OSDN Git Service

120ab156fb15dae1a5c7d27452b3083b61bb8bfe
[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 static int const x86_64_int_parameter_registers[6] =
1537 {
1538   5 /*RDI*/, 4 /*RSI*/, 1 /*RDX*/, 2 /*RCX*/,
1539   FIRST_REX_INT_REG /*R8 */, FIRST_REX_INT_REG + 1 /*R9 */
1540 };
1541
1542 static int const x86_64_ms_abi_int_parameter_registers[4] =
1543 {
1544   2 /*RCX*/, 1 /*RDX*/,
1545   FIRST_REX_INT_REG /*R8 */, FIRST_REX_INT_REG + 1 /*R9 */
1546 };
1547
1548 static int const x86_64_int_return_registers[4] =
1549 {
1550   0 /*RAX*/, 1 /*RDX*/, 5 /*RDI*/, 4 /*RSI*/
1551 };
1552
1553 /* The "default" register map used in 64bit mode.  */
1554 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
1555 {
1556   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
1557   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
1558   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1559   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
1560   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
1561   8,9,10,11,12,13,14,15,                /* extended integer registers */
1562   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
1563 };
1564
1565 /* Define the register numbers to be used in Dwarf debugging information.
1566    The SVR4 reference port C compiler uses the following register numbers
1567    in its Dwarf output code:
1568         0 for %eax (gcc regno = 0)
1569         1 for %ecx (gcc regno = 2)
1570         2 for %edx (gcc regno = 1)
1571         3 for %ebx (gcc regno = 3)
1572         4 for %esp (gcc regno = 7)
1573         5 for %ebp (gcc regno = 6)
1574         6 for %esi (gcc regno = 4)
1575         7 for %edi (gcc regno = 5)
1576    The following three DWARF register numbers are never generated by
1577    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
1578    believes these numbers have these meanings.
1579         8  for %eip    (no gcc equivalent)
1580         9  for %eflags (gcc regno = 17)
1581         10 for %trapno (no gcc equivalent)
1582    It is not at all clear how we should number the FP stack registers
1583    for the x86 architecture.  If the version of SDB on x86/svr4 were
1584    a bit less brain dead with respect to floating-point then we would
1585    have a precedent to follow with respect to DWARF register numbers
1586    for x86 FP registers, but the SDB on x86/svr4 is so completely
1587    broken with respect to FP registers that it is hardly worth thinking
1588    of it as something to strive for compatibility with.
1589    The version of x86/svr4 SDB I have at the moment does (partially)
1590    seem to believe that DWARF register number 11 is associated with
1591    the x86 register %st(0), but that's about all.  Higher DWARF
1592    register numbers don't seem to be associated with anything in
1593    particular, and even for DWARF regno 11, SDB only seems to under-
1594    stand that it should say that a variable lives in %st(0) (when
1595    asked via an `=' command) if we said it was in DWARF regno 11,
1596    but SDB still prints garbage when asked for the value of the
1597    variable in question (via a `/' command).
1598    (Also note that the labels SDB prints for various FP stack regs
1599    when doing an `x' command are all wrong.)
1600    Note that these problems generally don't affect the native SVR4
1601    C compiler because it doesn't allow the use of -O with -g and
1602    because when it is *not* optimizing, it allocates a memory
1603    location for each floating-point variable, and the memory
1604    location is what gets described in the DWARF AT_location
1605    attribute for the variable in question.
1606    Regardless of the severe mental illness of the x86/svr4 SDB, we
1607    do something sensible here and we use the following DWARF
1608    register numbers.  Note that these are all stack-top-relative
1609    numbers.
1610         11 for %st(0) (gcc regno = 8)
1611         12 for %st(1) (gcc regno = 9)
1612         13 for %st(2) (gcc regno = 10)
1613         14 for %st(3) (gcc regno = 11)
1614         15 for %st(4) (gcc regno = 12)
1615         16 for %st(5) (gcc regno = 13)
1616         17 for %st(6) (gcc regno = 14)
1617         18 for %st(7) (gcc regno = 15)
1618 */
1619 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
1620 {
1621   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
1622   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
1623   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
1624   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
1625   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
1626   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1627   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1628 };
1629
1630 /* Test and compare insns in i386.md store the information needed to
1631    generate branch and scc insns here.  */
1632
1633 rtx ix86_compare_op0 = NULL_RTX;
1634 rtx ix86_compare_op1 = NULL_RTX;
1635 rtx ix86_compare_emitted = NULL_RTX;
1636
1637 /* Define the structure for the machine field in struct function.  */
1638
1639 struct stack_local_entry GTY(())
1640 {
1641   unsigned short mode;
1642   unsigned short n;
1643   rtx rtl;
1644   struct stack_local_entry *next;
1645 };
1646
1647 /* Structure describing stack frame layout.
1648    Stack grows downward:
1649
1650    [arguments]
1651                                               <- ARG_POINTER
1652    saved pc
1653
1654    saved frame pointer if frame_pointer_needed
1655                                               <- HARD_FRAME_POINTER
1656    [saved regs]
1657
1658    [padding0]
1659
1660    [saved SSE regs]
1661
1662    [padding1]          \
1663                         )
1664    [va_arg registers]  (
1665                         > to_allocate         <- FRAME_POINTER
1666    [frame]             (
1667                         )
1668    [padding2]          /
1669   */
1670 struct ix86_frame
1671 {
1672   int padding0;
1673   int nsseregs;
1674   int nregs;
1675   int padding1;
1676   int va_arg_size;
1677   HOST_WIDE_INT frame;
1678   int padding2;
1679   int outgoing_arguments_size;
1680   int red_zone_size;
1681
1682   HOST_WIDE_INT to_allocate;
1683   /* The offsets relative to ARG_POINTER.  */
1684   HOST_WIDE_INT frame_pointer_offset;
1685   HOST_WIDE_INT hard_frame_pointer_offset;
1686   HOST_WIDE_INT stack_pointer_offset;
1687
1688   /* When save_regs_using_mov is set, emit prologue using
1689      move instead of push instructions.  */
1690   bool save_regs_using_mov;
1691 };
1692
1693 /* Code model option.  */
1694 enum cmodel ix86_cmodel;
1695 /* Asm dialect.  */
1696 enum asm_dialect ix86_asm_dialect = ASM_ATT;
1697 /* TLS dialects.  */
1698 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
1699
1700 /* Which unit we are generating floating point math for.  */
1701 enum fpmath_unit ix86_fpmath;
1702
1703 /* Which cpu are we scheduling for.  */
1704 enum attr_cpu ix86_schedule;
1705
1706 /* Which cpu are we optimizing for.  */
1707 enum processor_type ix86_tune;
1708
1709 /* Which instruction set architecture to use.  */
1710 enum processor_type ix86_arch;
1711
1712 /* true if sse prefetch instruction is not NOOP.  */
1713 int x86_prefetch_sse;
1714
1715 /* ix86_regparm_string as a number */
1716 static int ix86_regparm;
1717
1718 /* -mstackrealign option */
1719 extern int ix86_force_align_arg_pointer;
1720 static const char ix86_force_align_arg_pointer_string[]
1721   = "force_align_arg_pointer";
1722
1723 static rtx (*ix86_gen_leave) (void);
1724 static rtx (*ix86_gen_pop1) (rtx);
1725 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
1726 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
1727 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx);
1728 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
1729 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
1730 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
1731
1732 /* Preferred alignment for stack boundary in bits.  */
1733 unsigned int ix86_preferred_stack_boundary;
1734
1735 /* Alignment for incoming stack boundary in bits specified at
1736    command line.  */
1737 static unsigned int ix86_user_incoming_stack_boundary;
1738
1739 /* Default alignment for incoming stack boundary in bits.  */
1740 static unsigned int ix86_default_incoming_stack_boundary;
1741
1742 /* Alignment for incoming stack boundary in bits.  */
1743 unsigned int ix86_incoming_stack_boundary;
1744
1745 /* Values 1-5: see jump.c */
1746 int ix86_branch_cost;
1747
1748 /* Calling abi specific va_list type nodes.  */
1749 static GTY(()) tree sysv_va_list_type_node;
1750 static GTY(()) tree ms_va_list_type_node;
1751
1752 /* Variables which are this size or smaller are put in the data/bss
1753    or ldata/lbss sections.  */
1754
1755 int ix86_section_threshold = 65536;
1756
1757 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
1758 char internal_label_prefix[16];
1759 int internal_label_prefix_len;
1760
1761 /* Fence to use after loop using movnt.  */
1762 tree x86_mfence;
1763
1764 /* Register class used for passing given 64bit part of the argument.
1765    These represent classes as documented by the PS ABI, with the exception
1766    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
1767    use SF or DFmode move instead of DImode to avoid reformatting penalties.
1768
1769    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
1770    whenever possible (upper half does contain padding).  */
1771 enum x86_64_reg_class
1772   {
1773     X86_64_NO_CLASS,
1774     X86_64_INTEGER_CLASS,
1775     X86_64_INTEGERSI_CLASS,
1776     X86_64_SSE_CLASS,
1777     X86_64_SSESF_CLASS,
1778     X86_64_SSEDF_CLASS,
1779     X86_64_SSEUP_CLASS,
1780     X86_64_X87_CLASS,
1781     X86_64_X87UP_CLASS,
1782     X86_64_COMPLEX_X87_CLASS,
1783     X86_64_MEMORY_CLASS
1784   };
1785
1786 #define MAX_CLASSES 4
1787
1788 /* Table of constants used by fldpi, fldln2, etc....  */
1789 static REAL_VALUE_TYPE ext_80387_constants_table [5];
1790 static bool ext_80387_constants_init = 0;
1791
1792 \f
1793 static struct machine_function * ix86_init_machine_status (void);
1794 static rtx ix86_function_value (const_tree, const_tree, bool);
1795 static int ix86_function_regparm (const_tree, const_tree);
1796 static void ix86_compute_frame_layout (struct ix86_frame *);
1797 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
1798                                                  rtx, rtx, int);
1799 static void ix86_add_new_builtins (int);
1800
1801 enum ix86_function_specific_strings
1802 {
1803   IX86_FUNCTION_SPECIFIC_ARCH,
1804   IX86_FUNCTION_SPECIFIC_TUNE,
1805   IX86_FUNCTION_SPECIFIC_FPMATH,
1806   IX86_FUNCTION_SPECIFIC_MAX
1807 };
1808
1809 static char *ix86_target_string (int, int, const char *, const char *,
1810                                  const char *, bool);
1811 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
1812 static void ix86_function_specific_save (struct cl_target_option *);
1813 static void ix86_function_specific_restore (struct cl_target_option *);
1814 static void ix86_function_specific_print (FILE *, int,
1815                                           struct cl_target_option *);
1816 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
1817 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
1818 static bool ix86_can_inline_p (tree, tree);
1819 static void ix86_set_current_function (tree);
1820
1821 \f
1822 /* The svr4 ABI for the i386 says that records and unions are returned
1823    in memory.  */
1824 #ifndef DEFAULT_PCC_STRUCT_RETURN
1825 #define DEFAULT_PCC_STRUCT_RETURN 1
1826 #endif
1827
1828 /* Whether -mtune= or -march= were specified */
1829 static int ix86_tune_defaulted;
1830 static int ix86_arch_specified;
1831
1832 /* Bit flags that specify the ISA we are compiling for.  */
1833 int ix86_isa_flags = TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_ISA_DEFAULT;
1834
1835 /* A mask of ix86_isa_flags that includes bit X if X
1836    was set or cleared on the command line.  */
1837 static int ix86_isa_flags_explicit;
1838
1839 /* Define a set of ISAs which are available when a given ISA is
1840    enabled.  MMX and SSE ISAs are handled separately.  */
1841
1842 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
1843 #define OPTION_MASK_ISA_3DNOW_SET \
1844   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
1845
1846 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
1847 #define OPTION_MASK_ISA_SSE2_SET \
1848   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
1849 #define OPTION_MASK_ISA_SSE3_SET \
1850   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
1851 #define OPTION_MASK_ISA_SSSE3_SET \
1852   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
1853 #define OPTION_MASK_ISA_SSE4_1_SET \
1854   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
1855 #define OPTION_MASK_ISA_SSE4_2_SET \
1856   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
1857 #define OPTION_MASK_ISA_AVX_SET \
1858   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
1859 #define OPTION_MASK_ISA_FMA_SET \
1860   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
1861
1862 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
1863    as -msse4.2.  */
1864 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
1865
1866 #define OPTION_MASK_ISA_SSE4A_SET \
1867   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
1868 #define OPTION_MASK_ISA_SSE5_SET \
1869   (OPTION_MASK_ISA_SSE5 | OPTION_MASK_ISA_SSE4A_SET)
1870
1871 /* AES and PCLMUL need SSE2 because they use xmm registers */
1872 #define OPTION_MASK_ISA_AES_SET \
1873   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
1874 #define OPTION_MASK_ISA_PCLMUL_SET \
1875   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
1876
1877 #define OPTION_MASK_ISA_ABM_SET \
1878   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
1879 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
1880 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
1881 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
1882
1883 /* Define a set of ISAs which aren't available when a given ISA is
1884    disabled.  MMX and SSE ISAs are handled separately.  */
1885
1886 #define OPTION_MASK_ISA_MMX_UNSET \
1887   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
1888 #define OPTION_MASK_ISA_3DNOW_UNSET \
1889   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
1890 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
1891
1892 #define OPTION_MASK_ISA_SSE_UNSET \
1893   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
1894 #define OPTION_MASK_ISA_SSE2_UNSET \
1895   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
1896 #define OPTION_MASK_ISA_SSE3_UNSET \
1897   (OPTION_MASK_ISA_SSE3 \
1898    | OPTION_MASK_ISA_SSSE3_UNSET \
1899    | OPTION_MASK_ISA_SSE4A_UNSET )
1900 #define OPTION_MASK_ISA_SSSE3_UNSET \
1901   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
1902 #define OPTION_MASK_ISA_SSE4_1_UNSET \
1903   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
1904 #define OPTION_MASK_ISA_SSE4_2_UNSET \
1905   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
1906 #define OPTION_MASK_ISA_AVX_UNSET \
1907   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET)
1908 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
1909
1910 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
1911    as -mno-sse4.1. */
1912 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
1913
1914 #define OPTION_MASK_ISA_SSE4A_UNSET \
1915   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE5_UNSET)
1916 #define OPTION_MASK_ISA_SSE5_UNSET OPTION_MASK_ISA_SSE5
1917 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
1918 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
1919 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
1920 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
1921 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
1922 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
1923
1924 /* Vectorization library interface and handlers.  */
1925 tree (*ix86_veclib_handler)(enum built_in_function, tree, tree) = NULL;
1926 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
1927 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
1928
1929 /* Processor target table, indexed by processor number */
1930 struct ptt
1931 {
1932   const struct processor_costs *cost;           /* Processor costs */
1933   const int align_loop;                         /* Default alignments.  */
1934   const int align_loop_max_skip;
1935   const int align_jump;
1936   const int align_jump_max_skip;
1937   const int align_func;
1938 };
1939
1940 static const struct ptt processor_target_table[PROCESSOR_max] =
1941 {
1942   {&i386_cost, 4, 3, 4, 3, 4},
1943   {&i486_cost, 16, 15, 16, 15, 16},
1944   {&pentium_cost, 16, 7, 16, 7, 16},
1945   {&pentiumpro_cost, 16, 15, 16, 10, 16},
1946   {&geode_cost, 0, 0, 0, 0, 0},
1947   {&k6_cost, 32, 7, 32, 7, 32},
1948   {&athlon_cost, 16, 7, 16, 7, 16},
1949   {&pentium4_cost, 0, 0, 0, 0, 0},
1950   {&k8_cost, 16, 7, 16, 7, 16},
1951   {&nocona_cost, 0, 0, 0, 0, 0},
1952   {&core2_cost, 16, 10, 16, 10, 16},
1953   {&generic32_cost, 16, 7, 16, 7, 16},
1954   {&generic64_cost, 16, 10, 16, 10, 16},
1955   {&amdfam10_cost, 32, 24, 32, 7, 32}
1956 };
1957
1958 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
1959 {
1960   "generic",
1961   "i386",
1962   "i486",
1963   "pentium",
1964   "pentium-mmx",
1965   "pentiumpro",
1966   "pentium2",
1967   "pentium3",
1968   "pentium4",
1969   "pentium-m",
1970   "prescott",
1971   "nocona",
1972   "core2",
1973   "geode",
1974   "k6",
1975   "k6-2",
1976   "k6-3",
1977   "athlon",
1978   "athlon-4",
1979   "k8",
1980   "amdfam10"
1981 };
1982 \f
1983 /* Implement TARGET_HANDLE_OPTION.  */
1984
1985 static bool
1986 ix86_handle_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
1987 {
1988   switch (code)
1989     {
1990     case OPT_mmmx:
1991       if (value)
1992         {
1993           ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
1994           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
1995         }
1996       else
1997         {
1998           ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
1999           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2000         }
2001       return true;
2002
2003     case OPT_m3dnow:
2004       if (value)
2005         {
2006           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2007           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2008         }
2009       else
2010         {
2011           ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2012           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2013         }
2014       return true;
2015
2016     case OPT_m3dnowa:
2017       return false;
2018
2019     case OPT_msse:
2020       if (value)
2021         {
2022           ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2023           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2024         }
2025       else
2026         {
2027           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2028           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2029         }
2030       return true;
2031
2032     case OPT_msse2:
2033       if (value)
2034         {
2035           ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2036           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2037         }
2038       else
2039         {
2040           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2041           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2042         }
2043       return true;
2044
2045     case OPT_msse3:
2046       if (value)
2047         {
2048           ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2049           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2050         }
2051       else
2052         {
2053           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2054           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2055         }
2056       return true;
2057
2058     case OPT_mssse3:
2059       if (value)
2060         {
2061           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2062           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2063         }
2064       else
2065         {
2066           ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2067           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2068         }
2069       return true;
2070
2071     case OPT_msse4_1:
2072       if (value)
2073         {
2074           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2075           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2076         }
2077       else
2078         {
2079           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2080           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2081         }
2082       return true;
2083
2084     case OPT_msse4_2:
2085       if (value)
2086         {
2087           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2088           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2089         }
2090       else
2091         {
2092           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2093           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2094         }
2095       return true;
2096
2097     case OPT_mavx:
2098       if (value)
2099         {
2100           ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2101           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2102         }
2103       else
2104         {
2105           ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2106           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2107         }
2108       return true;
2109
2110     case OPT_mfma:
2111       if (value)
2112         {
2113           ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2114           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2115         }
2116       else
2117         {
2118           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2119           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2120         }
2121       return true;
2122
2123     case OPT_msse4:
2124       ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2125       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2126       return true;
2127
2128     case OPT_mno_sse4:
2129       ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2130       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2131       return true;
2132
2133     case OPT_msse4a:
2134       if (value)
2135         {
2136           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2137           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2138         }
2139       else
2140         {
2141           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2142           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2143         }
2144       return true;
2145
2146     case OPT_msse5:
2147       if (value)
2148         {
2149           ix86_isa_flags |= OPTION_MASK_ISA_SSE5_SET;
2150           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_SET;
2151         }
2152       else
2153         {
2154           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE5_UNSET;
2155           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_UNSET;
2156         }
2157       return true;
2158
2159     case OPT_mabm:
2160       if (value)
2161         {
2162           ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2163           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2164         }
2165       else
2166         {
2167           ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2168           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2169         }
2170       return true;
2171
2172     case OPT_mpopcnt:
2173       if (value)
2174         {
2175           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2176           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2177         }
2178       else
2179         {
2180           ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2181           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2182         }
2183       return true;
2184
2185     case OPT_msahf:
2186       if (value)
2187         {
2188           ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2189           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2190         }
2191       else
2192         {
2193           ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2194           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2195         }
2196       return true;
2197
2198     case OPT_mcx16:
2199       if (value)
2200         {
2201           ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2202           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2203         }
2204       else
2205         {
2206           ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2207           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2208         }
2209       return true;
2210
2211     case OPT_maes:
2212       if (value)
2213         {
2214           ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2215           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2216         }
2217       else
2218         {
2219           ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
2220           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
2221         }
2222       return true;
2223
2224     case OPT_mpclmul:
2225       if (value)
2226         {
2227           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
2228           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
2229         }
2230       else
2231         {
2232           ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
2233           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
2234         }
2235       return true;
2236
2237     default:
2238       return true;
2239     }
2240 }
2241 \f
2242 /* Return a string the documents the current -m options.  The caller is
2243    responsible for freeing the string.  */
2244
2245 static char *
2246 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
2247                     const char *fpmath, bool add_nl_p)
2248 {
2249   struct ix86_target_opts
2250   {
2251     const char *option;         /* option string */
2252     int mask;                   /* isa mask options */
2253   };
2254
2255   /* This table is ordered so that options like -msse5 or -msse4.2 that imply
2256      preceding options while match those first.  */
2257   static struct ix86_target_opts isa_opts[] =
2258   {
2259     { "-m64",           OPTION_MASK_ISA_64BIT },
2260     { "-msse5",         OPTION_MASK_ISA_SSE5 },
2261     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
2262     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
2263     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
2264     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
2265     { "-msse3",         OPTION_MASK_ISA_SSE3 },
2266     { "-msse2",         OPTION_MASK_ISA_SSE2 },
2267     { "-msse",          OPTION_MASK_ISA_SSE },
2268     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
2269     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
2270     { "-mmmx",          OPTION_MASK_ISA_MMX },
2271     { "-mabm",          OPTION_MASK_ISA_ABM },
2272     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
2273     { "-maes",          OPTION_MASK_ISA_AES },
2274     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
2275   };
2276
2277   /* Flag options.  */
2278   static struct ix86_target_opts flag_opts[] =
2279   {
2280     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
2281     { "-m80387",                        MASK_80387 },
2282     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
2283     { "-malign-double",                 MASK_ALIGN_DOUBLE },
2284     { "-mcld",                          MASK_CLD },
2285     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
2286     { "-mieee-fp",                      MASK_IEEE_FP },
2287     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
2288     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
2289     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
2290     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
2291     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
2292     { "-mno-fused-madd",                MASK_NO_FUSED_MADD },
2293     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
2294     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
2295     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
2296     { "-mrecip",                        MASK_RECIP },
2297     { "-mrtd",                          MASK_RTD },
2298     { "-msseregparm",                   MASK_SSEREGPARM },
2299     { "-mstack-arg-probe",              MASK_STACK_PROBE },
2300     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
2301   };
2302
2303   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
2304
2305   char isa_other[40];
2306   char target_other[40];
2307   unsigned num = 0;
2308   unsigned i, j;
2309   char *ret;
2310   char *ptr;
2311   size_t len;
2312   size_t line_len;
2313   size_t sep_len;
2314
2315   memset (opts, '\0', sizeof (opts));
2316
2317   /* Add -march= option.  */
2318   if (arch)
2319     {
2320       opts[num][0] = "-march=";
2321       opts[num++][1] = arch;
2322     }
2323
2324   /* Add -mtune= option.  */
2325   if (tune)
2326     {
2327       opts[num][0] = "-mtune=";
2328       opts[num++][1] = tune;
2329     }
2330
2331   /* Pick out the options in isa options.  */
2332   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
2333     {
2334       if ((isa & isa_opts[i].mask) != 0)
2335         {
2336           opts[num++][0] = isa_opts[i].option;
2337           isa &= ~ isa_opts[i].mask;
2338         }
2339     }
2340
2341   if (isa && add_nl_p)
2342     {
2343       opts[num++][0] = isa_other;
2344       sprintf (isa_other, "(other isa: 0x%x)", isa);
2345     }
2346
2347   /* Add flag options.  */
2348   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
2349     {
2350       if ((flags & flag_opts[i].mask) != 0)
2351         {
2352           opts[num++][0] = flag_opts[i].option;
2353           flags &= ~ flag_opts[i].mask;
2354         }
2355     }
2356
2357   if (flags && add_nl_p)
2358     {
2359       opts[num++][0] = target_other;
2360       sprintf (target_other, "(other flags: 0x%x)", isa);
2361     }
2362
2363   /* Add -fpmath= option.  */
2364   if (fpmath)
2365     {
2366       opts[num][0] = "-mfpmath=";
2367       opts[num++][1] = fpmath;
2368     }
2369
2370   /* Any options?  */
2371   if (num == 0)
2372     return NULL;
2373
2374   gcc_assert (num < ARRAY_SIZE (opts));
2375
2376   /* Size the string.  */
2377   len = 0;
2378   sep_len = (add_nl_p) ? 3 : 1;
2379   for (i = 0; i < num; i++)
2380     {
2381       len += sep_len;
2382       for (j = 0; j < 2; j++)
2383         if (opts[i][j])
2384           len += strlen (opts[i][j]);
2385     }
2386
2387   /* Build the string.  */
2388   ret = ptr = (char *) xmalloc (len);
2389   line_len = 0;
2390
2391   for (i = 0; i < num; i++)
2392     {
2393       size_t len2[2];
2394
2395       for (j = 0; j < 2; j++)
2396         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
2397
2398       if (i != 0)
2399         {
2400           *ptr++ = ' ';
2401           line_len++;
2402
2403           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
2404             {
2405               *ptr++ = '\\';
2406               *ptr++ = '\n';
2407               line_len = 0;
2408             }
2409         }
2410
2411       for (j = 0; j < 2; j++)
2412         if (opts[i][j])
2413           {
2414             memcpy (ptr, opts[i][j], len2[j]);
2415             ptr += len2[j];
2416             line_len += len2[j];
2417           }
2418     }
2419
2420   *ptr = '\0';
2421   gcc_assert (ret + len >= ptr);
2422
2423   return ret;
2424 }
2425
2426 /* Function that is callable from the debugger to print the current
2427    options.  */
2428 void
2429 ix86_debug_options (void)
2430 {
2431   char *opts = ix86_target_string (ix86_isa_flags, target_flags,
2432                                    ix86_arch_string, ix86_tune_string,
2433                                    ix86_fpmath_string, true);
2434
2435   if (opts)
2436     {
2437       fprintf (stderr, "%s\n\n", opts);
2438       free (opts);
2439     }
2440   else
2441     fprintf (stderr, "<no options>\n\n");
2442
2443   return;
2444 }
2445 \f
2446 /* Sometimes certain combinations of command options do not make
2447    sense on a particular target machine.  You can define a macro
2448    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
2449    defined, is executed once just after all the command options have
2450    been parsed.
2451
2452    Don't use this macro to turn on various extra optimizations for
2453    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
2454
2455 void
2456 override_options (bool main_args_p)
2457 {
2458   int i;
2459   unsigned int ix86_arch_mask, ix86_tune_mask;
2460   const char *prefix;
2461   const char *suffix;
2462   const char *sw;
2463
2464   /* Comes from final.c -- no real reason to change it.  */
2465 #define MAX_CODE_ALIGN 16
2466
2467   enum pta_flags
2468     {
2469       PTA_SSE = 1 << 0,
2470       PTA_SSE2 = 1 << 1,
2471       PTA_SSE3 = 1 << 2,
2472       PTA_MMX = 1 << 3,
2473       PTA_PREFETCH_SSE = 1 << 4,
2474       PTA_3DNOW = 1 << 5,
2475       PTA_3DNOW_A = 1 << 6,
2476       PTA_64BIT = 1 << 7,
2477       PTA_SSSE3 = 1 << 8,
2478       PTA_CX16 = 1 << 9,
2479       PTA_POPCNT = 1 << 10,
2480       PTA_ABM = 1 << 11,
2481       PTA_SSE4A = 1 << 12,
2482       PTA_NO_SAHF = 1 << 13,
2483       PTA_SSE4_1 = 1 << 14,
2484       PTA_SSE4_2 = 1 << 15,
2485       PTA_SSE5 = 1 << 16,
2486       PTA_AES = 1 << 17,
2487       PTA_PCLMUL = 1 << 18,
2488       PTA_AVX = 1 << 19,
2489       PTA_FMA = 1 << 20 
2490     };
2491
2492   static struct pta
2493     {
2494       const char *const name;           /* processor name or nickname.  */
2495       const enum processor_type processor;
2496       const enum attr_cpu schedule;
2497       const unsigned /*enum pta_flags*/ flags;
2498     }
2499   const processor_alias_table[] =
2500     {
2501       {"i386", PROCESSOR_I386, CPU_NONE, 0},
2502       {"i486", PROCESSOR_I486, CPU_NONE, 0},
2503       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2504       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2505       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
2506       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
2507       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2508       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2509       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
2510       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2511       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2512       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
2513       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2514         PTA_MMX | PTA_SSE},
2515       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2516         PTA_MMX | PTA_SSE},
2517       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2518         PTA_MMX | PTA_SSE | PTA_SSE2},
2519       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
2520         PTA_MMX |PTA_SSE | PTA_SSE2},
2521       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
2522         PTA_MMX | PTA_SSE | PTA_SSE2},
2523       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
2524         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
2525       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
2526         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2527         | PTA_CX16 | PTA_NO_SAHF},
2528       {"core2", PROCESSOR_CORE2, CPU_CORE2,
2529         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2530         | PTA_SSSE3 | PTA_CX16},
2531       {"geode", PROCESSOR_GEODE, CPU_GEODE,
2532         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
2533       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
2534       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2535       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2536       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
2537         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2538       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
2539         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2540       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
2541         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2542       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
2543         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2544       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
2545         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2546       {"x86-64", PROCESSOR_K8, CPU_K8,
2547         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
2548       {"k8", PROCESSOR_K8, CPU_K8,
2549         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2550         | PTA_SSE2 | PTA_NO_SAHF},
2551       {"k8-sse3", PROCESSOR_K8, CPU_K8,
2552         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2553         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2554       {"opteron", PROCESSOR_K8, CPU_K8,
2555         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2556         | PTA_SSE2 | PTA_NO_SAHF},
2557       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
2558         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2559         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2560       {"athlon64", PROCESSOR_K8, CPU_K8,
2561         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2562         | PTA_SSE2 | PTA_NO_SAHF},
2563       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
2564         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2565         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2566       {"athlon-fx", PROCESSOR_K8, CPU_K8,
2567         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2568         | PTA_SSE2 | PTA_NO_SAHF},
2569       {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2570         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2571         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2572       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2573         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2574         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2575       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
2576         0 /* flags are only used for -march switch.  */ },
2577       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
2578         PTA_64BIT /* flags are only used for -march switch.  */ },
2579     };
2580
2581   int const pta_size = ARRAY_SIZE (processor_alias_table);
2582
2583   /* Set up prefix/suffix so the error messages refer to either the command
2584      line argument, or the attribute(target).  */
2585   if (main_args_p)
2586     {
2587       prefix = "-m";
2588       suffix = "";
2589       sw = "switch";
2590     }
2591   else
2592     {
2593       prefix = "option(\"";
2594       suffix = "\")";
2595       sw = "attribute";
2596     }
2597
2598 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2599   SUBTARGET_OVERRIDE_OPTIONS;
2600 #endif
2601
2602 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2603   SUBSUBTARGET_OVERRIDE_OPTIONS;
2604 #endif
2605
2606   /* -fPIC is the default for x86_64.  */
2607   if (TARGET_MACHO && TARGET_64BIT)
2608     flag_pic = 2;
2609
2610   /* Set the default values for switches whose default depends on TARGET_64BIT
2611      in case they weren't overwritten by command line options.  */
2612   if (TARGET_64BIT)
2613     {
2614       /* Mach-O doesn't support omitting the frame pointer for now.  */
2615       if (flag_omit_frame_pointer == 2)
2616         flag_omit_frame_pointer = (TARGET_MACHO ? 0 : 1);
2617       if (flag_asynchronous_unwind_tables == 2)
2618         flag_asynchronous_unwind_tables = 1;
2619       if (flag_pcc_struct_return == 2)
2620         flag_pcc_struct_return = 0;
2621     }
2622   else
2623     {
2624       if (flag_omit_frame_pointer == 2)
2625         flag_omit_frame_pointer = 0;
2626       if (flag_asynchronous_unwind_tables == 2)
2627         flag_asynchronous_unwind_tables = 0;
2628       if (flag_pcc_struct_return == 2)
2629         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
2630     }
2631
2632   /* Need to check -mtune=generic first.  */
2633   if (ix86_tune_string)
2634     {
2635       if (!strcmp (ix86_tune_string, "generic")
2636           || !strcmp (ix86_tune_string, "i686")
2637           /* As special support for cross compilers we read -mtune=native
2638              as -mtune=generic.  With native compilers we won't see the
2639              -mtune=native, as it was changed by the driver.  */
2640           || !strcmp (ix86_tune_string, "native"))
2641         {
2642           if (TARGET_64BIT)
2643             ix86_tune_string = "generic64";
2644           else
2645             ix86_tune_string = "generic32";
2646         }
2647       /* If this call is for setting the option attribute, allow the
2648          generic32/generic64 that was previously set.  */
2649       else if (!main_args_p
2650                && (!strcmp (ix86_tune_string, "generic32")
2651                    || !strcmp (ix86_tune_string, "generic64")))
2652         ;
2653       else if (!strncmp (ix86_tune_string, "generic", 7))
2654         error ("bad value (%s) for %stune=%s %s",
2655                ix86_tune_string, prefix, suffix, sw);
2656     }
2657   else
2658     {
2659       if (ix86_arch_string)
2660         ix86_tune_string = ix86_arch_string;
2661       if (!ix86_tune_string)
2662         {
2663           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
2664           ix86_tune_defaulted = 1;
2665         }
2666
2667       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
2668          need to use a sensible tune option.  */
2669       if (!strcmp (ix86_tune_string, "generic")
2670           || !strcmp (ix86_tune_string, "x86-64")
2671           || !strcmp (ix86_tune_string, "i686"))
2672         {
2673           if (TARGET_64BIT)
2674             ix86_tune_string = "generic64";
2675           else
2676             ix86_tune_string = "generic32";
2677         }
2678     }
2679   if (ix86_stringop_string)
2680     {
2681       if (!strcmp (ix86_stringop_string, "rep_byte"))
2682         stringop_alg = rep_prefix_1_byte;
2683       else if (!strcmp (ix86_stringop_string, "libcall"))
2684         stringop_alg = libcall;
2685       else if (!strcmp (ix86_stringop_string, "rep_4byte"))
2686         stringop_alg = rep_prefix_4_byte;
2687       else if (!strcmp (ix86_stringop_string, "rep_8byte")
2688                && TARGET_64BIT)
2689         /* rep; movq isn't available in 32-bit code.  */
2690         stringop_alg = rep_prefix_8_byte;
2691       else if (!strcmp (ix86_stringop_string, "byte_loop"))
2692         stringop_alg = loop_1_byte;
2693       else if (!strcmp (ix86_stringop_string, "loop"))
2694         stringop_alg = loop;
2695       else if (!strcmp (ix86_stringop_string, "unrolled_loop"))
2696         stringop_alg = unrolled_loop;
2697       else
2698         error ("bad value (%s) for %sstringop-strategy=%s %s",
2699                ix86_stringop_string, prefix, suffix, sw);
2700     }
2701   if (!strcmp (ix86_tune_string, "x86-64"))
2702     warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated.  Use "
2703              "%stune=k8%s or %stune=generic%s instead as appropriate.",
2704              prefix, suffix, prefix, suffix, prefix, suffix);
2705
2706   if (!ix86_arch_string)
2707     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386";
2708   else
2709     ix86_arch_specified = 1;
2710
2711   if (!strcmp (ix86_arch_string, "generic"))
2712     error ("generic CPU can be used only for %stune=%s %s",
2713            prefix, suffix, sw);
2714   if (!strncmp (ix86_arch_string, "generic", 7))
2715     error ("bad value (%s) for %sarch=%s %s",
2716            ix86_arch_string, prefix, suffix, sw);
2717
2718   if (ix86_cmodel_string != 0)
2719     {
2720       if (!strcmp (ix86_cmodel_string, "small"))
2721         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2722       else if (!strcmp (ix86_cmodel_string, "medium"))
2723         ix86_cmodel = flag_pic ? CM_MEDIUM_PIC : CM_MEDIUM;
2724       else if (!strcmp (ix86_cmodel_string, "large"))
2725         ix86_cmodel = flag_pic ? CM_LARGE_PIC : CM_LARGE;
2726       else if (flag_pic)
2727         error ("code model %s does not support PIC mode", ix86_cmodel_string);
2728       else if (!strcmp (ix86_cmodel_string, "32"))
2729         ix86_cmodel = CM_32;
2730       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
2731         ix86_cmodel = CM_KERNEL;
2732       else
2733         error ("bad value (%s) for %scmodel=%s %s",
2734                ix86_cmodel_string, prefix, suffix, sw);
2735     }
2736   else
2737     {
2738       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
2739          use of rip-relative addressing.  This eliminates fixups that
2740          would otherwise be needed if this object is to be placed in a
2741          DLL, and is essentially just as efficient as direct addressing.  */
2742       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
2743         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
2744       else if (TARGET_64BIT)
2745         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2746       else
2747         ix86_cmodel = CM_32;
2748     }
2749   if (ix86_asm_string != 0)
2750     {
2751       if (! TARGET_MACHO
2752           && !strcmp (ix86_asm_string, "intel"))
2753         ix86_asm_dialect = ASM_INTEL;
2754       else if (!strcmp (ix86_asm_string, "att"))
2755         ix86_asm_dialect = ASM_ATT;
2756       else
2757         error ("bad value (%s) for %sasm=%s %s",
2758                ix86_asm_string, prefix, suffix, sw);
2759     }
2760   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
2761     error ("code model %qs not supported in the %s bit mode",
2762            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
2763   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
2764     sorry ("%i-bit mode not compiled in",
2765            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
2766
2767   for (i = 0; i < pta_size; i++)
2768     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
2769       {
2770         ix86_schedule = processor_alias_table[i].schedule;
2771         ix86_arch = processor_alias_table[i].processor;
2772         /* Default cpu tuning to the architecture.  */
2773         ix86_tune = ix86_arch;
2774
2775         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2776           error ("CPU you selected does not support x86-64 "
2777                  "instruction set");
2778
2779         if (processor_alias_table[i].flags & PTA_MMX
2780             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
2781           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
2782         if (processor_alias_table[i].flags & PTA_3DNOW
2783             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
2784           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
2785         if (processor_alias_table[i].flags & PTA_3DNOW_A
2786             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
2787           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
2788         if (processor_alias_table[i].flags & PTA_SSE
2789             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
2790           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
2791         if (processor_alias_table[i].flags & PTA_SSE2
2792             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
2793           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
2794         if (processor_alias_table[i].flags & PTA_SSE3
2795             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
2796           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
2797         if (processor_alias_table[i].flags & PTA_SSSE3
2798             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
2799           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
2800         if (processor_alias_table[i].flags & PTA_SSE4_1
2801             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
2802           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
2803         if (processor_alias_table[i].flags & PTA_SSE4_2
2804             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
2805           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
2806         if (processor_alias_table[i].flags & PTA_AVX
2807             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
2808           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
2809         if (processor_alias_table[i].flags & PTA_FMA
2810             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
2811           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
2812         if (processor_alias_table[i].flags & PTA_SSE4A
2813             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
2814           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
2815         if (processor_alias_table[i].flags & PTA_SSE5
2816             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE5))
2817           ix86_isa_flags |= OPTION_MASK_ISA_SSE5;
2818         if (processor_alias_table[i].flags & PTA_ABM
2819             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
2820           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
2821         if (processor_alias_table[i].flags & PTA_CX16
2822             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
2823           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
2824         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
2825             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
2826           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
2827         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
2828             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
2829           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
2830         if (processor_alias_table[i].flags & PTA_AES
2831             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
2832           ix86_isa_flags |= OPTION_MASK_ISA_AES;
2833         if (processor_alias_table[i].flags & PTA_PCLMUL
2834             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
2835           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
2836         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
2837           x86_prefetch_sse = true;
2838
2839         break;
2840       }
2841
2842   if (i == pta_size)
2843     error ("bad value (%s) for %sarch=%s %s",
2844            ix86_arch_string, prefix, suffix, sw);
2845
2846   ix86_arch_mask = 1u << ix86_arch;
2847   for (i = 0; i < X86_ARCH_LAST; ++i)
2848     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
2849
2850   for (i = 0; i < pta_size; i++)
2851     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
2852       {
2853         ix86_schedule = processor_alias_table[i].schedule;
2854         ix86_tune = processor_alias_table[i].processor;
2855         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2856           {
2857             if (ix86_tune_defaulted)
2858               {
2859                 ix86_tune_string = "x86-64";
2860                 for (i = 0; i < pta_size; i++)
2861                   if (! strcmp (ix86_tune_string,
2862                                 processor_alias_table[i].name))
2863                     break;
2864                 ix86_schedule = processor_alias_table[i].schedule;
2865                 ix86_tune = processor_alias_table[i].processor;
2866               }
2867             else
2868               error ("CPU you selected does not support x86-64 "
2869                      "instruction set");
2870           }
2871         /* Intel CPUs have always interpreted SSE prefetch instructions as
2872            NOPs; so, we can enable SSE prefetch instructions even when
2873            -mtune (rather than -march) points us to a processor that has them.
2874            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
2875            higher processors.  */
2876         if (TARGET_CMOVE
2877             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
2878           x86_prefetch_sse = true;
2879         break;
2880       }
2881   if (i == pta_size)
2882     error ("bad value (%s) for %stune=%s %s",
2883            ix86_tune_string, prefix, suffix, sw);
2884
2885   ix86_tune_mask = 1u << ix86_tune;
2886   for (i = 0; i < X86_TUNE_LAST; ++i)
2887     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
2888
2889   if (optimize_size)
2890     ix86_cost = &ix86_size_cost;
2891   else
2892     ix86_cost = processor_target_table[ix86_tune].cost;
2893
2894   /* Arrange to set up i386_stack_locals for all functions.  */
2895   init_machine_status = ix86_init_machine_status;
2896
2897   /* Validate -mregparm= value.  */
2898   if (ix86_regparm_string)
2899     {
2900       if (TARGET_64BIT)
2901         warning (0, "%sregparm%s is ignored in 64-bit mode", prefix, suffix);
2902       i = atoi (ix86_regparm_string);
2903       if (i < 0 || i > REGPARM_MAX)
2904         error ("%sregparm=%d%s is not between 0 and %d",
2905                prefix, i, suffix, REGPARM_MAX);
2906       else
2907         ix86_regparm = i;
2908     }
2909   if (TARGET_64BIT)
2910     ix86_regparm = REGPARM_MAX;
2911
2912   /* If the user has provided any of the -malign-* options,
2913      warn and use that value only if -falign-* is not set.
2914      Remove this code in GCC 3.2 or later.  */
2915   if (ix86_align_loops_string)
2916     {
2917       warning (0, "%salign-loops%s is obsolete, use -falign-loops%s",
2918                prefix, suffix, suffix);
2919       if (align_loops == 0)
2920         {
2921           i = atoi (ix86_align_loops_string);
2922           if (i < 0 || i > MAX_CODE_ALIGN)
2923             error ("%salign-loops=%d%s is not between 0 and %d",
2924                    prefix, i, suffix, MAX_CODE_ALIGN);
2925           else
2926             align_loops = 1 << i;
2927         }
2928     }
2929
2930   if (ix86_align_jumps_string)
2931     {
2932       warning (0, "%salign-jumps%s is obsolete, use -falign-jumps%s",
2933                prefix, suffix, suffix);
2934       if (align_jumps == 0)
2935         {
2936           i = atoi (ix86_align_jumps_string);
2937           if (i < 0 || i > MAX_CODE_ALIGN)
2938             error ("%salign-loops=%d%s is not between 0 and %d",
2939                    prefix, i, suffix, MAX_CODE_ALIGN);
2940           else
2941             align_jumps = 1 << i;
2942         }
2943     }
2944
2945   if (ix86_align_funcs_string)
2946     {
2947       warning (0, "%salign-functions%s is obsolete, use -falign-functions%s",
2948                prefix, suffix, suffix);
2949       if (align_functions == 0)
2950         {
2951           i = atoi (ix86_align_funcs_string);
2952           if (i < 0 || i > MAX_CODE_ALIGN)
2953             error ("%salign-loops=%d%s is not between 0 and %d",
2954                    prefix, i, suffix, MAX_CODE_ALIGN);
2955           else
2956             align_functions = 1 << i;
2957         }
2958     }
2959
2960   /* Default align_* from the processor table.  */
2961   if (align_loops == 0)
2962     {
2963       align_loops = processor_target_table[ix86_tune].align_loop;
2964       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
2965     }
2966   if (align_jumps == 0)
2967     {
2968       align_jumps = processor_target_table[ix86_tune].align_jump;
2969       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
2970     }
2971   if (align_functions == 0)
2972     {
2973       align_functions = processor_target_table[ix86_tune].align_func;
2974     }
2975
2976   /* Validate -mbranch-cost= value, or provide default.  */
2977   ix86_branch_cost = ix86_cost->branch_cost;
2978   if (ix86_branch_cost_string)
2979     {
2980       i = atoi (ix86_branch_cost_string);
2981       if (i < 0 || i > 5)
2982         error ("%sbranch-cost=%d%s is not between 0 and 5", prefix, i, suffix);
2983       else
2984         ix86_branch_cost = i;
2985     }
2986   if (ix86_section_threshold_string)
2987     {
2988       i = atoi (ix86_section_threshold_string);
2989       if (i < 0)
2990         error ("%slarge-data-threshold=%d%s is negative", prefix, i, suffix);
2991       else
2992         ix86_section_threshold = i;
2993     }
2994
2995   if (ix86_tls_dialect_string)
2996     {
2997       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
2998         ix86_tls_dialect = TLS_DIALECT_GNU;
2999       else if (strcmp (ix86_tls_dialect_string, "gnu2") == 0)
3000         ix86_tls_dialect = TLS_DIALECT_GNU2;
3001       else if (strcmp (ix86_tls_dialect_string, "sun") == 0)
3002         ix86_tls_dialect = TLS_DIALECT_SUN;
3003       else
3004         error ("bad value (%s) for %stls-dialect=%s %s",
3005                ix86_tls_dialect_string, prefix, suffix, sw);
3006     }
3007
3008   if (ix87_precision_string)
3009     {
3010       i = atoi (ix87_precision_string);
3011       if (i != 32 && i != 64 && i != 80)
3012         error ("pc%d is not valid precision setting (32, 64 or 80)", i);
3013     }
3014
3015   if (TARGET_64BIT)
3016     {
3017       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3018
3019       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3020          explicitly disable any of these.  In particular, disabling SSE and
3021          MMX for kernel code is extremely useful.  */
3022       if (!ix86_arch_specified)
3023       ix86_isa_flags
3024         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3025              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3026
3027       if (TARGET_RTD)
3028         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3029     }
3030   else
3031     {
3032       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3033
3034       if (!ix86_arch_specified)
3035       ix86_isa_flags
3036         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3037
3038       /* i386 ABI does not specify red zone.  It still makes sense to use it
3039          when programmer takes care to stack from being destroyed.  */
3040       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3041         target_flags |= MASK_NO_RED_ZONE;
3042     }
3043
3044   /* Keep nonleaf frame pointers.  */
3045   if (flag_omit_frame_pointer)
3046     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
3047   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
3048     flag_omit_frame_pointer = 1;
3049
3050   /* If we're doing fast math, we don't care about comparison order
3051      wrt NaNs.  This lets us use a shorter comparison sequence.  */
3052   if (flag_finite_math_only)
3053     target_flags &= ~MASK_IEEE_FP;
3054
3055   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
3056      since the insns won't need emulation.  */
3057   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
3058     target_flags &= ~MASK_NO_FANCY_MATH_387;
3059
3060   /* Likewise, if the target doesn't have a 387, or we've specified
3061      software floating point, don't use 387 inline intrinsics.  */
3062   if (!TARGET_80387)
3063     target_flags |= MASK_NO_FANCY_MATH_387;
3064
3065   /* Turn on MMX builtins for -msse.  */
3066   if (TARGET_SSE)
3067     {
3068       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
3069       x86_prefetch_sse = true;
3070     }
3071
3072   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
3073   if (TARGET_SSE4_2 || TARGET_ABM)
3074     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
3075
3076   /* Validate -mpreferred-stack-boundary= value or default it to
3077      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
3078   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
3079   if (ix86_preferred_stack_boundary_string)
3080     {
3081       i = atoi (ix86_preferred_stack_boundary_string);
3082       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3083         error ("%spreferred-stack-boundary=%d%s is not between %d and 12",
3084                prefix, i, suffix, TARGET_64BIT ? 4 : 2);
3085       else
3086         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
3087     }
3088
3089   /* Set the default value for -mstackrealign.  */
3090   if (ix86_force_align_arg_pointer == -1)
3091     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
3092
3093   /* Validate -mincoming-stack-boundary= value or default it to
3094      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
3095   if (ix86_force_align_arg_pointer)
3096     ix86_default_incoming_stack_boundary = MIN_STACK_BOUNDARY;
3097   else
3098     ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
3099   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
3100   if (ix86_incoming_stack_boundary_string)
3101     {
3102       i = atoi (ix86_incoming_stack_boundary_string);
3103       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3104         error ("-mincoming-stack-boundary=%d is not between %d and 12",
3105                i, TARGET_64BIT ? 4 : 2);
3106       else
3107         {
3108           ix86_user_incoming_stack_boundary = (1 << i) * BITS_PER_UNIT;
3109           ix86_incoming_stack_boundary
3110             = ix86_user_incoming_stack_boundary;
3111         }
3112     }
3113
3114   /* Accept -msseregparm only if at least SSE support is enabled.  */
3115   if (TARGET_SSEREGPARM
3116       && ! TARGET_SSE)
3117     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
3118
3119   ix86_fpmath = TARGET_FPMATH_DEFAULT;
3120   if (ix86_fpmath_string != 0)
3121     {
3122       if (! strcmp (ix86_fpmath_string, "387"))
3123         ix86_fpmath = FPMATH_387;
3124       else if (! strcmp (ix86_fpmath_string, "sse"))
3125         {
3126           if (!TARGET_SSE)
3127             {
3128               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3129               ix86_fpmath = FPMATH_387;
3130             }
3131           else
3132             ix86_fpmath = FPMATH_SSE;
3133         }
3134       else if (! strcmp (ix86_fpmath_string, "387,sse")
3135                || ! strcmp (ix86_fpmath_string, "387+sse")
3136                || ! strcmp (ix86_fpmath_string, "sse,387")
3137                || ! strcmp (ix86_fpmath_string, "sse+387")
3138                || ! strcmp (ix86_fpmath_string, "both"))
3139         {
3140           if (!TARGET_SSE)
3141             {
3142               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3143               ix86_fpmath = FPMATH_387;
3144             }
3145           else if (!TARGET_80387)
3146             {
3147               warning (0, "387 instruction set disabled, using SSE arithmetics");
3148               ix86_fpmath = FPMATH_SSE;
3149             }
3150           else
3151             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
3152         }
3153       else
3154         error ("bad value (%s) for %sfpmath=%s %s",
3155                ix86_fpmath_string, prefix, suffix, sw);
3156     }
3157
3158   /* If the i387 is disabled, then do not return values in it. */
3159   if (!TARGET_80387)
3160     target_flags &= ~MASK_FLOAT_RETURNS;
3161
3162   /* Use external vectorized library in vectorizing intrinsics.  */
3163   if (ix86_veclibabi_string)
3164     {
3165       if (strcmp (ix86_veclibabi_string, "svml") == 0)
3166         ix86_veclib_handler = ix86_veclibabi_svml;
3167       else if (strcmp (ix86_veclibabi_string, "acml") == 0)
3168         ix86_veclib_handler = ix86_veclibabi_acml;
3169       else
3170         error ("unknown vectorization library ABI type (%s) for "
3171                "%sveclibabi=%s %s", ix86_veclibabi_string,
3172                prefix, suffix, sw);
3173     }
3174
3175   if ((x86_accumulate_outgoing_args & ix86_tune_mask)
3176       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3177       && !optimize_size)
3178     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3179
3180   /* ??? Unwind info is not correct around the CFG unless either a frame
3181      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
3182      unwind info generation to be aware of the CFG and propagating states
3183      around edges.  */
3184   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
3185        || flag_exceptions || flag_non_call_exceptions)
3186       && flag_omit_frame_pointer
3187       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3188     {
3189       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3190         warning (0, "unwind tables currently require either a frame pointer "
3191                  "or %saccumulate-outgoing-args%s for correctness",
3192                  prefix, suffix);
3193       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3194     }
3195
3196   /* If stack probes are required, the space used for large function
3197      arguments on the stack must also be probed, so enable
3198      -maccumulate-outgoing-args so this happens in the prologue.  */
3199   if (TARGET_STACK_PROBE
3200       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3201     {
3202       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3203         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
3204                  "for correctness", prefix, suffix);
3205       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3206     }
3207
3208   /* For sane SSE instruction set generation we need fcomi instruction.
3209      It is safe to enable all CMOVE instructions.  */
3210   if (TARGET_SSE)
3211     TARGET_CMOVE = 1;
3212
3213   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
3214   {
3215     char *p;
3216     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
3217     p = strchr (internal_label_prefix, 'X');
3218     internal_label_prefix_len = p - internal_label_prefix;
3219     *p = '\0';
3220   }
3221
3222   /* When scheduling description is not available, disable scheduler pass
3223      so it won't slow down the compilation and make x87 code slower.  */
3224   if (!TARGET_SCHEDULE)
3225     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
3226
3227   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
3228     set_param_value ("simultaneous-prefetches",
3229                      ix86_cost->simultaneous_prefetches);
3230   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
3231     set_param_value ("l1-cache-line-size", ix86_cost->prefetch_block);
3232   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
3233     set_param_value ("l1-cache-size", ix86_cost->l1_cache_size);
3234   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
3235     set_param_value ("l2-cache-size", ix86_cost->l2_cache_size);
3236
3237   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3238      can be optimized to ap = __builtin_next_arg (0).  */
3239   if (!TARGET_64BIT)
3240     targetm.expand_builtin_va_start = NULL;
3241
3242   if (TARGET_64BIT)
3243     {
3244       ix86_gen_leave = gen_leave_rex64;
3245       ix86_gen_pop1 = gen_popdi1;
3246       ix86_gen_add3 = gen_adddi3;
3247       ix86_gen_sub3 = gen_subdi3;
3248       ix86_gen_sub3_carry = gen_subdi3_carry_rex64;
3249       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
3250       ix86_gen_monitor = gen_sse3_monitor64;
3251       ix86_gen_andsp = gen_anddi3;
3252     }
3253   else
3254     {
3255       ix86_gen_leave = gen_leave;
3256       ix86_gen_pop1 = gen_popsi1;
3257       ix86_gen_add3 = gen_addsi3;
3258       ix86_gen_sub3 = gen_subsi3;
3259       ix86_gen_sub3_carry = gen_subsi3_carry;
3260       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
3261       ix86_gen_monitor = gen_sse3_monitor;
3262       ix86_gen_andsp = gen_andsi3;
3263     }
3264
3265 #ifdef USE_IX86_CLD
3266   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
3267   if (!TARGET_64BIT)
3268     target_flags |= MASK_CLD & ~target_flags_explicit;
3269 #endif
3270
3271   /* Save the initial options in case the user does function specific options */
3272   if (main_args_p)
3273     target_option_default_node = target_option_current_node
3274       = build_target_option_node ();
3275 }
3276 \f
3277 /* Save the current options */
3278
3279 static void
3280 ix86_function_specific_save (struct cl_target_option *ptr)
3281 {
3282   gcc_assert (IN_RANGE (ix86_arch, 0, 255));
3283   gcc_assert (IN_RANGE (ix86_schedule, 0, 255));
3284   gcc_assert (IN_RANGE (ix86_tune, 0, 255));
3285   gcc_assert (IN_RANGE (ix86_fpmath, 0, 255));
3286   gcc_assert (IN_RANGE (ix86_branch_cost, 0, 255));
3287
3288   ptr->arch = ix86_arch;
3289   ptr->schedule = ix86_schedule;
3290   ptr->tune = ix86_tune;
3291   ptr->fpmath = ix86_fpmath;
3292   ptr->branch_cost = ix86_branch_cost;
3293   ptr->tune_defaulted = ix86_tune_defaulted;
3294   ptr->arch_specified = ix86_arch_specified;
3295   ptr->ix86_isa_flags_explicit = ix86_isa_flags_explicit;
3296   ptr->target_flags_explicit = target_flags_explicit;
3297 }
3298
3299 /* Restore the current options */
3300
3301 static void
3302 ix86_function_specific_restore (struct cl_target_option *ptr)
3303 {
3304   enum processor_type old_tune = ix86_tune;
3305   enum processor_type old_arch = ix86_arch;
3306   unsigned int ix86_arch_mask, ix86_tune_mask;
3307   int i;
3308
3309   ix86_arch = ptr->arch;
3310   ix86_schedule = ptr->schedule;
3311   ix86_tune = ptr->tune;
3312   ix86_fpmath = ptr->fpmath;
3313   ix86_branch_cost = ptr->branch_cost;
3314   ix86_tune_defaulted = ptr->tune_defaulted;
3315   ix86_arch_specified = ptr->arch_specified;
3316   ix86_isa_flags_explicit = ptr->ix86_isa_flags_explicit;
3317   target_flags_explicit = ptr->target_flags_explicit;
3318
3319   /* Recreate the arch feature tests if the arch changed */
3320   if (old_arch != ix86_arch)
3321     {
3322       ix86_arch_mask = 1u << ix86_arch;
3323       for (i = 0; i < X86_ARCH_LAST; ++i)
3324         ix86_arch_features[i]
3325           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3326     }
3327
3328   /* Recreate the tune optimization tests */
3329   if (old_tune != ix86_tune)
3330     {
3331       ix86_tune_mask = 1u << ix86_tune;
3332       for (i = 0; i < X86_TUNE_LAST; ++i)
3333         ix86_tune_features[i]
3334           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3335     }
3336 }
3337
3338 /* Print the current options */
3339
3340 static void
3341 ix86_function_specific_print (FILE *file, int indent,
3342                               struct cl_target_option *ptr)
3343 {
3344   char *target_string
3345     = ix86_target_string (ptr->ix86_isa_flags, ptr->target_flags,
3346                           NULL, NULL, NULL, false);
3347
3348   fprintf (file, "%*sarch = %d (%s)\n",
3349            indent, "",
3350            ptr->arch,
3351            ((ptr->arch < TARGET_CPU_DEFAULT_max)
3352             ? cpu_names[ptr->arch]
3353             : "<unknown>"));
3354
3355   fprintf (file, "%*stune = %d (%s)\n",
3356            indent, "",
3357            ptr->tune,
3358            ((ptr->tune < TARGET_CPU_DEFAULT_max)
3359             ? cpu_names[ptr->tune]
3360             : "<unknown>"));
3361
3362   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
3363            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
3364            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
3365   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
3366
3367   if (target_string)
3368     {
3369       fprintf (file, "%*s%s\n", indent, "", target_string);
3370       free (target_string);
3371     }
3372 }
3373
3374 \f
3375 /* Inner function to process the attribute((target(...))), take an argument and
3376    set the current options from the argument. If we have a list, recursively go
3377    over the list.  */
3378
3379 static bool
3380 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
3381 {
3382   char *next_optstr;
3383   bool ret = true;
3384
3385 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
3386 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
3387 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
3388 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
3389
3390   enum ix86_opt_type
3391   {
3392     ix86_opt_unknown,
3393     ix86_opt_yes,
3394     ix86_opt_no,
3395     ix86_opt_str,
3396     ix86_opt_isa
3397   };
3398
3399   static const struct
3400   {
3401     const char *string;
3402     size_t len;
3403     enum ix86_opt_type type;
3404     int opt;
3405     int mask;
3406   } attrs[] = {
3407     /* isa options */
3408     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
3409     IX86_ATTR_ISA ("abm",       OPT_mabm),
3410     IX86_ATTR_ISA ("aes",       OPT_maes),
3411     IX86_ATTR_ISA ("avx",       OPT_mavx),
3412     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
3413     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
3414     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
3415     IX86_ATTR_ISA ("sse",       OPT_msse),
3416     IX86_ATTR_ISA ("sse2",      OPT_msse2),
3417     IX86_ATTR_ISA ("sse3",      OPT_msse3),
3418     IX86_ATTR_ISA ("sse4",      OPT_msse4),
3419     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
3420     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
3421     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
3422     IX86_ATTR_ISA ("sse5",      OPT_msse5),
3423     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
3424
3425     /* string options */
3426     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
3427     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
3428     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
3429
3430     /* flag options */
3431     IX86_ATTR_YES ("cld",
3432                    OPT_mcld,
3433                    MASK_CLD),
3434
3435     IX86_ATTR_NO ("fancy-math-387",
3436                   OPT_mfancy_math_387,
3437                   MASK_NO_FANCY_MATH_387),
3438
3439     IX86_ATTR_NO ("fused-madd",
3440                   OPT_mfused_madd,
3441                   MASK_NO_FUSED_MADD),
3442
3443     IX86_ATTR_YES ("ieee-fp",
3444                    OPT_mieee_fp,
3445                    MASK_IEEE_FP),
3446
3447     IX86_ATTR_YES ("inline-all-stringops",
3448                    OPT_minline_all_stringops,
3449                    MASK_INLINE_ALL_STRINGOPS),
3450
3451     IX86_ATTR_YES ("inline-stringops-dynamically",
3452                    OPT_minline_stringops_dynamically,
3453                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
3454
3455     IX86_ATTR_NO ("align-stringops",
3456                   OPT_mno_align_stringops,
3457                   MASK_NO_ALIGN_STRINGOPS),
3458
3459     IX86_ATTR_YES ("recip",
3460                    OPT_mrecip,
3461                    MASK_RECIP),
3462
3463   };
3464
3465   /* If this is a list, recurse to get the options.  */
3466   if (TREE_CODE (args) == TREE_LIST)
3467     {
3468       bool ret = true;
3469
3470       for (; args; args = TREE_CHAIN (args))
3471         if (TREE_VALUE (args)
3472             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
3473           ret = false;
3474
3475       return ret;
3476     }
3477
3478   else if (TREE_CODE (args) != STRING_CST)
3479     gcc_unreachable ();
3480
3481   /* Handle multiple arguments separated by commas.  */
3482   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
3483
3484   while (next_optstr && *next_optstr != '\0')
3485     {
3486       char *p = next_optstr;
3487       char *orig_p = p;
3488       char *comma = strchr (next_optstr, ',');
3489       const char *opt_string;
3490       size_t len, opt_len;
3491       int opt;
3492       bool opt_set_p;
3493       char ch;
3494       unsigned i;
3495       enum ix86_opt_type type = ix86_opt_unknown;
3496       int mask = 0;
3497
3498       if (comma)
3499         {
3500           *comma = '\0';
3501           len = comma - next_optstr;
3502           next_optstr = comma + 1;
3503         }
3504       else
3505         {
3506           len = strlen (p);
3507           next_optstr = NULL;
3508         }
3509
3510       /* Recognize no-xxx.  */
3511       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
3512         {
3513           opt_set_p = false;
3514           p += 3;
3515           len -= 3;
3516         }
3517       else
3518         opt_set_p = true;
3519
3520       /* Find the option.  */
3521       ch = *p;
3522       opt = N_OPTS;
3523       for (i = 0; i < ARRAY_SIZE (attrs); i++)
3524         {
3525           type = attrs[i].type;
3526           opt_len = attrs[i].len;
3527           if (ch == attrs[i].string[0]
3528               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
3529               && memcmp (p, attrs[i].string, opt_len) == 0)
3530             {
3531               opt = attrs[i].opt;
3532               mask = attrs[i].mask;
3533               opt_string = attrs[i].string;
3534               break;
3535             }
3536         }
3537
3538       /* Process the option.  */
3539       if (opt == N_OPTS)
3540         {
3541           error ("attribute(target(\"%s\")) is unknown", orig_p);
3542           ret = false;
3543         }
3544
3545       else if (type == ix86_opt_isa)
3546         ix86_handle_option (opt, p, opt_set_p);
3547
3548       else if (type == ix86_opt_yes || type == ix86_opt_no)
3549         {
3550           if (type == ix86_opt_no)
3551             opt_set_p = !opt_set_p;
3552
3553           if (opt_set_p)
3554             target_flags |= mask;
3555           else
3556             target_flags &= ~mask;
3557         }
3558
3559       else if (type == ix86_opt_str)
3560         {
3561           if (p_strings[opt])
3562             {
3563               error ("option(\"%s\") was already specified", opt_string);
3564               ret = false;
3565             }
3566           else
3567             p_strings[opt] = xstrdup (p + opt_len);
3568         }
3569
3570       else
3571         gcc_unreachable ();
3572     }
3573
3574   return ret;
3575 }
3576
3577 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
3578
3579 tree
3580 ix86_valid_target_attribute_tree (tree args)
3581 {
3582   const char *orig_arch_string = ix86_arch_string;
3583   const char *orig_tune_string = ix86_tune_string;
3584   const char *orig_fpmath_string = ix86_fpmath_string;
3585   int orig_tune_defaulted = ix86_tune_defaulted;
3586   int orig_arch_specified = ix86_arch_specified;
3587   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
3588   tree t = NULL_TREE;
3589   int i;
3590   struct cl_target_option *def
3591     = TREE_TARGET_OPTION (target_option_default_node);
3592
3593   /* Process each of the options on the chain.  */
3594   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
3595     return NULL_TREE;
3596
3597   /* If the changed options are different from the default, rerun override_options,
3598      and then save the options away.  The string options are are attribute options,
3599      and will be undone when we copy the save structure.  */
3600   if (ix86_isa_flags != def->ix86_isa_flags
3601       || target_flags != def->target_flags
3602       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
3603       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
3604       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3605     {
3606       /* If we are using the default tune= or arch=, undo the string assigned,
3607          and use the default.  */
3608       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
3609         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
3610       else if (!orig_arch_specified)
3611         ix86_arch_string = NULL;
3612
3613       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
3614         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
3615       else if (orig_tune_defaulted)
3616         ix86_tune_string = NULL;
3617
3618       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
3619       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3620         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
3621       else if (!TARGET_64BIT && TARGET_SSE)
3622         ix86_fpmath_string = "sse,387";
3623
3624       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
3625       override_options (false);
3626
3627       /* Add any builtin functions with the new isa if any.  */
3628       ix86_add_new_builtins (ix86_isa_flags);
3629
3630       /* Save the current options unless we are validating options for
3631          #pragma.  */
3632       t = build_target_option_node ();
3633
3634       ix86_arch_string = orig_arch_string;
3635       ix86_tune_string = orig_tune_string;
3636       ix86_fpmath_string = orig_fpmath_string;
3637
3638       /* Free up memory allocated to hold the strings */
3639       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
3640         if (option_strings[i])
3641           free (option_strings[i]);
3642     }
3643
3644   return t;
3645 }
3646
3647 /* Hook to validate attribute((target("string"))).  */
3648
3649 static bool
3650 ix86_valid_target_attribute_p (tree fndecl,
3651                                tree ARG_UNUSED (name),
3652                                tree args,
3653                                int ARG_UNUSED (flags))
3654 {
3655   struct cl_target_option cur_target;
3656   bool ret = true;
3657   tree old_optimize = build_optimization_node ();
3658   tree new_target, new_optimize;
3659   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
3660
3661   /* If the function changed the optimization levels as well as setting target
3662      options, start with the optimizations specified.  */
3663   if (func_optimize && func_optimize != old_optimize)
3664     cl_optimization_restore (TREE_OPTIMIZATION (func_optimize));
3665
3666   /* The target attributes may also change some optimization flags, so update
3667      the optimization options if necessary.  */
3668   cl_target_option_save (&cur_target);
3669   new_target = ix86_valid_target_attribute_tree (args);
3670   new_optimize = build_optimization_node ();
3671
3672   if (!new_target)
3673     ret = false;
3674
3675   else if (fndecl)
3676     {
3677       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
3678
3679       if (old_optimize != new_optimize)
3680         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
3681     }
3682
3683   cl_target_option_restore (&cur_target);
3684
3685   if (old_optimize != new_optimize)
3686     cl_optimization_restore (TREE_OPTIMIZATION (old_optimize));
3687
3688   return ret;
3689 }
3690
3691 \f
3692 /* Hook to determine if one function can safely inline another.  */
3693
3694 static bool
3695 ix86_can_inline_p (tree caller, tree callee)
3696 {
3697   bool ret = false;
3698   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
3699   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
3700
3701   /* If callee has no option attributes, then it is ok to inline.  */
3702   if (!callee_tree)
3703     ret = true;
3704
3705   /* If caller has no option attributes, but callee does then it is not ok to
3706      inline.  */
3707   else if (!caller_tree)
3708     ret = false;
3709
3710   else
3711     {
3712       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
3713       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
3714
3715       /* Callee's isa options should a subset of the caller's, i.e. a SSE5 function
3716          can inline a SSE2 function but a SSE2 function can't inline a SSE5
3717          function.  */
3718       if ((caller_opts->ix86_isa_flags & callee_opts->ix86_isa_flags)
3719           != callee_opts->ix86_isa_flags)
3720         ret = false;
3721
3722       /* See if we have the same non-isa options.  */
3723       else if (caller_opts->target_flags != callee_opts->target_flags)
3724         ret = false;
3725
3726       /* See if arch, tune, etc. are the same.  */
3727       else if (caller_opts->arch != callee_opts->arch)
3728         ret = false;
3729
3730       else if (caller_opts->tune != callee_opts->tune)
3731         ret = false;
3732
3733       else if (caller_opts->fpmath != callee_opts->fpmath)
3734         ret = false;
3735
3736       else if (caller_opts->branch_cost != callee_opts->branch_cost)
3737         ret = false;
3738
3739       else
3740         ret = true;
3741     }
3742
3743   return ret;
3744 }
3745
3746 \f
3747 /* Remember the last target of ix86_set_current_function.  */
3748 static GTY(()) tree ix86_previous_fndecl;
3749
3750 /* Establish appropriate back-end context for processing the function
3751    FNDECL.  The argument might be NULL to indicate processing at top
3752    level, outside of any function scope.  */
3753 static void
3754 ix86_set_current_function (tree fndecl)
3755 {
3756   /* Only change the context if the function changes.  This hook is called
3757      several times in the course of compiling a function, and we don't want to
3758      slow things down too much or call target_reinit when it isn't safe.  */
3759   if (fndecl && fndecl != ix86_previous_fndecl)
3760     {
3761       tree old_tree = (ix86_previous_fndecl
3762                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
3763                        : NULL_TREE);
3764
3765       tree new_tree = (fndecl
3766                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
3767                        : NULL_TREE);
3768
3769       ix86_previous_fndecl = fndecl;
3770       if (old_tree == new_tree)
3771         ;
3772
3773       else if (new_tree)
3774         {
3775           cl_target_option_restore (TREE_TARGET_OPTION (new_tree));
3776           target_reinit ();
3777         }
3778
3779       else if (old_tree)
3780         {
3781           struct cl_target_option *def
3782             = TREE_TARGET_OPTION (target_option_current_node);
3783
3784           cl_target_option_restore (def);
3785           target_reinit ();
3786         }
3787     }
3788 }
3789
3790 \f
3791 /* Return true if this goes in large data/bss.  */
3792
3793 static bool
3794 ix86_in_large_data_p (tree exp)
3795 {
3796   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
3797     return false;
3798
3799   /* Functions are never large data.  */
3800   if (TREE_CODE (exp) == FUNCTION_DECL)
3801     return false;
3802
3803   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
3804     {
3805       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
3806       if (strcmp (section, ".ldata") == 0
3807           || strcmp (section, ".lbss") == 0)
3808         return true;
3809       return false;
3810     }
3811   else
3812     {
3813       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
3814
3815       /* If this is an incomplete type with size 0, then we can't put it
3816          in data because it might be too big when completed.  */
3817       if (!size || size > ix86_section_threshold)
3818         return true;
3819     }
3820
3821   return false;
3822 }
3823
3824 /* Switch to the appropriate section for output of DECL.
3825    DECL is either a `VAR_DECL' node or a constant of some sort.
3826    RELOC indicates whether forming the initial value of DECL requires
3827    link-time relocations.  */
3828
3829 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
3830         ATTRIBUTE_UNUSED;
3831
3832 static section *
3833 x86_64_elf_select_section (tree decl, int reloc,
3834                            unsigned HOST_WIDE_INT align)
3835 {
3836   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3837       && ix86_in_large_data_p (decl))
3838     {
3839       const char *sname = NULL;
3840       unsigned int flags = SECTION_WRITE;
3841       switch (categorize_decl_for_section (decl, reloc))
3842         {
3843         case SECCAT_DATA:
3844           sname = ".ldata";
3845           break;
3846         case SECCAT_DATA_REL:
3847           sname = ".ldata.rel";
3848           break;
3849         case SECCAT_DATA_REL_LOCAL:
3850           sname = ".ldata.rel.local";
3851           break;
3852         case SECCAT_DATA_REL_RO:
3853           sname = ".ldata.rel.ro";
3854           break;
3855         case SECCAT_DATA_REL_RO_LOCAL:
3856           sname = ".ldata.rel.ro.local";
3857           break;
3858         case SECCAT_BSS:
3859           sname = ".lbss";
3860           flags |= SECTION_BSS;
3861           break;
3862         case SECCAT_RODATA:
3863         case SECCAT_RODATA_MERGE_STR:
3864         case SECCAT_RODATA_MERGE_STR_INIT:
3865         case SECCAT_RODATA_MERGE_CONST:
3866           sname = ".lrodata";
3867           flags = 0;
3868           break;
3869         case SECCAT_SRODATA:
3870         case SECCAT_SDATA:
3871         case SECCAT_SBSS:
3872           gcc_unreachable ();
3873         case SECCAT_TEXT:
3874         case SECCAT_TDATA:
3875         case SECCAT_TBSS:
3876           /* We don't split these for medium model.  Place them into
3877              default sections and hope for best.  */
3878           break;
3879         case SECCAT_EMUTLS_VAR:
3880         case SECCAT_EMUTLS_TMPL:
3881           gcc_unreachable ();
3882         }
3883       if (sname)
3884         {
3885           /* We might get called with string constants, but get_named_section
3886              doesn't like them as they are not DECLs.  Also, we need to set
3887              flags in that case.  */
3888           if (!DECL_P (decl))
3889             return get_section (sname, flags, NULL);
3890           return get_named_section (decl, sname, reloc);
3891         }
3892     }
3893   return default_elf_select_section (decl, reloc, align);
3894 }
3895
3896 /* Build up a unique section name, expressed as a
3897    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
3898    RELOC indicates whether the initial value of EXP requires
3899    link-time relocations.  */
3900
3901 static void ATTRIBUTE_UNUSED
3902 x86_64_elf_unique_section (tree decl, int reloc)
3903 {
3904   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3905       && ix86_in_large_data_p (decl))
3906     {
3907       const char *prefix = NULL;
3908       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
3909       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
3910
3911       switch (categorize_decl_for_section (decl, reloc))
3912         {
3913         case SECCAT_DATA:
3914         case SECCAT_DATA_REL:
3915         case SECCAT_DATA_REL_LOCAL:
3916         case SECCAT_DATA_REL_RO:
3917         case SECCAT_DATA_REL_RO_LOCAL:
3918           prefix = one_only ? ".ld" : ".ldata";
3919           break;
3920         case SECCAT_BSS:
3921           prefix = one_only ? ".lb" : ".lbss";
3922           break;
3923         case SECCAT_RODATA:
3924         case SECCAT_RODATA_MERGE_STR:
3925         case SECCAT_RODATA_MERGE_STR_INIT:
3926         case SECCAT_RODATA_MERGE_CONST:
3927           prefix = one_only ? ".lr" : ".lrodata";
3928           break;
3929         case SECCAT_SRODATA:
3930         case SECCAT_SDATA:
3931         case SECCAT_SBSS:
3932           gcc_unreachable ();
3933         case SECCAT_TEXT:
3934         case SECCAT_TDATA:
3935         case SECCAT_TBSS:
3936           /* We don't split these for medium model.  Place them into
3937              default sections and hope for best.  */
3938           break;
3939         case SECCAT_EMUTLS_VAR:
3940           prefix = targetm.emutls.var_section;
3941           break;
3942         case SECCAT_EMUTLS_TMPL:
3943           prefix = targetm.emutls.tmpl_section;
3944           break;
3945         }
3946       if (prefix)
3947         {
3948           const char *name, *linkonce;
3949           char *string;
3950
3951           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3952           name = targetm.strip_name_encoding (name);
3953           
3954           /* If we're using one_only, then there needs to be a .gnu.linkonce
3955              prefix to the section name.  */
3956           linkonce = one_only ? ".gnu.linkonce" : "";
3957   
3958           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
3959           
3960           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
3961           return;
3962         }
3963     }
3964   default_unique_section (decl, reloc);
3965 }
3966
3967 #ifdef COMMON_ASM_OP
3968 /* This says how to output assembler code to declare an
3969    uninitialized external linkage data object.
3970
3971    For medium model x86-64 we need to use .largecomm opcode for
3972    large objects.  */
3973 void
3974 x86_elf_aligned_common (FILE *file,
3975                         const char *name, unsigned HOST_WIDE_INT size,
3976                         int align)
3977 {
3978   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3979       && size > (unsigned int)ix86_section_threshold)
3980     fprintf (file, ".largecomm\t");
3981   else
3982     fprintf (file, "%s", COMMON_ASM_OP);
3983   assemble_name (file, name);
3984   fprintf (file, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
3985            size, align / BITS_PER_UNIT);
3986 }
3987 #endif
3988
3989 /* Utility function for targets to use in implementing
3990    ASM_OUTPUT_ALIGNED_BSS.  */
3991
3992 void
3993 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
3994                         const char *name, unsigned HOST_WIDE_INT size,
3995                         int align)
3996 {
3997   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3998       && size > (unsigned int)ix86_section_threshold)
3999     switch_to_section (get_named_section (decl, ".lbss", 0));
4000   else
4001     switch_to_section (bss_section);
4002   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
4003 #ifdef ASM_DECLARE_OBJECT_NAME
4004   last_assemble_variable_decl = decl;
4005   ASM_DECLARE_OBJECT_NAME (file, name, decl);
4006 #else
4007   /* Standard thing is just output label for the object.  */
4008   ASM_OUTPUT_LABEL (file, name);
4009 #endif /* ASM_DECLARE_OBJECT_NAME */
4010   ASM_OUTPUT_SKIP (file, size ? size : 1);
4011 }
4012 \f
4013 void
4014 optimization_options (int level, int size ATTRIBUTE_UNUSED)
4015 {
4016   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
4017      make the problem with not enough registers even worse.  */
4018 #ifdef INSN_SCHEDULING
4019   if (level > 1)
4020     flag_schedule_insns = 0;
4021 #endif
4022
4023   if (TARGET_MACHO)
4024     /* The Darwin libraries never set errno, so we might as well
4025        avoid calling them when that's the only reason we would.  */
4026     flag_errno_math = 0;
4027
4028   /* The default values of these switches depend on the TARGET_64BIT
4029      that is not known at this moment.  Mark these values with 2 and
4030      let user the to override these.  In case there is no command line option
4031      specifying them, we will set the defaults in override_options.  */
4032   if (optimize >= 1)
4033     flag_omit_frame_pointer = 2;
4034   flag_pcc_struct_return = 2;
4035   flag_asynchronous_unwind_tables = 2;
4036   flag_vect_cost_model = 1;
4037 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
4038   SUBTARGET_OPTIMIZATION_OPTIONS;
4039 #endif
4040 }
4041 \f
4042 /* Decide whether we can make a sibling call to a function.  DECL is the
4043    declaration of the function being targeted by the call and EXP is the
4044    CALL_EXPR representing the call.  */
4045
4046 static bool
4047 ix86_function_ok_for_sibcall (tree decl, tree exp)
4048 {
4049   tree func;
4050   rtx a, b;
4051
4052   /* If we are generating position-independent code, we cannot sibcall
4053      optimize any indirect call, or a direct call to a global function,
4054      as the PLT requires %ebx be live.  */
4055   if (!TARGET_64BIT && flag_pic && (!decl || !targetm.binds_local_p (decl)))
4056     return false;
4057
4058   if (decl)
4059     func = decl;
4060   else
4061     {
4062       func = TREE_TYPE (CALL_EXPR_FN (exp));
4063       if (POINTER_TYPE_P (func))
4064         func = TREE_TYPE (func);
4065     }
4066
4067   /* Check that the return value locations are the same.  Like
4068      if we are returning floats on the 80387 register stack, we cannot
4069      make a sibcall from a function that doesn't return a float to a
4070      function that does or, conversely, from a function that does return
4071      a float to a function that doesn't; the necessary stack adjustment
4072      would not be executed.  This is also the place we notice
4073      differences in the return value ABI.  Note that it is ok for one
4074      of the functions to have void return type as long as the return
4075      value of the other is passed in a register.  */
4076   a = ix86_function_value (TREE_TYPE (exp), func, false);
4077   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
4078                            cfun->decl, false);
4079   if (STACK_REG_P (a) || STACK_REG_P (b))
4080     {
4081       if (!rtx_equal_p (a, b))
4082         return false;
4083     }
4084   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
4085     ;
4086   else if (!rtx_equal_p (a, b))
4087     return false;
4088
4089   /* If this call is indirect, we'll need to be able to use a call-clobbered
4090      register for the address of the target function.  Make sure that all
4091      such registers are not used for passing parameters.  */
4092   if (!decl && !TARGET_64BIT)
4093     {
4094       tree type;
4095
4096       /* We're looking at the CALL_EXPR, we need the type of the function.  */
4097       type = CALL_EXPR_FN (exp);                /* pointer expression */
4098       type = TREE_TYPE (type);                  /* pointer type */
4099       type = TREE_TYPE (type);                  /* function type */
4100
4101       if (ix86_function_regparm (type, NULL) >= 3)
4102         {
4103           /* ??? Need to count the actual number of registers to be used,
4104              not the possible number of registers.  Fix later.  */
4105           return false;
4106         }
4107     }
4108
4109   /* Dllimport'd functions are also called indirectly.  */
4110   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
4111       && !TARGET_64BIT
4112       && decl && DECL_DLLIMPORT_P (decl)
4113       && ix86_function_regparm (TREE_TYPE (decl), NULL) >= 3)
4114     return false;
4115
4116   /* If we need to align the outgoing stack, then sibcalling would
4117      unalign the stack, which may break the called function.  */
4118   if (ix86_incoming_stack_boundary < PREFERRED_STACK_BOUNDARY)
4119     return false;
4120
4121   /* Otherwise okay.  That also includes certain types of indirect calls.  */
4122   return true;
4123 }
4124
4125 /* Handle "cdecl", "stdcall", "fastcall", "regparm" and "sseregparm"
4126    calling convention attributes;
4127    arguments as in struct attribute_spec.handler.  */
4128
4129 static tree
4130 ix86_handle_cconv_attribute (tree *node, tree name,
4131                                    tree args,
4132                                    int flags ATTRIBUTE_UNUSED,
4133                                    bool *no_add_attrs)
4134 {
4135   if (TREE_CODE (*node) != FUNCTION_TYPE
4136       && TREE_CODE (*node) != METHOD_TYPE
4137       && TREE_CODE (*node) != FIELD_DECL
4138       && TREE_CODE (*node) != TYPE_DECL)
4139     {
4140       warning (OPT_Wattributes, "%qs attribute only applies to functions",
4141                IDENTIFIER_POINTER (name));
4142       *no_add_attrs = true;
4143       return NULL_TREE;
4144     }
4145
4146   /* Can combine regparm with all attributes but fastcall.  */
4147   if (is_attribute_p ("regparm", name))
4148     {
4149       tree cst;
4150
4151       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4152         {
4153           error ("fastcall and regparm attributes are not compatible");
4154         }
4155
4156       cst = TREE_VALUE (args);
4157       if (TREE_CODE (cst) != INTEGER_CST)
4158         {
4159           warning (OPT_Wattributes,
4160                    "%qs attribute requires an integer constant argument",
4161                    IDENTIFIER_POINTER (name));
4162           *no_add_attrs = true;
4163         }
4164       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
4165         {
4166           warning (OPT_Wattributes, "argument to %qs attribute larger than %d",
4167                    IDENTIFIER_POINTER (name), REGPARM_MAX);
4168           *no_add_attrs = true;
4169         }
4170
4171       return NULL_TREE;
4172     }
4173
4174   if (TARGET_64BIT)
4175     {
4176       /* Do not warn when emulating the MS ABI.  */
4177       if (TREE_CODE (*node) != FUNCTION_TYPE || ix86_function_type_abi (*node)!=MS_ABI)
4178         warning (OPT_Wattributes, "%qs attribute ignored",
4179                  IDENTIFIER_POINTER (name));
4180       *no_add_attrs = true;
4181       return NULL_TREE;
4182     }
4183
4184   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
4185   if (is_attribute_p ("fastcall", name))
4186     {
4187       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4188         {
4189           error ("fastcall and cdecl attributes are not compatible");
4190         }
4191       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4192         {
4193           error ("fastcall and stdcall attributes are not compatible");
4194         }
4195       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
4196         {
4197           error ("fastcall and regparm attributes are not compatible");
4198         }
4199     }
4200
4201   /* Can combine stdcall with fastcall (redundant), regparm and
4202      sseregparm.  */
4203   else if (is_attribute_p ("stdcall", name))
4204     {
4205       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4206         {
4207           error ("stdcall and cdecl attributes are not compatible");
4208         }
4209       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4210         {
4211           error ("stdcall and fastcall attributes are not compatible");
4212         }
4213     }
4214
4215   /* Can combine cdecl with regparm and sseregparm.  */
4216   else if (is_attribute_p ("cdecl", name))
4217     {
4218       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4219         {
4220           error ("stdcall and cdecl attributes are not compatible");
4221         }
4222       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4223         {
4224           error ("fastcall and cdecl attributes are not compatible");
4225         }
4226     }
4227
4228   /* Can combine sseregparm with all attributes.  */
4229
4230   return NULL_TREE;
4231 }
4232
4233 /* Return 0 if the attributes for two types are incompatible, 1 if they
4234    are compatible, and 2 if they are nearly compatible (which causes a
4235    warning to be generated).  */
4236
4237 static int
4238 ix86_comp_type_attributes (const_tree type1, const_tree type2)
4239 {
4240   /* Check for mismatch of non-default calling convention.  */
4241   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
4242
4243   if (TREE_CODE (type1) != FUNCTION_TYPE
4244       && TREE_CODE (type1) != METHOD_TYPE)
4245     return 1;
4246
4247   /* Check for mismatched fastcall/regparm types.  */
4248   if ((!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
4249        != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
4250       || (ix86_function_regparm (type1, NULL)
4251           != ix86_function_regparm (type2, NULL)))
4252     return 0;
4253
4254   /* Check for mismatched sseregparm types.  */
4255   if (!lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type1))
4256       != !lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type2)))
4257     return 0;
4258
4259   /* Check for mismatched return types (cdecl vs stdcall).  */
4260   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
4261       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
4262     return 0;
4263
4264   return 1;
4265 }
4266 \f
4267 /* Return the regparm value for a function with the indicated TYPE and DECL.
4268    DECL may be NULL when calling function indirectly
4269    or considering a libcall.  */
4270
4271 static int
4272 ix86_function_regparm (const_tree type, const_tree decl)
4273 {
4274   tree attr;
4275   int regparm = ix86_regparm;
4276
4277   static bool error_issued;
4278
4279   if (TARGET_64BIT)
4280     {
4281       if (ix86_function_type_abi (type) == DEFAULT_ABI)
4282         return regparm;
4283       return DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
4284     }
4285
4286   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
4287   if (attr)
4288     {
4289       regparm
4290         = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
4291
4292       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4293         {
4294           /* We can't use regparm(3) for nested functions because
4295              these pass static chain pointer in %ecx register.  */
4296           if (!error_issued && regparm == 3
4297               && decl_function_context (decl)
4298               && !DECL_NO_STATIC_CHAIN (decl))
4299             {
4300               error ("nested functions are limited to 2 register parameters");
4301               error_issued = true;
4302               return 0;
4303             }
4304         }
4305
4306       return regparm;
4307     }
4308
4309   if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
4310     return 2;
4311
4312   /* Use register calling convention for local functions when possible.  */
4313   if (decl && TREE_CODE (decl) == FUNCTION_DECL
4314       && !profile_flag)
4315     {
4316       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4317       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4318       if (i && i->local)
4319         {
4320           int local_regparm, globals = 0, regno;
4321           struct function *f;
4322
4323           /* Make sure no regparm register is taken by a
4324              fixed register variable.  */
4325           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
4326             if (fixed_regs[local_regparm])
4327               break;
4328
4329           /* We can't use regparm(3) for nested functions as these use
4330              static chain pointer in third argument.  */
4331           if (local_regparm == 3
4332               && decl_function_context (decl)
4333               && !DECL_NO_STATIC_CHAIN (decl))
4334             local_regparm = 2;
4335
4336           /* If the function realigns its stackpointer, the prologue will
4337              clobber %ecx.  If we've already generated code for the callee,
4338              the callee DECL_STRUCT_FUNCTION is gone, so we fall back to
4339              scanning the attributes for the self-realigning property.  */
4340           f = DECL_STRUCT_FUNCTION (decl);
4341           /* Since current internal arg pointer won't conflict with
4342              parameter passing regs, so no need to change stack
4343              realignment and adjust regparm number.
4344
4345              Each fixed register usage increases register pressure,
4346              so less registers should be used for argument passing.
4347              This functionality can be overriden by an explicit
4348              regparm value.  */
4349           for (regno = 0; regno <= DI_REG; regno++)
4350             if (fixed_regs[regno])
4351               globals++;
4352
4353           local_regparm
4354             = globals < local_regparm ? local_regparm - globals : 0;
4355
4356           if (local_regparm > regparm)
4357             regparm = local_regparm;
4358         }
4359     }
4360
4361   return regparm;
4362 }
4363
4364 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
4365    DFmode (2) arguments in SSE registers for a function with the
4366    indicated TYPE and DECL.  DECL may be NULL when calling function
4367    indirectly or considering a libcall.  Otherwise return 0.  */
4368
4369 static int
4370 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
4371 {
4372   gcc_assert (!TARGET_64BIT);
4373
4374   /* Use SSE registers to pass SFmode and DFmode arguments if requested
4375      by the sseregparm attribute.  */
4376   if (TARGET_SSEREGPARM
4377       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
4378     {
4379       if (!TARGET_SSE)
4380         {
4381           if (warn)
4382             {
4383               if (decl)
4384                 error ("Calling %qD with attribute sseregparm without "
4385                        "SSE/SSE2 enabled", decl);
4386               else
4387                 error ("Calling %qT with attribute sseregparm without "
4388                        "SSE/SSE2 enabled", type);
4389             }
4390           return 0;
4391         }
4392
4393       return 2;
4394     }
4395
4396   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
4397      (and DFmode for SSE2) arguments in SSE registers.  */
4398   if (decl && TARGET_SSE_MATH && !profile_flag)
4399     {
4400       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4401       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4402       if (i && i->local)
4403         return TARGET_SSE2 ? 2 : 1;
4404     }
4405
4406   return 0;
4407 }
4408
4409 /* Return true if EAX is live at the start of the function.  Used by
4410    ix86_expand_prologue to determine if we need special help before
4411    calling allocate_stack_worker.  */
4412
4413 static bool
4414 ix86_eax_live_at_start_p (void)
4415 {
4416   /* Cheat.  Don't bother working forward from ix86_function_regparm
4417      to the function type to whether an actual argument is located in
4418      eax.  Instead just look at cfg info, which is still close enough
4419      to correct at this point.  This gives false positives for broken
4420      functions that might use uninitialized data that happens to be
4421      allocated in eax, but who cares?  */
4422   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
4423 }
4424
4425 /* Value is the number of bytes of arguments automatically
4426    popped when returning from a subroutine call.
4427    FUNDECL is the declaration node of the function (as a tree),
4428    FUNTYPE is the data type of the function (as a tree),
4429    or for a library call it is an identifier node for the subroutine name.
4430    SIZE is the number of bytes of arguments passed on the stack.
4431
4432    On the 80386, the RTD insn may be used to pop them if the number
4433      of args is fixed, but if the number is variable then the caller
4434      must pop them all.  RTD can't be used for library calls now
4435      because the library is compiled with the Unix compiler.
4436    Use of RTD is a selectable option, since it is incompatible with
4437    standard Unix calling sequences.  If the option is not selected,
4438    the caller must always pop the args.
4439
4440    The attribute stdcall is equivalent to RTD on a per module basis.  */
4441
4442 int
4443 ix86_return_pops_args (tree fundecl, tree funtype, int size)
4444 {
4445   int rtd;
4446
4447   /* None of the 64-bit ABIs pop arguments.  */
4448   if (TARGET_64BIT)
4449     return 0;
4450
4451   rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
4452
4453   /* Cdecl functions override -mrtd, and never pop the stack.  */
4454   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype)))
4455     {
4456       /* Stdcall and fastcall functions will pop the stack if not
4457          variable args.  */
4458       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
4459           || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
4460         rtd = 1;
4461
4462       if (rtd && ! stdarg_p (funtype))
4463         return size;
4464     }
4465
4466   /* Lose any fake structure return argument if it is passed on the stack.  */
4467   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
4468       && !KEEP_AGGREGATE_RETURN_POINTER)
4469     {
4470       int nregs = ix86_function_regparm (funtype, fundecl);
4471       if (nregs == 0)
4472         return GET_MODE_SIZE (Pmode);
4473     }
4474
4475   return 0;
4476 }
4477 \f
4478 /* Argument support functions.  */
4479
4480 /* Return true when register may be used to pass function parameters.  */
4481 bool
4482 ix86_function_arg_regno_p (int regno)
4483 {
4484   int i;
4485   const int *parm_regs;
4486
4487   if (!TARGET_64BIT)
4488     {
4489       if (TARGET_MACHO)
4490         return (regno < REGPARM_MAX
4491                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
4492       else
4493         return (regno < REGPARM_MAX
4494                 || (TARGET_MMX && MMX_REGNO_P (regno)
4495                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
4496                 || (TARGET_SSE && SSE_REGNO_P (regno)
4497                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
4498     }
4499
4500   if (TARGET_MACHO)
4501     {
4502       if (SSE_REGNO_P (regno) && TARGET_SSE)
4503         return true;
4504     }
4505   else
4506     {
4507       if (TARGET_SSE && SSE_REGNO_P (regno)
4508           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
4509         return true;
4510     }
4511
4512   /* TODO: The function should depend on current function ABI but
4513      builtins.c would need updating then. Therefore we use the
4514      default ABI.  */
4515
4516   /* RAX is used as hidden argument to va_arg functions.  */
4517   if (DEFAULT_ABI == SYSV_ABI && regno == AX_REG)
4518     return true;
4519
4520   if (DEFAULT_ABI == MS_ABI)
4521     parm_regs = x86_64_ms_abi_int_parameter_registers;
4522   else
4523     parm_regs = x86_64_int_parameter_registers;
4524   for (i = 0; i < (DEFAULT_ABI == MS_ABI ? X64_REGPARM_MAX
4525                                          : X86_64_REGPARM_MAX); i++)
4526     if (regno == parm_regs[i])
4527       return true;
4528   return false;
4529 }
4530
4531 /* Return if we do not know how to pass TYPE solely in registers.  */
4532
4533 static bool
4534 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
4535 {
4536   if (must_pass_in_stack_var_size_or_pad (mode, type))
4537     return true;
4538
4539   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
4540      The layout_type routine is crafty and tries to trick us into passing
4541      currently unsupported vector types on the stack by using TImode.  */
4542   return (!TARGET_64BIT && mode == TImode
4543           && type && TREE_CODE (type) != VECTOR_TYPE);
4544 }
4545
4546 /* It returns the size, in bytes, of the area reserved for arguments passed
4547    in registers for the function represented by fndecl dependent to the used
4548    abi format.  */
4549 int
4550 ix86_reg_parm_stack_space (const_tree fndecl)
4551 {
4552   int call_abi = SYSV_ABI;
4553   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
4554     call_abi = ix86_function_abi (fndecl);
4555   else
4556     call_abi = ix86_function_type_abi (fndecl);
4557   if (call_abi == MS_ABI)
4558     return 32;
4559   return 0;
4560 }
4561
4562 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
4563    call abi used.  */
4564 int
4565 ix86_function_type_abi (const_tree fntype)
4566 {
4567   if (TARGET_64BIT && fntype != NULL)
4568     {
4569       int abi;
4570       if (DEFAULT_ABI == SYSV_ABI)
4571         abi = lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)) ? MS_ABI : SYSV_ABI;
4572       else
4573         abi = lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)) ? SYSV_ABI : MS_ABI;
4574
4575       return abi;
4576     }
4577   return DEFAULT_ABI;
4578 }
4579
4580 int
4581 ix86_function_abi (const_tree fndecl)
4582 {
4583   if (! fndecl)
4584     return DEFAULT_ABI;
4585   return ix86_function_type_abi (TREE_TYPE (fndecl));
4586 }
4587
4588 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
4589    call abi used.  */
4590 int
4591 ix86_cfun_abi (void)
4592 {
4593   if (! cfun || ! TARGET_64BIT)
4594     return DEFAULT_ABI;
4595   return cfun->machine->call_abi;
4596 }
4597
4598 /* regclass.c  */
4599 extern void init_regs (void);
4600
4601 /* Implementation of call abi switching target hook. Specific to FNDECL
4602    the specific call register sets are set. See also CONDITIONAL_REGISTER_USAGE
4603    for more details.  */
4604 void
4605 ix86_call_abi_override (const_tree fndecl)
4606 {
4607   if (fndecl == NULL_TREE)
4608     cfun->machine->call_abi = DEFAULT_ABI;
4609   else
4610     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
4611 }
4612
4613 /* MS and SYSV ABI have different set of call used registers.  Avoid expensive
4614    re-initialization of init_regs each time we switch function context since
4615    this is needed only during RTL expansion.  */
4616 static void
4617 ix86_maybe_switch_abi (void)
4618 {
4619   if (TARGET_64BIT &&
4620       call_used_regs[4 /*RSI*/] ==  (cfun->machine->call_abi == MS_ABI))
4621     reinit_regs ();
4622 }
4623
4624 /* Initialize a variable CUM of type CUMULATIVE_ARGS
4625    for a call to a function whose data type is FNTYPE.
4626    For a library call, FNTYPE is 0.  */
4627
4628 void
4629 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
4630                       tree fntype,      /* tree ptr for function decl */
4631                       rtx libname,      /* SYMBOL_REF of library name or 0 */
4632                       tree fndecl)
4633 {
4634   struct cgraph_local_info *i = fndecl ? cgraph_local_info (fndecl) : NULL;
4635   memset (cum, 0, sizeof (*cum));
4636
4637   if (fndecl)
4638    cum->call_abi = ix86_function_abi (fndecl);
4639   else
4640    cum->call_abi = ix86_function_type_abi (fntype);
4641   /* Set up the number of registers to use for passing arguments.  */
4642
4643   if (cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
4644     sorry ("ms_abi attribute require -maccumulate-outgoing-args or subtarget optimization implying it");
4645   cum->nregs = ix86_regparm;
4646   if (TARGET_64BIT)
4647     {
4648       if (cum->call_abi != DEFAULT_ABI)
4649         cum->nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX
4650                                              : X64_REGPARM_MAX;
4651     }
4652   if (TARGET_SSE)
4653     {
4654       cum->sse_nregs = SSE_REGPARM_MAX;
4655       if (TARGET_64BIT)
4656         {
4657           if (cum->call_abi != DEFAULT_ABI)
4658             cum->sse_nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
4659                                                      : X64_SSE_REGPARM_MAX;
4660         }
4661     }
4662   if (TARGET_MMX)
4663     cum->mmx_nregs = MMX_REGPARM_MAX;
4664   cum->warn_avx = true;
4665   cum->warn_sse = true;
4666   cum->warn_mmx = true;
4667
4668   /* Because type might mismatch in between caller and callee, we need to
4669      use actual type of function for local calls.
4670      FIXME: cgraph_analyze can be told to actually record if function uses
4671      va_start so for local functions maybe_vaarg can be made aggressive
4672      helping K&R code.
4673      FIXME: once typesytem is fixed, we won't need this code anymore.  */
4674   if (i && i->local)
4675     fntype = TREE_TYPE (fndecl);
4676   cum->maybe_vaarg = (fntype
4677                       ? (!prototype_p (fntype) || stdarg_p (fntype))
4678                       : !libname);
4679
4680   if (!TARGET_64BIT)
4681     {
4682       /* If there are variable arguments, then we won't pass anything
4683          in registers in 32-bit mode. */
4684       if (stdarg_p (fntype))
4685         {
4686           cum->nregs = 0;
4687           cum->sse_nregs = 0;
4688           cum->mmx_nregs = 0;
4689           cum->warn_avx = 0;
4690           cum->warn_sse = 0;
4691           cum->warn_mmx = 0;
4692           return;
4693         }
4694
4695       /* Use ecx and edx registers if function has fastcall attribute,
4696          else look for regparm information.  */
4697       if (fntype)
4698         {
4699           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
4700             {
4701               cum->nregs = 2;
4702               cum->fastcall = 1;
4703             }
4704           else
4705             cum->nregs = ix86_function_regparm (fntype, fndecl);
4706         }
4707
4708       /* Set up the number of SSE registers used for passing SFmode
4709          and DFmode arguments.  Warn for mismatching ABI.  */
4710       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
4711     }
4712 }
4713
4714 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
4715    But in the case of vector types, it is some vector mode.
4716
4717    When we have only some of our vector isa extensions enabled, then there
4718    are some modes for which vector_mode_supported_p is false.  For these
4719    modes, the generic vector support in gcc will choose some non-vector mode
4720    in order to implement the type.  By computing the natural mode, we'll
4721    select the proper ABI location for the operand and not depend on whatever
4722    the middle-end decides to do with these vector types.
4723
4724    The midde-end can't deal with the vector types > 16 bytes.  In this
4725    case, we return the original mode and warn ABI change if CUM isn't
4726    NULL.  */
4727
4728 static enum machine_mode
4729 type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
4730 {
4731   enum machine_mode mode = TYPE_MODE (type);
4732
4733   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
4734     {
4735       HOST_WIDE_INT size = int_size_in_bytes (type);
4736       if ((size == 8 || size == 16 || size == 32)
4737           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
4738           && TYPE_VECTOR_SUBPARTS (type) > 1)
4739         {
4740           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
4741
4742           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
4743             mode = MIN_MODE_VECTOR_FLOAT;
4744           else
4745             mode = MIN_MODE_VECTOR_INT;
4746
4747           /* Get the mode which has this inner mode and number of units.  */
4748           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
4749             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
4750                 && GET_MODE_INNER (mode) == innermode)
4751               {
4752                 if (size == 32 && !TARGET_AVX)
4753                   {
4754                     static bool warnedavx;
4755
4756                     if (cum
4757                         && !warnedavx 
4758                         && cum->warn_avx)
4759                       {
4760                         warnedavx = true;
4761                         warning (0, "AVX vector argument without AVX "
4762                                  "enabled changes the ABI");
4763                       }
4764                     return TYPE_MODE (type);
4765                   }
4766                 else
4767                   return mode;
4768               }
4769
4770           gcc_unreachable ();
4771         }
4772     }
4773
4774   return mode;
4775 }
4776
4777 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
4778    this may not agree with the mode that the type system has chosen for the
4779    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
4780    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
4781
4782 static rtx
4783 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
4784                      unsigned int regno)
4785 {
4786   rtx tmp;
4787
4788   if (orig_mode != BLKmode)
4789     tmp = gen_rtx_REG (orig_mode, regno);
4790   else
4791     {
4792       tmp = gen_rtx_REG (mode, regno);
4793       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
4794       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
4795     }
4796
4797   return tmp;
4798 }
4799
4800 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
4801    of this code is to classify each 8bytes of incoming argument by the register
4802    class and assign registers accordingly.  */
4803
4804 /* Return the union class of CLASS1 and CLASS2.
4805    See the x86-64 PS ABI for details.  */
4806
4807 static enum x86_64_reg_class
4808 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
4809 {
4810   /* Rule #1: If both classes are equal, this is the resulting class.  */
4811   if (class1 == class2)
4812     return class1;
4813
4814   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
4815      the other class.  */
4816   if (class1 == X86_64_NO_CLASS)
4817     return class2;
4818   if (class2 == X86_64_NO_CLASS)
4819     return class1;
4820
4821   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
4822   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
4823     return X86_64_MEMORY_CLASS;
4824
4825   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
4826   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
4827       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
4828     return X86_64_INTEGERSI_CLASS;
4829   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
4830       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
4831     return X86_64_INTEGER_CLASS;
4832
4833   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
4834      MEMORY is used.  */
4835   if (class1 == X86_64_X87_CLASS
4836       || class1 == X86_64_X87UP_CLASS
4837       || class1 == X86_64_COMPLEX_X87_CLASS
4838       || class2 == X86_64_X87_CLASS
4839       || class2 == X86_64_X87UP_CLASS
4840       || class2 == X86_64_COMPLEX_X87_CLASS)
4841     return X86_64_MEMORY_CLASS;
4842
4843   /* Rule #6: Otherwise class SSE is used.  */
4844   return X86_64_SSE_CLASS;
4845 }
4846
4847 /* Classify the argument of type TYPE and mode MODE.
4848    CLASSES will be filled by the register class used to pass each word
4849    of the operand.  The number of words is returned.  In case the parameter
4850    should be passed in memory, 0 is returned. As a special case for zero
4851    sized containers, classes[0] will be NO_CLASS and 1 is returned.
4852
4853    BIT_OFFSET is used internally for handling records and specifies offset
4854    of the offset in bits modulo 256 to avoid overflow cases.
4855
4856    See the x86-64 PS ABI for details.
4857 */
4858
4859 static int
4860 classify_argument (enum machine_mode mode, const_tree type,
4861                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
4862 {
4863   HOST_WIDE_INT bytes =
4864     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
4865   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4866
4867   /* Variable sized entities are always passed/returned in memory.  */
4868   if (bytes < 0)
4869     return 0;
4870
4871   if (mode != VOIDmode
4872       && targetm.calls.must_pass_in_stack (mode, type))
4873     return 0;
4874
4875   if (type && AGGREGATE_TYPE_P (type))
4876     {
4877       int i;
4878       tree field;
4879       enum x86_64_reg_class subclasses[MAX_CLASSES];
4880
4881       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
4882       if (bytes > 32)
4883         return 0;
4884
4885       for (i = 0; i < words; i++)
4886         classes[i] = X86_64_NO_CLASS;
4887
4888       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
4889          signalize memory class, so handle it as special case.  */
4890       if (!words)
4891         {
4892           classes[0] = X86_64_NO_CLASS;
4893           return 1;
4894         }
4895
4896       /* Classify each field of record and merge classes.  */
4897       switch (TREE_CODE (type))
4898         {
4899         case RECORD_TYPE:
4900           /* And now merge the fields of structure.  */
4901           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4902             {
4903               if (TREE_CODE (field) == FIELD_DECL)
4904                 {
4905                   int num;
4906
4907                   if (TREE_TYPE (field) == error_mark_node)
4908                     continue;
4909
4910                   /* Bitfields are always classified as integer.  Handle them
4911                      early, since later code would consider them to be
4912                      misaligned integers.  */
4913                   if (DECL_BIT_FIELD (field))
4914                     {
4915                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
4916                            i < ((int_bit_position (field) + (bit_offset % 64))
4917                                 + tree_low_cst (DECL_SIZE (field), 0)
4918                                 + 63) / 8 / 8; i++)
4919                         classes[i] =
4920                           merge_classes (X86_64_INTEGER_CLASS,
4921                                          classes[i]);
4922                     }
4923                   else
4924                     {
4925                       num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
4926                                                TREE_TYPE (field), subclasses,
4927                                                (int_bit_position (field)
4928                                                 + bit_offset) % 256);
4929                       if (!num)
4930                         return 0;
4931                       for (i = 0; i < num; i++)
4932                         {
4933                           int pos =
4934                             (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
4935                           classes[i + pos] =
4936                             merge_classes (subclasses[i], classes[i + pos]);
4937                         }
4938                     }
4939                 }
4940             }
4941           break;
4942
4943         case ARRAY_TYPE:
4944           /* Arrays are handled as small records.  */
4945           {
4946             int num;
4947             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
4948                                      TREE_TYPE (type), subclasses, bit_offset);
4949             if (!num)
4950               return 0;
4951
4952             /* The partial classes are now full classes.  */
4953             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
4954               subclasses[0] = X86_64_SSE_CLASS;
4955             if (subclasses[0] == X86_64_INTEGERSI_CLASS
4956                 && !((bit_offset % 64) == 0 && bytes == 4))
4957               subclasses[0] = X86_64_INTEGER_CLASS;
4958
4959             for (i = 0; i < words; i++)
4960               classes[i] = subclasses[i % num];
4961
4962             break;
4963           }
4964         case UNION_TYPE:
4965         case QUAL_UNION_TYPE:
4966           /* Unions are similar to RECORD_TYPE but offset is always 0.
4967              */
4968           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4969             {
4970               if (TREE_CODE (field) == FIELD_DECL)
4971                 {
4972                   int num;
4973
4974                   if (TREE_TYPE (field) == error_mark_node)
4975                     continue;
4976
4977                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
4978                                            TREE_TYPE (field), subclasses,
4979                                            bit_offset);
4980                   if (!num)
4981                     return 0;
4982                   for (i = 0; i < num; i++)
4983                     classes[i] = merge_classes (subclasses[i], classes[i]);
4984                 }
4985             }
4986           break;
4987
4988         default:
4989           gcc_unreachable ();
4990         }
4991
4992       if (words > 2)
4993         {
4994           /* When size > 16 bytes, if the first one isn't
4995              X86_64_SSE_CLASS or any other ones aren't
4996              X86_64_SSEUP_CLASS, everything should be passed in
4997              memory.  */
4998           if (classes[0] != X86_64_SSE_CLASS)
4999               return 0;
5000
5001           for (i = 1; i < words; i++)
5002             if (classes[i] != X86_64_SSEUP_CLASS)
5003               return 0;
5004         }
5005
5006       /* Final merger cleanup.  */
5007       for (i = 0; i < words; i++)
5008         {
5009           /* If one class is MEMORY, everything should be passed in
5010              memory.  */
5011           if (classes[i] == X86_64_MEMORY_CLASS)
5012             return 0;
5013
5014           /* The X86_64_SSEUP_CLASS should be always preceded by
5015              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
5016           if (classes[i] == X86_64_SSEUP_CLASS
5017               && classes[i - 1] != X86_64_SSE_CLASS
5018               && classes[i - 1] != X86_64_SSEUP_CLASS)
5019             {
5020               /* The first one should never be X86_64_SSEUP_CLASS.  */
5021               gcc_assert (i != 0);
5022               classes[i] = X86_64_SSE_CLASS;
5023             }
5024
5025           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
5026                everything should be passed in memory.  */
5027           if (classes[i] == X86_64_X87UP_CLASS
5028               && (classes[i - 1] != X86_64_X87_CLASS))
5029             {
5030               static bool warned;
5031
5032               /* The first one should never be X86_64_X87UP_CLASS.  */
5033               gcc_assert (i != 0);
5034               if (!warned && warn_psabi)
5035                 {
5036                   warned = true;
5037                   inform (input_location,
5038                           "The ABI of passing union with long double"
5039                           " has changed in GCC 4.4");
5040                 }
5041               return 0;
5042             }
5043         }
5044       return words;
5045     }
5046
5047   /* Compute alignment needed.  We align all types to natural boundaries with
5048      exception of XFmode that is aligned to 64bits.  */
5049   if (mode != VOIDmode && mode != BLKmode)
5050     {
5051       int mode_alignment = GET_MODE_BITSIZE (mode);
5052
5053       if (mode == XFmode)
5054         mode_alignment = 128;
5055       else if (mode == XCmode)
5056         mode_alignment = 256;
5057       if (COMPLEX_MODE_P (mode))
5058         mode_alignment /= 2;
5059       /* Misaligned fields are always returned in memory.  */
5060       if (bit_offset % mode_alignment)
5061         return 0;
5062     }
5063
5064   /* for V1xx modes, just use the base mode */
5065   if (VECTOR_MODE_P (mode) && mode != V1DImode
5066       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
5067     mode = GET_MODE_INNER (mode);
5068
5069   /* Classification of atomic types.  */
5070   switch (mode)
5071     {
5072     case SDmode:
5073     case DDmode:
5074       classes[0] = X86_64_SSE_CLASS;
5075       return 1;
5076     case TDmode:
5077       classes[0] = X86_64_SSE_CLASS;
5078       classes[1] = X86_64_SSEUP_CLASS;
5079       return 2;
5080     case DImode:
5081     case SImode:
5082     case HImode:
5083     case QImode:
5084     case CSImode:
5085     case CHImode:
5086     case CQImode:
5087       {
5088         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
5089
5090         if (size <= 32)
5091           {
5092             classes[0] = X86_64_INTEGERSI_CLASS;
5093             return 1;
5094           }
5095         else if (size <= 64)
5096           {
5097             classes[0] = X86_64_INTEGER_CLASS;
5098             return 1;
5099           }
5100         else if (size <= 64+32)
5101           {
5102             classes[0] = X86_64_INTEGER_CLASS;
5103             classes[1] = X86_64_INTEGERSI_CLASS;
5104             return 2;
5105           }
5106         else if (size <= 64+64)
5107           {
5108             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5109             return 2;
5110           }
5111         else
5112           gcc_unreachable ();
5113       }
5114     case CDImode:
5115     case TImode:
5116       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5117       return 2;
5118     case COImode:
5119     case OImode:
5120       /* OImode shouldn't be used directly.  */
5121       gcc_unreachable ();
5122     case CTImode:
5123       return 0;
5124     case SFmode:
5125       if (!(bit_offset % 64))
5126         classes[0] = X86_64_SSESF_CLASS;
5127       else
5128         classes[0] = X86_64_SSE_CLASS;
5129       return 1;
5130     case DFmode:
5131       classes[0] = X86_64_SSEDF_CLASS;
5132       return 1;
5133     case XFmode:
5134       classes[0] = X86_64_X87_CLASS;
5135       classes[1] = X86_64_X87UP_CLASS;
5136       return 2;
5137     case TFmode:
5138       classes[0] = X86_64_SSE_CLASS;
5139       classes[1] = X86_64_SSEUP_CLASS;
5140       return 2;
5141     case SCmode:
5142       classes[0] = X86_64_SSE_CLASS;
5143       return 1;
5144     case DCmode:
5145       classes[0] = X86_64_SSEDF_CLASS;
5146       classes[1] = X86_64_SSEDF_CLASS;
5147       return 2;
5148     case XCmode:
5149       classes[0] = X86_64_COMPLEX_X87_CLASS;
5150       return 1;
5151     case TCmode:
5152       /* This modes is larger than 16 bytes.  */
5153       return 0;
5154     case V8SFmode:
5155     case V8SImode:
5156     case V32QImode:
5157     case V16HImode:
5158     case V4DFmode:
5159     case V4DImode:
5160       classes[0] = X86_64_SSE_CLASS;
5161       classes[1] = X86_64_SSEUP_CLASS;
5162       classes[2] = X86_64_SSEUP_CLASS;
5163       classes[3] = X86_64_SSEUP_CLASS;
5164       return 4;
5165     case V4SFmode:
5166     case V4SImode:
5167     case V16QImode:
5168     case V8HImode:
5169     case V2DFmode:
5170     case V2DImode:
5171       classes[0] = X86_64_SSE_CLASS;
5172       classes[1] = X86_64_SSEUP_CLASS;
5173       return 2;
5174     case V1DImode:
5175     case V2SFmode:
5176     case V2SImode:
5177     case V4HImode:
5178     case V8QImode:
5179       classes[0] = X86_64_SSE_CLASS;
5180       return 1;
5181     case BLKmode:
5182     case VOIDmode:
5183       return 0;
5184     default:
5185       gcc_assert (VECTOR_MODE_P (mode));
5186
5187       if (bytes > 16)
5188         return 0;
5189
5190       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
5191
5192       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
5193         classes[0] = X86_64_INTEGERSI_CLASS;
5194       else
5195         classes[0] = X86_64_INTEGER_CLASS;
5196       classes[1] = X86_64_INTEGER_CLASS;
5197       return 1 + (bytes > 8);
5198     }
5199 }
5200
5201 /* Examine the argument and return set number of register required in each
5202    class.  Return 0 iff parameter should be passed in memory.  */
5203 static int
5204 examine_argument (enum machine_mode mode, const_tree type, int in_return,
5205                   int *int_nregs, int *sse_nregs)
5206 {
5207   enum x86_64_reg_class regclass[MAX_CLASSES];
5208   int n = classify_argument (mode, type, regclass, 0);
5209
5210   *int_nregs = 0;
5211   *sse_nregs = 0;
5212   if (!n)
5213     return 0;
5214   for (n--; n >= 0; n--)
5215     switch (regclass[n])
5216       {
5217       case X86_64_INTEGER_CLASS:
5218       case X86_64_INTEGERSI_CLASS:
5219         (*int_nregs)++;
5220         break;
5221       case X86_64_SSE_CLASS:
5222       case X86_64_SSESF_CLASS:
5223       case X86_64_SSEDF_CLASS:
5224         (*sse_nregs)++;
5225         break;
5226       case X86_64_NO_CLASS:
5227       case X86_64_SSEUP_CLASS:
5228         break;
5229       case X86_64_X87_CLASS:
5230       case X86_64_X87UP_CLASS:
5231         if (!in_return)
5232           return 0;
5233         break;
5234       case X86_64_COMPLEX_X87_CLASS:
5235         return in_return ? 2 : 0;
5236       case X86_64_MEMORY_CLASS:
5237         gcc_unreachable ();
5238       }
5239   return 1;
5240 }
5241
5242 /* Construct container for the argument used by GCC interface.  See
5243    FUNCTION_ARG for the detailed description.  */
5244
5245 static rtx
5246 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
5247                      const_tree type, int in_return, int nintregs, int nsseregs,
5248                      const int *intreg, int sse_regno)
5249 {
5250   /* The following variables hold the static issued_error state.  */
5251   static bool issued_sse_arg_error;
5252   static bool issued_sse_ret_error;
5253   static bool issued_x87_ret_error;
5254
5255   enum machine_mode tmpmode;
5256   int bytes =
5257     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5258   enum x86_64_reg_class regclass[MAX_CLASSES];
5259   int n;
5260   int i;
5261   int nexps = 0;
5262   int needed_sseregs, needed_intregs;
5263   rtx exp[MAX_CLASSES];
5264   rtx ret;
5265
5266   n = classify_argument (mode, type, regclass, 0);
5267   if (!n)
5268     return NULL;
5269   if (!examine_argument (mode, type, in_return, &needed_intregs,
5270                          &needed_sseregs))
5271     return NULL;
5272   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
5273     return NULL;
5274
5275   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
5276      some less clueful developer tries to use floating-point anyway.  */
5277   if (needed_sseregs && !TARGET_SSE)
5278     {
5279       if (in_return)
5280         {
5281           if (!issued_sse_ret_error)
5282             {
5283               error ("SSE register return with SSE disabled");
5284               issued_sse_ret_error = true;
5285             }
5286         }
5287       else if (!issued_sse_arg_error)
5288         {
5289           error ("SSE register argument with SSE disabled");
5290           issued_sse_arg_error = true;
5291         }
5292       return NULL;
5293     }
5294
5295   /* Likewise, error if the ABI requires us to return values in the
5296      x87 registers and the user specified -mno-80387.  */
5297   if (!TARGET_80387 && in_return)
5298     for (i = 0; i < n; i++)
5299       if (regclass[i] == X86_64_X87_CLASS
5300           || regclass[i] == X86_64_X87UP_CLASS
5301           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
5302         {
5303           if (!issued_x87_ret_error)
5304             {
5305               error ("x87 register return with x87 disabled");
5306               issued_x87_ret_error = true;
5307             }
5308           return NULL;
5309         }
5310
5311   /* First construct simple cases.  Avoid SCmode, since we want to use
5312      single register to pass this type.  */
5313   if (n == 1 && mode != SCmode)
5314     switch (regclass[0])
5315       {
5316       case X86_64_INTEGER_CLASS:
5317       case X86_64_INTEGERSI_CLASS:
5318         return gen_rtx_REG (mode, intreg[0]);
5319       case X86_64_SSE_CLASS:
5320       case X86_64_SSESF_CLASS:
5321       case X86_64_SSEDF_CLASS:
5322         return gen_reg_or_parallel (mode, orig_mode, SSE_REGNO (sse_regno));
5323       case X86_64_X87_CLASS:
5324       case X86_64_COMPLEX_X87_CLASS:
5325         return gen_rtx_REG (mode, FIRST_STACK_REG);
5326       case X86_64_NO_CLASS:
5327         /* Zero sized array, struct or class.  */
5328         return NULL;
5329       default:
5330         gcc_unreachable ();
5331       }
5332   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
5333       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
5334     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5335   if (n == 4
5336       && regclass[0] == X86_64_SSE_CLASS
5337       && regclass[1] == X86_64_SSEUP_CLASS
5338       && regclass[2] == X86_64_SSEUP_CLASS
5339       && regclass[3] == X86_64_SSEUP_CLASS
5340       && mode != BLKmode)
5341     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5342
5343   if (n == 2
5344       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
5345     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
5346   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
5347       && regclass[1] == X86_64_INTEGER_CLASS
5348       && (mode == CDImode || mode == TImode || mode == TFmode)
5349       && intreg[0] + 1 == intreg[1])
5350     return gen_rtx_REG (mode, intreg[0]);
5351
5352   /* Otherwise figure out the entries of the PARALLEL.  */
5353   for (i = 0; i < n; i++)
5354     {
5355       int pos;
5356
5357       switch (regclass[i])
5358         {
5359           case X86_64_NO_CLASS:
5360             break;
5361           case X86_64_INTEGER_CLASS:
5362           case X86_64_INTEGERSI_CLASS:
5363             /* Merge TImodes on aligned occasions here too.  */
5364             if (i * 8 + 8 > bytes)
5365               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
5366             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
5367               tmpmode = SImode;
5368             else
5369               tmpmode = DImode;
5370             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
5371             if (tmpmode == BLKmode)
5372               tmpmode = DImode;
5373             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5374                                                gen_rtx_REG (tmpmode, *intreg),
5375                                                GEN_INT (i*8));
5376             intreg++;
5377             break;
5378           case X86_64_SSESF_CLASS:
5379             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5380                                                gen_rtx_REG (SFmode,
5381                                                             SSE_REGNO (sse_regno)),
5382                                                GEN_INT (i*8));
5383             sse_regno++;
5384             break;
5385           case X86_64_SSEDF_CLASS:
5386             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5387                                                gen_rtx_REG (DFmode,
5388                                                             SSE_REGNO (sse_regno)),
5389                                                GEN_INT (i*8));
5390             sse_regno++;
5391             break;
5392           case X86_64_SSE_CLASS:
5393             pos = i;
5394             switch (n)
5395               {
5396               case 1:
5397                 tmpmode = DImode;
5398                 break;
5399               case 2:
5400                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
5401                   {
5402                     tmpmode = TImode;
5403                     i++;
5404                   }
5405                 else
5406                   tmpmode = DImode;
5407                 break;
5408               case 4:
5409                 gcc_assert (i == 0
5410                             && regclass[1] == X86_64_SSEUP_CLASS
5411                             && regclass[2] == X86_64_SSEUP_CLASS
5412                             && regclass[3] == X86_64_SSEUP_CLASS);
5413                 tmpmode = OImode;
5414                 i += 3;
5415                 break;
5416               default:
5417                 gcc_unreachable ();
5418               }
5419             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5420                                                gen_rtx_REG (tmpmode,
5421                                                             SSE_REGNO (sse_regno)),
5422                                                GEN_INT (pos*8));
5423             sse_regno++;
5424             break;
5425           default:
5426             gcc_unreachable ();
5427         }
5428     }
5429
5430   /* Empty aligned struct, union or class.  */
5431   if (nexps == 0)
5432     return NULL;
5433
5434   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
5435   for (i = 0; i < nexps; i++)
5436     XVECEXP (ret, 0, i) = exp [i];
5437   return ret;
5438 }
5439
5440 /* Update the data in CUM to advance over an argument of mode MODE
5441    and data type TYPE.  (TYPE is null for libcalls where that information
5442    may not be available.)  */
5443
5444 static void
5445 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5446                          tree type, HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5447 {
5448   switch (mode)
5449     {
5450     default:
5451       break;
5452
5453     case BLKmode:
5454       if (bytes < 0)
5455         break;
5456       /* FALLTHRU */
5457
5458     case DImode:
5459     case SImode:
5460     case HImode:
5461     case QImode:
5462       cum->words += words;
5463       cum->nregs -= words;
5464       cum->regno += words;
5465
5466       if (cum->nregs <= 0)
5467         {
5468           cum->nregs = 0;
5469           cum->regno = 0;
5470         }
5471       break;
5472
5473     case OImode:
5474       /* OImode shouldn't be used directly.  */
5475       gcc_unreachable ();
5476
5477     case DFmode:
5478       if (cum->float_in_sse < 2)
5479         break;
5480     case SFmode:
5481       if (cum->float_in_sse < 1)
5482         break;
5483       /* FALLTHRU */
5484
5485     case V8SFmode:
5486     case V8SImode:
5487     case V32QImode:
5488     case V16HImode:
5489     case V4DFmode:
5490     case V4DImode:
5491     case TImode:
5492     case V16QImode:
5493     case V8HImode:
5494     case V4SImode:
5495     case V2DImode:
5496     case V4SFmode:
5497     case V2DFmode:
5498       if (!type || !AGGREGATE_TYPE_P (type))
5499         {
5500           cum->sse_words += words;
5501           cum->sse_nregs -= 1;
5502           cum->sse_regno += 1;
5503           if (cum->sse_nregs <= 0)
5504             {
5505               cum->sse_nregs = 0;
5506               cum->sse_regno = 0;
5507             }
5508         }
5509       break;
5510
5511     case V8QImode:
5512     case V4HImode:
5513     case V2SImode:
5514     case V2SFmode:
5515     case V1DImode:
5516       if (!type || !AGGREGATE_TYPE_P (type))
5517         {
5518           cum->mmx_words += words;
5519           cum->mmx_nregs -= 1;
5520           cum->mmx_regno += 1;
5521           if (cum->mmx_nregs <= 0)
5522             {
5523               cum->mmx_nregs = 0;
5524               cum->mmx_regno = 0;
5525             }
5526         }
5527       break;
5528     }
5529 }
5530
5531 static void
5532 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5533                          tree type, HOST_WIDE_INT words, int named)
5534 {
5535   int int_nregs, sse_nregs;
5536
5537   /* Unnamed 256bit vector mode parameters are passed on stack.  */
5538   if (!named && VALID_AVX256_REG_MODE (mode))
5539     return;
5540
5541   if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
5542     cum->words += words;
5543   else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
5544     {
5545       cum->nregs -= int_nregs;
5546       cum->sse_nregs -= sse_nregs;
5547       cum->regno += int_nregs;
5548       cum->sse_regno += sse_nregs;
5549     }
5550   else
5551     cum->words += words;
5552 }
5553
5554 static void
5555 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
5556                             HOST_WIDE_INT words)
5557 {
5558   /* Otherwise, this should be passed indirect.  */
5559   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
5560
5561   cum->words += words;
5562   if (cum->nregs > 0)
5563     {
5564       cum->nregs -= 1;
5565       cum->regno += 1;
5566     }
5567 }
5568
5569 void
5570 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5571                       tree type, int named)
5572 {
5573   HOST_WIDE_INT bytes, words;
5574
5575   if (mode == BLKmode)
5576     bytes = int_size_in_bytes (type);
5577   else
5578     bytes = GET_MODE_SIZE (mode);
5579   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5580
5581   if (type)
5582     mode = type_natural_mode (type, NULL);
5583
5584   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5585     function_arg_advance_ms_64 (cum, bytes, words);
5586   else if (TARGET_64BIT)
5587     function_arg_advance_64 (cum, mode, type, words, named);
5588   else
5589     function_arg_advance_32 (cum, mode, type, bytes, words);
5590 }
5591
5592 /* Define where to put the arguments to a function.
5593    Value is zero to push the argument on the stack,
5594    or a hard register in which to store the argument.
5595
5596    MODE is the argument's machine mode.
5597    TYPE is the data type of the argument (as a tree).
5598     This is null for libcalls where that information may
5599     not be available.
5600    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5601     the preceding args and about the function being called.
5602    NAMED is nonzero if this argument is a named parameter
5603     (otherwise it is an extra parameter matching an ellipsis).  */
5604
5605 static rtx
5606 function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5607                  enum machine_mode orig_mode, tree type,
5608                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5609 {
5610   static bool warnedsse, warnedmmx;
5611
5612   /* Avoid the AL settings for the Unix64 ABI.  */
5613   if (mode == VOIDmode)
5614     return constm1_rtx;
5615
5616   switch (mode)
5617     {
5618     default:
5619       break;
5620
5621     case BLKmode:
5622       if (bytes < 0)
5623         break;
5624       /* FALLTHRU */
5625     case DImode:
5626     case SImode:
5627     case HImode:
5628     case QImode:
5629       if (words <= cum->nregs)
5630         {
5631           int regno = cum->regno;
5632
5633           /* Fastcall allocates the first two DWORD (SImode) or
5634             smaller arguments to ECX and EDX if it isn't an
5635             aggregate type .  */
5636           if (cum->fastcall)
5637             {
5638               if (mode == BLKmode
5639                   || mode == DImode
5640                   || (type && AGGREGATE_TYPE_P (type)))
5641                 break;
5642
5643               /* ECX not EAX is the first allocated register.  */
5644               if (regno == AX_REG)
5645                 regno = CX_REG;
5646             }
5647           return gen_rtx_REG (mode, regno);
5648         }
5649       break;
5650
5651     case DFmode:
5652       if (cum->float_in_sse < 2)
5653         break;
5654     case SFmode:
5655       if (cum->float_in_sse < 1)
5656         break;
5657       /* FALLTHRU */
5658     case TImode:
5659       /* In 32bit, we pass TImode in xmm registers.  */
5660     case V16QImode:
5661     case V8HImode:
5662     case V4SImode:
5663     case V2DImode:
5664     case V4SFmode:
5665     case V2DFmode:
5666       if (!type || !AGGREGATE_TYPE_P (type))
5667         {
5668           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
5669             {
5670               warnedsse = true;
5671               warning (0, "SSE vector argument without SSE enabled "
5672                        "changes the ABI");
5673             }
5674           if (cum->sse_nregs)
5675             return gen_reg_or_parallel (mode, orig_mode,
5676                                         cum->sse_regno + FIRST_SSE_REG);
5677         }
5678       break;
5679
5680     case OImode:
5681       /* OImode shouldn't be used directly.  */
5682       gcc_unreachable ();
5683
5684     case V8SFmode:
5685     case V8SImode:
5686     case V32QImode:
5687     case V16HImode:
5688     case V4DFmode:
5689     case V4DImode:
5690       if (!type || !AGGREGATE_TYPE_P (type))
5691         {
5692           if (cum->sse_nregs)
5693             return gen_reg_or_parallel (mode, orig_mode,
5694                                         cum->sse_regno + FIRST_SSE_REG);
5695         }
5696       break;
5697
5698     case V8QImode:
5699     case V4HImode:
5700     case V2SImode:
5701     case V2SFmode:
5702     case V1DImode:
5703       if (!type || !AGGREGATE_TYPE_P (type))
5704         {
5705           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
5706             {
5707               warnedmmx = true;
5708               warning (0, "MMX vector argument without MMX enabled "
5709                        "changes the ABI");
5710             }
5711           if (cum->mmx_nregs)
5712             return gen_reg_or_parallel (mode, orig_mode,
5713                                         cum->mmx_regno + FIRST_MMX_REG);
5714         }
5715       break;
5716     }
5717
5718   return NULL_RTX;
5719 }
5720
5721 static rtx
5722 function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5723                  enum machine_mode orig_mode, tree type, int named)
5724 {
5725   /* Handle a hidden AL argument containing number of registers
5726      for varargs x86-64 functions.  */
5727   if (mode == VOIDmode)
5728     return GEN_INT (cum->maybe_vaarg
5729                     ? (cum->sse_nregs < 0
5730                        ? (cum->call_abi == DEFAULT_ABI
5731                           ? SSE_REGPARM_MAX
5732                           : (DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
5733                                                      : X64_SSE_REGPARM_MAX))
5734                : cum->sse_regno)
5735                     : -1);
5736
5737   switch (mode)
5738     {
5739     default:
5740       break;
5741
5742     case V8SFmode:
5743     case V8SImode:
5744     case V32QImode:
5745     case V16HImode:
5746     case V4DFmode:
5747     case V4DImode:
5748       /* Unnamed 256bit vector mode parameters are passed on stack.  */
5749       if (!named)
5750         return NULL;
5751       break;
5752     }
5753
5754   return construct_container (mode, orig_mode, type, 0, cum->nregs,
5755                               cum->sse_nregs,
5756                               &x86_64_int_parameter_registers [cum->regno],
5757                               cum->sse_regno);
5758 }
5759
5760 static rtx
5761 function_arg_ms_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5762                     enum machine_mode orig_mode, int named,
5763                     HOST_WIDE_INT bytes)
5764 {
5765   unsigned int regno;
5766
5767   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
5768      We use value of -2 to specify that current function call is MSABI.  */
5769   if (mode == VOIDmode)
5770     return GEN_INT (-2);
5771
5772   /* If we've run out of registers, it goes on the stack.  */
5773   if (cum->nregs == 0)
5774     return NULL_RTX;
5775
5776   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
5777
5778   /* Only floating point modes are passed in anything but integer regs.  */
5779   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
5780     {
5781       if (named)
5782         regno = cum->regno + FIRST_SSE_REG;
5783       else
5784         {
5785           rtx t1, t2;
5786
5787           /* Unnamed floating parameters are passed in both the
5788              SSE and integer registers.  */
5789           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
5790           t2 = gen_rtx_REG (mode, regno);
5791           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
5792           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
5793           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
5794         }
5795     }
5796   /* Handle aggregated types passed in register.  */
5797   if (orig_mode == BLKmode)
5798     {
5799       if (bytes > 0 && bytes <= 8)
5800         mode = (bytes > 4 ? DImode : SImode);
5801       if (mode == BLKmode)
5802         mode = DImode;
5803     }
5804
5805   return gen_reg_or_parallel (mode, orig_mode, regno);
5806 }
5807
5808 rtx
5809 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
5810               tree type, int named)
5811 {
5812   enum machine_mode mode = omode;
5813   HOST_WIDE_INT bytes, words;
5814
5815   if (mode == BLKmode)
5816     bytes = int_size_in_bytes (type);
5817   else
5818     bytes = GET_MODE_SIZE (mode);
5819   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5820
5821   /* To simplify the code below, represent vector types with a vector mode
5822      even if MMX/SSE are not active.  */
5823   if (type && TREE_CODE (type) == VECTOR_TYPE)
5824     mode = type_natural_mode (type, cum);
5825
5826   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5827     return function_arg_ms_64 (cum, mode, omode, named, bytes);
5828   else if (TARGET_64BIT)
5829     return function_arg_64 (cum, mode, omode, type, named);
5830   else
5831     return function_arg_32 (cum, mode, omode, type, bytes, words);
5832 }
5833
5834 /* A C expression that indicates when an argument must be passed by
5835    reference.  If nonzero for an argument, a copy of that argument is
5836    made in memory and a pointer to the argument is passed instead of
5837    the argument itself.  The pointer is passed in whatever way is
5838    appropriate for passing a pointer to that type.  */
5839
5840 static bool
5841 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5842                         enum machine_mode mode ATTRIBUTE_UNUSED,
5843                         const_tree type, bool named ATTRIBUTE_UNUSED)
5844 {
5845   /* See Windows x64 Software Convention.  */
5846   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5847     {
5848       int msize = (int) GET_MODE_SIZE (mode);
5849       if (type)
5850         {
5851           /* Arrays are passed by reference.  */
5852           if (TREE_CODE (type) == ARRAY_TYPE)
5853             return true;
5854
5855           if (AGGREGATE_TYPE_P (type))
5856             {
5857               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
5858                  are passed by reference.  */
5859               msize = int_size_in_bytes (type);
5860             }
5861         }
5862
5863       /* __m128 is passed by reference.  */
5864       switch (msize) {
5865       case 1: case 2: case 4: case 8:
5866         break;
5867       default:
5868         return true;
5869       }
5870     }
5871   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
5872     return 1;
5873
5874   return 0;
5875 }
5876
5877 /* Return true when TYPE should be 128bit aligned for 32bit argument passing
5878    ABI.  */
5879 static bool
5880 contains_aligned_value_p (tree type)
5881 {
5882   enum machine_mode mode = TYPE_MODE (type);
5883   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
5884        || mode == TDmode
5885        || mode == TFmode
5886        || mode == TCmode)
5887       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
5888     return true;
5889   if (TYPE_ALIGN (type) < 128)
5890     return false;
5891
5892   if (AGGREGATE_TYPE_P (type))
5893     {
5894       /* Walk the aggregates recursively.  */
5895       switch (TREE_CODE (type))
5896         {
5897         case RECORD_TYPE:
5898         case UNION_TYPE:
5899         case QUAL_UNION_TYPE:
5900           {
5901             tree field;
5902
5903             /* Walk all the structure fields.  */
5904             for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5905               {
5906                 if (TREE_CODE (field) == FIELD_DECL
5907                     && contains_aligned_value_p (TREE_TYPE (field)))
5908                   return true;
5909               }
5910             break;
5911           }
5912
5913         case ARRAY_TYPE:
5914           /* Just for use if some languages passes arrays by value.  */
5915           if (contains_aligned_value_p (TREE_TYPE (type)))
5916             return true;
5917           break;
5918
5919         default:
5920           gcc_unreachable ();
5921         }
5922     }
5923   return false;
5924 }
5925
5926 /* Gives the alignment boundary, in bits, of an argument with the
5927    specified mode and type.  */
5928
5929 int
5930 ix86_function_arg_boundary (enum machine_mode mode, tree type)
5931 {
5932   int align;
5933   if (type)
5934     {
5935       /* Since canonical type is used for call, we convert it to
5936          canonical type if needed.  */
5937       if (!TYPE_STRUCTURAL_EQUALITY_P (type))
5938         type = TYPE_CANONICAL (type);
5939       align = TYPE_ALIGN (type);
5940     }
5941   else
5942     align = GET_MODE_ALIGNMENT (mode);
5943   if (align < PARM_BOUNDARY)
5944     align = PARM_BOUNDARY;
5945   /* In 32bit, only _Decimal128 and __float128 are aligned to their
5946      natural boundaries.  */
5947   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
5948     {
5949       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
5950          make an exception for SSE modes since these require 128bit
5951          alignment.
5952
5953          The handling here differs from field_alignment.  ICC aligns MMX
5954          arguments to 4 byte boundaries, while structure fields are aligned
5955          to 8 byte boundaries.  */
5956       if (!type)
5957         {
5958           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
5959             align = PARM_BOUNDARY;
5960         }
5961       else
5962         {
5963           if (!contains_aligned_value_p (type))
5964             align = PARM_BOUNDARY;
5965         }
5966     }
5967   if (align > BIGGEST_ALIGNMENT)
5968     align = BIGGEST_ALIGNMENT;
5969   return align;
5970 }
5971
5972 /* Return true if N is a possible register number of function value.  */
5973
5974 bool
5975 ix86_function_value_regno_p (int regno)
5976 {
5977   switch (regno)
5978     {
5979     case 0:
5980       return true;
5981
5982     case FIRST_FLOAT_REG:
5983       /* TODO: The function should depend on current function ABI but
5984        builtins.c would need updating then. Therefore we use the
5985        default ABI.  */
5986       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
5987         return false;
5988       return TARGET_FLOAT_RETURNS_IN_80387;
5989
5990     case FIRST_SSE_REG:
5991       return TARGET_SSE;
5992
5993     case FIRST_MMX_REG:
5994       if (TARGET_MACHO || TARGET_64BIT)
5995         return false;
5996       return TARGET_MMX;
5997     }
5998
5999   return false;
6000 }
6001
6002 /* Define how to find the value returned by a function.
6003    VALTYPE is the data type of the value (as a tree).
6004    If the precise function being called is known, FUNC is its FUNCTION_DECL;
6005    otherwise, FUNC is 0.  */
6006
6007 static rtx
6008 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
6009                    const_tree fntype, const_tree fn)
6010 {
6011   unsigned int regno;
6012
6013   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
6014      we normally prevent this case when mmx is not available.  However
6015      some ABIs may require the result to be returned like DImode.  */
6016   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6017     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
6018
6019   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
6020      we prevent this case when sse is not available.  However some ABIs
6021      may require the result to be returned like integer TImode.  */
6022   else if (mode == TImode
6023            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6024     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
6025
6026   /* 32-byte vector modes in %ymm0.   */
6027   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
6028     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
6029
6030   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
6031   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
6032     regno = FIRST_FLOAT_REG;
6033   else
6034     /* Most things go in %eax.  */
6035     regno = AX_REG;
6036
6037   /* Override FP return register with %xmm0 for local functions when
6038      SSE math is enabled or for functions with sseregparm attribute.  */
6039   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
6040     {
6041       int sse_level = ix86_function_sseregparm (fntype, fn, false);
6042       if ((sse_level >= 1 && mode == SFmode)
6043           || (sse_level == 2 && mode == DFmode))
6044         regno = FIRST_SSE_REG;
6045     }
6046
6047   /* OImode shouldn't be used directly.  */
6048   gcc_assert (mode != OImode);
6049
6050   return gen_rtx_REG (orig_mode, regno);
6051 }
6052
6053 static rtx
6054 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
6055                    const_tree valtype)
6056 {
6057   rtx ret;
6058
6059   /* Handle libcalls, which don't provide a type node.  */
6060   if (valtype == NULL)
6061     {
6062       switch (mode)
6063         {
6064         case SFmode:
6065         case SCmode:
6066         case DFmode:
6067         case DCmode:
6068         case TFmode:
6069         case SDmode:
6070         case DDmode:
6071         case TDmode:
6072           return gen_rtx_REG (mode, FIRST_SSE_REG);
6073         case XFmode:
6074         case XCmode:
6075           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
6076         case TCmode:
6077           return NULL;
6078         default:
6079           return gen_rtx_REG (mode, AX_REG);
6080         }
6081     }
6082
6083   ret = construct_container (mode, orig_mode, valtype, 1,
6084                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
6085                              x86_64_int_return_registers, 0);
6086
6087   /* For zero sized structures, construct_container returns NULL, but we
6088      need to keep rest of compiler happy by returning meaningful value.  */
6089   if (!ret)
6090     ret = gen_rtx_REG (orig_mode, AX_REG);
6091
6092   return ret;
6093 }
6094
6095 static rtx
6096 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
6097 {
6098   unsigned int regno = AX_REG;
6099
6100   if (TARGET_SSE)
6101     {
6102       switch (GET_MODE_SIZE (mode))
6103         {
6104         case 16:
6105           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6106              && !COMPLEX_MODE_P (mode))
6107             regno = FIRST_SSE_REG;
6108           break;
6109         case 8:
6110         case 4:
6111           if (mode == SFmode || mode == DFmode)
6112             regno = FIRST_SSE_REG;
6113           break;
6114         default:
6115           break;
6116         }
6117     }
6118   return gen_rtx_REG (orig_mode, regno);
6119 }
6120
6121 static rtx
6122 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
6123                        enum machine_mode orig_mode, enum machine_mode mode)
6124 {
6125   const_tree fn, fntype;
6126
6127   fn = NULL_TREE;
6128   if (fntype_or_decl && DECL_P (fntype_or_decl))
6129     fn = fntype_or_decl;
6130   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
6131
6132   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
6133     return function_value_ms_64 (orig_mode, mode);
6134   else if (TARGET_64BIT)
6135     return function_value_64 (orig_mode, mode, valtype);
6136   else
6137     return function_value_32 (orig_mode, mode, fntype, fn);
6138 }
6139
6140 static rtx
6141 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
6142                      bool outgoing ATTRIBUTE_UNUSED)
6143 {
6144   enum machine_mode mode, orig_mode;
6145
6146   orig_mode = TYPE_MODE (valtype);
6147   mode = type_natural_mode (valtype, NULL);
6148   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
6149 }
6150
6151 rtx
6152 ix86_libcall_value (enum machine_mode mode)
6153 {
6154   return ix86_function_value_1 (NULL, NULL, mode, mode);
6155 }
6156
6157 /* Return true iff type is returned in memory.  */
6158
6159 static int ATTRIBUTE_UNUSED
6160 return_in_memory_32 (const_tree type, enum machine_mode mode)
6161 {
6162   HOST_WIDE_INT size;
6163
6164   if (mode == BLKmode)
6165     return 1;
6166
6167   size = int_size_in_bytes (type);
6168
6169   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
6170     return 0;
6171
6172   if (VECTOR_MODE_P (mode) || mode == TImode)
6173     {
6174       /* User-created vectors small enough to fit in EAX.  */
6175       if (size < 8)
6176         return 0;
6177
6178       /* MMX/3dNow values are returned in MM0,
6179          except when it doesn't exits.  */
6180       if (size == 8)
6181         return (TARGET_MMX ? 0 : 1);
6182
6183       /* SSE values are returned in XMM0, except when it doesn't exist.  */
6184       if (size == 16)
6185         return (TARGET_SSE ? 0 : 1);
6186
6187       /* AVX values are returned in YMM0, except when it doesn't exist.  */
6188       if (size == 32)
6189         return TARGET_AVX ? 0 : 1;
6190     }
6191
6192   if (mode == XFmode)
6193     return 0;
6194
6195   if (size > 12)
6196     return 1;
6197
6198   /* OImode shouldn't be used directly.  */
6199   gcc_assert (mode != OImode);
6200
6201   return 0;
6202 }
6203
6204 static int ATTRIBUTE_UNUSED
6205 return_in_memory_64 (const_tree type, enum machine_mode mode)
6206 {
6207   int needed_intregs, needed_sseregs;
6208   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
6209 }
6210
6211 static int ATTRIBUTE_UNUSED
6212 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
6213 {
6214   HOST_WIDE_INT size = int_size_in_bytes (type);
6215
6216   /* __m128 is returned in xmm0.  */
6217   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6218       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
6219     return 0;
6220
6221   /* Otherwise, the size must be exactly in [1248]. */
6222   return (size != 1 && size != 2 && size != 4 && size != 8);
6223 }
6224
6225 static bool
6226 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6227 {
6228 #ifdef SUBTARGET_RETURN_IN_MEMORY
6229   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
6230 #else
6231   const enum machine_mode mode = type_natural_mode (type, NULL);
6232  
6233   if (TARGET_64BIT)
6234     {
6235       if (ix86_function_type_abi (fntype) == MS_ABI)
6236         return return_in_memory_ms_64 (type, mode);
6237       else
6238         return return_in_memory_64 (type, mode);
6239     }
6240   else
6241     return return_in_memory_32 (type, mode);
6242 #endif
6243 }
6244
6245 /* Return false iff TYPE is returned in memory.  This version is used
6246    on Solaris 10.  It is similar to the generic ix86_return_in_memory,
6247    but differs notably in that when MMX is available, 8-byte vectors
6248    are returned in memory, rather than in MMX registers.  */
6249
6250 bool
6251 ix86_sol10_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6252 {
6253   int size;
6254   enum machine_mode mode = type_natural_mode (type, NULL);
6255
6256   if (TARGET_64BIT)
6257     return return_in_memory_64 (type, mode);
6258
6259   if (mode == BLKmode)
6260     return 1;
6261
6262   size = int_size_in_bytes (type);
6263
6264   if (VECTOR_MODE_P (mode))
6265     {
6266       /* Return in memory only if MMX registers *are* available.  This
6267          seems backwards, but it is consistent with the existing
6268          Solaris x86 ABI.  */
6269       if (size == 8)
6270         return TARGET_MMX;
6271       if (size == 16)
6272         return !TARGET_SSE;
6273     }
6274   else if (mode == TImode)
6275     return !TARGET_SSE;
6276   else if (mode == XFmode)
6277     return 0;
6278
6279   return size > 12;
6280 }
6281
6282 /* When returning SSE vector types, we have a choice of either
6283      (1) being abi incompatible with a -march switch, or
6284      (2) generating an error.
6285    Given no good solution, I think the safest thing is one warning.
6286    The user won't be able to use -Werror, but....
6287
6288    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
6289    called in response to actually generating a caller or callee that
6290    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
6291    via aggregate_value_p for general type probing from tree-ssa.  */
6292
6293 static rtx
6294 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
6295 {
6296   static bool warnedsse, warnedmmx;
6297
6298   if (!TARGET_64BIT && type)
6299     {
6300       /* Look at the return type of the function, not the function type.  */
6301       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
6302
6303       if (!TARGET_SSE && !warnedsse)
6304         {
6305           if (mode == TImode
6306               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6307             {
6308               warnedsse = true;
6309               warning (0, "SSE vector return without SSE enabled "
6310                        "changes the ABI");
6311             }
6312         }
6313
6314       if (!TARGET_MMX && !warnedmmx)
6315         {
6316           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6317             {
6318               warnedmmx = true;
6319               warning (0, "MMX vector return without MMX enabled "
6320                        "changes the ABI");
6321             }
6322         }
6323     }
6324
6325   return NULL;
6326 }
6327
6328 \f
6329 /* Create the va_list data type.  */
6330
6331 /* Returns the calling convention specific va_list date type.
6332    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
6333
6334 static tree
6335 ix86_build_builtin_va_list_abi (enum calling_abi abi)
6336 {
6337   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
6338
6339   /* For i386 we use plain pointer to argument area.  */
6340   if (!TARGET_64BIT || abi == MS_ABI)
6341     return build_pointer_type (char_type_node);
6342
6343   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6344   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
6345
6346   f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"),
6347                       unsigned_type_node);
6348   f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"),
6349                       unsigned_type_node);
6350   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
6351                       ptr_type_node);
6352   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
6353                       ptr_type_node);
6354
6355   va_list_gpr_counter_field = f_gpr;
6356   va_list_fpr_counter_field = f_fpr;
6357
6358   DECL_FIELD_CONTEXT (f_gpr) = record;
6359   DECL_FIELD_CONTEXT (f_fpr) = record;
6360   DECL_FIELD_CONTEXT (f_ovf) = record;
6361   DECL_FIELD_CONTEXT (f_sav) = record;
6362
6363   TREE_CHAIN (record) = type_decl;
6364   TYPE_NAME (record) = type_decl;
6365   TYPE_FIELDS (record) = f_gpr;
6366   TREE_CHAIN (f_gpr) = f_fpr;
6367   TREE_CHAIN (f_fpr) = f_ovf;
6368   TREE_CHAIN (f_ovf) = f_sav;
6369
6370   layout_type (record);
6371
6372   /* The correct type is an array type of one element.  */
6373   return build_array_type (record, build_index_type (size_zero_node));
6374 }
6375
6376 /* Setup the builtin va_list data type and for 64-bit the additional
6377    calling convention specific va_list data types.  */
6378
6379 static tree
6380 ix86_build_builtin_va_list (void)
6381 {
6382   tree ret = ix86_build_builtin_va_list_abi (DEFAULT_ABI);
6383
6384   /* Initialize abi specific va_list builtin types.  */
6385   if (TARGET_64BIT)
6386     {
6387       tree t;
6388       if (DEFAULT_ABI == MS_ABI)
6389         {
6390           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
6391           if (TREE_CODE (t) != RECORD_TYPE)
6392             t = build_variant_type_copy (t);
6393           sysv_va_list_type_node = t;
6394         }
6395       else
6396         {
6397           t = ret;
6398           if (TREE_CODE (t) != RECORD_TYPE)
6399             t = build_variant_type_copy (t);
6400           sysv_va_list_type_node = t;
6401         }
6402       if (DEFAULT_ABI != MS_ABI)
6403         {
6404           t = ix86_build_builtin_va_list_abi (MS_ABI);
6405           if (TREE_CODE (t) != RECORD_TYPE)
6406             t = build_variant_type_copy (t);
6407           ms_va_list_type_node = t;
6408         }
6409       else
6410         {
6411           t = ret;
6412           if (TREE_CODE (t) != RECORD_TYPE)
6413             t = build_variant_type_copy (t);
6414           ms_va_list_type_node = t;
6415         }
6416     }
6417
6418   return ret;
6419 }
6420
6421 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
6422
6423 static void
6424 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
6425 {
6426   rtx save_area, mem;
6427   rtx label;
6428   rtx label_ref;
6429   rtx tmp_reg;
6430   rtx nsse_reg;
6431   alias_set_type set;
6432   int i;
6433   int regparm = ix86_regparm;
6434
6435   if (cum->call_abi != DEFAULT_ABI)
6436     regparm = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
6437
6438   /* GPR size of varargs save area.  */
6439   if (cfun->va_list_gpr_size)
6440     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
6441   else
6442     ix86_varargs_gpr_size = 0;
6443
6444   /* FPR size of varargs save area.  We don't need it if we don't pass
6445      anything in SSE registers.  */
6446   if (cum->sse_nregs && cfun->va_list_fpr_size)
6447     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
6448   else
6449     ix86_varargs_fpr_size = 0;
6450
6451   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
6452     return;
6453
6454   save_area = frame_pointer_rtx;
6455   set = get_varargs_alias_set ();
6456
6457   for (i = cum->regno;
6458        i < regparm
6459        && i < cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
6460        i++)
6461     {
6462       mem = gen_rtx_MEM (Pmode,
6463                          plus_constant (save_area, i * UNITS_PER_WORD));
6464       MEM_NOTRAP_P (mem) = 1;
6465       set_mem_alias_set (mem, set);
6466       emit_move_insn (mem, gen_rtx_REG (Pmode,
6467                                         x86_64_int_parameter_registers[i]));
6468     }
6469
6470   if (ix86_varargs_fpr_size)
6471     {
6472       /* Now emit code to save SSE registers.  The AX parameter contains number
6473          of SSE parameter registers used to call this function.  We use
6474          sse_prologue_save insn template that produces computed jump across
6475          SSE saves.  We need some preparation work to get this working.  */
6476
6477       label = gen_label_rtx ();
6478       label_ref = gen_rtx_LABEL_REF (Pmode, label);
6479
6480       /* Compute address to jump to :
6481          label - eax*4 + nnamed_sse_arguments*4 Or
6482          label - eax*5 + nnamed_sse_arguments*5 for AVX.  */
6483       tmp_reg = gen_reg_rtx (Pmode);
6484       nsse_reg = gen_reg_rtx (Pmode);
6485       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, AX_REG)));
6486       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6487                               gen_rtx_MULT (Pmode, nsse_reg,
6488                                             GEN_INT (4))));
6489
6490       /* vmovaps is one byte longer than movaps.  */
6491       if (TARGET_AVX)
6492         emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6493                                 gen_rtx_PLUS (Pmode, tmp_reg,
6494                                               nsse_reg)));
6495
6496       if (cum->sse_regno)
6497         emit_move_insn
6498           (nsse_reg,
6499            gen_rtx_CONST (DImode,
6500                           gen_rtx_PLUS (DImode,
6501                                         label_ref,
6502                                         GEN_INT (cum->sse_regno
6503                                                  * (TARGET_AVX ? 5 : 4)))));
6504       else
6505         emit_move_insn (nsse_reg, label_ref);
6506       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
6507
6508       /* Compute address of memory block we save into.  We always use pointer
6509          pointing 127 bytes after first byte to store - this is needed to keep
6510          instruction size limited by 4 bytes (5 bytes for AVX) with one
6511          byte displacement.  */
6512       tmp_reg = gen_reg_rtx (Pmode);
6513       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6514                               plus_constant (save_area,
6515                                              ix86_varargs_gpr_size + 127)));
6516       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
6517       MEM_NOTRAP_P (mem) = 1;
6518       set_mem_alias_set (mem, set);
6519       set_mem_align (mem, BITS_PER_WORD);
6520
6521       /* And finally do the dirty job!  */
6522       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
6523                                         GEN_INT (cum->sse_regno), label));
6524     }
6525 }
6526
6527 static void
6528 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
6529 {
6530   alias_set_type set = get_varargs_alias_set ();
6531   int i;
6532
6533   for (i = cum->regno; i < X64_REGPARM_MAX; i++)
6534     {
6535       rtx reg, mem;
6536
6537       mem = gen_rtx_MEM (Pmode,
6538                          plus_constant (virtual_incoming_args_rtx,
6539                                         i * UNITS_PER_WORD));
6540       MEM_NOTRAP_P (mem) = 1;
6541       set_mem_alias_set (mem, set);
6542
6543       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
6544       emit_move_insn (mem, reg);
6545     }
6546 }
6547
6548 static void
6549 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6550                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
6551                              int no_rtl)
6552 {
6553   CUMULATIVE_ARGS next_cum;
6554   tree fntype;
6555
6556   /* This argument doesn't appear to be used anymore.  Which is good,
6557      because the old code here didn't suppress rtl generation.  */
6558   gcc_assert (!no_rtl);
6559
6560   if (!TARGET_64BIT)
6561     return;
6562
6563   fntype = TREE_TYPE (current_function_decl);
6564
6565   /* For varargs, we do not want to skip the dummy va_dcl argument.
6566      For stdargs, we do want to skip the last named argument.  */
6567   next_cum = *cum;
6568   if (stdarg_p (fntype))
6569     function_arg_advance (&next_cum, mode, type, 1);
6570
6571   if (cum->call_abi == MS_ABI)
6572     setup_incoming_varargs_ms_64 (&next_cum);
6573   else
6574     setup_incoming_varargs_64 (&next_cum);
6575 }
6576
6577 /* Checks if TYPE is of kind va_list char *.  */
6578
6579 static bool
6580 is_va_list_char_pointer (tree type)
6581 {
6582   tree canonic;
6583
6584   /* For 32-bit it is always true.  */
6585   if (!TARGET_64BIT)
6586     return true;
6587   canonic = ix86_canonical_va_list_type (type);
6588   return (canonic == ms_va_list_type_node
6589           || (DEFAULT_ABI == MS_ABI && canonic == va_list_type_node));
6590 }
6591
6592 /* Implement va_start.  */
6593
6594 static void
6595 ix86_va_start (tree valist, rtx nextarg)
6596 {
6597   HOST_WIDE_INT words, n_gpr, n_fpr;
6598   tree f_gpr, f_fpr, f_ovf, f_sav;
6599   tree gpr, fpr, ovf, sav, t;
6600   tree type;
6601
6602   /* Only 64bit target needs something special.  */
6603   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6604     {
6605       std_expand_builtin_va_start (valist, nextarg);
6606       return;
6607     }
6608
6609   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6610   f_fpr = TREE_CHAIN (f_gpr);
6611   f_ovf = TREE_CHAIN (f_fpr);
6612   f_sav = TREE_CHAIN (f_ovf);
6613
6614   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
6615   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6616   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6617   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6618   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6619
6620   /* Count number of gp and fp argument registers used.  */
6621   words = crtl->args.info.words;
6622   n_gpr = crtl->args.info.regno;
6623   n_fpr = crtl->args.info.sse_regno;
6624
6625   if (cfun->va_list_gpr_size)
6626     {
6627       type = TREE_TYPE (gpr);
6628       t = build2 (MODIFY_EXPR, type,
6629                   gpr, build_int_cst (type, n_gpr * 8));
6630       TREE_SIDE_EFFECTS (t) = 1;
6631       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6632     }
6633
6634   if (TARGET_SSE && cfun->va_list_fpr_size)
6635     {
6636       type = TREE_TYPE (fpr);
6637       t = build2 (MODIFY_EXPR, type, fpr,
6638                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
6639       TREE_SIDE_EFFECTS (t) = 1;
6640       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6641     }
6642
6643   /* Find the overflow area.  */
6644   type = TREE_TYPE (ovf);
6645   t = make_tree (type, crtl->args.internal_arg_pointer);
6646   if (words != 0)
6647     t = build2 (POINTER_PLUS_EXPR, type, t,
6648                 size_int (words * UNITS_PER_WORD));
6649   t = build2 (MODIFY_EXPR, type, ovf, t);
6650   TREE_SIDE_EFFECTS (t) = 1;
6651   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6652
6653   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
6654     {
6655       /* Find the register save area.
6656          Prologue of the function save it right above stack frame.  */
6657       type = TREE_TYPE (sav);
6658       t = make_tree (type, frame_pointer_rtx);
6659       if (!ix86_varargs_gpr_size)
6660         t = build2 (POINTER_PLUS_EXPR, type, t,
6661                     size_int (-8 * X86_64_REGPARM_MAX));
6662       t = build2 (MODIFY_EXPR, type, sav, t);
6663       TREE_SIDE_EFFECTS (t) = 1;
6664       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6665     }
6666 }
6667
6668 /* Implement va_arg.  */
6669
6670 static tree
6671 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6672                       gimple_seq *post_p)
6673 {
6674   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
6675   tree f_gpr, f_fpr, f_ovf, f_sav;
6676   tree gpr, fpr, ovf, sav, t;
6677   int size, rsize;
6678   tree lab_false, lab_over = NULL_TREE;
6679   tree addr, t2;
6680   rtx container;
6681   int indirect_p = 0;
6682   tree ptrtype;
6683   enum machine_mode nat_mode;
6684   int arg_boundary;
6685
6686   /* Only 64bit target needs something special.  */
6687   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6688     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6689
6690   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6691   f_fpr = TREE_CHAIN (f_gpr);
6692   f_ovf = TREE_CHAIN (f_fpr);
6693   f_sav = TREE_CHAIN (f_ovf);
6694
6695   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
6696                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
6697   valist = build_va_arg_indirect_ref (valist);
6698   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6699   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6700   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6701
6702   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
6703   if (indirect_p)
6704     type = build_pointer_type (type);
6705   size = int_size_in_bytes (type);
6706   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6707
6708   nat_mode = type_natural_mode (type, NULL);
6709   switch (nat_mode)
6710     {
6711     case V8SFmode:
6712     case V8SImode:
6713     case V32QImode:
6714     case V16HImode:
6715     case V4DFmode:
6716     case V4DImode:
6717       /* Unnamed 256bit vector mode parameters are passed on stack.  */
6718       if (ix86_cfun_abi () == SYSV_ABI)
6719         {
6720           container = NULL;
6721           break;
6722         }
6723
6724     default:
6725       container = construct_container (nat_mode, TYPE_MODE (type),
6726                                        type, 0, X86_64_REGPARM_MAX,
6727                                        X86_64_SSE_REGPARM_MAX, intreg,
6728                                        0);
6729       break;
6730     }
6731
6732   /* Pull the value out of the saved registers.  */
6733
6734   addr = create_tmp_var (ptr_type_node, "addr");
6735   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
6736
6737   if (container)
6738     {
6739       int needed_intregs, needed_sseregs;
6740       bool need_temp;
6741       tree int_addr, sse_addr;
6742
6743       lab_false = create_artificial_label ();
6744       lab_over = create_artificial_label ();
6745
6746       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
6747
6748       need_temp = (!REG_P (container)
6749                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
6750                        || TYPE_ALIGN (type) > 128));
6751
6752       /* In case we are passing structure, verify that it is consecutive block
6753          on the register save area.  If not we need to do moves.  */
6754       if (!need_temp && !REG_P (container))
6755         {
6756           /* Verify that all registers are strictly consecutive  */
6757           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
6758             {
6759               int i;
6760
6761               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6762                 {
6763                   rtx slot = XVECEXP (container, 0, i);
6764                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
6765                       || INTVAL (XEXP (slot, 1)) != i * 16)
6766                     need_temp = 1;
6767                 }
6768             }
6769           else
6770             {
6771               int i;
6772
6773               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6774                 {
6775                   rtx slot = XVECEXP (container, 0, i);
6776                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
6777                       || INTVAL (XEXP (slot, 1)) != i * 8)
6778                     need_temp = 1;
6779                 }
6780             }
6781         }
6782       if (!need_temp)
6783         {
6784           int_addr = addr;
6785           sse_addr = addr;
6786         }
6787       else
6788         {
6789           int_addr = create_tmp_var (ptr_type_node, "int_addr");
6790           DECL_POINTER_ALIAS_SET (int_addr) = get_varargs_alias_set ();
6791           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
6792           DECL_POINTER_ALIAS_SET (sse_addr) = get_varargs_alias_set ();
6793         }
6794
6795       /* First ensure that we fit completely in registers.  */
6796       if (needed_intregs)
6797         {
6798           t = build_int_cst (TREE_TYPE (gpr),
6799                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
6800           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
6801           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6802           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6803           gimplify_and_add (t, pre_p);
6804         }
6805       if (needed_sseregs)
6806         {
6807           t = build_int_cst (TREE_TYPE (fpr),
6808                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
6809                              + X86_64_REGPARM_MAX * 8);
6810           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
6811           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6812           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6813           gimplify_and_add (t, pre_p);
6814         }
6815
6816       /* Compute index to start of area used for integer regs.  */
6817       if (needed_intregs)
6818         {
6819           /* int_addr = gpr + sav; */
6820           t = fold_convert (sizetype, gpr);
6821           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6822           gimplify_assign (int_addr, t, pre_p);
6823         }
6824       if (needed_sseregs)
6825         {
6826           /* sse_addr = fpr + sav; */
6827           t = fold_convert (sizetype, fpr);
6828           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6829           gimplify_assign (sse_addr, t, pre_p);
6830         }
6831       if (need_temp)
6832         {
6833           int i;
6834           tree temp = create_tmp_var (type, "va_arg_tmp");
6835
6836           /* addr = &temp; */
6837           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
6838           gimplify_assign (addr, t, pre_p);
6839
6840           for (i = 0; i < XVECLEN (container, 0); i++)
6841             {
6842               rtx slot = XVECEXP (container, 0, i);
6843               rtx reg = XEXP (slot, 0);
6844               enum machine_mode mode = GET_MODE (reg);
6845               tree piece_type = lang_hooks.types.type_for_mode (mode, 1);
6846               tree addr_type = build_pointer_type (piece_type);
6847               tree daddr_type = build_pointer_type_for_mode (piece_type,
6848                                                              ptr_mode, true);
6849               tree src_addr, src;
6850               int src_offset;
6851               tree dest_addr, dest;
6852
6853               if (SSE_REGNO_P (REGNO (reg)))
6854                 {
6855                   src_addr = sse_addr;
6856                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
6857                 }
6858               else
6859                 {
6860                   src_addr = int_addr;
6861                   src_offset = REGNO (reg) * 8;
6862                 }
6863               src_addr = fold_convert (addr_type, src_addr);
6864               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
6865                                       size_int (src_offset));
6866               src = build_va_arg_indirect_ref (src_addr);
6867
6868               dest_addr = fold_convert (daddr_type, addr);
6869               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
6870                                        size_int (INTVAL (XEXP (slot, 1))));
6871               dest = build_va_arg_indirect_ref (dest_addr);
6872
6873               gimplify_assign (dest, src, pre_p);
6874             }
6875         }
6876
6877       if (needed_intregs)
6878         {
6879           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
6880                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
6881           gimplify_assign (gpr, t, pre_p);
6882         }
6883
6884       if (needed_sseregs)
6885         {
6886           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
6887                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
6888           gimplify_assign (fpr, t, pre_p);
6889         }
6890
6891       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
6892
6893       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
6894     }
6895
6896   /* ... otherwise out of the overflow area.  */
6897
6898   /* When we align parameter on stack for caller, if the parameter
6899      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
6900      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
6901      here with caller.  */
6902   arg_boundary = FUNCTION_ARG_BOUNDARY (VOIDmode, type);
6903   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
6904     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
6905
6906   /* Care for on-stack alignment if needed.  */
6907   if (arg_boundary <= 64
6908       || integer_zerop (TYPE_SIZE (type)))
6909     t = ovf;
6910  else
6911     {
6912       HOST_WIDE_INT align = arg_boundary / 8;
6913       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
6914                   size_int (align - 1));
6915       t = fold_convert (sizetype, t);
6916       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
6917                   size_int (-align));
6918       t = fold_convert (TREE_TYPE (ovf), t);
6919     }
6920   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
6921   gimplify_assign (addr, t, pre_p);
6922
6923   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
6924               size_int (rsize * UNITS_PER_WORD));
6925   gimplify_assign (unshare_expr (ovf), t, pre_p);
6926
6927   if (container)
6928     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
6929
6930   ptrtype = build_pointer_type (type);
6931   addr = fold_convert (ptrtype, addr);
6932
6933   if (indirect_p)
6934     addr = build_va_arg_indirect_ref (addr);
6935   return build_va_arg_indirect_ref (addr);
6936 }
6937 \f
6938 /* Return nonzero if OPNUM's MEM should be matched
6939    in movabs* patterns.  */
6940
6941 int
6942 ix86_check_movabs (rtx insn, int opnum)
6943 {
6944   rtx set, mem;
6945
6946   set = PATTERN (insn);
6947   if (GET_CODE (set) == PARALLEL)
6948     set = XVECEXP (set, 0, 0);
6949   gcc_assert (GET_CODE (set) == SET);
6950   mem = XEXP (set, opnum);
6951   while (GET_CODE (mem) == SUBREG)
6952     mem = SUBREG_REG (mem);
6953   gcc_assert (MEM_P (mem));
6954   return (volatile_ok || !MEM_VOLATILE_P (mem));
6955 }
6956 \f
6957 /* Initialize the table of extra 80387 mathematical constants.  */
6958
6959 static void
6960 init_ext_80387_constants (void)
6961 {
6962   static const char * cst[5] =
6963   {
6964     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
6965     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
6966     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
6967     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
6968     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
6969   };
6970   int i;
6971
6972   for (i = 0; i < 5; i++)
6973     {
6974       real_from_string (&ext_80387_constants_table[i], cst[i]);
6975       /* Ensure each constant is rounded to XFmode precision.  */
6976       real_convert (&ext_80387_constants_table[i],
6977                     XFmode, &ext_80387_constants_table[i]);
6978     }
6979
6980   ext_80387_constants_init = 1;
6981 }
6982
6983 /* Return true if the constant is something that can be loaded with
6984    a special instruction.  */
6985
6986 int
6987 standard_80387_constant_p (rtx x)
6988 {
6989   enum machine_mode mode = GET_MODE (x);
6990
6991   REAL_VALUE_TYPE r;
6992
6993   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
6994     return -1;
6995
6996   if (x == CONST0_RTX (mode))
6997     return 1;
6998   if (x == CONST1_RTX (mode))
6999     return 2;
7000
7001   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7002
7003   /* For XFmode constants, try to find a special 80387 instruction when
7004      optimizing for size or on those CPUs that benefit from them.  */
7005   if (mode == XFmode
7006       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
7007     {
7008       int i;
7009
7010       if (! ext_80387_constants_init)
7011         init_ext_80387_constants ();
7012
7013       for (i = 0; i < 5; i++)
7014         if (real_identical (&r, &ext_80387_constants_table[i]))
7015           return i + 3;
7016     }
7017
7018   /* Load of the constant -0.0 or -1.0 will be split as
7019      fldz;fchs or fld1;fchs sequence.  */
7020   if (real_isnegzero (&r))
7021     return 8;
7022   if (real_identical (&r, &dconstm1))
7023     return 9;
7024
7025   return 0;
7026 }
7027
7028 /* Return the opcode of the special instruction to be used to load
7029    the constant X.  */
7030
7031 const char *
7032 standard_80387_constant_opcode (rtx x)
7033 {
7034   switch (standard_80387_constant_p (x))
7035     {
7036     case 1:
7037       return "fldz";
7038     case 2:
7039       return "fld1";
7040     case 3:
7041       return "fldlg2";
7042     case 4:
7043       return "fldln2";
7044     case 5:
7045       return "fldl2e";
7046     case 6:
7047       return "fldl2t";
7048     case 7:
7049       return "fldpi";
7050     case 8:
7051     case 9:
7052       return "#";
7053     default:
7054       gcc_unreachable ();
7055     }
7056 }
7057
7058 /* Return the CONST_DOUBLE representing the 80387 constant that is
7059    loaded by the specified special instruction.  The argument IDX
7060    matches the return value from standard_80387_constant_p.  */
7061
7062 rtx
7063 standard_80387_constant_rtx (int idx)
7064 {
7065   int i;
7066
7067   if (! ext_80387_constants_init)
7068     init_ext_80387_constants ();
7069
7070   switch (idx)
7071     {
7072     case 3:
7073     case 4:
7074     case 5:
7075     case 6:
7076     case 7:
7077       i = idx - 3;
7078       break;
7079
7080     default:
7081       gcc_unreachable ();
7082     }
7083
7084   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
7085                                        XFmode);
7086 }
7087
7088 /* Return 1 if mode is a valid mode for sse.  */
7089 static int
7090 standard_sse_mode_p (enum machine_mode mode)
7091 {
7092   switch (mode)
7093     {
7094     case V16QImode:
7095     case V8HImode:
7096     case V4SImode:
7097     case V2DImode:
7098     case V4SFmode:
7099     case V2DFmode:
7100       return 1;
7101
7102     default:
7103       return 0;
7104     }
7105 }
7106
7107 /* Return 1 if X is all 0s.  For all 1s, return 2 if X is in 128bit
7108    SSE modes and SSE2 is enabled,  return 3 if X is in 256bit AVX
7109    modes and AVX is enabled.  */
7110
7111 int
7112 standard_sse_constant_p (rtx x)
7113 {
7114   enum machine_mode mode = GET_MODE (x);
7115
7116   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
7117     return 1;
7118   if (vector_all_ones_operand (x, mode))
7119     {
7120       if (standard_sse_mode_p (mode))
7121         return TARGET_SSE2 ? 2 : -2;
7122       else if (VALID_AVX256_REG_MODE (mode))
7123         return TARGET_AVX ? 3 : -3;
7124     }
7125
7126   return 0;
7127 }
7128
7129 /* Return the opcode of the special instruction to be used to load
7130    the constant X.  */
7131
7132 const char *
7133 standard_sse_constant_opcode (rtx insn, rtx x)
7134 {
7135   switch (standard_sse_constant_p (x))
7136     {
7137     case 1:
7138       switch (get_attr_mode (insn))
7139         {
7140         case MODE_V4SF:
7141           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
7142         case MODE_V2DF:
7143           return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
7144         case MODE_TI:
7145           return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
7146         case MODE_V8SF:
7147           return "vxorps\t%x0, %x0, %x0";
7148         case MODE_V4DF:
7149           return "vxorpd\t%x0, %x0, %x0";
7150         case MODE_OI:
7151           return "vpxor\t%x0, %x0, %x0";
7152         default:
7153           gcc_unreachable ();
7154         }
7155     case 2:
7156       if (TARGET_AVX)
7157         switch (get_attr_mode (insn))
7158           {
7159           case MODE_V4SF:
7160           case MODE_V2DF:
7161           case MODE_TI:
7162             return "vpcmpeqd\t%0, %0, %0";
7163             break;
7164           default:
7165             gcc_unreachable ();
7166         }
7167       else
7168         return "pcmpeqd\t%0, %0";
7169     }
7170   gcc_unreachable ();
7171 }
7172
7173 /* Returns 1 if OP contains a symbol reference */
7174
7175 int
7176 symbolic_reference_mentioned_p (rtx op)
7177 {
7178   const char *fmt;
7179   int i;
7180
7181   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
7182     return 1;
7183
7184   fmt = GET_RTX_FORMAT (GET_CODE (op));
7185   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
7186     {
7187       if (fmt[i] == 'E')
7188         {
7189           int j;
7190
7191           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
7192             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
7193               return 1;
7194         }
7195
7196       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
7197         return 1;
7198     }
7199
7200   return 0;
7201 }
7202
7203 /* Return 1 if it is appropriate to emit `ret' instructions in the
7204    body of a function.  Do this only if the epilogue is simple, needing a
7205    couple of insns.  Prior to reloading, we can't tell how many registers
7206    must be saved, so return 0 then.  Return 0 if there is no frame
7207    marker to de-allocate.  */
7208
7209 int
7210 ix86_can_use_return_insn_p (void)
7211 {
7212   struct ix86_frame frame;
7213
7214   if (! reload_completed || frame_pointer_needed)
7215     return 0;
7216
7217   /* Don't allow more than 32 pop, since that's all we can do
7218      with one instruction.  */
7219   if (crtl->args.pops_args
7220       && crtl->args.size >= 32768)
7221     return 0;
7222
7223   ix86_compute_frame_layout (&frame);
7224   return frame.to_allocate == 0 && (frame.nregs + frame.nsseregs) == 0;
7225 }
7226 \f
7227 /* Value should be nonzero if functions must have frame pointers.
7228    Zero means the frame pointer need not be set up (and parms may
7229    be accessed via the stack pointer) in functions that seem suitable.  */
7230
7231 int
7232 ix86_frame_pointer_required (void)
7233 {
7234   /* If we accessed previous frames, then the generated code expects
7235      to be able to access the saved ebp value in our frame.  */
7236   if (cfun->machine->accesses_prev_frame)
7237     return 1;
7238
7239   /* Several x86 os'es need a frame pointer for other reasons,
7240      usually pertaining to setjmp.  */
7241   if (SUBTARGET_FRAME_POINTER_REQUIRED)
7242     return 1;
7243
7244   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
7245      the frame pointer by default.  Turn it back on now if we've not
7246      got a leaf function.  */
7247   if (TARGET_OMIT_LEAF_FRAME_POINTER
7248       && (!current_function_is_leaf
7249           || ix86_current_function_calls_tls_descriptor))
7250     return 1;
7251
7252   if (crtl->profile)
7253     return 1;
7254
7255   return 0;
7256 }
7257
7258 /* Record that the current function accesses previous call frames.  */
7259
7260 void
7261 ix86_setup_frame_addresses (void)
7262 {
7263   cfun->machine->accesses_prev_frame = 1;
7264 }
7265 \f
7266 #if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
7267 # define USE_HIDDEN_LINKONCE 1
7268 #else
7269 # define USE_HIDDEN_LINKONCE 0
7270 #endif
7271
7272 static int pic_labels_used;
7273
7274 /* Fills in the label name that should be used for a pc thunk for
7275    the given register.  */
7276
7277 static void
7278 get_pc_thunk_name (char name[32], unsigned int regno)
7279 {
7280   gcc_assert (!TARGET_64BIT);
7281
7282   if (USE_HIDDEN_LINKONCE)
7283     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
7284   else
7285     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
7286 }
7287
7288
7289 /* This function generates code for -fpic that loads %ebx with
7290    the return address of the caller and then returns.  */
7291
7292 void
7293 ix86_file_end (void)
7294 {
7295   rtx xops[2];
7296   int regno;
7297
7298   for (regno = 0; regno < 8; ++regno)
7299     {
7300       char name[32];
7301
7302       if (! ((pic_labels_used >> regno) & 1))
7303         continue;
7304
7305       get_pc_thunk_name (name, regno);
7306
7307 #if TARGET_MACHO
7308       if (TARGET_MACHO)
7309         {
7310           switch_to_section (darwin_sections[text_coal_section]);
7311           fputs ("\t.weak_definition\t", asm_out_file);
7312           assemble_name (asm_out_file, name);
7313           fputs ("\n\t.private_extern\t", asm_out_file);
7314           assemble_name (asm_out_file, name);
7315           fputs ("\n", asm_out_file);
7316           ASM_OUTPUT_LABEL (asm_out_file, name);
7317         }
7318       else
7319 #endif
7320       if (USE_HIDDEN_LINKONCE)
7321         {
7322           tree decl;
7323
7324           decl = build_decl (FUNCTION_DECL, get_identifier (name),
7325                              error_mark_node);
7326           TREE_PUBLIC (decl) = 1;
7327           TREE_STATIC (decl) = 1;
7328           DECL_ONE_ONLY (decl) = 1;
7329
7330           (*targetm.asm_out.unique_section) (decl, 0);
7331           switch_to_section (get_named_section (decl, NULL, 0));
7332
7333           (*targetm.asm_out.globalize_label) (asm_out_file, name);
7334           fputs ("\t.hidden\t", asm_out_file);
7335           assemble_name (asm_out_file, name);
7336           fputc ('\n', asm_out_file);
7337           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
7338         }
7339       else
7340         {
7341           switch_to_section (text_section);
7342           ASM_OUTPUT_LABEL (asm_out_file, name);
7343         }
7344
7345       xops[0] = gen_rtx_REG (Pmode, regno);
7346       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
7347       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
7348       output_asm_insn ("ret", xops);
7349     }
7350
7351   if (NEED_INDICATE_EXEC_STACK)
7352     file_end_indicate_exec_stack ();
7353 }
7354
7355 /* Emit code for the SET_GOT patterns.  */
7356
7357 const char *
7358 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
7359 {
7360   rtx xops[3];
7361
7362   xops[0] = dest;
7363
7364   if (TARGET_VXWORKS_RTP && flag_pic)
7365     {
7366       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
7367       xops[2] = gen_rtx_MEM (Pmode,
7368                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
7369       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
7370
7371       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
7372          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
7373          an unadorned address.  */
7374       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
7375       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
7376       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
7377       return "";
7378     }
7379
7380   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
7381
7382   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
7383     {
7384       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
7385
7386       if (!flag_pic)
7387         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
7388       else
7389         output_asm_insn ("call\t%a2", xops);
7390
7391 #if TARGET_MACHO
7392       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7393          is what will be referenced by the Mach-O PIC subsystem.  */
7394       if (!label)
7395         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7396 #endif
7397
7398       (*targetm.asm_out.internal_label) (asm_out_file, "L",
7399                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
7400
7401       if (flag_pic)
7402         output_asm_insn ("pop%z0\t%0", xops);
7403     }
7404   else
7405     {
7406       char name[32];
7407       get_pc_thunk_name (name, REGNO (dest));
7408       pic_labels_used |= 1 << REGNO (dest);
7409
7410       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
7411       xops[2] = gen_rtx_MEM (QImode, xops[2]);
7412       output_asm_insn ("call\t%X2", xops);
7413       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7414          is what will be referenced by the Mach-O PIC subsystem.  */
7415 #if TARGET_MACHO
7416       if (!label)
7417         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7418       else
7419         targetm.asm_out.internal_label (asm_out_file, "L",
7420                                            CODE_LABEL_NUMBER (label));
7421 #endif
7422     }
7423
7424   if (TARGET_MACHO)
7425     return "";
7426
7427   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
7428     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
7429   else
7430     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
7431
7432   return "";
7433 }
7434
7435 /* Generate an "push" pattern for input ARG.  */
7436
7437 static rtx
7438 gen_push (rtx arg)
7439 {
7440   return gen_rtx_SET (VOIDmode,
7441                       gen_rtx_MEM (Pmode,
7442                                    gen_rtx_PRE_DEC (Pmode,
7443                                                     stack_pointer_rtx)),
7444                       arg);
7445 }
7446
7447 /* Return >= 0 if there is an unused call-clobbered register available
7448    for the entire function.  */
7449
7450 static unsigned int
7451 ix86_select_alt_pic_regnum (void)
7452 {
7453   if (current_function_is_leaf && !crtl->profile
7454       && !ix86_current_function_calls_tls_descriptor)
7455     {
7456       int i, drap;
7457       /* Can't use the same register for both PIC and DRAP.  */
7458       if (crtl->drap_reg)
7459         drap = REGNO (crtl->drap_reg);
7460       else
7461         drap = -1;
7462       for (i = 2; i >= 0; --i)
7463         if (i != drap && !df_regs_ever_live_p (i))
7464           return i;
7465     }
7466
7467   return INVALID_REGNUM;
7468 }
7469
7470 /* Return 1 if we need to save REGNO.  */
7471 static int
7472 ix86_save_reg (unsigned int regno, int maybe_eh_return)
7473 {
7474   if (pic_offset_table_rtx
7475       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
7476       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
7477           || crtl->profile
7478           || crtl->calls_eh_return
7479           || crtl->uses_const_pool))
7480     {
7481       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
7482         return 0;
7483       return 1;
7484     }
7485
7486   if (crtl->calls_eh_return && maybe_eh_return)
7487     {
7488       unsigned i;
7489       for (i = 0; ; i++)
7490         {
7491           unsigned test = EH_RETURN_DATA_REGNO (i);
7492           if (test == INVALID_REGNUM)
7493             break;
7494           if (test == regno)
7495             return 1;
7496         }
7497     }
7498
7499   if (crtl->drap_reg
7500       && regno == REGNO (crtl->drap_reg))
7501     return 1;
7502
7503   return (df_regs_ever_live_p (regno)
7504           && !call_used_regs[regno]
7505           && !fixed_regs[regno]
7506           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
7507 }
7508
7509 /* Return number of saved general prupose registers.  */
7510
7511 static int
7512 ix86_nsaved_regs (void)
7513 {
7514   int nregs = 0;
7515   int regno;
7516
7517   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7518     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7519       nregs ++;
7520   return nregs;
7521 }
7522
7523 /* Return number of saved SSE registrers.  */
7524
7525 static int
7526 ix86_nsaved_sseregs (void)
7527 {
7528   int nregs = 0;
7529   int regno;
7530
7531   if (ix86_cfun_abi () != MS_ABI)
7532     return 0;
7533   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7534     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7535       nregs ++;
7536   return nregs;
7537 }
7538
7539 /* Given FROM and TO register numbers, say whether this elimination is
7540    allowed.  If stack alignment is needed, we can only replace argument
7541    pointer with hard frame pointer, or replace frame pointer with stack
7542    pointer.  Otherwise, frame pointer elimination is automatically
7543    handled and all other eliminations are valid.  */
7544
7545 int
7546 ix86_can_eliminate (int from, int to)
7547 {
7548   if (stack_realign_fp)
7549     return ((from == ARG_POINTER_REGNUM
7550              && to == HARD_FRAME_POINTER_REGNUM)
7551             || (from == FRAME_POINTER_REGNUM
7552                 && to == STACK_POINTER_REGNUM));
7553   else
7554     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : 1;
7555 }
7556
7557 /* Return the offset between two registers, one to be eliminated, and the other
7558    its replacement, at the start of a routine.  */
7559
7560 HOST_WIDE_INT
7561 ix86_initial_elimination_offset (int from, int to)
7562 {
7563   struct ix86_frame frame;
7564   ix86_compute_frame_layout (&frame);
7565
7566   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
7567     return frame.hard_frame_pointer_offset;
7568   else if (from == FRAME_POINTER_REGNUM
7569            && to == HARD_FRAME_POINTER_REGNUM)
7570     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
7571   else
7572     {
7573       gcc_assert (to == STACK_POINTER_REGNUM);
7574
7575       if (from == ARG_POINTER_REGNUM)
7576         return frame.stack_pointer_offset;
7577
7578       gcc_assert (from == FRAME_POINTER_REGNUM);
7579       return frame.stack_pointer_offset - frame.frame_pointer_offset;
7580     }
7581 }
7582
7583 /* In a dynamically-aligned function, we can't know the offset from
7584    stack pointer to frame pointer, so we must ensure that setjmp
7585    eliminates fp against the hard fp (%ebp) rather than trying to
7586    index from %esp up to the top of the frame across a gap that is
7587    of unknown (at compile-time) size.  */
7588 static rtx
7589 ix86_builtin_setjmp_frame_value (void)
7590 {
7591   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
7592 }
7593
7594 /* Fill structure ix86_frame about frame of currently computed function.  */
7595
7596 static void
7597 ix86_compute_frame_layout (struct ix86_frame *frame)
7598 {
7599   HOST_WIDE_INT total_size;
7600   unsigned int stack_alignment_needed;
7601   HOST_WIDE_INT offset;
7602   unsigned int preferred_alignment;
7603   HOST_WIDE_INT size = get_frame_size ();
7604
7605   frame->nregs = ix86_nsaved_regs ();
7606   frame->nsseregs = ix86_nsaved_sseregs ();
7607   total_size = size;
7608
7609   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
7610   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
7611
7612   /* MS ABI seem to require stack alignment to be always 16 except for function
7613      prologues.  */
7614   if (ix86_cfun_abi () == MS_ABI && preferred_alignment < 16)
7615     {
7616       preferred_alignment = 16;
7617       stack_alignment_needed = 16;
7618       crtl->preferred_stack_boundary = 128;
7619       crtl->stack_alignment_needed = 128;
7620     }
7621
7622   gcc_assert (!size || stack_alignment_needed);
7623   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
7624   gcc_assert (preferred_alignment <= stack_alignment_needed);
7625
7626   /* During reload iteration the amount of registers saved can change.
7627      Recompute the value as needed.  Do not recompute when amount of registers
7628      didn't change as reload does multiple calls to the function and does not
7629      expect the decision to change within single iteration.  */
7630   if (!optimize_function_for_size_p (cfun)
7631       && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
7632     {
7633       int count = frame->nregs;
7634
7635       cfun->machine->use_fast_prologue_epilogue_nregs = count;
7636       /* The fast prologue uses move instead of push to save registers.  This
7637          is significantly longer, but also executes faster as modern hardware
7638          can execute the moves in parallel, but can't do that for push/pop.
7639
7640          Be careful about choosing what prologue to emit:  When function takes
7641          many instructions to execute we may use slow version as well as in
7642          case function is known to be outside hot spot (this is known with
7643          feedback only).  Weight the size of function by number of registers
7644          to save as it is cheap to use one or two push instructions but very
7645          slow to use many of them.  */
7646       if (count)
7647         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
7648       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
7649           || (flag_branch_probabilities
7650               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
7651         cfun->machine->use_fast_prologue_epilogue = false;
7652       else
7653         cfun->machine->use_fast_prologue_epilogue
7654            = !expensive_function_p (count);
7655     }
7656   if (TARGET_PROLOGUE_USING_MOVE
7657       && cfun->machine->use_fast_prologue_epilogue)
7658     frame->save_regs_using_mov = true;
7659   else
7660     frame->save_regs_using_mov = false;
7661
7662
7663   /* Skip return address and saved base pointer.  */
7664   offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
7665
7666   frame->hard_frame_pointer_offset = offset;
7667
7668   /* Set offset to aligned because the realigned frame starts from
7669      here.  */
7670   if (stack_realign_fp)
7671     offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
7672
7673   /* Register save area */
7674   offset += frame->nregs * UNITS_PER_WORD;
7675
7676   /* Align SSE reg save area.  */
7677   if (frame->nsseregs)
7678     frame->padding0 = ((offset + 16 - 1) & -16) - offset;
7679   else
7680     frame->padding0 = 0;
7681   
7682   /* SSE register save area.  */
7683   offset += frame->padding0 + frame->nsseregs * 16;
7684
7685   /* Va-arg area */
7686   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
7687   offset += frame->va_arg_size;
7688
7689   /* Align start of frame for local function.  */
7690   frame->padding1 = ((offset + stack_alignment_needed - 1)
7691                      & -stack_alignment_needed) - offset;
7692
7693   offset += frame->padding1;
7694
7695   /* Frame pointer points here.  */
7696   frame->frame_pointer_offset = offset;
7697
7698   offset += size;
7699
7700   /* Add outgoing arguments area.  Can be skipped if we eliminated
7701      all the function calls as dead code.
7702      Skipping is however impossible when function calls alloca.  Alloca
7703      expander assumes that last crtl->outgoing_args_size
7704      of stack frame are unused.  */
7705   if (ACCUMULATE_OUTGOING_ARGS
7706       && (!current_function_is_leaf || cfun->calls_alloca
7707           || ix86_current_function_calls_tls_descriptor))
7708     {
7709       offset += crtl->outgoing_args_size;
7710       frame->outgoing_arguments_size = crtl->outgoing_args_size;
7711     }
7712   else
7713     frame->outgoing_arguments_size = 0;
7714
7715   /* Align stack boundary.  Only needed if we're calling another function
7716      or using alloca.  */
7717   if (!current_function_is_leaf || cfun->calls_alloca
7718       || ix86_current_function_calls_tls_descriptor)
7719     frame->padding2 = ((offset + preferred_alignment - 1)
7720                        & -preferred_alignment) - offset;
7721   else
7722     frame->padding2 = 0;
7723
7724   offset += frame->padding2;
7725
7726   /* We've reached end of stack frame.  */
7727   frame->stack_pointer_offset = offset;
7728
7729   /* Size prologue needs to allocate.  */
7730   frame->to_allocate =
7731     (size + frame->padding1 + frame->padding2
7732      + frame->outgoing_arguments_size + frame->va_arg_size);
7733
7734   if ((!frame->to_allocate && frame->nregs <= 1)
7735       || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
7736     frame->save_regs_using_mov = false;
7737
7738   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && current_function_sp_is_unchanging
7739       && current_function_is_leaf
7740       && !ix86_current_function_calls_tls_descriptor)
7741     {
7742       frame->red_zone_size = frame->to_allocate;
7743       if (frame->save_regs_using_mov)
7744         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
7745       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
7746         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
7747     }
7748   else
7749     frame->red_zone_size = 0;
7750   frame->to_allocate -= frame->red_zone_size;
7751   frame->stack_pointer_offset -= frame->red_zone_size;
7752 #if 0
7753   fprintf (stderr, "\n");
7754   fprintf (stderr, "size: %ld\n", (long)size);
7755   fprintf (stderr, "nregs: %ld\n", (long)frame->nregs);
7756   fprintf (stderr, "nsseregs: %ld\n", (long)frame->nsseregs);
7757   fprintf (stderr, "padding0: %ld\n", (long)frame->padding0);
7758   fprintf (stderr, "alignment1: %ld\n", (long)stack_alignment_needed);
7759   fprintf (stderr, "padding1: %ld\n", (long)frame->padding1);
7760   fprintf (stderr, "va_arg: %ld\n", (long)frame->va_arg_size);
7761   fprintf (stderr, "padding2: %ld\n", (long)frame->padding2);
7762   fprintf (stderr, "to_allocate: %ld\n", (long)frame->to_allocate);
7763   fprintf (stderr, "red_zone_size: %ld\n", (long)frame->red_zone_size);
7764   fprintf (stderr, "frame_pointer_offset: %ld\n", (long)frame->frame_pointer_offset);
7765   fprintf (stderr, "hard_frame_pointer_offset: %ld\n",
7766            (long)frame->hard_frame_pointer_offset);
7767   fprintf (stderr, "stack_pointer_offset: %ld\n", (long)frame->stack_pointer_offset);
7768   fprintf (stderr, "current_function_is_leaf: %ld\n", (long)current_function_is_leaf);
7769   fprintf (stderr, "cfun->calls_alloca: %ld\n", (long)cfun->calls_alloca);
7770   fprintf (stderr, "x86_current_function_calls_tls_descriptor: %ld\n", (long)ix86_current_function_calls_tls_descriptor);
7771 #endif
7772 }
7773
7774 /* Emit code to save registers in the prologue.  */
7775
7776 static void
7777 ix86_emit_save_regs (void)
7778 {
7779   unsigned int regno;
7780   rtx insn;
7781
7782   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
7783     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7784       {
7785         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
7786         RTX_FRAME_RELATED_P (insn) = 1;
7787       }
7788 }
7789
7790 /* Emit code to save registers using MOV insns.  First register
7791    is restored from POINTER + OFFSET.  */
7792 static void
7793 ix86_emit_save_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7794 {
7795   unsigned int regno;
7796   rtx insn;
7797
7798   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7799     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7800       {
7801         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
7802                                                Pmode, offset),
7803                                gen_rtx_REG (Pmode, regno));
7804         RTX_FRAME_RELATED_P (insn) = 1;
7805         offset += UNITS_PER_WORD;
7806       }
7807 }
7808
7809 /* Emit code to save registers using MOV insns.  First register
7810    is restored from POINTER + OFFSET.  */
7811 static void
7812 ix86_emit_save_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7813 {
7814   unsigned int regno;
7815   rtx insn;
7816   rtx mem;
7817
7818   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7819     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7820       {
7821         mem = adjust_address (gen_rtx_MEM (TImode, pointer), TImode, offset);
7822         set_mem_align (mem, 128);
7823         insn = emit_move_insn (mem, gen_rtx_REG (TImode, regno));
7824         RTX_FRAME_RELATED_P (insn) = 1;
7825         offset += 16;
7826       }
7827 }
7828
7829 /* Expand prologue or epilogue stack adjustment.
7830    The pattern exist to put a dependency on all ebp-based memory accesses.
7831    STYLE should be negative if instructions should be marked as frame related,
7832    zero if %r11 register is live and cannot be freely used and positive
7833    otherwise.  */
7834
7835 static void
7836 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset, int style)
7837 {
7838   rtx insn;
7839
7840   if (! TARGET_64BIT)
7841     insn = emit_insn (gen_pro_epilogue_adjust_stack_1 (dest, src, offset));
7842   else if (x86_64_immediate_operand (offset, DImode))
7843     insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
7844   else
7845     {
7846       rtx r11;
7847       /* r11 is used by indirect sibcall return as well, set before the
7848          epilogue and used after the epilogue.  ATM indirect sibcall
7849          shouldn't be used together with huge frame sizes in one
7850          function because of the frame_size check in sibcall.c.  */
7851       gcc_assert (style);
7852       r11 = gen_rtx_REG (DImode, R11_REG);
7853       insn = emit_insn (gen_rtx_SET (DImode, r11, offset));
7854       if (style < 0)
7855         RTX_FRAME_RELATED_P (insn) = 1;
7856       insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11,
7857                                                                offset));
7858     }
7859   if (style < 0)
7860     RTX_FRAME_RELATED_P (insn) = 1;
7861 }
7862
7863 /* Find an available register to be used as dynamic realign argument
7864    pointer regsiter.  Such a register will be written in prologue and
7865    used in begin of body, so it must not be
7866         1. parameter passing register.
7867         2. GOT pointer.
7868    We reuse static-chain register if it is available.  Otherwise, we
7869    use DI for i386 and R13 for x86-64.  We chose R13 since it has
7870    shorter encoding.
7871
7872    Return: the regno of chosen register.  */
7873
7874 static unsigned int 
7875 find_drap_reg (void)
7876 {
7877   tree decl = cfun->decl;
7878
7879   if (TARGET_64BIT)
7880     {
7881       /* Use R13 for nested function or function need static chain.
7882          Since function with tail call may use any caller-saved
7883          registers in epilogue, DRAP must not use caller-saved
7884          register in such case.  */
7885       if ((decl_function_context (decl)
7886            && !DECL_NO_STATIC_CHAIN (decl))
7887           || crtl->tail_call_emit)
7888         return R13_REG;
7889
7890       return R10_REG;
7891     }
7892   else
7893     {
7894       /* Use DI for nested function or function need static chain.
7895          Since function with tail call may use any caller-saved
7896          registers in epilogue, DRAP must not use caller-saved
7897          register in such case.  */
7898       if ((decl_function_context (decl)
7899            && !DECL_NO_STATIC_CHAIN (decl))
7900           || crtl->tail_call_emit)
7901         return DI_REG;
7902     
7903       /* Reuse static chain register if it isn't used for parameter
7904          passing.  */
7905       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2
7906           && !lookup_attribute ("fastcall",
7907                                 TYPE_ATTRIBUTES (TREE_TYPE (decl))))
7908         return CX_REG;
7909       else
7910         return DI_REG;
7911     }
7912 }
7913
7914 /* Update incoming stack boundary and estimated stack alignment.  */
7915
7916 static void
7917 ix86_update_stack_boundary (void)
7918 {
7919   /* Prefer the one specified at command line. */
7920   ix86_incoming_stack_boundary 
7921     = (ix86_user_incoming_stack_boundary
7922        ? ix86_user_incoming_stack_boundary
7923        : ix86_default_incoming_stack_boundary);
7924
7925   /* Incoming stack alignment can be changed on individual functions
7926      via force_align_arg_pointer attribute.  We use the smallest
7927      incoming stack boundary.  */
7928   if (ix86_incoming_stack_boundary > MIN_STACK_BOUNDARY
7929       && lookup_attribute (ix86_force_align_arg_pointer_string,
7930                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
7931     ix86_incoming_stack_boundary = MIN_STACK_BOUNDARY;
7932
7933   /* The incoming stack frame has to be aligned at least at
7934      parm_stack_boundary.  */
7935   if (ix86_incoming_stack_boundary < crtl->parm_stack_boundary)
7936     ix86_incoming_stack_boundary = crtl->parm_stack_boundary;
7937
7938   /* Stack at entrance of main is aligned by runtime.  We use the
7939      smallest incoming stack boundary. */
7940   if (ix86_incoming_stack_boundary > MAIN_STACK_BOUNDARY
7941       && DECL_NAME (current_function_decl)
7942       && MAIN_NAME_P (DECL_NAME (current_function_decl))
7943       && DECL_FILE_SCOPE_P (current_function_decl))
7944     ix86_incoming_stack_boundary = MAIN_STACK_BOUNDARY;
7945
7946   /* x86_64 vararg needs 16byte stack alignment for register save
7947      area.  */
7948   if (TARGET_64BIT
7949       && cfun->stdarg
7950       && crtl->stack_alignment_estimated < 128)
7951     crtl->stack_alignment_estimated = 128;
7952 }
7953
7954 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
7955    needed or an rtx for DRAP otherwise.  */
7956
7957 static rtx
7958 ix86_get_drap_rtx (void)
7959 {
7960   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
7961     crtl->need_drap = true;
7962
7963   if (stack_realign_drap)
7964     {
7965       /* Assign DRAP to vDRAP and returns vDRAP */
7966       unsigned int regno = find_drap_reg ();
7967       rtx drap_vreg;
7968       rtx arg_ptr;
7969       rtx seq, insn;
7970
7971       arg_ptr = gen_rtx_REG (Pmode, regno);
7972       crtl->drap_reg = arg_ptr;
7973
7974       start_sequence ();
7975       drap_vreg = copy_to_reg (arg_ptr);
7976       seq = get_insns ();
7977       end_sequence ();
7978       
7979       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
7980       RTX_FRAME_RELATED_P (insn) = 1;
7981       return drap_vreg;
7982     }
7983   else
7984     return NULL;
7985 }
7986
7987 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
7988
7989 static rtx
7990 ix86_internal_arg_pointer (void)
7991 {
7992   return virtual_incoming_args_rtx;
7993 }
7994
7995 /* Handle the TARGET_DWARF_HANDLE_FRAME_UNSPEC hook.
7996    This is called from dwarf2out.c to emit call frame instructions
7997    for frame-related insns containing UNSPECs and UNSPEC_VOLATILEs. */
7998 static void
7999 ix86_dwarf_handle_frame_unspec (const char *label, rtx pattern, int index)
8000 {
8001   rtx unspec = SET_SRC (pattern);
8002   gcc_assert (GET_CODE (unspec) == UNSPEC);
8003
8004   switch (index)
8005     {
8006     case UNSPEC_REG_SAVE:
8007       dwarf2out_reg_save_reg (label, XVECEXP (unspec, 0, 0),
8008                               SET_DEST (pattern));
8009       break;
8010     case UNSPEC_DEF_CFA:
8011       dwarf2out_def_cfa (label, REGNO (SET_DEST (pattern)),
8012                          INTVAL (XVECEXP (unspec, 0, 0)));
8013       break;
8014     default:
8015       gcc_unreachable ();
8016     }
8017 }
8018
8019 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
8020    to be generated in correct form.  */
8021 static void 
8022 ix86_finalize_stack_realign_flags (void)
8023 {
8024   /* Check if stack realign is really needed after reload, and 
8025      stores result in cfun */
8026   unsigned int incoming_stack_boundary
8027     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
8028        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
8029   unsigned int stack_realign = (incoming_stack_boundary
8030                                 < (current_function_is_leaf
8031                                    ? crtl->max_used_stack_slot_alignment
8032                                    : crtl->stack_alignment_needed));
8033
8034   if (crtl->stack_realign_finalized)
8035     {
8036       /* After stack_realign_needed is finalized, we can't no longer
8037          change it.  */
8038       gcc_assert (crtl->stack_realign_needed == stack_realign);
8039     }
8040   else
8041     {
8042       crtl->stack_realign_needed = stack_realign;
8043       crtl->stack_realign_finalized = true;
8044     }
8045 }
8046
8047 /* Expand the prologue into a bunch of separate insns.  */
8048
8049 void
8050 ix86_expand_prologue (void)
8051 {
8052   rtx insn;
8053   bool pic_reg_used;
8054   struct ix86_frame frame;
8055   HOST_WIDE_INT allocate;
8056
8057   ix86_finalize_stack_realign_flags ();
8058
8059   /* DRAP should not coexist with stack_realign_fp */
8060   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
8061
8062   ix86_compute_frame_layout (&frame);
8063
8064   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
8065      of DRAP is needed and stack realignment is really needed after reload */
8066   if (crtl->drap_reg && crtl->stack_realign_needed)
8067     {
8068       rtx x, y;
8069       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8070       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8071                               ? 0 : UNITS_PER_WORD);
8072
8073       gcc_assert (stack_realign_drap);
8074
8075       /* Grab the argument pointer.  */
8076       x = plus_constant (stack_pointer_rtx, 
8077                          (UNITS_PER_WORD + param_ptr_offset));
8078       y = crtl->drap_reg;
8079
8080       /* Only need to push parameter pointer reg if it is caller
8081          saved reg */
8082       if (!call_used_regs[REGNO (crtl->drap_reg)])
8083         {
8084           /* Push arg pointer reg */
8085           insn = emit_insn (gen_push (y));
8086           RTX_FRAME_RELATED_P (insn) = 1;
8087         }
8088
8089       insn = emit_insn (gen_rtx_SET (VOIDmode, y, x));
8090       RTX_FRAME_RELATED_P (insn) = 1; 
8091
8092       /* Align the stack.  */
8093       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8094                                            stack_pointer_rtx,
8095                                            GEN_INT (-align_bytes)));
8096       RTX_FRAME_RELATED_P (insn) = 1;
8097
8098       /* Replicate the return address on the stack so that return
8099          address can be reached via (argp - 1) slot.  This is needed
8100          to implement macro RETURN_ADDR_RTX and intrinsic function
8101          expand_builtin_return_addr etc.  */
8102       x = crtl->drap_reg;
8103       x = gen_frame_mem (Pmode,
8104                          plus_constant (x, -UNITS_PER_WORD));
8105       insn = emit_insn (gen_push (x));
8106       RTX_FRAME_RELATED_P (insn) = 1;
8107     }
8108
8109   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
8110      slower on all targets.  Also sdb doesn't like it.  */
8111
8112   if (frame_pointer_needed)
8113     {
8114       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
8115       RTX_FRAME_RELATED_P (insn) = 1;
8116
8117       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
8118       RTX_FRAME_RELATED_P (insn) = 1;
8119     }
8120
8121   if (stack_realign_fp)
8122     {
8123       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8124       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
8125
8126       /* Align the stack.  */
8127       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8128                                            stack_pointer_rtx,
8129                                            GEN_INT (-align_bytes)));
8130       RTX_FRAME_RELATED_P (insn) = 1;
8131     }
8132
8133   allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding0;
8134
8135   if (!frame.save_regs_using_mov)
8136     ix86_emit_save_regs ();
8137   else
8138     allocate += frame.nregs * UNITS_PER_WORD;
8139
8140   /* When using red zone we may start register saving before allocating
8141      the stack frame saving one cycle of the prologue. However I will
8142      avoid doing this if I am going to have to probe the stack since
8143      at least on x86_64 the stack probe can turn into a call that clobbers
8144      a red zone location */
8145   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && frame.save_regs_using_mov
8146       && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT))
8147     ix86_emit_save_regs_using_mov ((frame_pointer_needed
8148                                      && !crtl->stack_realign_needed) 
8149                                    ? hard_frame_pointer_rtx
8150                                    : stack_pointer_rtx,
8151                                    -frame.nregs * UNITS_PER_WORD);
8152
8153   if (allocate == 0)
8154     ;
8155   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
8156     pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8157                                GEN_INT (-allocate), -1);
8158   else
8159     {
8160       /* Only valid for Win32.  */
8161       rtx eax = gen_rtx_REG (Pmode, AX_REG);
8162       bool eax_live;
8163       rtx t;
8164
8165       gcc_assert (!TARGET_64BIT || cfun->machine->call_abi == MS_ABI);
8166
8167       if (cfun->machine->call_abi == MS_ABI)
8168         eax_live = false;
8169       else
8170         eax_live = ix86_eax_live_at_start_p ();
8171
8172       if (eax_live)
8173         {
8174           emit_insn (gen_push (eax));
8175           allocate -= UNITS_PER_WORD;
8176         }
8177
8178       emit_move_insn (eax, GEN_INT (allocate));
8179
8180       if (TARGET_64BIT)
8181         insn = gen_allocate_stack_worker_64 (eax, eax);
8182       else
8183         insn = gen_allocate_stack_worker_32 (eax, eax);
8184       insn = emit_insn (insn);
8185       RTX_FRAME_RELATED_P (insn) = 1;
8186       t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-allocate));
8187       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8188       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8189                                             t, REG_NOTES (insn));
8190
8191       if (eax_live)
8192         {
8193           if (frame_pointer_needed)
8194             t = plus_constant (hard_frame_pointer_rtx,
8195                                allocate
8196                                - frame.to_allocate
8197                                - frame.nregs * UNITS_PER_WORD);
8198           else
8199             t = plus_constant (stack_pointer_rtx, allocate);
8200           emit_move_insn (eax, gen_rtx_MEM (Pmode, t));
8201         }
8202     }
8203
8204   if (frame.save_regs_using_mov
8205       && !(!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8206          && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
8207     {
8208       if (!frame_pointer_needed
8209           || !frame.to_allocate
8210           || crtl->stack_realign_needed)
8211         ix86_emit_save_regs_using_mov (stack_pointer_rtx,
8212                                        frame.to_allocate
8213                                        + frame.nsseregs * 16 + frame.padding0);
8214       else
8215         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
8216                                        -frame.nregs * UNITS_PER_WORD);
8217     }
8218   if (!frame_pointer_needed
8219       || !frame.to_allocate
8220       || crtl->stack_realign_needed)
8221     ix86_emit_save_sse_regs_using_mov (stack_pointer_rtx,
8222                                        frame.to_allocate);
8223   else
8224     ix86_emit_save_sse_regs_using_mov (hard_frame_pointer_rtx,
8225                                        - frame.nregs * UNITS_PER_WORD
8226                                        - frame.nsseregs * 16
8227                                        - frame.padding0);
8228
8229   pic_reg_used = false;
8230   if (pic_offset_table_rtx
8231       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
8232           || crtl->profile))
8233     {
8234       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
8235
8236       if (alt_pic_reg_used != INVALID_REGNUM)
8237         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
8238
8239       pic_reg_used = true;
8240     }
8241
8242   if (pic_reg_used)
8243     {
8244       if (TARGET_64BIT)
8245         {
8246           if (ix86_cmodel == CM_LARGE_PIC)
8247             {
8248               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
8249               rtx label = gen_label_rtx ();
8250               emit_label (label);
8251               LABEL_PRESERVE_P (label) = 1;
8252               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
8253               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
8254               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
8255               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
8256                                             pic_offset_table_rtx, tmp_reg));
8257             }
8258           else
8259             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
8260         }
8261       else
8262         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
8263     }
8264
8265   /* In the pic_reg_used case, make sure that the got load isn't deleted
8266      when mcount needs it.  Blockage to avoid call movement across mcount
8267      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
8268      note.  */
8269   if (crtl->profile && pic_reg_used)
8270     emit_insn (gen_prologue_use (pic_offset_table_rtx));
8271
8272   if (crtl->drap_reg && !crtl->stack_realign_needed)
8273     {
8274       /* vDRAP is setup but after reload it turns out stack realign
8275          isn't necessary, here we will emit prologue to setup DRAP
8276          without stack realign adjustment */
8277       int drap_bp_offset = UNITS_PER_WORD * 2;
8278       rtx x = plus_constant (hard_frame_pointer_rtx, drap_bp_offset);
8279       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, x));
8280     }
8281
8282   /* Prevent instructions from being scheduled into register save push
8283      sequence when access to the redzone area is done through frame pointer.
8284      The offset betweeh the frame pointer and the stack pointer is calculated
8285      relative to the value of the stack pointer at the end of the function
8286      prologue, and moving instructions that access redzone area via frame
8287      pointer inside push sequence violates this assumption.  */
8288   if (frame_pointer_needed && frame.red_zone_size)
8289     emit_insn (gen_memory_blockage ());
8290
8291   /* Emit cld instruction if stringops are used in the function.  */
8292   if (TARGET_CLD && ix86_current_function_needs_cld)
8293     emit_insn (gen_cld ());
8294 }
8295
8296 /* Emit code to restore saved registers using MOV insns.  First register
8297    is restored from POINTER + OFFSET.  */
8298 static void
8299 ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8300                                   int maybe_eh_return)
8301 {
8302   int regno;
8303   rtx base_address = gen_rtx_MEM (Pmode, pointer);
8304
8305   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8306     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8307       {
8308         /* Ensure that adjust_address won't be forced to produce pointer
8309            out of range allowed by x86-64 instruction set.  */
8310         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8311           {
8312             rtx r11;
8313
8314             r11 = gen_rtx_REG (DImode, R11_REG);
8315             emit_move_insn (r11, GEN_INT (offset));
8316             emit_insn (gen_adddi3 (r11, r11, pointer));
8317             base_address = gen_rtx_MEM (Pmode, r11);
8318             offset = 0;
8319           }
8320         emit_move_insn (gen_rtx_REG (Pmode, regno),
8321                         adjust_address (base_address, Pmode, offset));
8322         offset += UNITS_PER_WORD;
8323       }
8324 }
8325
8326 /* Emit code to restore saved registers using MOV insns.  First register
8327    is restored from POINTER + OFFSET.  */
8328 static void
8329 ix86_emit_restore_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8330                                       int maybe_eh_return)
8331 {
8332   int regno;
8333   rtx base_address = gen_rtx_MEM (TImode, pointer);
8334   rtx mem;
8335
8336   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8337     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8338       {
8339         /* Ensure that adjust_address won't be forced to produce pointer
8340            out of range allowed by x86-64 instruction set.  */
8341         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8342           {
8343             rtx r11;
8344
8345             r11 = gen_rtx_REG (DImode, R11_REG);
8346             emit_move_insn (r11, GEN_INT (offset));
8347             emit_insn (gen_adddi3 (r11, r11, pointer));
8348             base_address = gen_rtx_MEM (TImode, r11);
8349             offset = 0;
8350           }
8351         mem = adjust_address (base_address, TImode, offset);
8352         set_mem_align (mem, 128);
8353         emit_move_insn (gen_rtx_REG (TImode, regno), mem);
8354         offset += 16;
8355       }
8356 }
8357
8358 /* Restore function stack, frame, and registers.  */
8359
8360 void
8361 ix86_expand_epilogue (int style)
8362 {
8363   int regno;
8364   int sp_valid;
8365   struct ix86_frame frame;
8366   HOST_WIDE_INT offset;
8367
8368   ix86_finalize_stack_realign_flags ();
8369
8370  /* When stack is realigned, SP must be valid.  */
8371   sp_valid = (!frame_pointer_needed
8372               || current_function_sp_is_unchanging
8373               || stack_realign_fp);
8374
8375   ix86_compute_frame_layout (&frame);
8376
8377   /* See the comment about red zone and frame
8378      pointer usage in ix86_expand_prologue.  */
8379   if (frame_pointer_needed && frame.red_zone_size)
8380     emit_insn (gen_memory_blockage ()); 
8381
8382   /* Calculate start of saved registers relative to ebp.  Special care
8383      must be taken for the normal return case of a function using
8384      eh_return: the eax and edx registers are marked as saved, but not
8385      restored along this path.  */
8386   offset = frame.nregs;
8387   if (crtl->calls_eh_return && style != 2)
8388     offset -= 2;
8389   offset *= -UNITS_PER_WORD;
8390   offset -= frame.nsseregs * 16 + frame.padding0;
8391
8392   /* If we're only restoring one register and sp is not valid then
8393      using a move instruction to restore the register since it's
8394      less work than reloading sp and popping the register.
8395
8396      The default code result in stack adjustment using add/lea instruction,
8397      while this code results in LEAVE instruction (or discrete equivalent),
8398      so it is profitable in some other cases as well.  Especially when there
8399      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
8400      and there is exactly one register to pop. This heuristic may need some
8401      tuning in future.  */
8402   if ((!sp_valid && (frame.nregs + frame.nsseregs) <= 1)
8403       || (TARGET_EPILOGUE_USING_MOVE
8404           && cfun->machine->use_fast_prologue_epilogue
8405           && ((frame.nregs + frame.nsseregs) > 1 || frame.to_allocate))
8406       || (frame_pointer_needed && !(frame.nregs + frame.nsseregs) && frame.to_allocate)
8407       || (frame_pointer_needed && TARGET_USE_LEAVE
8408           && cfun->machine->use_fast_prologue_epilogue
8409           && (frame.nregs + frame.nsseregs) == 1)
8410       || crtl->calls_eh_return)
8411     {
8412       /* Restore registers.  We can use ebp or esp to address the memory
8413          locations.  If both are available, default to ebp, since offsets
8414          are known to be small.  Only exception is esp pointing directly
8415          to the end of block of saved registers, where we may simplify
8416          addressing mode.  
8417
8418          If we are realigning stack with bp and sp, regs restore can't
8419          be addressed by bp. sp must be used instead.  */
8420
8421       if (!frame_pointer_needed
8422           || (sp_valid && !frame.to_allocate) 
8423           || stack_realign_fp)
8424         {
8425           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8426                                                 frame.to_allocate, style == 2);
8427           ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
8428                                             frame.to_allocate
8429                                             + frame.nsseregs * 16
8430                                             + frame.padding0, style == 2);
8431         }
8432       else
8433         {
8434           ix86_emit_restore_sse_regs_using_mov (hard_frame_pointer_rtx,
8435                                                 offset, style == 2);
8436           ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
8437                                             offset
8438                                             + frame.nsseregs * 16
8439                                             + frame.padding0, style == 2);
8440         }
8441
8442       /* eh_return epilogues need %ecx added to the stack pointer.  */
8443       if (style == 2)
8444         {
8445           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
8446
8447           /* Stack align doesn't work with eh_return.  */
8448           gcc_assert (!crtl->stack_realign_needed);
8449
8450           if (frame_pointer_needed)
8451             {
8452               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
8453               tmp = plus_constant (tmp, UNITS_PER_WORD);
8454               emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
8455
8456               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
8457               emit_move_insn (hard_frame_pointer_rtx, tmp);
8458
8459               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
8460                                          const0_rtx, style);
8461             }
8462           else
8463             {
8464               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
8465               tmp = plus_constant (tmp, (frame.to_allocate
8466                                          + frame.nregs * UNITS_PER_WORD
8467                                          + frame.nsseregs * 16
8468                                          + frame.padding0));
8469               emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
8470             }
8471         }
8472       else if (!frame_pointer_needed)
8473         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8474                                    GEN_INT (frame.to_allocate
8475                                             + frame.nregs * UNITS_PER_WORD
8476                                             + frame.nsseregs * 16
8477                                             + frame.padding0),
8478                                    style);
8479       /* If not an i386, mov & pop is faster than "leave".  */
8480       else if (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
8481                || !cfun->machine->use_fast_prologue_epilogue)
8482         emit_insn ((*ix86_gen_leave) ());
8483       else
8484         {
8485           pro_epilogue_adjust_stack (stack_pointer_rtx,
8486                                      hard_frame_pointer_rtx,
8487                                      const0_rtx, style);
8488
8489           emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8490         }
8491     }
8492   else
8493     {
8494       /* First step is to deallocate the stack frame so that we can
8495          pop the registers.
8496
8497          If we realign stack with frame pointer, then stack pointer
8498          won't be able to recover via lea $offset(%bp), %sp, because
8499          there is a padding area between bp and sp for realign. 
8500          "add $to_allocate, %sp" must be used instead.  */
8501       if (!sp_valid)
8502         {
8503           gcc_assert (frame_pointer_needed);
8504           gcc_assert (!stack_realign_fp);
8505           pro_epilogue_adjust_stack (stack_pointer_rtx,
8506                                      hard_frame_pointer_rtx,
8507                                      GEN_INT (offset), style);
8508           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8509                                                 frame.to_allocate, style == 2);
8510           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8511                                      GEN_INT (frame.nsseregs * 16), style);
8512         }
8513       else if (frame.to_allocate || frame.nsseregs)
8514         {
8515           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8516                                                 frame.to_allocate,
8517                                                 style == 2);
8518           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8519                                      GEN_INT (frame.to_allocate
8520                                               + frame.nsseregs * 16
8521                                               + frame.padding0), style);
8522         }
8523
8524       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8525         if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
8526           emit_insn ((*ix86_gen_pop1) (gen_rtx_REG (Pmode, regno)));
8527       if (frame_pointer_needed)
8528         {
8529           /* Leave results in shorter dependency chains on CPUs that are
8530              able to grok it fast.  */
8531           if (TARGET_USE_LEAVE)
8532             emit_insn ((*ix86_gen_leave) ());
8533           else
8534             {
8535               /* For stack realigned really happens, recover stack 
8536                  pointer to hard frame pointer is a must, if not using 
8537                  leave.  */
8538               if (stack_realign_fp)
8539                 pro_epilogue_adjust_stack (stack_pointer_rtx,
8540                                            hard_frame_pointer_rtx,
8541                                            const0_rtx, style);
8542               emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8543             }
8544         }
8545     }
8546
8547   if (crtl->drap_reg && crtl->stack_realign_needed)
8548     {
8549       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8550                               ? 0 : UNITS_PER_WORD);
8551       gcc_assert (stack_realign_drap);
8552       emit_insn ((*ix86_gen_add3) (stack_pointer_rtx,
8553                                    crtl->drap_reg,
8554                                    GEN_INT (-(UNITS_PER_WORD
8555                                               + param_ptr_offset))));
8556       if (!call_used_regs[REGNO (crtl->drap_reg)])
8557         emit_insn ((*ix86_gen_pop1) (crtl->drap_reg));
8558       
8559     }
8560
8561   /* Sibcall epilogues don't want a return instruction.  */
8562   if (style == 0)
8563     return;
8564
8565   if (crtl->args.pops_args && crtl->args.size)
8566     {
8567       rtx popc = GEN_INT (crtl->args.pops_args);
8568
8569       /* i386 can only pop 64K bytes.  If asked to pop more, pop
8570          return address, do explicit add, and jump indirectly to the
8571          caller.  */
8572
8573       if (crtl->args.pops_args >= 65536)
8574         {
8575           rtx ecx = gen_rtx_REG (SImode, CX_REG);
8576
8577           /* There is no "pascal" calling convention in any 64bit ABI.  */
8578           gcc_assert (!TARGET_64BIT);
8579
8580           emit_insn (gen_popsi1 (ecx));
8581           emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
8582           emit_jump_insn (gen_return_indirect_internal (ecx));
8583         }
8584       else
8585         emit_jump_insn (gen_return_pop_internal (popc));
8586     }
8587   else
8588     emit_jump_insn (gen_return_internal ());
8589 }
8590
8591 /* Reset from the function's potential modifications.  */
8592
8593 static void
8594 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
8595                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8596 {
8597   if (pic_offset_table_rtx)
8598     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
8599 #if TARGET_MACHO
8600   /* Mach-O doesn't support labels at the end of objects, so if
8601      it looks like we might want one, insert a NOP.  */
8602   {
8603     rtx insn = get_last_insn ();
8604     while (insn
8605            && NOTE_P (insn)
8606            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
8607       insn = PREV_INSN (insn);
8608     if (insn
8609         && (LABEL_P (insn)
8610             || (NOTE_P (insn)
8611                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
8612       fputs ("\tnop\n", file);
8613   }
8614 #endif
8615
8616 }
8617 \f
8618 /* Extract the parts of an RTL expression that is a valid memory address
8619    for an instruction.  Return 0 if the structure of the address is
8620    grossly off.  Return -1 if the address contains ASHIFT, so it is not
8621    strictly valid, but still used for computing length of lea instruction.  */
8622
8623 int
8624 ix86_decompose_address (rtx addr, struct ix86_address *out)
8625 {
8626   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
8627   rtx base_reg, index_reg;
8628   HOST_WIDE_INT scale = 1;
8629   rtx scale_rtx = NULL_RTX;
8630   int retval = 1;
8631   enum ix86_address_seg seg = SEG_DEFAULT;
8632
8633   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
8634     base = addr;
8635   else if (GET_CODE (addr) == PLUS)
8636     {
8637       rtx addends[4], op;
8638       int n = 0, i;
8639
8640       op = addr;
8641       do
8642         {
8643           if (n >= 4)
8644             return 0;
8645           addends[n++] = XEXP (op, 1);
8646           op = XEXP (op, 0);
8647         }
8648       while (GET_CODE (op) == PLUS);
8649       if (n >= 4)
8650         return 0;
8651       addends[n] = op;
8652
8653       for (i = n; i >= 0; --i)
8654         {
8655           op = addends[i];
8656           switch (GET_CODE (op))
8657             {
8658             case MULT:
8659               if (index)
8660                 return 0;
8661               index = XEXP (op, 0);
8662               scale_rtx = XEXP (op, 1);
8663               break;
8664
8665             case UNSPEC:
8666               if (XINT (op, 1) == UNSPEC_TP
8667                   && TARGET_TLS_DIRECT_SEG_REFS
8668                   && seg == SEG_DEFAULT)
8669                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
8670               else
8671                 return 0;
8672               break;
8673
8674             case REG:
8675             case SUBREG:
8676               if (!base)
8677                 base = op;
8678               else if (!index)
8679                 index = op;
8680               else
8681                 return 0;
8682               break;
8683
8684             case CONST:
8685             case CONST_INT:
8686             case SYMBOL_REF:
8687             case LABEL_REF:
8688               if (disp)
8689                 return 0;
8690               disp = op;
8691               break;
8692
8693             default:
8694               return 0;
8695             }
8696         }
8697     }
8698   else if (GET_CODE (addr) == MULT)
8699     {
8700       index = XEXP (addr, 0);           /* index*scale */
8701       scale_rtx = XEXP (addr, 1);
8702     }
8703   else if (GET_CODE (addr) == ASHIFT)
8704     {
8705       rtx tmp;
8706
8707       /* We're called for lea too, which implements ashift on occasion.  */
8708       index = XEXP (addr, 0);
8709       tmp = XEXP (addr, 1);
8710       if (!CONST_INT_P (tmp))
8711         return 0;
8712       scale = INTVAL (tmp);
8713       if ((unsigned HOST_WIDE_INT) scale > 3)
8714         return 0;
8715       scale = 1 << scale;
8716       retval = -1;
8717     }
8718   else
8719     disp = addr;                        /* displacement */
8720
8721   /* Extract the integral value of scale.  */
8722   if (scale_rtx)
8723     {
8724       if (!CONST_INT_P (scale_rtx))
8725         return 0;
8726       scale = INTVAL (scale_rtx);
8727     }
8728
8729   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
8730   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
8731
8732   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
8733   if (base_reg && index_reg && scale == 1
8734       && (index_reg == arg_pointer_rtx
8735           || index_reg == frame_pointer_rtx
8736           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
8737     {
8738       rtx tmp;
8739       tmp = base, base = index, index = tmp;
8740       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
8741     }
8742
8743   /* Special case: %ebp cannot be encoded as a base without a displacement.  */
8744   if ((base_reg == hard_frame_pointer_rtx
8745        || base_reg == frame_pointer_rtx
8746        || base_reg == arg_pointer_rtx) && !disp)
8747     disp = const0_rtx;
8748
8749   /* Special case: on K6, [%esi] makes the instruction vector decoded.
8750      Avoid this by transforming to [%esi+0].
8751      Reload calls address legitimization without cfun defined, so we need
8752      to test cfun for being non-NULL. */
8753   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
8754       && base_reg && !index_reg && !disp
8755       && REG_P (base_reg)
8756       && REGNO_REG_CLASS (REGNO (base_reg)) == SIREG)
8757     disp = const0_rtx;
8758
8759   /* Special case: encode reg+reg instead of reg*2.  */
8760   if (!base && index && scale && scale == 2)
8761     base = index, base_reg = index_reg, scale = 1;
8762
8763   /* Special case: scaling cannot be encoded without base or displacement.  */
8764   if (!base && !disp && index && scale != 1)
8765     disp = const0_rtx;
8766
8767   out->base = base;
8768   out->index = index;
8769   out->disp = disp;
8770   out->scale = scale;
8771   out->seg = seg;
8772
8773   return retval;
8774 }
8775 \f
8776 /* Return cost of the memory address x.
8777    For i386, it is better to use a complex address than let gcc copy
8778    the address into a reg and make a new pseudo.  But not if the address
8779    requires to two regs - that would mean more pseudos with longer
8780    lifetimes.  */
8781 static int
8782 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
8783 {
8784   struct ix86_address parts;
8785   int cost = 1;
8786   int ok = ix86_decompose_address (x, &parts);
8787
8788   gcc_assert (ok);
8789
8790   if (parts.base && GET_CODE (parts.base) == SUBREG)
8791     parts.base = SUBREG_REG (parts.base);
8792   if (parts.index && GET_CODE (parts.index) == SUBREG)
8793     parts.index = SUBREG_REG (parts.index);
8794
8795   /* Attempt to minimize number of registers in the address.  */
8796   if ((parts.base
8797        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
8798       || (parts.index
8799           && (!REG_P (parts.index)
8800               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
8801     cost++;
8802
8803   if (parts.base
8804       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
8805       && parts.index
8806       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
8807       && parts.base != parts.index)
8808     cost++;
8809
8810   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
8811      since it's predecode logic can't detect the length of instructions
8812      and it degenerates to vector decoded.  Increase cost of such
8813      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
8814      to split such addresses or even refuse such addresses at all.
8815
8816      Following addressing modes are affected:
8817       [base+scale*index]
8818       [scale*index+disp]
8819       [base+index]
8820
8821      The first and last case  may be avoidable by explicitly coding the zero in
8822      memory address, but I don't have AMD-K6 machine handy to check this
8823      theory.  */
8824
8825   if (TARGET_K6
8826       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
8827           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
8828           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
8829     cost += 10;
8830
8831   return cost;
8832 }
8833 \f
8834 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
8835    this is used for to form addresses to local data when -fPIC is in
8836    use.  */
8837
8838 static bool
8839 darwin_local_data_pic (rtx disp)
8840 {
8841   return (GET_CODE (disp) == UNSPEC
8842           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
8843 }
8844
8845 /* Determine if a given RTX is a valid constant.  We already know this
8846    satisfies CONSTANT_P.  */
8847
8848 bool
8849 legitimate_constant_p (rtx x)
8850 {
8851   switch (GET_CODE (x))
8852     {
8853     case CONST:
8854       x = XEXP (x, 0);
8855
8856       if (GET_CODE (x) == PLUS)
8857         {
8858           if (!CONST_INT_P (XEXP (x, 1)))
8859             return false;
8860           x = XEXP (x, 0);
8861         }
8862
8863       if (TARGET_MACHO && darwin_local_data_pic (x))
8864         return true;
8865
8866       /* Only some unspecs are valid as "constants".  */
8867       if (GET_CODE (x) == UNSPEC)
8868         switch (XINT (x, 1))
8869           {
8870           case UNSPEC_GOT:
8871           case UNSPEC_GOTOFF:
8872           case UNSPEC_PLTOFF:
8873             return TARGET_64BIT;
8874           case UNSPEC_TPOFF:
8875           case UNSPEC_NTPOFF:
8876             x = XVECEXP (x, 0, 0);
8877             return (GET_CODE (x) == SYMBOL_REF
8878                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
8879           case UNSPEC_DTPOFF:
8880             x = XVECEXP (x, 0, 0);
8881             return (GET_CODE (x) == SYMBOL_REF
8882                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
8883           default:
8884             return false;
8885           }
8886
8887       /* We must have drilled down to a symbol.  */
8888       if (GET_CODE (x) == LABEL_REF)
8889         return true;
8890       if (GET_CODE (x) != SYMBOL_REF)
8891         return false;
8892       /* FALLTHRU */
8893
8894     case SYMBOL_REF:
8895       /* TLS symbols are never valid.  */
8896       if (SYMBOL_REF_TLS_MODEL (x))
8897         return false;
8898
8899       /* DLLIMPORT symbols are never valid.  */
8900       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
8901           && SYMBOL_REF_DLLIMPORT_P (x))
8902         return false;
8903       break;
8904
8905     case CONST_DOUBLE:
8906       if (GET_MODE (x) == TImode
8907           && x != CONST0_RTX (TImode)
8908           && !TARGET_64BIT)
8909         return false;
8910       break;
8911
8912     case CONST_VECTOR:
8913       if (x == CONST0_RTX (GET_MODE (x)))
8914         return true;
8915       return false;
8916
8917     default:
8918       break;
8919     }
8920
8921   /* Otherwise we handle everything else in the move patterns.  */
8922   return true;
8923 }
8924
8925 /* Determine if it's legal to put X into the constant pool.  This
8926    is not possible for the address of thread-local symbols, which
8927    is checked above.  */
8928
8929 static bool
8930 ix86_cannot_force_const_mem (rtx x)
8931 {
8932   /* We can always put integral constants and vectors in memory.  */
8933   switch (GET_CODE (x))
8934     {
8935     case CONST_INT:
8936     case CONST_DOUBLE:
8937     case CONST_VECTOR:
8938       return false;
8939
8940     default:
8941       break;
8942     }
8943   return !legitimate_constant_p (x);
8944 }
8945
8946 /* Determine if a given RTX is a valid constant address.  */
8947
8948 bool
8949 constant_address_p (rtx x)
8950 {
8951   return CONSTANT_P (x) && legitimate_address_p (Pmode, x, 1);
8952 }
8953
8954 /* Nonzero if the constant value X is a legitimate general operand
8955    when generating PIC code.  It is given that flag_pic is on and
8956    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
8957
8958 bool
8959 legitimate_pic_operand_p (rtx x)
8960 {
8961   rtx inner;
8962
8963   switch (GET_CODE (x))
8964     {
8965     case CONST:
8966       inner = XEXP (x, 0);
8967       if (GET_CODE (inner) == PLUS
8968           && CONST_INT_P (XEXP (inner, 1)))
8969         inner = XEXP (inner, 0);
8970
8971       /* Only some unspecs are valid as "constants".  */
8972       if (GET_CODE (inner) == UNSPEC)
8973         switch (XINT (inner, 1))
8974           {
8975           case UNSPEC_GOT:
8976           case UNSPEC_GOTOFF:
8977           case UNSPEC_PLTOFF:
8978             return TARGET_64BIT;
8979           case UNSPEC_TPOFF:
8980             x = XVECEXP (inner, 0, 0);
8981             return (GET_CODE (x) == SYMBOL_REF
8982                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
8983           case UNSPEC_MACHOPIC_OFFSET:
8984             return legitimate_pic_address_disp_p (x);
8985           default:
8986             return false;
8987           }
8988       /* FALLTHRU */
8989
8990     case SYMBOL_REF:
8991     case LABEL_REF:
8992       return legitimate_pic_address_disp_p (x);
8993
8994     default:
8995       return true;
8996     }
8997 }
8998
8999 /* Determine if a given CONST RTX is a valid memory displacement
9000    in PIC mode.  */
9001
9002 int
9003 legitimate_pic_address_disp_p (rtx disp)
9004 {
9005   bool saw_plus;
9006
9007   /* In 64bit mode we can allow direct addresses of symbols and labels
9008      when they are not dynamic symbols.  */
9009   if (TARGET_64BIT)
9010     {
9011       rtx op0 = disp, op1;
9012
9013       switch (GET_CODE (disp))
9014         {
9015         case LABEL_REF:
9016           return true;
9017
9018         case CONST:
9019           if (GET_CODE (XEXP (disp, 0)) != PLUS)
9020             break;
9021           op0 = XEXP (XEXP (disp, 0), 0);
9022           op1 = XEXP (XEXP (disp, 0), 1);
9023           if (!CONST_INT_P (op1)
9024               || INTVAL (op1) >= 16*1024*1024
9025               || INTVAL (op1) < -16*1024*1024)
9026             break;
9027           if (GET_CODE (op0) == LABEL_REF)
9028             return true;
9029           if (GET_CODE (op0) != SYMBOL_REF)
9030             break;
9031           /* FALLTHRU */
9032
9033         case SYMBOL_REF:
9034           /* TLS references should always be enclosed in UNSPEC.  */
9035           if (SYMBOL_REF_TLS_MODEL (op0))
9036             return false;
9037           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
9038               && ix86_cmodel != CM_LARGE_PIC)
9039             return true;
9040           break;
9041
9042         default:
9043           break;
9044         }
9045     }
9046   if (GET_CODE (disp) != CONST)
9047     return 0;
9048   disp = XEXP (disp, 0);
9049
9050   if (TARGET_64BIT)
9051     {
9052       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
9053          of GOT tables.  We should not need these anyway.  */
9054       if (GET_CODE (disp) != UNSPEC
9055           || (XINT (disp, 1) != UNSPEC_GOTPCREL
9056               && XINT (disp, 1) != UNSPEC_GOTOFF
9057               && XINT (disp, 1) != UNSPEC_PLTOFF))
9058         return 0;
9059
9060       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
9061           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
9062         return 0;
9063       return 1;
9064     }
9065
9066   saw_plus = false;
9067   if (GET_CODE (disp) == PLUS)
9068     {
9069       if (!CONST_INT_P (XEXP (disp, 1)))
9070         return 0;
9071       disp = XEXP (disp, 0);
9072       saw_plus = true;
9073     }
9074
9075   if (TARGET_MACHO && darwin_local_data_pic (disp))
9076     return 1;
9077
9078   if (GET_CODE (disp) != UNSPEC)
9079     return 0;
9080
9081   switch (XINT (disp, 1))
9082     {
9083     case UNSPEC_GOT:
9084       if (saw_plus)
9085         return false;
9086       /* We need to check for both symbols and labels because VxWorks loads
9087          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
9088          details.  */
9089       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9090               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
9091     case UNSPEC_GOTOFF:
9092       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
9093          While ABI specify also 32bit relocation but we don't produce it in
9094          small PIC model at all.  */
9095       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9096            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
9097           && !TARGET_64BIT)
9098         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
9099       return false;
9100     case UNSPEC_GOTTPOFF:
9101     case UNSPEC_GOTNTPOFF:
9102     case UNSPEC_INDNTPOFF:
9103       if (saw_plus)
9104         return false;
9105       disp = XVECEXP (disp, 0, 0);
9106       return (GET_CODE (disp) == SYMBOL_REF
9107               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
9108     case UNSPEC_NTPOFF:
9109       disp = XVECEXP (disp, 0, 0);
9110       return (GET_CODE (disp) == SYMBOL_REF
9111               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
9112     case UNSPEC_DTPOFF:
9113       disp = XVECEXP (disp, 0, 0);
9114       return (GET_CODE (disp) == SYMBOL_REF
9115               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
9116     }
9117
9118   return 0;
9119 }
9120
9121 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression that is a valid
9122    memory address for an instruction.  The MODE argument is the machine mode
9123    for the MEM expression that wants to use this address.
9124
9125    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
9126    convert common non-canonical forms to canonical form so that they will
9127    be recognized.  */
9128
9129 int
9130 legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
9131                       rtx addr, int strict)
9132 {
9133   struct ix86_address parts;
9134   rtx base, index, disp;
9135   HOST_WIDE_INT scale;
9136   const char *reason = NULL;
9137   rtx reason_rtx = NULL_RTX;
9138
9139   if (ix86_decompose_address (addr, &parts) <= 0)
9140     {
9141       reason = "decomposition failed";
9142       goto report_error;
9143     }
9144
9145   base = parts.base;
9146   index = parts.index;
9147   disp = parts.disp;
9148   scale = parts.scale;
9149
9150   /* Validate base register.
9151
9152      Don't allow SUBREG's that span more than a word here.  It can lead to spill
9153      failures when the base is one word out of a two word structure, which is
9154      represented internally as a DImode int.  */
9155
9156   if (base)
9157     {
9158       rtx reg;
9159       reason_rtx = base;
9160
9161       if (REG_P (base))
9162         reg = base;
9163       else if (GET_CODE (base) == SUBREG
9164                && REG_P (SUBREG_REG (base))
9165                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
9166                   <= UNITS_PER_WORD)
9167         reg = SUBREG_REG (base);
9168       else
9169         {
9170           reason = "base is not a register";
9171           goto report_error;
9172         }
9173
9174       if (GET_MODE (base) != Pmode)
9175         {
9176           reason = "base is not in Pmode";
9177           goto report_error;
9178         }
9179
9180       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
9181           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
9182         {
9183           reason = "base is not valid";
9184           goto report_error;
9185         }
9186     }
9187
9188   /* Validate index register.
9189
9190      Don't allow SUBREG's that span more than a word here -- same as above.  */
9191
9192   if (index)
9193     {
9194       rtx reg;
9195       reason_rtx = index;
9196
9197       if (REG_P (index))
9198         reg = index;
9199       else if (GET_CODE (index) == SUBREG
9200                && REG_P (SUBREG_REG (index))
9201                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
9202                   <= UNITS_PER_WORD)
9203         reg = SUBREG_REG (index);
9204       else
9205         {
9206           reason = "index is not a register";
9207           goto report_error;
9208         }
9209
9210       if (GET_MODE (index) != Pmode)
9211         {
9212           reason = "index is not in Pmode";
9213           goto report_error;
9214         }
9215
9216       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
9217           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
9218         {
9219           reason = "index is not valid";
9220           goto report_error;
9221         }
9222     }
9223
9224   /* Validate scale factor.  */
9225   if (scale != 1)
9226     {
9227       reason_rtx = GEN_INT (scale);
9228       if (!index)
9229         {
9230           reason = "scale without index";
9231           goto report_error;
9232         }
9233
9234       if (scale != 2 && scale != 4 && scale != 8)
9235         {
9236           reason = "scale is not a valid multiplier";
9237           goto report_error;
9238         }
9239     }
9240
9241   /* Validate displacement.  */
9242   if (disp)
9243     {
9244       reason_rtx = disp;
9245
9246       if (GET_CODE (disp) == CONST
9247           && GET_CODE (XEXP (disp, 0)) == UNSPEC
9248           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
9249         switch (XINT (XEXP (disp, 0), 1))
9250           {
9251           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
9252              used.  While ABI specify also 32bit relocations, we don't produce
9253              them at all and use IP relative instead.  */
9254           case UNSPEC_GOT:
9255           case UNSPEC_GOTOFF:
9256             gcc_assert (flag_pic);
9257             if (!TARGET_64BIT)
9258               goto is_legitimate_pic;
9259             reason = "64bit address unspec";
9260             goto report_error;
9261
9262           case UNSPEC_GOTPCREL:
9263             gcc_assert (flag_pic);
9264             goto is_legitimate_pic;
9265
9266           case UNSPEC_GOTTPOFF:
9267           case UNSPEC_GOTNTPOFF:
9268           case UNSPEC_INDNTPOFF:
9269           case UNSPEC_NTPOFF:
9270           case UNSPEC_DTPOFF:
9271             break;
9272
9273           default:
9274             reason = "invalid address unspec";
9275             goto report_error;
9276           }
9277
9278       else if (SYMBOLIC_CONST (disp)
9279                && (flag_pic
9280                    || (TARGET_MACHO
9281 #if TARGET_MACHO
9282                        && MACHOPIC_INDIRECT
9283                        && !machopic_operand_p (disp)
9284 #endif
9285                )))
9286         {
9287
9288         is_legitimate_pic:
9289           if (TARGET_64BIT && (index || base))
9290             {
9291               /* foo@dtpoff(%rX) is ok.  */
9292               if (GET_CODE (disp) != CONST
9293                   || GET_CODE (XEXP (disp, 0)) != PLUS
9294                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
9295                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
9296                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
9297                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
9298                 {
9299                   reason = "non-constant pic memory reference";
9300                   goto report_error;
9301                 }
9302             }
9303           else if (! legitimate_pic_address_disp_p (disp))
9304             {
9305               reason = "displacement is an invalid pic construct";
9306               goto report_error;
9307             }
9308
9309           /* This code used to verify that a symbolic pic displacement
9310              includes the pic_offset_table_rtx register.
9311
9312              While this is good idea, unfortunately these constructs may
9313              be created by "adds using lea" optimization for incorrect
9314              code like:
9315
9316              int a;
9317              int foo(int i)
9318                {
9319                  return *(&a+i);
9320                }
9321
9322              This code is nonsensical, but results in addressing
9323              GOT table with pic_offset_table_rtx base.  We can't
9324              just refuse it easily, since it gets matched by
9325              "addsi3" pattern, that later gets split to lea in the
9326              case output register differs from input.  While this
9327              can be handled by separate addsi pattern for this case
9328              that never results in lea, this seems to be easier and
9329              correct fix for crash to disable this test.  */
9330         }
9331       else if (GET_CODE (disp) != LABEL_REF
9332                && !CONST_INT_P (disp)
9333                && (GET_CODE (disp) != CONST
9334                    || !legitimate_constant_p (disp))
9335                && (GET_CODE (disp) != SYMBOL_REF
9336                    || !legitimate_constant_p (disp)))
9337         {
9338           reason = "displacement is not constant";
9339           goto report_error;
9340         }
9341       else if (TARGET_64BIT
9342                && !x86_64_immediate_operand (disp, VOIDmode))
9343         {
9344           reason = "displacement is out of range";
9345           goto report_error;
9346         }
9347     }
9348
9349   /* Everything looks valid.  */
9350   return TRUE;
9351
9352  report_error:
9353   return FALSE;
9354 }
9355 \f
9356 /* Return a unique alias set for the GOT.  */
9357
9358 static alias_set_type
9359 ix86_GOT_alias_set (void)
9360 {
9361   static alias_set_type set = -1;
9362   if (set == -1)
9363     set = new_alias_set ();
9364   return set;
9365 }
9366
9367 /* Return a legitimate reference for ORIG (an address) using the
9368    register REG.  If REG is 0, a new pseudo is generated.
9369
9370    There are two types of references that must be handled:
9371
9372    1. Global data references must load the address from the GOT, via
9373       the PIC reg.  An insn is emitted to do this load, and the reg is
9374       returned.
9375
9376    2. Static data references, constant pool addresses, and code labels
9377       compute the address as an offset from the GOT, whose base is in
9378       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
9379       differentiate them from global data objects.  The returned
9380       address is the PIC reg + an unspec constant.
9381
9382    GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
9383    reg also appears in the address.  */
9384
9385 static rtx
9386 legitimize_pic_address (rtx orig, rtx reg)
9387 {
9388   rtx addr = orig;
9389   rtx new_rtx = orig;
9390   rtx base;
9391
9392 #if TARGET_MACHO
9393   if (TARGET_MACHO && !TARGET_64BIT)
9394     {
9395       if (reg == 0)
9396         reg = gen_reg_rtx (Pmode);
9397       /* Use the generic Mach-O PIC machinery.  */
9398       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
9399     }
9400 #endif
9401
9402   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
9403     new_rtx = addr;
9404   else if (TARGET_64BIT
9405            && ix86_cmodel != CM_SMALL_PIC
9406            && gotoff_operand (addr, Pmode))
9407     {
9408       rtx tmpreg;
9409       /* This symbol may be referenced via a displacement from the PIC
9410          base address (@GOTOFF).  */
9411
9412       if (reload_in_progress)
9413         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9414       if (GET_CODE (addr) == CONST)
9415         addr = XEXP (addr, 0);
9416       if (GET_CODE (addr) == PLUS)
9417           {
9418             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9419                                       UNSPEC_GOTOFF);
9420             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9421           }
9422         else
9423           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9424       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9425       if (!reg)
9426         tmpreg = gen_reg_rtx (Pmode);
9427       else
9428         tmpreg = reg;
9429       emit_move_insn (tmpreg, new_rtx);
9430
9431       if (reg != 0)
9432         {
9433           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
9434                                          tmpreg, 1, OPTAB_DIRECT);
9435           new_rtx = reg;
9436         }
9437       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
9438     }
9439   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
9440     {
9441       /* This symbol may be referenced via a displacement from the PIC
9442          base address (@GOTOFF).  */
9443
9444       if (reload_in_progress)
9445         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9446       if (GET_CODE (addr) == CONST)
9447         addr = XEXP (addr, 0);
9448       if (GET_CODE (addr) == PLUS)
9449           {
9450             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9451                                       UNSPEC_GOTOFF);
9452             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9453           }
9454         else
9455           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9456       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9457       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9458
9459       if (reg != 0)
9460         {
9461           emit_move_insn (reg, new_rtx);
9462           new_rtx = reg;
9463         }
9464     }
9465   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
9466            /* We can't use @GOTOFF for text labels on VxWorks;
9467               see gotoff_operand.  */
9468            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
9469     {
9470       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
9471         {
9472           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
9473             return legitimize_dllimport_symbol (addr, true);
9474           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
9475               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
9476               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
9477             {
9478               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
9479               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
9480             }
9481         }
9482
9483       if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
9484         {
9485           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
9486           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9487           new_rtx = gen_const_mem (Pmode, new_rtx);
9488           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9489
9490           if (reg == 0)
9491             reg = gen_reg_rtx (Pmode);
9492           /* Use directly gen_movsi, otherwise the address is loaded
9493              into register for CSE.  We don't want to CSE this addresses,
9494              instead we CSE addresses from the GOT table, so skip this.  */
9495           emit_insn (gen_movsi (reg, new_rtx));
9496           new_rtx = reg;
9497         }
9498       else
9499         {
9500           /* This symbol must be referenced via a load from the
9501              Global Offset Table (@GOT).  */
9502
9503           if (reload_in_progress)
9504             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9505           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
9506           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9507           if (TARGET_64BIT)
9508             new_rtx = force_reg (Pmode, new_rtx);
9509           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9510           new_rtx = gen_const_mem (Pmode, new_rtx);
9511           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9512
9513           if (reg == 0)
9514             reg = gen_reg_rtx (Pmode);
9515           emit_move_insn (reg, new_rtx);
9516           new_rtx = reg;
9517         }
9518     }
9519   else
9520     {
9521       if (CONST_INT_P (addr)
9522           && !x86_64_immediate_operand (addr, VOIDmode))
9523         {
9524           if (reg)
9525             {
9526               emit_move_insn (reg, addr);
9527               new_rtx = reg;
9528             }
9529           else
9530             new_rtx = force_reg (Pmode, addr);
9531         }
9532       else if (GET_CODE (addr) == CONST)
9533         {
9534           addr = XEXP (addr, 0);
9535
9536           /* We must match stuff we generate before.  Assume the only
9537              unspecs that can get here are ours.  Not that we could do
9538              anything with them anyway....  */
9539           if (GET_CODE (addr) == UNSPEC
9540               || (GET_CODE (addr) == PLUS
9541                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
9542             return orig;
9543           gcc_assert (GET_CODE (addr) == PLUS);
9544         }
9545       if (GET_CODE (addr) == PLUS)
9546         {
9547           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
9548
9549           /* Check first to see if this is a constant offset from a @GOTOFF
9550              symbol reference.  */
9551           if (gotoff_operand (op0, Pmode)
9552               && CONST_INT_P (op1))
9553             {
9554               if (!TARGET_64BIT)
9555                 {
9556                   if (reload_in_progress)
9557                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9558                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
9559                                             UNSPEC_GOTOFF);
9560                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
9561                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9562                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9563
9564                   if (reg != 0)
9565                     {
9566                       emit_move_insn (reg, new_rtx);
9567                       new_rtx = reg;
9568                     }
9569                 }
9570               else
9571                 {
9572                   if (INTVAL (op1) < -16*1024*1024
9573                       || INTVAL (op1) >= 16*1024*1024)
9574                     {
9575                       if (!x86_64_immediate_operand (op1, Pmode))
9576                         op1 = force_reg (Pmode, op1);
9577                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
9578                     }
9579                 }
9580             }
9581           else
9582             {
9583               base = legitimize_pic_address (XEXP (addr, 0), reg);
9584               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
9585                                                  base == reg ? NULL_RTX : reg);
9586
9587               if (CONST_INT_P (new_rtx))
9588                 new_rtx = plus_constant (base, INTVAL (new_rtx));
9589               else
9590                 {
9591                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
9592                     {
9593                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
9594                       new_rtx = XEXP (new_rtx, 1);
9595                     }
9596                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
9597                 }
9598             }
9599         }
9600     }
9601   return new_rtx;
9602 }
9603 \f
9604 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
9605
9606 static rtx
9607 get_thread_pointer (int to_reg)
9608 {
9609   rtx tp, reg, insn;
9610
9611   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
9612   if (!to_reg)
9613     return tp;
9614
9615   reg = gen_reg_rtx (Pmode);
9616   insn = gen_rtx_SET (VOIDmode, reg, tp);
9617   insn = emit_insn (insn);
9618
9619   return reg;
9620 }
9621
9622 /* A subroutine of legitimize_address and ix86_expand_move.  FOR_MOV is
9623    false if we expect this to be used for a memory address and true if
9624    we expect to load the address into a register.  */
9625
9626 static rtx
9627 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
9628 {
9629   rtx dest, base, off, pic, tp;
9630   int type;
9631
9632   switch (model)
9633     {
9634     case TLS_MODEL_GLOBAL_DYNAMIC:
9635       dest = gen_reg_rtx (Pmode);
9636       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9637
9638       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9639         {
9640           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
9641
9642           start_sequence ();
9643           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
9644           insns = get_insns ();
9645           end_sequence ();
9646
9647           RTL_CONST_CALL_P (insns) = 1;
9648           emit_libcall_block (insns, dest, rax, x);
9649         }
9650       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9651         emit_insn (gen_tls_global_dynamic_64 (dest, x));
9652       else
9653         emit_insn (gen_tls_global_dynamic_32 (dest, x));
9654
9655       if (TARGET_GNU2_TLS)
9656         {
9657           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
9658
9659           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9660         }
9661       break;
9662
9663     case TLS_MODEL_LOCAL_DYNAMIC:
9664       base = gen_reg_rtx (Pmode);
9665       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9666
9667       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9668         {
9669           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
9670
9671           start_sequence ();
9672           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
9673           insns = get_insns ();
9674           end_sequence ();
9675
9676           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
9677           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
9678           RTL_CONST_CALL_P (insns) = 1;
9679           emit_libcall_block (insns, base, rax, note);
9680         }
9681       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9682         emit_insn (gen_tls_local_dynamic_base_64 (base));
9683       else
9684         emit_insn (gen_tls_local_dynamic_base_32 (base));
9685
9686       if (TARGET_GNU2_TLS)
9687         {
9688           rtx x = ix86_tls_module_base ();
9689
9690           set_unique_reg_note (get_last_insn (), REG_EQUIV,
9691                                gen_rtx_MINUS (Pmode, x, tp));
9692         }
9693
9694       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
9695       off = gen_rtx_CONST (Pmode, off);
9696
9697       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
9698
9699       if (TARGET_GNU2_TLS)
9700         {
9701           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
9702
9703           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9704         }
9705
9706       break;
9707
9708     case TLS_MODEL_INITIAL_EXEC:
9709       if (TARGET_64BIT)
9710         {
9711           pic = NULL;
9712           type = UNSPEC_GOTNTPOFF;
9713         }
9714       else if (flag_pic)
9715         {
9716           if (reload_in_progress)
9717             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9718           pic = pic_offset_table_rtx;
9719           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
9720         }
9721       else if (!TARGET_ANY_GNU_TLS)
9722         {
9723           pic = gen_reg_rtx (Pmode);
9724           emit_insn (gen_set_got (pic));
9725           type = UNSPEC_GOTTPOFF;
9726         }
9727       else
9728         {
9729           pic = NULL;
9730           type = UNSPEC_INDNTPOFF;
9731         }
9732
9733       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
9734       off = gen_rtx_CONST (Pmode, off);
9735       if (pic)
9736         off = gen_rtx_PLUS (Pmode, pic, off);
9737       off = gen_const_mem (Pmode, off);
9738       set_mem_alias_set (off, ix86_GOT_alias_set ());
9739
9740       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9741         {
9742           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9743           off = force_reg (Pmode, off);
9744           return gen_rtx_PLUS (Pmode, base, off);
9745         }
9746       else
9747         {
9748           base = get_thread_pointer (true);
9749           dest = gen_reg_rtx (Pmode);
9750           emit_insn (gen_subsi3 (dest, base, off));
9751         }
9752       break;
9753
9754     case TLS_MODEL_LOCAL_EXEC:
9755       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
9756                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9757                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
9758       off = gen_rtx_CONST (Pmode, off);
9759
9760       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9761         {
9762           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9763           return gen_rtx_PLUS (Pmode, base, off);
9764         }
9765       else
9766         {
9767           base = get_thread_pointer (true);
9768           dest = gen_reg_rtx (Pmode);
9769           emit_insn (gen_subsi3 (dest, base, off));
9770         }
9771       break;
9772
9773     default:
9774       gcc_unreachable ();
9775     }
9776
9777   return dest;
9778 }
9779
9780 /* Create or return the unique __imp_DECL dllimport symbol corresponding
9781    to symbol DECL.  */
9782
9783 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
9784   htab_t dllimport_map;
9785
9786 static tree
9787 get_dllimport_decl (tree decl)
9788 {
9789   struct tree_map *h, in;
9790   void **loc;
9791   const char *name;
9792   const char *prefix;
9793   size_t namelen, prefixlen;
9794   char *imp_name;
9795   tree to;
9796   rtx rtl;
9797
9798   if (!dllimport_map)
9799     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
9800
9801   in.hash = htab_hash_pointer (decl);
9802   in.base.from = decl;
9803   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
9804   h = (struct tree_map *) *loc;
9805   if (h)
9806     return h->to;
9807
9808   *loc = h = GGC_NEW (struct tree_map);
9809   h->hash = in.hash;
9810   h->base.from = decl;
9811   h->to = to = build_decl (VAR_DECL, NULL, ptr_type_node);
9812   DECL_ARTIFICIAL (to) = 1;
9813   DECL_IGNORED_P (to) = 1;
9814   DECL_EXTERNAL (to) = 1;
9815   TREE_READONLY (to) = 1;
9816
9817   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
9818   name = targetm.strip_name_encoding (name);
9819   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
9820     ? "*__imp_" : "*__imp__";
9821   namelen = strlen (name);
9822   prefixlen = strlen (prefix);
9823   imp_name = (char *) alloca (namelen + prefixlen + 1);
9824   memcpy (imp_name, prefix, prefixlen);
9825   memcpy (imp_name + prefixlen, name, namelen + 1);
9826
9827   name = ggc_alloc_string (imp_name, namelen + prefixlen);
9828   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
9829   SET_SYMBOL_REF_DECL (rtl, to);
9830   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
9831
9832   rtl = gen_const_mem (Pmode, rtl);
9833   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
9834
9835   SET_DECL_RTL (to, rtl);
9836   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
9837
9838   return to;
9839 }
9840
9841 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
9842    true if we require the result be a register.  */
9843
9844 static rtx
9845 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
9846 {
9847   tree imp_decl;
9848   rtx x;
9849
9850   gcc_assert (SYMBOL_REF_DECL (symbol));
9851   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
9852
9853   x = DECL_RTL (imp_decl);
9854   if (want_reg)
9855     x = force_reg (Pmode, x);
9856   return x;
9857 }
9858
9859 /* Try machine-dependent ways of modifying an illegitimate address
9860    to be legitimate.  If we find one, return the new, valid address.
9861    This macro is used in only one place: `memory_address' in explow.c.
9862
9863    OLDX is the address as it was before break_out_memory_refs was called.
9864    In some cases it is useful to look at this to decide what needs to be done.
9865
9866    MODE and WIN are passed so that this macro can use
9867    GO_IF_LEGITIMATE_ADDRESS.
9868
9869    It is always safe for this macro to do nothing.  It exists to recognize
9870    opportunities to optimize the output.
9871
9872    For the 80386, we handle X+REG by loading X into a register R and
9873    using R+REG.  R will go in a general reg and indexing will be used.
9874    However, if REG is a broken-out memory address or multiplication,
9875    nothing needs to be done because REG can certainly go in a general reg.
9876
9877    When -fpic is used, special handling is needed for symbolic references.
9878    See comments by legitimize_pic_address in i386.c for details.  */
9879
9880 rtx
9881 legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
9882 {
9883   int changed = 0;
9884   unsigned log;
9885
9886   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
9887   if (log)
9888     return legitimize_tls_address (x, (enum tls_model) log, false);
9889   if (GET_CODE (x) == CONST
9890       && GET_CODE (XEXP (x, 0)) == PLUS
9891       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
9892       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
9893     {
9894       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
9895                                       (enum tls_model) log, false);
9896       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
9897     }
9898
9899   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
9900     {
9901       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
9902         return legitimize_dllimport_symbol (x, true);
9903       if (GET_CODE (x) == CONST
9904           && GET_CODE (XEXP (x, 0)) == PLUS
9905           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
9906           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
9907         {
9908           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
9909           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
9910         }
9911     }
9912
9913   if (flag_pic && SYMBOLIC_CONST (x))
9914     return legitimize_pic_address (x, 0);
9915
9916   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
9917   if (GET_CODE (x) == ASHIFT
9918       && CONST_INT_P (XEXP (x, 1))
9919       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
9920     {
9921       changed = 1;
9922       log = INTVAL (XEXP (x, 1));
9923       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
9924                         GEN_INT (1 << log));
9925     }
9926
9927   if (GET_CODE (x) == PLUS)
9928     {
9929       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
9930
9931       if (GET_CODE (XEXP (x, 0)) == ASHIFT
9932           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
9933           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
9934         {
9935           changed = 1;
9936           log = INTVAL (XEXP (XEXP (x, 0), 1));
9937           XEXP (x, 0) = gen_rtx_MULT (Pmode,
9938                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
9939                                       GEN_INT (1 << log));
9940         }
9941
9942       if (GET_CODE (XEXP (x, 1)) == ASHIFT
9943           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
9944           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
9945         {
9946           changed = 1;
9947           log = INTVAL (XEXP (XEXP (x, 1), 1));
9948           XEXP (x, 1) = gen_rtx_MULT (Pmode,
9949                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
9950                                       GEN_INT (1 << log));
9951         }
9952
9953       /* Put multiply first if it isn't already.  */
9954       if (GET_CODE (XEXP (x, 1)) == MULT)
9955         {
9956           rtx tmp = XEXP (x, 0);
9957           XEXP (x, 0) = XEXP (x, 1);
9958           XEXP (x, 1) = tmp;
9959           changed = 1;
9960         }
9961
9962       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
9963          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
9964          created by virtual register instantiation, register elimination, and
9965          similar optimizations.  */
9966       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
9967         {
9968           changed = 1;
9969           x = gen_rtx_PLUS (Pmode,
9970                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
9971                                           XEXP (XEXP (x, 1), 0)),
9972                             XEXP (XEXP (x, 1), 1));
9973         }
9974
9975       /* Canonicalize
9976          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
9977          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
9978       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
9979                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
9980                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
9981                && CONSTANT_P (XEXP (x, 1)))
9982         {
9983           rtx constant;
9984           rtx other = NULL_RTX;
9985
9986           if (CONST_INT_P (XEXP (x, 1)))
9987             {
9988               constant = XEXP (x, 1);
9989               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
9990             }
9991           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
9992             {
9993               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
9994               other = XEXP (x, 1);
9995             }
9996           else
9997             constant = 0;
9998
9999           if (constant)
10000             {
10001               changed = 1;
10002               x = gen_rtx_PLUS (Pmode,
10003                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
10004                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
10005                                 plus_constant (other, INTVAL (constant)));
10006             }
10007         }
10008
10009       if (changed && legitimate_address_p (mode, x, FALSE))
10010         return x;
10011
10012       if (GET_CODE (XEXP (x, 0)) == MULT)
10013         {
10014           changed = 1;
10015           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
10016         }
10017
10018       if (GET_CODE (XEXP (x, 1)) == MULT)
10019         {
10020           changed = 1;
10021           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
10022         }
10023
10024       if (changed
10025           && REG_P (XEXP (x, 1))
10026           && REG_P (XEXP (x, 0)))
10027         return x;
10028
10029       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
10030         {
10031           changed = 1;
10032           x = legitimize_pic_address (x, 0);
10033         }
10034
10035       if (changed && legitimate_address_p (mode, x, FALSE))
10036         return x;
10037
10038       if (REG_P (XEXP (x, 0)))
10039         {
10040           rtx temp = gen_reg_rtx (Pmode);
10041           rtx val  = force_operand (XEXP (x, 1), temp);
10042           if (val != temp)
10043             emit_move_insn (temp, val);
10044
10045           XEXP (x, 1) = temp;
10046           return x;
10047         }
10048
10049       else if (REG_P (XEXP (x, 1)))
10050         {
10051           rtx temp = gen_reg_rtx (Pmode);
10052           rtx val  = force_operand (XEXP (x, 0), temp);
10053           if (val != temp)
10054             emit_move_insn (temp, val);
10055
10056           XEXP (x, 0) = temp;
10057           return x;
10058         }
10059     }
10060
10061   return x;
10062 }
10063 \f
10064 /* Print an integer constant expression in assembler syntax.  Addition
10065    and subtraction are the only arithmetic that may appear in these
10066    expressions.  FILE is the stdio stream to write to, X is the rtx, and
10067    CODE is the operand print code from the output string.  */
10068
10069 static void
10070 output_pic_addr_const (FILE *file, rtx x, int code)
10071 {
10072   char buf[256];
10073
10074   switch (GET_CODE (x))
10075     {
10076     case PC:
10077       gcc_assert (flag_pic);
10078       putc ('.', file);
10079       break;
10080
10081     case SYMBOL_REF:
10082       if (! TARGET_MACHO || TARGET_64BIT)
10083         output_addr_const (file, x);
10084       else
10085         {
10086           const char *name = XSTR (x, 0);
10087
10088           /* Mark the decl as referenced so that cgraph will
10089              output the function.  */
10090           if (SYMBOL_REF_DECL (x))
10091             mark_decl_referenced (SYMBOL_REF_DECL (x));
10092
10093 #if TARGET_MACHO
10094           if (MACHOPIC_INDIRECT
10095               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10096             name = machopic_indirection_name (x, /*stub_p=*/true);
10097 #endif
10098           assemble_name (file, name);
10099         }
10100       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
10101           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
10102         fputs ("@PLT", file);
10103       break;
10104
10105     case LABEL_REF:
10106       x = XEXP (x, 0);
10107       /* FALLTHRU */
10108     case CODE_LABEL:
10109       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
10110       assemble_name (asm_out_file, buf);
10111       break;
10112
10113     case CONST_INT:
10114       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
10115       break;
10116
10117     case CONST:
10118       /* This used to output parentheses around the expression,
10119          but that does not work on the 386 (either ATT or BSD assembler).  */
10120       output_pic_addr_const (file, XEXP (x, 0), code);
10121       break;
10122
10123     case CONST_DOUBLE:
10124       if (GET_MODE (x) == VOIDmode)
10125         {
10126           /* We can use %d if the number is <32 bits and positive.  */
10127           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
10128             fprintf (file, "0x%lx%08lx",
10129                      (unsigned long) CONST_DOUBLE_HIGH (x),
10130                      (unsigned long) CONST_DOUBLE_LOW (x));
10131           else
10132             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
10133         }
10134       else
10135         /* We can't handle floating point constants;
10136            PRINT_OPERAND must handle them.  */
10137         output_operand_lossage ("floating constant misused");
10138       break;
10139
10140     case PLUS:
10141       /* Some assemblers need integer constants to appear first.  */
10142       if (CONST_INT_P (XEXP (x, 0)))
10143         {
10144           output_pic_addr_const (file, XEXP (x, 0), code);
10145           putc ('+', file);
10146           output_pic_addr_const (file, XEXP (x, 1), code);
10147         }
10148       else
10149         {
10150           gcc_assert (CONST_INT_P (XEXP (x, 1)));
10151           output_pic_addr_const (file, XEXP (x, 1), code);
10152           putc ('+', file);
10153           output_pic_addr_const (file, XEXP (x, 0), code);
10154         }
10155       break;
10156
10157     case MINUS:
10158       if (!TARGET_MACHO)
10159         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
10160       output_pic_addr_const (file, XEXP (x, 0), code);
10161       putc ('-', file);
10162       output_pic_addr_const (file, XEXP (x, 1), code);
10163       if (!TARGET_MACHO)
10164         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
10165       break;
10166
10167      case UNSPEC:
10168        gcc_assert (XVECLEN (x, 0) == 1);
10169        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
10170        switch (XINT (x, 1))
10171         {
10172         case UNSPEC_GOT:
10173           fputs ("@GOT", file);
10174           break;
10175         case UNSPEC_GOTOFF:
10176           fputs ("@GOTOFF", file);
10177           break;
10178         case UNSPEC_PLTOFF:
10179           fputs ("@PLTOFF", file);
10180           break;
10181         case UNSPEC_GOTPCREL:
10182           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10183                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
10184           break;
10185         case UNSPEC_GOTTPOFF:
10186           /* FIXME: This might be @TPOFF in Sun ld too.  */
10187           fputs ("@GOTTPOFF", file);
10188           break;
10189         case UNSPEC_TPOFF:
10190           fputs ("@TPOFF", file);
10191           break;
10192         case UNSPEC_NTPOFF:
10193           if (TARGET_64BIT)
10194             fputs ("@TPOFF", file);
10195           else
10196             fputs ("@NTPOFF", file);
10197           break;
10198         case UNSPEC_DTPOFF:
10199           fputs ("@DTPOFF", file);
10200           break;
10201         case UNSPEC_GOTNTPOFF:
10202           if (TARGET_64BIT)
10203             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10204                    "@GOTTPOFF(%rip)": "@GOTTPOFF[rip]", file);
10205           else
10206             fputs ("@GOTNTPOFF", file);
10207           break;
10208         case UNSPEC_INDNTPOFF:
10209           fputs ("@INDNTPOFF", file);
10210           break;
10211 #if TARGET_MACHO
10212         case UNSPEC_MACHOPIC_OFFSET:
10213           putc ('-', file);
10214           machopic_output_function_base_name (file);
10215           break;
10216 #endif
10217         default:
10218           output_operand_lossage ("invalid UNSPEC as operand");
10219           break;
10220         }
10221        break;
10222
10223     default:
10224       output_operand_lossage ("invalid expression as operand");
10225     }
10226 }
10227
10228 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
10229    We need to emit DTP-relative relocations.  */
10230
10231 static void ATTRIBUTE_UNUSED
10232 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
10233 {
10234   fputs (ASM_LONG, file);
10235   output_addr_const (file, x);
10236   fputs ("@DTPOFF", file);
10237   switch (size)
10238     {
10239     case 4:
10240       break;
10241     case 8:
10242       fputs (", 0", file);
10243       break;
10244     default:
10245       gcc_unreachable ();
10246    }
10247 }
10248
10249 /* Return true if X is a representation of the PIC register.  This copes
10250    with calls from ix86_find_base_term, where the register might have
10251    been replaced by a cselib value.  */
10252
10253 static bool
10254 ix86_pic_register_p (rtx x)
10255 {
10256   if (GET_CODE (x) == VALUE)
10257     return (pic_offset_table_rtx
10258             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
10259   else
10260     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
10261 }
10262
10263 /* In the name of slightly smaller debug output, and to cater to
10264    general assembler lossage, recognize PIC+GOTOFF and turn it back
10265    into a direct symbol reference.
10266
10267    On Darwin, this is necessary to avoid a crash, because Darwin
10268    has a different PIC label for each routine but the DWARF debugging
10269    information is not associated with any particular routine, so it's
10270    necessary to remove references to the PIC label from RTL stored by
10271    the DWARF output code.  */
10272
10273 static rtx
10274 ix86_delegitimize_address (rtx orig_x)
10275 {
10276   rtx x = orig_x;
10277   /* reg_addend is NULL or a multiple of some register.  */
10278   rtx reg_addend = NULL_RTX;
10279   /* const_addend is NULL or a const_int.  */
10280   rtx const_addend = NULL_RTX;
10281   /* This is the result, or NULL.  */
10282   rtx result = NULL_RTX;
10283
10284   if (MEM_P (x))
10285     x = XEXP (x, 0);
10286
10287   if (TARGET_64BIT)
10288     {
10289       if (GET_CODE (x) != CONST
10290           || GET_CODE (XEXP (x, 0)) != UNSPEC
10291           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
10292           || !MEM_P (orig_x))
10293         return orig_x;
10294       return XVECEXP (XEXP (x, 0), 0, 0);
10295     }
10296
10297   if (GET_CODE (x) != PLUS
10298       || GET_CODE (XEXP (x, 1)) != CONST)
10299     return orig_x;
10300
10301   if (ix86_pic_register_p (XEXP (x, 0)))
10302     /* %ebx + GOT/GOTOFF */
10303     ;
10304   else if (GET_CODE (XEXP (x, 0)) == PLUS)
10305     {
10306       /* %ebx + %reg * scale + GOT/GOTOFF */
10307       reg_addend = XEXP (x, 0);
10308       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
10309         reg_addend = XEXP (reg_addend, 1);
10310       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
10311         reg_addend = XEXP (reg_addend, 0);
10312       else
10313         return orig_x;
10314       if (!REG_P (reg_addend)
10315           && GET_CODE (reg_addend) != MULT
10316           && GET_CODE (reg_addend) != ASHIFT)
10317         return orig_x;
10318     }
10319   else
10320     return orig_x;
10321
10322   x = XEXP (XEXP (x, 1), 0);
10323   if (GET_CODE (x) == PLUS
10324       && CONST_INT_P (XEXP (x, 1)))
10325     {
10326       const_addend = XEXP (x, 1);
10327       x = XEXP (x, 0);
10328     }
10329
10330   if (GET_CODE (x) == UNSPEC
10331       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x))
10332           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
10333     result = XVECEXP (x, 0, 0);
10334
10335   if (TARGET_MACHO && darwin_local_data_pic (x)
10336       && !MEM_P (orig_x))
10337     result = XVECEXP (x, 0, 0);
10338
10339   if (! result)
10340     return orig_x;
10341
10342   if (const_addend)
10343     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
10344   if (reg_addend)
10345     result = gen_rtx_PLUS (Pmode, reg_addend, result);
10346   return result;
10347 }
10348
10349 /* If X is a machine specific address (i.e. a symbol or label being
10350    referenced as a displacement from the GOT implemented using an
10351    UNSPEC), then return the base term.  Otherwise return X.  */
10352
10353 rtx
10354 ix86_find_base_term (rtx x)
10355 {
10356   rtx term;
10357
10358   if (TARGET_64BIT)
10359     {
10360       if (GET_CODE (x) != CONST)
10361         return x;
10362       term = XEXP (x, 0);
10363       if (GET_CODE (term) == PLUS
10364           && (CONST_INT_P (XEXP (term, 1))
10365               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
10366         term = XEXP (term, 0);
10367       if (GET_CODE (term) != UNSPEC
10368           || XINT (term, 1) != UNSPEC_GOTPCREL)
10369         return x;
10370
10371       return XVECEXP (term, 0, 0);
10372     }
10373
10374   return ix86_delegitimize_address (x);
10375 }
10376 \f
10377 static void
10378 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
10379                     int fp, FILE *file)
10380 {
10381   const char *suffix;
10382
10383   if (mode == CCFPmode || mode == CCFPUmode)
10384     {
10385       enum rtx_code second_code, bypass_code;
10386       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
10387       gcc_assert (bypass_code == UNKNOWN && second_code == UNKNOWN);
10388       code = ix86_fp_compare_code_to_integer (code);
10389       mode = CCmode;
10390     }
10391   if (reverse)
10392     code = reverse_condition (code);
10393
10394   switch (code)
10395     {
10396     case EQ:
10397       switch (mode)
10398         {
10399         case CCAmode:
10400           suffix = "a";
10401           break;
10402
10403         case CCCmode:
10404           suffix = "c";
10405           break;
10406
10407         case CCOmode:
10408           suffix = "o";
10409           break;
10410
10411         case CCSmode:
10412           suffix = "s";
10413           break;
10414
10415         default:
10416           suffix = "e";
10417         }
10418       break;
10419     case NE:
10420       switch (mode)
10421         {
10422         case CCAmode:
10423           suffix = "na";
10424           break;
10425
10426         case CCCmode:
10427           suffix = "nc";
10428           break;
10429
10430         case CCOmode:
10431           suffix = "no";
10432           break;
10433
10434         case CCSmode:
10435           suffix = "ns";
10436           break;
10437
10438         default:
10439           suffix = "ne";
10440         }
10441       break;
10442     case GT:
10443       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
10444       suffix = "g";
10445       break;
10446     case GTU:
10447       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
10448          Those same assemblers have the same but opposite lossage on cmov.  */
10449       if (mode == CCmode)
10450         suffix = fp ? "nbe" : "a";
10451       else if (mode == CCCmode)
10452         suffix = "b";
10453       else
10454         gcc_unreachable ();
10455       break;
10456     case LT:
10457       switch (mode)
10458         {
10459         case CCNOmode:
10460         case CCGOCmode:
10461           suffix = "s";
10462           break;
10463
10464         case CCmode:
10465         case CCGCmode:
10466           suffix = "l";
10467           break;
10468
10469         default:
10470           gcc_unreachable ();
10471         }
10472       break;
10473     case LTU:
10474       gcc_assert (mode == CCmode || mode == CCCmode);
10475       suffix = "b";
10476       break;
10477     case GE:
10478       switch (mode)
10479         {
10480         case CCNOmode:
10481         case CCGOCmode:
10482           suffix = "ns";
10483           break;
10484
10485         case CCmode:
10486         case CCGCmode:
10487           suffix = "ge";
10488           break;
10489
10490         default:
10491           gcc_unreachable ();
10492         }
10493       break;
10494     case GEU:
10495       /* ??? As above.  */
10496       gcc_assert (mode == CCmode || mode == CCCmode);
10497       suffix = fp ? "nb" : "ae";
10498       break;
10499     case LE:
10500       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
10501       suffix = "le";
10502       break;
10503     case LEU:
10504       /* ??? As above.  */
10505       if (mode == CCmode)
10506         suffix = "be";
10507       else if (mode == CCCmode)
10508         suffix = fp ? "nb" : "ae";
10509       else
10510         gcc_unreachable ();
10511       break;
10512     case UNORDERED:
10513       suffix = fp ? "u" : "p";
10514       break;
10515     case ORDERED:
10516       suffix = fp ? "nu" : "np";
10517       break;
10518     default:
10519       gcc_unreachable ();
10520     }
10521   fputs (suffix, file);
10522 }
10523
10524 /* Print the name of register X to FILE based on its machine mode and number.
10525    If CODE is 'w', pretend the mode is HImode.
10526    If CODE is 'b', pretend the mode is QImode.
10527    If CODE is 'k', pretend the mode is SImode.
10528    If CODE is 'q', pretend the mode is DImode.
10529    If CODE is 'x', pretend the mode is V4SFmode.
10530    If CODE is 't', pretend the mode is V8SFmode.
10531    If CODE is 'h', pretend the reg is the 'high' byte register.
10532    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
10533    If CODE is 'd', duplicate the operand for AVX instruction.
10534  */
10535
10536 void
10537 print_reg (rtx x, int code, FILE *file)
10538 {
10539   const char *reg;
10540   bool duplicated = code == 'd' && TARGET_AVX;
10541
10542   gcc_assert (x == pc_rtx
10543               || (REGNO (x) != ARG_POINTER_REGNUM
10544                   && REGNO (x) != FRAME_POINTER_REGNUM
10545                   && REGNO (x) != FLAGS_REG
10546                   && REGNO (x) != FPSR_REG
10547                   && REGNO (x) != FPCR_REG));
10548
10549   if (ASSEMBLER_DIALECT == ASM_ATT)
10550     putc ('%', file);
10551
10552   if (x == pc_rtx)
10553     {
10554       gcc_assert (TARGET_64BIT);
10555       fputs ("rip", file);
10556       return;
10557     }
10558
10559   if (code == 'w' || MMX_REG_P (x))
10560     code = 2;
10561   else if (code == 'b')
10562     code = 1;
10563   else if (code == 'k')
10564     code = 4;
10565   else if (code == 'q')
10566     code = 8;
10567   else if (code == 'y')
10568     code = 3;
10569   else if (code == 'h')
10570     code = 0;
10571   else if (code == 'x')
10572     code = 16;
10573   else if (code == 't')
10574     code = 32;
10575   else
10576     code = GET_MODE_SIZE (GET_MODE (x));
10577
10578   /* Irritatingly, AMD extended registers use different naming convention
10579      from the normal registers.  */
10580   if (REX_INT_REG_P (x))
10581     {
10582       gcc_assert (TARGET_64BIT);
10583       switch (code)
10584         {
10585           case 0:
10586             error ("extended registers have no high halves");
10587             break;
10588           case 1:
10589             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
10590             break;
10591           case 2:
10592             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
10593             break;
10594           case 4:
10595             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
10596             break;
10597           case 8:
10598             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
10599             break;
10600           default:
10601             error ("unsupported operand size for extended register");
10602             break;
10603         }
10604       return;
10605     }
10606
10607   reg = NULL;
10608   switch (code)
10609     {
10610     case 3:
10611       if (STACK_TOP_P (x))
10612         {
10613           reg = "st(0)";
10614           break;
10615         }
10616       /* FALLTHRU */
10617     case 8:
10618     case 4:
10619     case 12:
10620       if (! ANY_FP_REG_P (x))
10621         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
10622       /* FALLTHRU */
10623     case 16:
10624     case 2:
10625     normal:
10626       reg = hi_reg_name[REGNO (x)];
10627       break;
10628     case 1:
10629       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
10630         goto normal;
10631       reg = qi_reg_name[REGNO (x)];
10632       break;
10633     case 0:
10634       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
10635         goto normal;
10636       reg = qi_high_reg_name[REGNO (x)];
10637       break;
10638     case 32:
10639       if (SSE_REG_P (x))
10640         {
10641           gcc_assert (!duplicated);
10642           putc ('y', file);
10643           fputs (hi_reg_name[REGNO (x)] + 1, file);
10644           return;
10645         }
10646       break;
10647     default:
10648       gcc_unreachable ();
10649     }
10650
10651   fputs (reg, file);
10652   if (duplicated)
10653     {
10654       if (ASSEMBLER_DIALECT == ASM_ATT)
10655         fprintf (file, ", %%%s", reg);
10656       else
10657         fprintf (file, ", %s", reg);
10658     }
10659 }
10660
10661 /* Locate some local-dynamic symbol still in use by this function
10662    so that we can print its name in some tls_local_dynamic_base
10663    pattern.  */
10664
10665 static int
10666 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
10667 {
10668   rtx x = *px;
10669
10670   if (GET_CODE (x) == SYMBOL_REF
10671       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
10672     {
10673       cfun->machine->some_ld_name = XSTR (x, 0);
10674       return 1;
10675     }
10676
10677   return 0;
10678 }
10679
10680 static const char *
10681 get_some_local_dynamic_name (void)
10682 {
10683   rtx insn;
10684
10685   if (cfun->machine->some_ld_name)
10686     return cfun->machine->some_ld_name;
10687
10688   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
10689     if (INSN_P (insn)
10690         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
10691       return cfun->machine->some_ld_name;
10692
10693   gcc_unreachable ();
10694 }
10695
10696 /* Meaning of CODE:
10697    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
10698    C -- print opcode suffix for set/cmov insn.
10699    c -- like C, but print reversed condition
10700    E,e -- likewise, but for compare-and-branch fused insn.
10701    F,f -- likewise, but for floating-point.
10702    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
10703         otherwise nothing
10704    R -- print the prefix for register names.
10705    z -- print the opcode suffix for the size of the current operand.
10706    * -- print a star (in certain assembler syntax)
10707    A -- print an absolute memory reference.
10708    w -- print the operand as if it's a "word" (HImode) even if it isn't.
10709    s -- print a shift double count, followed by the assemblers argument
10710         delimiter.
10711    b -- print the QImode name of the register for the indicated operand.
10712         %b0 would print %al if operands[0] is reg 0.
10713    w --  likewise, print the HImode name of the register.
10714    k --  likewise, print the SImode name of the register.
10715    q --  likewise, print the DImode name of the register.
10716    x --  likewise, print the V4SFmode name of the register.
10717    t --  likewise, print the V8SFmode name of the register.
10718    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
10719    y -- print "st(0)" instead of "st" as a register.
10720    d -- print duplicated register operand for AVX instruction.
10721    D -- print condition for SSE cmp instruction.
10722    P -- if PIC, print an @PLT suffix.
10723    X -- don't print any sort of PIC '@' suffix for a symbol.
10724    & -- print some in-use local-dynamic symbol name.
10725    H -- print a memory address offset by 8; used for sse high-parts
10726    Y -- print condition for SSE5 com* instruction.
10727    + -- print a branch hint as 'cs' or 'ds' prefix
10728    ; -- print a semicolon (after prefixes due to bug in older gas).
10729  */
10730
10731 void
10732 print_operand (FILE *file, rtx x, int code)
10733 {
10734   if (code)
10735     {
10736       switch (code)
10737         {
10738         case '*':
10739           if (ASSEMBLER_DIALECT == ASM_ATT)
10740             putc ('*', file);
10741           return;
10742
10743         case '&':
10744           assemble_name (file, get_some_local_dynamic_name ());
10745           return;
10746
10747         case 'A':
10748           switch (ASSEMBLER_DIALECT)
10749             {
10750             case ASM_ATT:
10751               putc ('*', file);
10752               break;
10753
10754             case ASM_INTEL:
10755               /* Intel syntax. For absolute addresses, registers should not
10756                  be surrounded by braces.  */
10757               if (!REG_P (x))
10758                 {
10759                   putc ('[', file);
10760                   PRINT_OPERAND (file, x, 0);
10761                   putc (']', file);
10762                   return;
10763                 }
10764               break;
10765
10766             default:
10767               gcc_unreachable ();
10768             }
10769
10770           PRINT_OPERAND (file, x, 0);
10771           return;
10772
10773
10774         case 'L':
10775           if (ASSEMBLER_DIALECT == ASM_ATT)
10776             putc ('l', file);
10777           return;
10778
10779         case 'W':
10780           if (ASSEMBLER_DIALECT == ASM_ATT)
10781             putc ('w', file);
10782           return;
10783
10784         case 'B':
10785           if (ASSEMBLER_DIALECT == ASM_ATT)
10786             putc ('b', file);
10787           return;
10788
10789         case 'Q':
10790           if (ASSEMBLER_DIALECT == ASM_ATT)
10791             putc ('l', file);
10792           return;
10793
10794         case 'S':
10795           if (ASSEMBLER_DIALECT == ASM_ATT)
10796             putc ('s', file);
10797           return;
10798
10799         case 'T':
10800           if (ASSEMBLER_DIALECT == ASM_ATT)
10801             putc ('t', file);
10802           return;
10803
10804         case 'z':
10805           /* 387 opcodes don't get size suffixes if the operands are
10806              registers.  */
10807           if (STACK_REG_P (x))
10808             return;
10809
10810           /* Likewise if using Intel opcodes.  */
10811           if (ASSEMBLER_DIALECT == ASM_INTEL)
10812             return;
10813
10814           /* This is the size of op from size of operand.  */
10815           switch (GET_MODE_SIZE (GET_MODE (x)))
10816             {
10817             case 1:
10818               putc ('b', file);
10819               return;
10820
10821             case 2:
10822               if (MEM_P (x))
10823                 {
10824 #ifdef HAVE_GAS_FILDS_FISTS
10825                   putc ('s', file);
10826 #endif
10827                   return;
10828                 }
10829               else
10830                 putc ('w', file);
10831               return;
10832
10833             case 4:
10834               if (GET_MODE (x) == SFmode)
10835                 {
10836                   putc ('s', file);
10837                   return;
10838                 }
10839               else
10840                 putc ('l', file);
10841               return;
10842
10843             case 12:
10844             case 16:
10845               putc ('t', file);
10846               return;
10847
10848             case 8:
10849               if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
10850                 {
10851                   if (MEM_P (x))
10852                     {
10853 #ifdef GAS_MNEMONICS
10854                       putc ('q', file);
10855 #else
10856                       putc ('l', file);
10857                       putc ('l', file);
10858 #endif
10859                     }
10860                   else
10861                     putc ('q', file);
10862                 }
10863               else
10864                 putc ('l', file);
10865               return;
10866
10867             default:
10868               gcc_unreachable ();
10869             }
10870
10871         case 'd':
10872         case 'b':
10873         case 'w':
10874         case 'k':
10875         case 'q':
10876         case 'h':
10877         case 't':
10878         case 'y':
10879         case 'x':
10880         case 'X':
10881         case 'P':
10882           break;
10883
10884         case 's':
10885           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
10886             {
10887               PRINT_OPERAND (file, x, 0);
10888               fputs (", ", file);
10889             }
10890           return;
10891
10892         case 'D':
10893           /* Little bit of braindamage here.  The SSE compare instructions
10894              does use completely different names for the comparisons that the
10895              fp conditional moves.  */
10896           if (TARGET_AVX)
10897             {
10898               switch (GET_CODE (x))
10899                 {
10900                 case EQ:
10901                   fputs ("eq", file);
10902                   break;
10903                 case UNEQ:
10904                   fputs ("eq_us", file);
10905                   break;
10906                 case LT:
10907                   fputs ("lt", file);
10908                   break;
10909                 case UNLT:
10910                   fputs ("nge", file);
10911                   break;
10912                 case LE:
10913                   fputs ("le", file);
10914                   break;
10915                 case UNLE:
10916                   fputs ("ngt", file);
10917                   break;
10918                 case UNORDERED:
10919                   fputs ("unord", file);
10920                   break;
10921                 case NE:
10922                   fputs ("neq", file);
10923                   break;
10924                 case LTGT:
10925                   fputs ("neq_oq", file);
10926                   break;
10927                 case GE:
10928                   fputs ("ge", file);
10929                   break;
10930                 case UNGE:
10931                   fputs ("nlt", file);
10932                   break;
10933                 case GT:
10934                   fputs ("gt", file);
10935                   break;
10936                 case UNGT:
10937                   fputs ("nle", file);
10938                   break;
10939                 case ORDERED:
10940                   fputs ("ord", file);
10941                   break;
10942                 default:
10943                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
10944                   return;
10945                 }
10946             }
10947           else
10948             {
10949               switch (GET_CODE (x))
10950                 {
10951                 case EQ:
10952                 case UNEQ:
10953                   fputs ("eq", file);
10954                   break;
10955                 case LT:
10956                 case UNLT:
10957                   fputs ("lt", file);
10958                   break;
10959                 case LE:
10960                 case UNLE:
10961                   fputs ("le", file);
10962                   break;
10963                 case UNORDERED:
10964                   fputs ("unord", file);
10965                   break;
10966                 case NE:
10967                 case LTGT:
10968                   fputs ("neq", file);
10969                   break;
10970                 case UNGE:
10971                 case GE:
10972                   fputs ("nlt", file);
10973                   break;
10974                 case UNGT:
10975                 case GT:
10976                   fputs ("nle", file);
10977                   break;
10978                 case ORDERED:
10979                   fputs ("ord", file);
10980                   break;
10981                 default:
10982                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
10983                   return;
10984                 }
10985             }
10986           return;
10987         case 'O':
10988 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
10989           if (ASSEMBLER_DIALECT == ASM_ATT)
10990             {
10991               switch (GET_MODE (x))
10992                 {
10993                 case HImode: putc ('w', file); break;
10994                 case SImode:
10995                 case SFmode: putc ('l', file); break;
10996                 case DImode:
10997                 case DFmode: putc ('q', file); break;
10998                 default: gcc_unreachable ();
10999                 }
11000               putc ('.', file);
11001             }
11002 #endif
11003           return;
11004         case 'C':
11005           if (!COMPARISON_P (x))
11006             {
11007               output_operand_lossage ("operand is neither a constant nor a "
11008                                       "condition code, invalid operand code "
11009                                       "'C'");
11010               return;
11011             }
11012           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
11013           return;
11014         case 'F':
11015           if (!COMPARISON_P (x))
11016             {
11017               output_operand_lossage ("operand is neither a constant nor a "
11018                                       "condition code, invalid operand code "
11019                                       "'F'");
11020               return;
11021             }
11022 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11023           if (ASSEMBLER_DIALECT == ASM_ATT)
11024             putc ('.', file);
11025 #endif
11026           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
11027           return;
11028
11029           /* Like above, but reverse condition */
11030         case 'c':
11031           /* Check to see if argument to %c is really a constant
11032              and not a condition code which needs to be reversed.  */
11033           if (!COMPARISON_P (x))
11034             {
11035               output_operand_lossage ("operand is neither a constant nor a "
11036                                       "condition code, invalid operand "
11037                                       "code 'c'");
11038               return;
11039             }
11040           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
11041           return;
11042         case 'f':
11043           if (!COMPARISON_P (x))
11044             {
11045               output_operand_lossage ("operand is neither a constant nor a "
11046                                       "condition code, invalid operand "
11047                                       "code 'f'");
11048               return;
11049             }
11050 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11051           if (ASSEMBLER_DIALECT == ASM_ATT)
11052             putc ('.', file);
11053 #endif
11054           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
11055           return;
11056
11057         case 'E':
11058           put_condition_code (GET_CODE (x), CCmode, 0, 0, file);
11059           return;
11060
11061         case 'e':
11062           put_condition_code (GET_CODE (x), CCmode, 1, 0, file);
11063           return;
11064
11065         case 'H':
11066           /* It doesn't actually matter what mode we use here, as we're
11067              only going to use this for printing.  */
11068           x = adjust_address_nv (x, DImode, 8);
11069           break;
11070
11071         case '+':
11072           {
11073             rtx x;
11074
11075             if (!optimize
11076                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
11077               return;
11078
11079             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
11080             if (x)
11081               {
11082                 int pred_val = INTVAL (XEXP (x, 0));
11083
11084                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
11085                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
11086                   {
11087                     int taken = pred_val > REG_BR_PROB_BASE / 2;
11088                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
11089
11090                     /* Emit hints only in the case default branch prediction
11091                        heuristics would fail.  */
11092                     if (taken != cputaken)
11093                       {
11094                         /* We use 3e (DS) prefix for taken branches and
11095                            2e (CS) prefix for not taken branches.  */
11096                         if (taken)
11097                           fputs ("ds ; ", file);
11098                         else
11099                           fputs ("cs ; ", file);
11100                       }
11101                   }
11102               }
11103             return;
11104           }
11105
11106         case 'Y':
11107           switch (GET_CODE (x))
11108             {
11109             case NE:
11110               fputs ("neq", file);
11111               break;
11112             case EQ:
11113               fputs ("eq", file);
11114               break;
11115             case GE:
11116             case GEU:
11117               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
11118               break;
11119             case GT:
11120             case GTU:
11121               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
11122               break;
11123             case LE:
11124             case LEU:
11125               fputs ("le", file);
11126               break;
11127             case LT:
11128             case LTU:
11129               fputs ("lt", file);
11130               break;
11131             case UNORDERED:
11132               fputs ("unord", file);
11133               break;
11134             case ORDERED:
11135               fputs ("ord", file);
11136               break;
11137             case UNEQ:
11138               fputs ("ueq", file);
11139               break;
11140             case UNGE:
11141               fputs ("nlt", file);
11142               break;
11143             case UNGT:
11144               fputs ("nle", file);
11145               break;
11146             case UNLE:
11147               fputs ("ule", file);
11148               break;
11149             case UNLT:
11150               fputs ("ult", file);
11151               break;
11152             case LTGT:
11153               fputs ("une", file);
11154               break;
11155             default:
11156               output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11157               return;
11158             }
11159           return;
11160
11161         case ';':
11162 #if TARGET_MACHO
11163           fputs (" ; ", file);
11164 #else
11165           fputc (' ', file);
11166 #endif
11167           return;
11168
11169         default:
11170             output_operand_lossage ("invalid operand code '%c'", code);
11171         }
11172     }
11173
11174   if (REG_P (x))
11175     print_reg (x, code, file);
11176
11177   else if (MEM_P (x))
11178     {
11179       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
11180       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
11181           && GET_MODE (x) != BLKmode)
11182         {
11183           const char * size;
11184           switch (GET_MODE_SIZE (GET_MODE (x)))
11185             {
11186             case 1: size = "BYTE"; break;
11187             case 2: size = "WORD"; break;
11188             case 4: size = "DWORD"; break;
11189             case 8: size = "QWORD"; break;
11190             case 12: size = "XWORD"; break;
11191             case 16:
11192               if (GET_MODE (x) == XFmode)
11193                 size = "XWORD";
11194               else
11195                 size = "XMMWORD";
11196               break;
11197             default:
11198               gcc_unreachable ();
11199             }
11200
11201           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
11202           if (code == 'b')
11203             size = "BYTE";
11204           else if (code == 'w')
11205             size = "WORD";
11206           else if (code == 'k')
11207             size = "DWORD";
11208
11209           fputs (size, file);
11210           fputs (" PTR ", file);
11211         }
11212
11213       x = XEXP (x, 0);
11214       /* Avoid (%rip) for call operands.  */
11215       if (CONSTANT_ADDRESS_P (x) && code == 'P'
11216           && !CONST_INT_P (x))
11217         output_addr_const (file, x);
11218       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
11219         output_operand_lossage ("invalid constraints for operand");
11220       else
11221         output_address (x);
11222     }
11223
11224   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
11225     {
11226       REAL_VALUE_TYPE r;
11227       long l;
11228
11229       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
11230       REAL_VALUE_TO_TARGET_SINGLE (r, l);
11231
11232       if (ASSEMBLER_DIALECT == ASM_ATT)
11233         putc ('$', file);
11234       fprintf (file, "0x%08lx", (long unsigned int) l);
11235     }
11236
11237   /* These float cases don't actually occur as immediate operands.  */
11238   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
11239     {
11240       char dstr[30];
11241
11242       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11243       fprintf (file, "%s", dstr);
11244     }
11245
11246   else if (GET_CODE (x) == CONST_DOUBLE
11247            && GET_MODE (x) == XFmode)
11248     {
11249       char dstr[30];
11250
11251       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11252       fprintf (file, "%s", dstr);
11253     }
11254
11255   else
11256     {
11257       /* We have patterns that allow zero sets of memory, for instance.
11258          In 64-bit mode, we should probably support all 8-byte vectors,
11259          since we can in fact encode that into an immediate.  */
11260       if (GET_CODE (x) == CONST_VECTOR)
11261         {
11262           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
11263           x = const0_rtx;
11264         }
11265
11266       if (code != 'P')
11267         {
11268           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
11269             {
11270               if (ASSEMBLER_DIALECT == ASM_ATT)
11271                 putc ('$', file);
11272             }
11273           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
11274                    || GET_CODE (x) == LABEL_REF)
11275             {
11276               if (ASSEMBLER_DIALECT == ASM_ATT)
11277                 putc ('$', file);
11278               else
11279                 fputs ("OFFSET FLAT:", file);
11280             }
11281         }
11282       if (CONST_INT_P (x))
11283         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
11284       else if (flag_pic)
11285         output_pic_addr_const (file, x, code);
11286       else
11287         output_addr_const (file, x);
11288     }
11289 }
11290 \f
11291 /* Print a memory operand whose address is ADDR.  */
11292
11293 void
11294 print_operand_address (FILE *file, rtx addr)
11295 {
11296   struct ix86_address parts;
11297   rtx base, index, disp;
11298   int scale;
11299   int ok = ix86_decompose_address (addr, &parts);
11300
11301   gcc_assert (ok);
11302
11303   base = parts.base;
11304   index = parts.index;
11305   disp = parts.disp;
11306   scale = parts.scale;
11307
11308   switch (parts.seg)
11309     {
11310     case SEG_DEFAULT:
11311       break;
11312     case SEG_FS:
11313     case SEG_GS:
11314       if (ASSEMBLER_DIALECT == ASM_ATT)
11315         putc ('%', file);
11316       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
11317       break;
11318     default:
11319       gcc_unreachable ();
11320     }
11321
11322   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
11323   if (TARGET_64BIT && !base && !index)
11324     {
11325       rtx symbol = disp;
11326
11327       if (GET_CODE (disp) == CONST
11328           && GET_CODE (XEXP (disp, 0)) == PLUS
11329           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11330         symbol = XEXP (XEXP (disp, 0), 0);
11331
11332       if (GET_CODE (symbol) == LABEL_REF
11333           || (GET_CODE (symbol) == SYMBOL_REF
11334               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
11335         base = pc_rtx;
11336     }
11337   if (!base && !index)
11338     {
11339       /* Displacement only requires special attention.  */
11340
11341       if (CONST_INT_P (disp))
11342         {
11343           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
11344             fputs ("ds:", file);
11345           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
11346         }
11347       else if (flag_pic)
11348         output_pic_addr_const (file, disp, 0);
11349       else
11350         output_addr_const (file, disp);
11351     }
11352   else
11353     {
11354       if (ASSEMBLER_DIALECT == ASM_ATT)
11355         {
11356           if (disp)
11357             {
11358               if (flag_pic)
11359                 output_pic_addr_const (file, disp, 0);
11360               else if (GET_CODE (disp) == LABEL_REF)
11361                 output_asm_label (disp);
11362               else
11363                 output_addr_const (file, disp);
11364             }
11365
11366           putc ('(', file);
11367           if (base)
11368             print_reg (base, 0, file);
11369           if (index)
11370             {
11371               putc (',', file);
11372               print_reg (index, 0, file);
11373               if (scale != 1)
11374                 fprintf (file, ",%d", scale);
11375             }
11376           putc (')', file);
11377         }
11378       else
11379         {
11380           rtx offset = NULL_RTX;
11381
11382           if (disp)
11383             {
11384               /* Pull out the offset of a symbol; print any symbol itself.  */
11385               if (GET_CODE (disp) == CONST
11386                   && GET_CODE (XEXP (disp, 0)) == PLUS
11387                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11388                 {
11389                   offset = XEXP (XEXP (disp, 0), 1);
11390                   disp = gen_rtx_CONST (VOIDmode,
11391                                         XEXP (XEXP (disp, 0), 0));
11392                 }
11393
11394               if (flag_pic)
11395                 output_pic_addr_const (file, disp, 0);
11396               else if (GET_CODE (disp) == LABEL_REF)
11397                 output_asm_label (disp);
11398               else if (CONST_INT_P (disp))
11399                 offset = disp;
11400               else
11401                 output_addr_const (file, disp);
11402             }
11403
11404           putc ('[', file);
11405           if (base)
11406             {
11407               print_reg (base, 0, file);
11408               if (offset)
11409                 {
11410                   if (INTVAL (offset) >= 0)
11411                     putc ('+', file);
11412                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11413                 }
11414             }
11415           else if (offset)
11416             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11417           else
11418             putc ('0', file);
11419
11420           if (index)
11421             {
11422               putc ('+', file);
11423               print_reg (index, 0, file);
11424               if (scale != 1)
11425                 fprintf (file, "*%d", scale);
11426             }
11427           putc (']', file);
11428         }
11429     }
11430 }
11431
11432 bool
11433 output_addr_const_extra (FILE *file, rtx x)
11434 {
11435   rtx op;
11436
11437   if (GET_CODE (x) != UNSPEC)
11438     return false;
11439
11440   op = XVECEXP (x, 0, 0);
11441   switch (XINT (x, 1))
11442     {
11443     case UNSPEC_GOTTPOFF:
11444       output_addr_const (file, op);
11445       /* FIXME: This might be @TPOFF in Sun ld.  */
11446       fputs ("@GOTTPOFF", file);
11447       break;
11448     case UNSPEC_TPOFF:
11449       output_addr_const (file, op);
11450       fputs ("@TPOFF", file);
11451       break;
11452     case UNSPEC_NTPOFF:
11453       output_addr_const (file, op);
11454       if (TARGET_64BIT)
11455         fputs ("@TPOFF", file);
11456       else
11457         fputs ("@NTPOFF", file);
11458       break;
11459     case UNSPEC_DTPOFF:
11460       output_addr_const (file, op);
11461       fputs ("@DTPOFF", file);
11462       break;
11463     case UNSPEC_GOTNTPOFF:
11464       output_addr_const (file, op);
11465       if (TARGET_64BIT)
11466         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
11467                "@GOTTPOFF(%rip)" : "@GOTTPOFF[rip]", file);
11468       else
11469         fputs ("@GOTNTPOFF", file);
11470       break;
11471     case UNSPEC_INDNTPOFF:
11472       output_addr_const (file, op);
11473       fputs ("@INDNTPOFF", file);
11474       break;
11475 #if TARGET_MACHO
11476     case UNSPEC_MACHOPIC_OFFSET:
11477       output_addr_const (file, op);
11478       putc ('-', file);
11479       machopic_output_function_base_name (file);
11480       break;
11481 #endif
11482
11483     default:
11484       return false;
11485     }
11486
11487   return true;
11488 }
11489 \f
11490 /* Split one or more DImode RTL references into pairs of SImode
11491    references.  The RTL can be REG, offsettable MEM, integer constant, or
11492    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11493    split and "num" is its length.  lo_half and hi_half are output arrays
11494    that parallel "operands".  */
11495
11496 void
11497 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11498 {
11499   while (num--)
11500     {
11501       rtx op = operands[num];
11502
11503       /* simplify_subreg refuse to split volatile memory addresses,
11504          but we still have to handle it.  */
11505       if (MEM_P (op))
11506         {
11507           lo_half[num] = adjust_address (op, SImode, 0);
11508           hi_half[num] = adjust_address (op, SImode, 4);
11509         }
11510       else
11511         {
11512           lo_half[num] = simplify_gen_subreg (SImode, op,
11513                                               GET_MODE (op) == VOIDmode
11514                                               ? DImode : GET_MODE (op), 0);
11515           hi_half[num] = simplify_gen_subreg (SImode, op,
11516                                               GET_MODE (op) == VOIDmode
11517                                               ? DImode : GET_MODE (op), 4);
11518         }
11519     }
11520 }
11521 /* Split one or more TImode RTL references into pairs of DImode
11522    references.  The RTL can be REG, offsettable MEM, integer constant, or
11523    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11524    split and "num" is its length.  lo_half and hi_half are output arrays
11525    that parallel "operands".  */
11526
11527 void
11528 split_ti (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11529 {
11530   while (num--)
11531     {
11532       rtx op = operands[num];
11533
11534       /* simplify_subreg refuse to split volatile memory addresses, but we
11535          still have to handle it.  */
11536       if (MEM_P (op))
11537         {
11538           lo_half[num] = adjust_address (op, DImode, 0);
11539           hi_half[num] = adjust_address (op, DImode, 8);
11540         }
11541       else
11542         {
11543           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
11544           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
11545         }
11546     }
11547 }
11548 \f
11549 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
11550    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
11551    is the expression of the binary operation.  The output may either be
11552    emitted here, or returned to the caller, like all output_* functions.
11553
11554    There is no guarantee that the operands are the same mode, as they
11555    might be within FLOAT or FLOAT_EXTEND expressions.  */
11556
11557 #ifndef SYSV386_COMPAT
11558 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
11559    wants to fix the assemblers because that causes incompatibility
11560    with gcc.  No-one wants to fix gcc because that causes
11561    incompatibility with assemblers...  You can use the option of
11562    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
11563 #define SYSV386_COMPAT 1
11564 #endif
11565
11566 const char *
11567 output_387_binary_op (rtx insn, rtx *operands)
11568 {
11569   static char buf[40];
11570   const char *p;
11571   const char *ssep;
11572   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
11573
11574 #ifdef ENABLE_CHECKING
11575   /* Even if we do not want to check the inputs, this documents input
11576      constraints.  Which helps in understanding the following code.  */
11577   if (STACK_REG_P (operands[0])
11578       && ((REG_P (operands[1])
11579            && REGNO (operands[0]) == REGNO (operands[1])
11580            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
11581           || (REG_P (operands[2])
11582               && REGNO (operands[0]) == REGNO (operands[2])
11583               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
11584       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
11585     ; /* ok */
11586   else
11587     gcc_assert (is_sse);
11588 #endif
11589
11590   switch (GET_CODE (operands[3]))
11591     {
11592     case PLUS:
11593       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11594           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11595         p = "fiadd";
11596       else
11597         p = "fadd";
11598       ssep = "vadd";
11599       break;
11600
11601     case MINUS:
11602       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11603           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11604         p = "fisub";
11605       else
11606         p = "fsub";
11607       ssep = "vsub";
11608       break;
11609
11610     case MULT:
11611       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11612           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11613         p = "fimul";
11614       else
11615         p = "fmul";
11616       ssep = "vmul";
11617       break;
11618
11619     case DIV:
11620       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11621           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11622         p = "fidiv";
11623       else
11624         p = "fdiv";
11625       ssep = "vdiv";
11626       break;
11627
11628     default:
11629       gcc_unreachable ();
11630     }
11631
11632   if (is_sse)
11633    {
11634      if (TARGET_AVX)
11635        {
11636          strcpy (buf, ssep);
11637          if (GET_MODE (operands[0]) == SFmode)
11638            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
11639          else
11640            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
11641        }
11642      else
11643        {
11644          strcpy (buf, ssep + 1);
11645          if (GET_MODE (operands[0]) == SFmode)
11646            strcat (buf, "ss\t{%2, %0|%0, %2}");
11647          else
11648            strcat (buf, "sd\t{%2, %0|%0, %2}");
11649        }
11650       return buf;
11651    }
11652   strcpy (buf, p);
11653
11654   switch (GET_CODE (operands[3]))
11655     {
11656     case MULT:
11657     case PLUS:
11658       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
11659         {
11660           rtx temp = operands[2];
11661           operands[2] = operands[1];
11662           operands[1] = temp;
11663         }
11664
11665       /* know operands[0] == operands[1].  */
11666
11667       if (MEM_P (operands[2]))
11668         {
11669           p = "%z2\t%2";
11670           break;
11671         }
11672
11673       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11674         {
11675           if (STACK_TOP_P (operands[0]))
11676             /* How is it that we are storing to a dead operand[2]?
11677                Well, presumably operands[1] is dead too.  We can't
11678                store the result to st(0) as st(0) gets popped on this
11679                instruction.  Instead store to operands[2] (which I
11680                think has to be st(1)).  st(1) will be popped later.
11681                gcc <= 2.8.1 didn't have this check and generated
11682                assembly code that the Unixware assembler rejected.  */
11683             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
11684           else
11685             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11686           break;
11687         }
11688
11689       if (STACK_TOP_P (operands[0]))
11690         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
11691       else
11692         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
11693       break;
11694
11695     case MINUS:
11696     case DIV:
11697       if (MEM_P (operands[1]))
11698         {
11699           p = "r%z1\t%1";
11700           break;
11701         }
11702
11703       if (MEM_P (operands[2]))
11704         {
11705           p = "%z2\t%2";
11706           break;
11707         }
11708
11709       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11710         {
11711 #if SYSV386_COMPAT
11712           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
11713              derived assemblers, confusingly reverse the direction of
11714              the operation for fsub{r} and fdiv{r} when the
11715              destination register is not st(0).  The Intel assembler
11716              doesn't have this brain damage.  Read !SYSV386_COMPAT to
11717              figure out what the hardware really does.  */
11718           if (STACK_TOP_P (operands[0]))
11719             p = "{p\t%0, %2|rp\t%2, %0}";
11720           else
11721             p = "{rp\t%2, %0|p\t%0, %2}";
11722 #else
11723           if (STACK_TOP_P (operands[0]))
11724             /* As above for fmul/fadd, we can't store to st(0).  */
11725             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
11726           else
11727             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11728 #endif
11729           break;
11730         }
11731
11732       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
11733         {
11734 #if SYSV386_COMPAT
11735           if (STACK_TOP_P (operands[0]))
11736             p = "{rp\t%0, %1|p\t%1, %0}";
11737           else
11738             p = "{p\t%1, %0|rp\t%0, %1}";
11739 #else
11740           if (STACK_TOP_P (operands[0]))
11741             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
11742           else
11743             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
11744 #endif
11745           break;
11746         }
11747
11748       if (STACK_TOP_P (operands[0]))
11749         {
11750           if (STACK_TOP_P (operands[1]))
11751             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
11752           else
11753             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
11754           break;
11755         }
11756       else if (STACK_TOP_P (operands[1]))
11757         {
11758 #if SYSV386_COMPAT
11759           p = "{\t%1, %0|r\t%0, %1}";
11760 #else
11761           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
11762 #endif
11763         }
11764       else
11765         {
11766 #if SYSV386_COMPAT
11767           p = "{r\t%2, %0|\t%0, %2}";
11768 #else
11769           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
11770 #endif
11771         }
11772       break;
11773
11774     default:
11775       gcc_unreachable ();
11776     }
11777
11778   strcat (buf, p);
11779   return buf;
11780 }
11781
11782 /* Return needed mode for entity in optimize_mode_switching pass.  */
11783
11784 int
11785 ix86_mode_needed (int entity, rtx insn)
11786 {
11787   enum attr_i387_cw mode;
11788
11789   /* The mode UNINITIALIZED is used to store control word after a
11790      function call or ASM pattern.  The mode ANY specify that function
11791      has no requirements on the control word and make no changes in the
11792      bits we are interested in.  */
11793
11794   if (CALL_P (insn)
11795       || (NONJUMP_INSN_P (insn)
11796           && (asm_noperands (PATTERN (insn)) >= 0
11797               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
11798     return I387_CW_UNINITIALIZED;
11799
11800   if (recog_memoized (insn) < 0)
11801     return I387_CW_ANY;
11802
11803   mode = get_attr_i387_cw (insn);
11804
11805   switch (entity)
11806     {
11807     case I387_TRUNC:
11808       if (mode == I387_CW_TRUNC)
11809         return mode;
11810       break;
11811
11812     case I387_FLOOR:
11813       if (mode == I387_CW_FLOOR)
11814         return mode;
11815       break;
11816
11817     case I387_CEIL:
11818       if (mode == I387_CW_CEIL)
11819         return mode;
11820       break;
11821
11822     case I387_MASK_PM:
11823       if (mode == I387_CW_MASK_PM)
11824         return mode;
11825       break;
11826
11827     default:
11828       gcc_unreachable ();
11829     }
11830
11831   return I387_CW_ANY;
11832 }
11833
11834 /* Output code to initialize control word copies used by trunc?f?i and
11835    rounding patterns.  CURRENT_MODE is set to current control word,
11836    while NEW_MODE is set to new control word.  */
11837
11838 void
11839 emit_i387_cw_initialization (int mode)
11840 {
11841   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
11842   rtx new_mode;
11843
11844   enum ix86_stack_slot slot;
11845
11846   rtx reg = gen_reg_rtx (HImode);
11847
11848   emit_insn (gen_x86_fnstcw_1 (stored_mode));
11849   emit_move_insn (reg, copy_rtx (stored_mode));
11850
11851   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
11852       || optimize_function_for_size_p (cfun))
11853     {
11854       switch (mode)
11855         {
11856         case I387_CW_TRUNC:
11857           /* round toward zero (truncate) */
11858           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
11859           slot = SLOT_CW_TRUNC;
11860           break;
11861
11862         case I387_CW_FLOOR:
11863           /* round down toward -oo */
11864           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
11865           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
11866           slot = SLOT_CW_FLOOR;
11867           break;
11868
11869         case I387_CW_CEIL:
11870           /* round up toward +oo */
11871           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
11872           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
11873           slot = SLOT_CW_CEIL;
11874           break;
11875
11876         case I387_CW_MASK_PM:
11877           /* mask precision exception for nearbyint() */
11878           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
11879           slot = SLOT_CW_MASK_PM;
11880           break;
11881
11882         default:
11883           gcc_unreachable ();
11884         }
11885     }
11886   else
11887     {
11888       switch (mode)
11889         {
11890         case I387_CW_TRUNC:
11891           /* round toward zero (truncate) */
11892           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
11893           slot = SLOT_CW_TRUNC;
11894           break;
11895
11896         case I387_CW_FLOOR:
11897           /* round down toward -oo */
11898           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
11899           slot = SLOT_CW_FLOOR;
11900           break;
11901
11902         case I387_CW_CEIL:
11903           /* round up toward +oo */
11904           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
11905           slot = SLOT_CW_CEIL;
11906           break;
11907
11908         case I387_CW_MASK_PM:
11909           /* mask precision exception for nearbyint() */
11910           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
11911           slot = SLOT_CW_MASK_PM;
11912           break;
11913
11914         default:
11915           gcc_unreachable ();
11916         }
11917     }
11918
11919   gcc_assert (slot < MAX_386_STACK_LOCALS);
11920
11921   new_mode = assign_386_stack_local (HImode, slot);
11922   emit_move_insn (new_mode, reg);
11923 }
11924
11925 /* Output code for INSN to convert a float to a signed int.  OPERANDS
11926    are the insn operands.  The output may be [HSD]Imode and the input
11927    operand may be [SDX]Fmode.  */
11928
11929 const char *
11930 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
11931 {
11932   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
11933   int dimode_p = GET_MODE (operands[0]) == DImode;
11934   int round_mode = get_attr_i387_cw (insn);
11935
11936   /* Jump through a hoop or two for DImode, since the hardware has no
11937      non-popping instruction.  We used to do this a different way, but
11938      that was somewhat fragile and broke with post-reload splitters.  */
11939   if ((dimode_p || fisttp) && !stack_top_dies)
11940     output_asm_insn ("fld\t%y1", operands);
11941
11942   gcc_assert (STACK_TOP_P (operands[1]));
11943   gcc_assert (MEM_P (operands[0]));
11944   gcc_assert (GET_MODE (operands[1]) != TFmode);
11945
11946   if (fisttp)
11947       output_asm_insn ("fisttp%z0\t%0", operands);
11948   else
11949     {
11950       if (round_mode != I387_CW_ANY)
11951         output_asm_insn ("fldcw\t%3", operands);
11952       if (stack_top_dies || dimode_p)
11953         output_asm_insn ("fistp%z0\t%0", operands);
11954       else
11955         output_asm_insn ("fist%z0\t%0", operands);
11956       if (round_mode != I387_CW_ANY)
11957         output_asm_insn ("fldcw\t%2", operands);
11958     }
11959
11960   return "";
11961 }
11962
11963 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
11964    have the values zero or one, indicates the ffreep insn's operand
11965    from the OPERANDS array.  */
11966
11967 static const char *
11968 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
11969 {
11970   if (TARGET_USE_FFREEP)
11971 #if HAVE_AS_IX86_FFREEP
11972     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
11973 #else
11974     {
11975       static char retval[] = ".word\t0xc_df";
11976       int regno = REGNO (operands[opno]);
11977
11978       gcc_assert (FP_REGNO_P (regno));
11979
11980       retval[9] = '0' + (regno - FIRST_STACK_REG);
11981       return retval;
11982     }
11983 #endif
11984
11985   return opno ? "fstp\t%y1" : "fstp\t%y0";
11986 }
11987
11988
11989 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
11990    should be used.  UNORDERED_P is true when fucom should be used.  */
11991
11992 const char *
11993 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
11994 {
11995   int stack_top_dies;
11996   rtx cmp_op0, cmp_op1;
11997   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
11998
11999   if (eflags_p)
12000     {
12001       cmp_op0 = operands[0];
12002       cmp_op1 = operands[1];
12003     }
12004   else
12005     {
12006       cmp_op0 = operands[1];
12007       cmp_op1 = operands[2];
12008     }
12009
12010   if (is_sse)
12011     {
12012       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
12013       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
12014       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
12015       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
12016
12017       if (GET_MODE (operands[0]) == SFmode)
12018         if (unordered_p)
12019           return &ucomiss[TARGET_AVX ? 0 : 1];
12020         else
12021           return &comiss[TARGET_AVX ? 0 : 1];
12022       else
12023         if (unordered_p)
12024           return &ucomisd[TARGET_AVX ? 0 : 1];
12025         else
12026           return &comisd[TARGET_AVX ? 0 : 1];
12027     }
12028
12029   gcc_assert (STACK_TOP_P (cmp_op0));
12030
12031   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12032
12033   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
12034     {
12035       if (stack_top_dies)
12036         {
12037           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
12038           return output_387_ffreep (operands, 1);
12039         }
12040       else
12041         return "ftst\n\tfnstsw\t%0";
12042     }
12043
12044   if (STACK_REG_P (cmp_op1)
12045       && stack_top_dies
12046       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
12047       && REGNO (cmp_op1) != FIRST_STACK_REG)
12048     {
12049       /* If both the top of the 387 stack dies, and the other operand
12050          is also a stack register that dies, then this must be a
12051          `fcompp' float compare */
12052
12053       if (eflags_p)
12054         {
12055           /* There is no double popping fcomi variant.  Fortunately,
12056              eflags is immune from the fstp's cc clobbering.  */
12057           if (unordered_p)
12058             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
12059           else
12060             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
12061           return output_387_ffreep (operands, 0);
12062         }
12063       else
12064         {
12065           if (unordered_p)
12066             return "fucompp\n\tfnstsw\t%0";
12067           else
12068             return "fcompp\n\tfnstsw\t%0";
12069         }
12070     }
12071   else
12072     {
12073       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
12074
12075       static const char * const alt[16] =
12076       {
12077         "fcom%z2\t%y2\n\tfnstsw\t%0",
12078         "fcomp%z2\t%y2\n\tfnstsw\t%0",
12079         "fucom%z2\t%y2\n\tfnstsw\t%0",
12080         "fucomp%z2\t%y2\n\tfnstsw\t%0",
12081
12082         "ficom%z2\t%y2\n\tfnstsw\t%0",
12083         "ficomp%z2\t%y2\n\tfnstsw\t%0",
12084         NULL,
12085         NULL,
12086
12087         "fcomi\t{%y1, %0|%0, %y1}",
12088         "fcomip\t{%y1, %0|%0, %y1}",
12089         "fucomi\t{%y1, %0|%0, %y1}",
12090         "fucomip\t{%y1, %0|%0, %y1}",
12091
12092         NULL,
12093         NULL,
12094         NULL,
12095         NULL
12096       };
12097
12098       int mask;
12099       const char *ret;
12100
12101       mask  = eflags_p << 3;
12102       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
12103       mask |= unordered_p << 1;
12104       mask |= stack_top_dies;
12105
12106       gcc_assert (mask < 16);
12107       ret = alt[mask];
12108       gcc_assert (ret);
12109
12110       return ret;
12111     }
12112 }
12113
12114 void
12115 ix86_output_addr_vec_elt (FILE *file, int value)
12116 {
12117   const char *directive = ASM_LONG;
12118
12119 #ifdef ASM_QUAD
12120   if (TARGET_64BIT)
12121     directive = ASM_QUAD;
12122 #else
12123   gcc_assert (!TARGET_64BIT);
12124 #endif
12125
12126   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
12127 }
12128
12129 void
12130 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
12131 {
12132   const char *directive = ASM_LONG;
12133
12134 #ifdef ASM_QUAD
12135   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
12136     directive = ASM_QUAD;
12137 #else
12138   gcc_assert (!TARGET_64BIT);
12139 #endif
12140   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
12141   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
12142     fprintf (file, "%s%s%d-%s%d\n",
12143              directive, LPREFIX, value, LPREFIX, rel);
12144   else if (HAVE_AS_GOTOFF_IN_DATA)
12145     fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value);
12146 #if TARGET_MACHO
12147   else if (TARGET_MACHO)
12148     {
12149       fprintf (file, "%s%s%d-", ASM_LONG, LPREFIX, value);
12150       machopic_output_function_base_name (file);
12151       fprintf(file, "\n");
12152     }
12153 #endif
12154   else
12155     asm_fprintf (file, "%s%U%s+[.-%s%d]\n",
12156                  ASM_LONG, GOT_SYMBOL_NAME, LPREFIX, value);
12157 }
12158 \f
12159 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
12160    for the target.  */
12161
12162 void
12163 ix86_expand_clear (rtx dest)
12164 {
12165   rtx tmp;
12166
12167   /* We play register width games, which are only valid after reload.  */
12168   gcc_assert (reload_completed);
12169
12170   /* Avoid HImode and its attendant prefix byte.  */
12171   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
12172     dest = gen_rtx_REG (SImode, REGNO (dest));
12173   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
12174
12175   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
12176   if (reload_completed && (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ()))
12177     {
12178       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12179       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
12180     }
12181
12182   emit_insn (tmp);
12183 }
12184
12185 /* X is an unchanging MEM.  If it is a constant pool reference, return
12186    the constant pool rtx, else NULL.  */
12187
12188 rtx
12189 maybe_get_pool_constant (rtx x)
12190 {
12191   x = ix86_delegitimize_address (XEXP (x, 0));
12192
12193   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
12194     return get_pool_constant (x);
12195
12196   return NULL_RTX;
12197 }
12198
12199 void
12200 ix86_expand_move (enum machine_mode mode, rtx operands[])
12201 {
12202   rtx op0, op1;
12203   enum tls_model model;
12204
12205   op0 = operands[0];
12206   op1 = operands[1];
12207
12208   if (GET_CODE (op1) == SYMBOL_REF)
12209     {
12210       model = SYMBOL_REF_TLS_MODEL (op1);
12211       if (model)
12212         {
12213           op1 = legitimize_tls_address (op1, model, true);
12214           op1 = force_operand (op1, op0);
12215           if (op1 == op0)
12216             return;
12217         }
12218       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12219                && SYMBOL_REF_DLLIMPORT_P (op1))
12220         op1 = legitimize_dllimport_symbol (op1, false);
12221     }
12222   else if (GET_CODE (op1) == CONST
12223            && GET_CODE (XEXP (op1, 0)) == PLUS
12224            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
12225     {
12226       rtx addend = XEXP (XEXP (op1, 0), 1);
12227       rtx symbol = XEXP (XEXP (op1, 0), 0);
12228       rtx tmp = NULL;
12229
12230       model = SYMBOL_REF_TLS_MODEL (symbol);
12231       if (model)
12232         tmp = legitimize_tls_address (symbol, model, true);
12233       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12234                && SYMBOL_REF_DLLIMPORT_P (symbol))
12235         tmp = legitimize_dllimport_symbol (symbol, true);
12236
12237       if (tmp)
12238         {
12239           tmp = force_operand (tmp, NULL);
12240           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
12241                                      op0, 1, OPTAB_DIRECT);
12242           if (tmp == op0)
12243             return;
12244         }
12245     }
12246
12247   if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
12248     {
12249       if (TARGET_MACHO && !TARGET_64BIT)
12250         {
12251 #if TARGET_MACHO
12252           if (MACHOPIC_PURE)
12253             {
12254               rtx temp = ((reload_in_progress
12255                            || ((op0 && REG_P (op0))
12256                                && mode == Pmode))
12257                           ? op0 : gen_reg_rtx (Pmode));
12258               op1 = machopic_indirect_data_reference (op1, temp);
12259               op1 = machopic_legitimize_pic_address (op1, mode,
12260                                                      temp == op1 ? 0 : temp);
12261             }
12262           else if (MACHOPIC_INDIRECT)
12263             op1 = machopic_indirect_data_reference (op1, 0);
12264           if (op0 == op1)
12265             return;
12266 #endif
12267         }
12268       else
12269         {
12270           if (MEM_P (op0))
12271             op1 = force_reg (Pmode, op1);
12272           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
12273             {
12274               rtx reg = !can_create_pseudo_p () ? op0 : NULL_RTX;
12275               op1 = legitimize_pic_address (op1, reg);
12276               if (op0 == op1)
12277                 return;
12278             }
12279         }
12280     }
12281   else
12282     {
12283       if (MEM_P (op0)
12284           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
12285               || !push_operand (op0, mode))
12286           && MEM_P (op1))
12287         op1 = force_reg (mode, op1);
12288
12289       if (push_operand (op0, mode)
12290           && ! general_no_elim_operand (op1, mode))
12291         op1 = copy_to_mode_reg (mode, op1);
12292
12293       /* Force large constants in 64bit compilation into register
12294          to get them CSEed.  */
12295       if (can_create_pseudo_p ()
12296           && (mode == DImode) && TARGET_64BIT
12297           && immediate_operand (op1, mode)
12298           && !x86_64_zext_immediate_operand (op1, VOIDmode)
12299           && !register_operand (op0, mode)
12300           && optimize)
12301         op1 = copy_to_mode_reg (mode, op1);
12302
12303       if (can_create_pseudo_p ()
12304           && FLOAT_MODE_P (mode)
12305           && GET_CODE (op1) == CONST_DOUBLE)
12306         {
12307           /* If we are loading a floating point constant to a register,
12308              force the value to memory now, since we'll get better code
12309              out the back end.  */
12310
12311           op1 = validize_mem (force_const_mem (mode, op1));
12312           if (!register_operand (op0, mode))
12313             {
12314               rtx temp = gen_reg_rtx (mode);
12315               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
12316               emit_move_insn (op0, temp);
12317               return;
12318             }
12319         }
12320     }
12321
12322   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12323 }
12324
12325 void
12326 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
12327 {
12328   rtx op0 = operands[0], op1 = operands[1];
12329   unsigned int align = GET_MODE_ALIGNMENT (mode);
12330
12331   /* Force constants other than zero into memory.  We do not know how
12332      the instructions used to build constants modify the upper 64 bits
12333      of the register, once we have that information we may be able
12334      to handle some of them more efficiently.  */
12335   if (can_create_pseudo_p ()
12336       && register_operand (op0, mode)
12337       && (CONSTANT_P (op1)
12338           || (GET_CODE (op1) == SUBREG
12339               && CONSTANT_P (SUBREG_REG (op1))))
12340       && standard_sse_constant_p (op1) <= 0)
12341     op1 = validize_mem (force_const_mem (mode, op1));
12342
12343   /* We need to check memory alignment for SSE mode since attribute
12344      can make operands unaligned.  */
12345   if (can_create_pseudo_p ()
12346       && SSE_REG_MODE_P (mode)
12347       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
12348           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
12349     {
12350       rtx tmp[2];
12351
12352       /* ix86_expand_vector_move_misalign() does not like constants ... */
12353       if (CONSTANT_P (op1)
12354           || (GET_CODE (op1) == SUBREG
12355               && CONSTANT_P (SUBREG_REG (op1))))
12356         op1 = validize_mem (force_const_mem (mode, op1));
12357
12358       /* ... nor both arguments in memory.  */
12359       if (!register_operand (op0, mode)
12360           && !register_operand (op1, mode))
12361         op1 = force_reg (mode, op1);
12362
12363       tmp[0] = op0; tmp[1] = op1;
12364       ix86_expand_vector_move_misalign (mode, tmp);
12365       return;
12366     }
12367
12368   /* Make operand1 a register if it isn't already.  */
12369   if (can_create_pseudo_p ()
12370       && !register_operand (op0, mode)
12371       && !register_operand (op1, mode))
12372     {
12373       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
12374       return;
12375     }
12376
12377   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12378 }
12379
12380 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
12381    straight to ix86_expand_vector_move.  */
12382 /* Code generation for scalar reg-reg moves of single and double precision data:
12383      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
12384        movaps reg, reg
12385      else
12386        movss reg, reg
12387      if (x86_sse_partial_reg_dependency == true)
12388        movapd reg, reg
12389      else
12390        movsd reg, reg
12391
12392    Code generation for scalar loads of double precision data:
12393      if (x86_sse_split_regs == true)
12394        movlpd mem, reg      (gas syntax)
12395      else
12396        movsd mem, reg
12397
12398    Code generation for unaligned packed loads of single precision data
12399    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
12400      if (x86_sse_unaligned_move_optimal)
12401        movups mem, reg
12402
12403      if (x86_sse_partial_reg_dependency == true)
12404        {
12405          xorps  reg, reg
12406          movlps mem, reg
12407          movhps mem+8, reg
12408        }
12409      else
12410        {
12411          movlps mem, reg
12412          movhps mem+8, reg
12413        }
12414
12415    Code generation for unaligned packed loads of double precision data
12416    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
12417      if (x86_sse_unaligned_move_optimal)
12418        movupd mem, reg
12419
12420      if (x86_sse_split_regs == true)
12421        {
12422          movlpd mem, reg
12423          movhpd mem+8, reg
12424        }
12425      else
12426        {
12427          movsd  mem, reg
12428          movhpd mem+8, reg
12429        }
12430  */
12431
12432 void
12433 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
12434 {
12435   rtx op0, op1, m;
12436
12437   op0 = operands[0];
12438   op1 = operands[1];
12439
12440   if (TARGET_AVX)
12441     {
12442       switch (GET_MODE_CLASS (mode))
12443         {
12444         case MODE_VECTOR_INT:
12445         case MODE_INT:
12446           switch (GET_MODE_SIZE (mode))
12447             {
12448             case 16:
12449               op0 = gen_lowpart (V16QImode, op0);
12450               op1 = gen_lowpart (V16QImode, op1);
12451               emit_insn (gen_avx_movdqu (op0, op1));
12452               break;
12453             case 32:
12454               op0 = gen_lowpart (V32QImode, op0);
12455               op1 = gen_lowpart (V32QImode, op1);
12456               emit_insn (gen_avx_movdqu256 (op0, op1));
12457               break;
12458             default:
12459               gcc_unreachable ();
12460             }
12461           break;
12462         case MODE_VECTOR_FLOAT:
12463           op0 = gen_lowpart (mode, op0);
12464           op1 = gen_lowpart (mode, op1);
12465
12466           switch (mode)
12467             { 
12468             case V4SFmode:
12469               emit_insn (gen_avx_movups (op0, op1));
12470               break;
12471             case V8SFmode:
12472               emit_insn (gen_avx_movups256 (op0, op1));
12473               break;
12474             case V2DFmode:
12475               emit_insn (gen_avx_movupd (op0, op1));
12476               break;
12477             case V4DFmode:
12478               emit_insn (gen_avx_movupd256 (op0, op1));
12479               break;
12480             default:
12481               gcc_unreachable ();
12482             }
12483           break;
12484
12485         default:
12486           gcc_unreachable ();
12487         }
12488
12489       return;
12490     }
12491
12492   if (MEM_P (op1))
12493     {
12494       /* If we're optimizing for size, movups is the smallest.  */
12495       if (optimize_insn_for_size_p ())
12496         {
12497           op0 = gen_lowpart (V4SFmode, op0);
12498           op1 = gen_lowpart (V4SFmode, op1);
12499           emit_insn (gen_sse_movups (op0, op1));
12500           return;
12501         }
12502
12503       /* ??? If we have typed data, then it would appear that using
12504          movdqu is the only way to get unaligned data loaded with
12505          integer type.  */
12506       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12507         {
12508           op0 = gen_lowpart (V16QImode, op0);
12509           op1 = gen_lowpart (V16QImode, op1);
12510           emit_insn (gen_sse2_movdqu (op0, op1));
12511           return;
12512         }
12513
12514       if (TARGET_SSE2 && mode == V2DFmode)
12515         {
12516           rtx zero;
12517
12518           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12519             {
12520               op0 = gen_lowpart (V2DFmode, op0);
12521               op1 = gen_lowpart (V2DFmode, op1);
12522               emit_insn (gen_sse2_movupd (op0, op1));
12523               return;
12524             }
12525
12526           /* When SSE registers are split into halves, we can avoid
12527              writing to the top half twice.  */
12528           if (TARGET_SSE_SPLIT_REGS)
12529             {
12530               emit_clobber (op0);
12531               zero = op0;
12532             }
12533           else
12534             {
12535               /* ??? Not sure about the best option for the Intel chips.
12536                  The following would seem to satisfy; the register is
12537                  entirely cleared, breaking the dependency chain.  We
12538                  then store to the upper half, with a dependency depth
12539                  of one.  A rumor has it that Intel recommends two movsd
12540                  followed by an unpacklpd, but this is unconfirmed.  And
12541                  given that the dependency depth of the unpacklpd would
12542                  still be one, I'm not sure why this would be better.  */
12543               zero = CONST0_RTX (V2DFmode);
12544             }
12545
12546           m = adjust_address (op1, DFmode, 0);
12547           emit_insn (gen_sse2_loadlpd (op0, zero, m));
12548           m = adjust_address (op1, DFmode, 8);
12549           emit_insn (gen_sse2_loadhpd (op0, op0, m));
12550         }
12551       else
12552         {
12553           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12554             {
12555               op0 = gen_lowpart (V4SFmode, op0);
12556               op1 = gen_lowpart (V4SFmode, op1);
12557               emit_insn (gen_sse_movups (op0, op1));
12558               return;
12559             }
12560
12561           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
12562             emit_move_insn (op0, CONST0_RTX (mode));
12563           else
12564             emit_clobber (op0);
12565
12566           if (mode != V4SFmode)
12567             op0 = gen_lowpart (V4SFmode, op0);
12568           m = adjust_address (op1, V2SFmode, 0);
12569           emit_insn (gen_sse_loadlps (op0, op0, m));
12570           m = adjust_address (op1, V2SFmode, 8);
12571           emit_insn (gen_sse_loadhps (op0, op0, m));
12572         }
12573     }
12574   else if (MEM_P (op0))
12575     {
12576       /* If we're optimizing for size, movups is the smallest.  */
12577       if (optimize_insn_for_size_p ())
12578         {
12579           op0 = gen_lowpart (V4SFmode, op0);
12580           op1 = gen_lowpart (V4SFmode, op1);
12581           emit_insn (gen_sse_movups (op0, op1));
12582           return;
12583         }
12584
12585       /* ??? Similar to above, only less clear because of quote
12586          typeless stores unquote.  */
12587       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
12588           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12589         {
12590           op0 = gen_lowpart (V16QImode, op0);
12591           op1 = gen_lowpart (V16QImode, op1);
12592           emit_insn (gen_sse2_movdqu (op0, op1));
12593           return;
12594         }
12595
12596       if (TARGET_SSE2 && mode == V2DFmode)
12597         {
12598           m = adjust_address (op0, DFmode, 0);
12599           emit_insn (gen_sse2_storelpd (m, op1));
12600           m = adjust_address (op0, DFmode, 8);
12601           emit_insn (gen_sse2_storehpd (m, op1));
12602         }
12603       else
12604         {
12605           if (mode != V4SFmode)
12606             op1 = gen_lowpart (V4SFmode, op1);
12607           m = adjust_address (op0, V2SFmode, 0);
12608           emit_insn (gen_sse_storelps (m, op1));
12609           m = adjust_address (op0, V2SFmode, 8);
12610           emit_insn (gen_sse_storehps (m, op1));
12611         }
12612     }
12613   else
12614     gcc_unreachable ();
12615 }
12616
12617 /* Expand a push in MODE.  This is some mode for which we do not support
12618    proper push instructions, at least from the registers that we expect
12619    the value to live in.  */
12620
12621 void
12622 ix86_expand_push (enum machine_mode mode, rtx x)
12623 {
12624   rtx tmp;
12625
12626   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
12627                              GEN_INT (-GET_MODE_SIZE (mode)),
12628                              stack_pointer_rtx, 1, OPTAB_DIRECT);
12629   if (tmp != stack_pointer_rtx)
12630     emit_move_insn (stack_pointer_rtx, tmp);
12631
12632   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
12633
12634   /* When we push an operand onto stack, it has to be aligned at least
12635      at the function argument boundary.  */
12636   set_mem_align (tmp,
12637                  ix86_function_arg_boundary (mode, NULL_TREE));
12638
12639   emit_move_insn (tmp, x);
12640 }
12641
12642 /* Helper function of ix86_fixup_binary_operands to canonicalize
12643    operand order.  Returns true if the operands should be swapped.  */
12644
12645 static bool
12646 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
12647                              rtx operands[])
12648 {
12649   rtx dst = operands[0];
12650   rtx src1 = operands[1];
12651   rtx src2 = operands[2];
12652
12653   /* If the operation is not commutative, we can't do anything.  */
12654   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
12655     return false;
12656
12657   /* Highest priority is that src1 should match dst.  */
12658   if (rtx_equal_p (dst, src1))
12659     return false;
12660   if (rtx_equal_p (dst, src2))
12661     return true;
12662
12663   /* Next highest priority is that immediate constants come second.  */
12664   if (immediate_operand (src2, mode))
12665     return false;
12666   if (immediate_operand (src1, mode))
12667     return true;
12668
12669   /* Lowest priority is that memory references should come second.  */
12670   if (MEM_P (src2))
12671     return false;
12672   if (MEM_P (src1))
12673     return true;
12674
12675   return false;
12676 }
12677
12678
12679 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
12680    destination to use for the operation.  If different from the true
12681    destination in operands[0], a copy operation will be required.  */
12682
12683 rtx
12684 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
12685                             rtx operands[])
12686 {
12687   rtx dst = operands[0];
12688   rtx src1 = operands[1];
12689   rtx src2 = operands[2];
12690
12691   /* Canonicalize operand order.  */
12692   if (ix86_swap_binary_operands_p (code, mode, operands))
12693     {
12694       rtx temp;
12695
12696       /* It is invalid to swap operands of different modes.  */
12697       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
12698
12699       temp = src1;
12700       src1 = src2;
12701       src2 = temp;
12702     }
12703
12704   /* Both source operands cannot be in memory.  */
12705   if (MEM_P (src1) && MEM_P (src2))
12706     {
12707       /* Optimization: Only read from memory once.  */
12708       if (rtx_equal_p (src1, src2))
12709         {
12710           src2 = force_reg (mode, src2);
12711           src1 = src2;
12712         }
12713       else
12714         src2 = force_reg (mode, src2);
12715     }
12716
12717   /* If the destination is memory, and we do not have matching source
12718      operands, do things in registers.  */
12719   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12720     dst = gen_reg_rtx (mode);
12721
12722   /* Source 1 cannot be a constant.  */
12723   if (CONSTANT_P (src1))
12724     src1 = force_reg (mode, src1);
12725
12726   /* Source 1 cannot be a non-matching memory.  */
12727   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12728     src1 = force_reg (mode, src1);
12729
12730   operands[1] = src1;
12731   operands[2] = src2;
12732   return dst;
12733 }
12734
12735 /* Similarly, but assume that the destination has already been
12736    set up properly.  */
12737
12738 void
12739 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
12740                                     enum machine_mode mode, rtx operands[])
12741 {
12742   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
12743   gcc_assert (dst == operands[0]);
12744 }
12745
12746 /* Attempt to expand a binary operator.  Make the expansion closer to the
12747    actual machine, then just general_operand, which will allow 3 separate
12748    memory references (one output, two input) in a single insn.  */
12749
12750 void
12751 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
12752                              rtx operands[])
12753 {
12754   rtx src1, src2, dst, op, clob;
12755
12756   dst = ix86_fixup_binary_operands (code, mode, operands);
12757   src1 = operands[1];
12758   src2 = operands[2];
12759
12760  /* Emit the instruction.  */
12761
12762   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
12763   if (reload_in_progress)
12764     {
12765       /* Reload doesn't know about the flags register, and doesn't know that
12766          it doesn't want to clobber it.  We can only do this with PLUS.  */
12767       gcc_assert (code == PLUS);
12768       emit_insn (op);
12769     }
12770   else
12771     {
12772       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12773       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
12774     }
12775
12776   /* Fix up the destination if needed.  */
12777   if (dst != operands[0])
12778     emit_move_insn (operands[0], dst);
12779 }
12780
12781 /* Return TRUE or FALSE depending on whether the binary operator meets the
12782    appropriate constraints.  */
12783
12784 int
12785 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
12786                          rtx operands[3])
12787 {
12788   rtx dst = operands[0];
12789   rtx src1 = operands[1];
12790   rtx src2 = operands[2];
12791
12792   /* Both source operands cannot be in memory.  */
12793   if (MEM_P (src1) && MEM_P (src2))
12794     return 0;
12795
12796   /* Canonicalize operand order for commutative operators.  */
12797   if (ix86_swap_binary_operands_p (code, mode, operands))
12798     {
12799       rtx temp = src1;
12800       src1 = src2;
12801       src2 = temp;
12802     }
12803
12804   /* If the destination is memory, we must have a matching source operand.  */
12805   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12806       return 0;
12807
12808   /* Source 1 cannot be a constant.  */
12809   if (CONSTANT_P (src1))
12810     return 0;
12811
12812   /* Source 1 cannot be a non-matching memory.  */
12813   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12814     return 0;
12815
12816   return 1;
12817 }
12818
12819 /* Attempt to expand a unary operator.  Make the expansion closer to the
12820    actual machine, then just general_operand, which will allow 2 separate
12821    memory references (one output, one input) in a single insn.  */
12822
12823 void
12824 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
12825                             rtx operands[])
12826 {
12827   int matching_memory;
12828   rtx src, dst, op, clob;
12829
12830   dst = operands[0];
12831   src = operands[1];
12832
12833   /* If the destination is memory, and we do not have matching source
12834      operands, do things in registers.  */
12835   matching_memory = 0;
12836   if (MEM_P (dst))
12837     {
12838       if (rtx_equal_p (dst, src))
12839         matching_memory = 1;
12840       else
12841         dst = gen_reg_rtx (mode);
12842     }
12843
12844   /* When source operand is memory, destination must match.  */
12845   if (MEM_P (src) && !matching_memory)
12846     src = force_reg (mode, src);
12847
12848   /* Emit the instruction.  */
12849
12850   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
12851   if (reload_in_progress || code == NOT)
12852     {
12853       /* Reload doesn't know about the flags register, and doesn't know that
12854          it doesn't want to clobber it.  */
12855       gcc_assert (code == NOT);
12856       emit_insn (op);
12857     }
12858   else
12859     {
12860       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12861       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
12862     }
12863
12864   /* Fix up the destination if needed.  */
12865   if (dst != operands[0])
12866     emit_move_insn (operands[0], dst);
12867 }
12868
12869 /* Return TRUE or FALSE depending on whether the unary operator meets the
12870    appropriate constraints.  */
12871
12872 int
12873 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
12874                         enum machine_mode mode ATTRIBUTE_UNUSED,
12875                         rtx operands[2] ATTRIBUTE_UNUSED)
12876 {
12877   /* If one of operands is memory, source and destination must match.  */
12878   if ((MEM_P (operands[0])
12879        || MEM_P (operands[1]))
12880       && ! rtx_equal_p (operands[0], operands[1]))
12881     return FALSE;
12882   return TRUE;
12883 }
12884
12885 /* Post-reload splitter for converting an SF or DFmode value in an
12886    SSE register into an unsigned SImode.  */
12887
12888 void
12889 ix86_split_convert_uns_si_sse (rtx operands[])
12890 {
12891   enum machine_mode vecmode;
12892   rtx value, large, zero_or_two31, input, two31, x;
12893
12894   large = operands[1];
12895   zero_or_two31 = operands[2];
12896   input = operands[3];
12897   two31 = operands[4];
12898   vecmode = GET_MODE (large);
12899   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
12900
12901   /* Load up the value into the low element.  We must ensure that the other
12902      elements are valid floats -- zero is the easiest such value.  */
12903   if (MEM_P (input))
12904     {
12905       if (vecmode == V4SFmode)
12906         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
12907       else
12908         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
12909     }
12910   else
12911     {
12912       input = gen_rtx_REG (vecmode, REGNO (input));
12913       emit_move_insn (value, CONST0_RTX (vecmode));
12914       if (vecmode == V4SFmode)
12915         emit_insn (gen_sse_movss (value, value, input));
12916       else
12917         emit_insn (gen_sse2_movsd (value, value, input));
12918     }
12919
12920   emit_move_insn (large, two31);
12921   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
12922
12923   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
12924   emit_insn (gen_rtx_SET (VOIDmode, large, x));
12925
12926   x = gen_rtx_AND (vecmode, zero_or_two31, large);
12927   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
12928
12929   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
12930   emit_insn (gen_rtx_SET (VOIDmode, value, x));
12931
12932   large = gen_rtx_REG (V4SImode, REGNO (large));
12933   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
12934
12935   x = gen_rtx_REG (V4SImode, REGNO (value));
12936   if (vecmode == V4SFmode)
12937     emit_insn (gen_sse2_cvttps2dq (x, value));
12938   else
12939     emit_insn (gen_sse2_cvttpd2dq (x, value));
12940   value = x;
12941
12942   emit_insn (gen_xorv4si3 (value, value, large));
12943 }
12944
12945 /* Convert an unsigned DImode value into a DFmode, using only SSE.
12946    Expects the 64-bit DImode to be supplied in a pair of integral
12947    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
12948    -mfpmath=sse, !optimize_size only.  */
12949
12950 void
12951 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
12952 {
12953   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
12954   rtx int_xmm, fp_xmm;
12955   rtx biases, exponents;
12956   rtx x;
12957
12958   int_xmm = gen_reg_rtx (V4SImode);
12959   if (TARGET_INTER_UNIT_MOVES)
12960     emit_insn (gen_movdi_to_sse (int_xmm, input));
12961   else if (TARGET_SSE_SPLIT_REGS)
12962     {
12963       emit_clobber (int_xmm);
12964       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
12965     }
12966   else
12967     {
12968       x = gen_reg_rtx (V2DImode);
12969       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
12970       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
12971     }
12972
12973   x = gen_rtx_CONST_VECTOR (V4SImode,
12974                             gen_rtvec (4, GEN_INT (0x43300000UL),
12975                                        GEN_INT (0x45300000UL),
12976                                        const0_rtx, const0_rtx));
12977   exponents = validize_mem (force_const_mem (V4SImode, x));
12978
12979   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
12980   emit_insn (gen_sse2_punpckldq (int_xmm, int_xmm, exponents));
12981
12982   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
12983      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
12984      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
12985      (0x1.0p84 + double(fp_value_hi_xmm)).
12986      Note these exponents differ by 32.  */
12987
12988   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
12989
12990   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
12991      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
12992   real_ldexp (&bias_lo_rvt, &dconst1, 52);
12993   real_ldexp (&bias_hi_rvt, &dconst1, 84);
12994   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
12995   x = const_double_from_real_value (bias_hi_rvt, DFmode);
12996   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
12997   biases = validize_mem (force_const_mem (V2DFmode, biases));
12998   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
12999
13000   /* Add the upper and lower DFmode values together.  */
13001   if (TARGET_SSE3)
13002     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
13003   else
13004     {
13005       x = copy_to_mode_reg (V2DFmode, fp_xmm);
13006       emit_insn (gen_sse2_unpckhpd (fp_xmm, fp_xmm, fp_xmm));
13007       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
13008     }
13009
13010   ix86_expand_vector_extract (false, target, fp_xmm, 0);
13011 }
13012
13013 /* Not used, but eases macroization of patterns.  */
13014 void
13015 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
13016                                   rtx input ATTRIBUTE_UNUSED)
13017 {
13018   gcc_unreachable ();
13019 }
13020
13021 /* Convert an unsigned SImode value into a DFmode.  Only currently used
13022    for SSE, but applicable anywhere.  */
13023
13024 void
13025 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
13026 {
13027   REAL_VALUE_TYPE TWO31r;
13028   rtx x, fp;
13029
13030   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
13031                            NULL, 1, OPTAB_DIRECT);
13032
13033   fp = gen_reg_rtx (DFmode);
13034   emit_insn (gen_floatsidf2 (fp, x));
13035
13036   real_ldexp (&TWO31r, &dconst1, 31);
13037   x = const_double_from_real_value (TWO31r, DFmode);
13038
13039   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
13040   if (x != target)
13041     emit_move_insn (target, x);
13042 }
13043
13044 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
13045    32-bit mode; otherwise we have a direct convert instruction.  */
13046
13047 void
13048 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
13049 {
13050   REAL_VALUE_TYPE TWO32r;
13051   rtx fp_lo, fp_hi, x;
13052
13053   fp_lo = gen_reg_rtx (DFmode);
13054   fp_hi = gen_reg_rtx (DFmode);
13055
13056   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
13057
13058   real_ldexp (&TWO32r, &dconst1, 32);
13059   x = const_double_from_real_value (TWO32r, DFmode);
13060   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
13061
13062   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
13063
13064   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
13065                            0, OPTAB_DIRECT);
13066   if (x != target)
13067     emit_move_insn (target, x);
13068 }
13069
13070 /* Convert an unsigned SImode value into a SFmode, using only SSE.
13071    For x86_32, -mfpmath=sse, !optimize_size only.  */
13072 void
13073 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
13074 {
13075   REAL_VALUE_TYPE ONE16r;
13076   rtx fp_hi, fp_lo, int_hi, int_lo, x;
13077
13078   real_ldexp (&ONE16r, &dconst1, 16);
13079   x = const_double_from_real_value (ONE16r, SFmode);
13080   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
13081                                       NULL, 0, OPTAB_DIRECT);
13082   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
13083                                       NULL, 0, OPTAB_DIRECT);
13084   fp_hi = gen_reg_rtx (SFmode);
13085   fp_lo = gen_reg_rtx (SFmode);
13086   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
13087   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
13088   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
13089                                0, OPTAB_DIRECT);
13090   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
13091                                0, OPTAB_DIRECT);
13092   if (!rtx_equal_p (target, fp_hi))
13093     emit_move_insn (target, fp_hi);
13094 }
13095
13096 /* A subroutine of ix86_build_signbit_mask_vector.  If VECT is true,
13097    then replicate the value for all elements of the vector
13098    register.  */
13099
13100 rtx
13101 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
13102 {
13103   rtvec v;
13104   switch (mode)
13105     {
13106     case SImode:
13107       gcc_assert (vect);
13108       v = gen_rtvec (4, value, value, value, value);
13109       return gen_rtx_CONST_VECTOR (V4SImode, v);
13110
13111     case DImode:
13112       gcc_assert (vect);
13113       v = gen_rtvec (2, value, value);
13114       return gen_rtx_CONST_VECTOR (V2DImode, v);
13115
13116     case SFmode:
13117       if (vect)
13118         v = gen_rtvec (4, value, value, value, value);
13119       else
13120         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
13121                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13122       return gen_rtx_CONST_VECTOR (V4SFmode, v);
13123
13124     case DFmode:
13125       if (vect)
13126         v = gen_rtvec (2, value, value);
13127       else
13128         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
13129       return gen_rtx_CONST_VECTOR (V2DFmode, v);
13130
13131     default:
13132       gcc_unreachable ();
13133     }
13134 }
13135
13136 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
13137    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
13138    for an SSE register.  If VECT is true, then replicate the mask for
13139    all elements of the vector register.  If INVERT is true, then create
13140    a mask excluding the sign bit.  */
13141
13142 rtx
13143 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
13144 {
13145   enum machine_mode vec_mode, imode;
13146   HOST_WIDE_INT hi, lo;
13147   int shift = 63;
13148   rtx v;
13149   rtx mask;
13150
13151   /* Find the sign bit, sign extended to 2*HWI.  */
13152   switch (mode)
13153     {
13154     case SImode:
13155     case SFmode:
13156       imode = SImode;
13157       vec_mode = (mode == SImode) ? V4SImode : V4SFmode;
13158       lo = 0x80000000, hi = lo < 0;
13159       break;
13160
13161     case DImode:
13162     case DFmode:
13163       imode = DImode;
13164       vec_mode = (mode == DImode) ? V2DImode : V2DFmode;
13165       if (HOST_BITS_PER_WIDE_INT >= 64)
13166         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
13167       else
13168         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13169       break;
13170
13171     case TImode:
13172     case TFmode:
13173       vec_mode = VOIDmode;
13174       if (HOST_BITS_PER_WIDE_INT >= 64)
13175         {
13176           imode = TImode;
13177           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
13178         }
13179       else
13180         {
13181           rtvec vec;
13182
13183           imode = DImode;
13184           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13185
13186           if (invert)
13187             {
13188               lo = ~lo, hi = ~hi;
13189               v = constm1_rtx;
13190             }
13191           else
13192             v = const0_rtx;
13193
13194           mask = immed_double_const (lo, hi, imode);
13195
13196           vec = gen_rtvec (2, v, mask);
13197           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
13198           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
13199
13200           return v;
13201         }
13202      break;
13203
13204     default:
13205       gcc_unreachable ();
13206     }
13207
13208   if (invert)
13209     lo = ~lo, hi = ~hi;
13210
13211   /* Force this value into the low part of a fp vector constant.  */
13212   mask = immed_double_const (lo, hi, imode);
13213   mask = gen_lowpart (mode, mask);
13214
13215   if (vec_mode == VOIDmode)
13216     return force_reg (mode, mask);
13217
13218   v = ix86_build_const_vector (mode, vect, mask);
13219   return force_reg (vec_mode, v);
13220 }
13221
13222 /* Generate code for floating point ABS or NEG.  */
13223
13224 void
13225 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
13226                                 rtx operands[])
13227 {
13228   rtx mask, set, use, clob, dst, src;
13229   bool use_sse = false;
13230   bool vector_mode = VECTOR_MODE_P (mode);
13231   enum machine_mode elt_mode = mode;
13232
13233   if (vector_mode)
13234     {
13235       elt_mode = GET_MODE_INNER (mode);
13236       use_sse = true;
13237     }
13238   else if (mode == TFmode)
13239     use_sse = true;
13240   else if (TARGET_SSE_MATH)
13241     use_sse = SSE_FLOAT_MODE_P (mode);
13242
13243   /* NEG and ABS performed with SSE use bitwise mask operations.
13244      Create the appropriate mask now.  */
13245   if (use_sse)
13246     mask = ix86_build_signbit_mask (elt_mode, vector_mode, code == ABS);
13247   else
13248     mask = NULL_RTX;
13249
13250   dst = operands[0];
13251   src = operands[1];
13252
13253   if (vector_mode)
13254     {
13255       set = gen_rtx_fmt_ee (code == NEG ? XOR : AND, mode, src, mask);
13256       set = gen_rtx_SET (VOIDmode, dst, set);
13257       emit_insn (set);
13258     }
13259   else
13260     {
13261       set = gen_rtx_fmt_e (code, mode, src);
13262       set = gen_rtx_SET (VOIDmode, dst, set);
13263       if (mask)
13264         {
13265           use = gen_rtx_USE (VOIDmode, mask);
13266           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13267           emit_insn (gen_rtx_PARALLEL (VOIDmode,
13268                                        gen_rtvec (3, set, use, clob)));
13269         }
13270       else
13271         emit_insn (set);
13272     }
13273 }
13274
13275 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
13276
13277 void
13278 ix86_expand_copysign (rtx operands[])
13279 {
13280   enum machine_mode mode;
13281   rtx dest, op0, op1, mask, nmask;
13282
13283   dest = operands[0];
13284   op0 = operands[1];
13285   op1 = operands[2];
13286
13287   mode = GET_MODE (dest);
13288
13289   if (GET_CODE (op0) == CONST_DOUBLE)
13290     {
13291       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
13292
13293       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
13294         op0 = simplify_unary_operation (ABS, mode, op0, mode);
13295
13296       if (mode == SFmode || mode == DFmode)
13297         {
13298           enum machine_mode vmode;
13299
13300           vmode = mode == SFmode ? V4SFmode : V2DFmode;
13301
13302           if (op0 == CONST0_RTX (mode))
13303             op0 = CONST0_RTX (vmode);
13304           else
13305             {
13306               rtvec v;
13307
13308               if (mode == SFmode)
13309                 v = gen_rtvec (4, op0, CONST0_RTX (SFmode),
13310                                CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13311               else
13312                 v = gen_rtvec (2, op0, CONST0_RTX (DFmode));
13313
13314               op0 = force_reg (vmode, gen_rtx_CONST_VECTOR (vmode, v));
13315             }
13316         }
13317       else if (op0 != CONST0_RTX (mode))
13318         op0 = force_reg (mode, op0);
13319
13320       mask = ix86_build_signbit_mask (mode, 0, 0);
13321
13322       if (mode == SFmode)
13323         copysign_insn = gen_copysignsf3_const;
13324       else if (mode == DFmode)
13325         copysign_insn = gen_copysigndf3_const;
13326       else
13327         copysign_insn = gen_copysigntf3_const;
13328
13329         emit_insn (copysign_insn (dest, op0, op1, mask));
13330     }
13331   else
13332     {
13333       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
13334
13335       nmask = ix86_build_signbit_mask (mode, 0, 1);
13336       mask = ix86_build_signbit_mask (mode, 0, 0);
13337
13338       if (mode == SFmode)
13339         copysign_insn = gen_copysignsf3_var;
13340       else if (mode == DFmode)
13341         copysign_insn = gen_copysigndf3_var;
13342       else
13343         copysign_insn = gen_copysigntf3_var;
13344
13345       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
13346     }
13347 }
13348
13349 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
13350    be a constant, and so has already been expanded into a vector constant.  */
13351
13352 void
13353 ix86_split_copysign_const (rtx operands[])
13354 {
13355   enum machine_mode mode, vmode;
13356   rtx dest, op0, op1, mask, x;
13357
13358   dest = operands[0];
13359   op0 = operands[1];
13360   op1 = operands[2];
13361   mask = operands[3];
13362
13363   mode = GET_MODE (dest);
13364   vmode = GET_MODE (mask);
13365
13366   dest = simplify_gen_subreg (vmode, dest, mode, 0);
13367   x = gen_rtx_AND (vmode, dest, mask);
13368   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13369
13370   if (op0 != CONST0_RTX (vmode))
13371     {
13372       x = gen_rtx_IOR (vmode, dest, op0);
13373       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13374     }
13375 }
13376
13377 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
13378    so we have to do two masks.  */
13379
13380 void
13381 ix86_split_copysign_var (rtx operands[])
13382 {
13383   enum machine_mode mode, vmode;
13384   rtx dest, scratch, op0, op1, mask, nmask, x;
13385
13386   dest = operands[0];
13387   scratch = operands[1];
13388   op0 = operands[2];
13389   op1 = operands[3];
13390   nmask = operands[4];
13391   mask = operands[5];
13392
13393   mode = GET_MODE (dest);
13394   vmode = GET_MODE (mask);
13395
13396   if (rtx_equal_p (op0, op1))
13397     {
13398       /* Shouldn't happen often (it's useless, obviously), but when it does
13399          we'd generate incorrect code if we continue below.  */
13400       emit_move_insn (dest, op0);
13401       return;
13402     }
13403
13404   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
13405     {
13406       gcc_assert (REGNO (op1) == REGNO (scratch));
13407
13408       x = gen_rtx_AND (vmode, scratch, mask);
13409       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13410
13411       dest = mask;
13412       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13413       x = gen_rtx_NOT (vmode, dest);
13414       x = gen_rtx_AND (vmode, x, op0);
13415       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13416     }
13417   else
13418     {
13419       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
13420         {
13421           x = gen_rtx_AND (vmode, scratch, mask);
13422         }
13423       else                                              /* alternative 2,4 */
13424         {
13425           gcc_assert (REGNO (mask) == REGNO (scratch));
13426           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
13427           x = gen_rtx_AND (vmode, scratch, op1);
13428         }
13429       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13430
13431       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
13432         {
13433           dest = simplify_gen_subreg (vmode, op0, mode, 0);
13434           x = gen_rtx_AND (vmode, dest, nmask);
13435         }
13436       else                                              /* alternative 3,4 */
13437         {
13438           gcc_assert (REGNO (nmask) == REGNO (dest));
13439           dest = nmask;
13440           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13441           x = gen_rtx_AND (vmode, dest, op0);
13442         }
13443       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13444     }
13445
13446   x = gen_rtx_IOR (vmode, dest, scratch);
13447   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13448 }
13449
13450 /* Return TRUE or FALSE depending on whether the first SET in INSN
13451    has source and destination with matching CC modes, and that the
13452    CC mode is at least as constrained as REQ_MODE.  */
13453
13454 int
13455 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
13456 {
13457   rtx set;
13458   enum machine_mode set_mode;
13459
13460   set = PATTERN (insn);
13461   if (GET_CODE (set) == PARALLEL)
13462     set = XVECEXP (set, 0, 0);
13463   gcc_assert (GET_CODE (set) == SET);
13464   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
13465
13466   set_mode = GET_MODE (SET_DEST (set));
13467   switch (set_mode)
13468     {
13469     case CCNOmode:
13470       if (req_mode != CCNOmode
13471           && (req_mode != CCmode
13472               || XEXP (SET_SRC (set), 1) != const0_rtx))
13473         return 0;
13474       break;
13475     case CCmode:
13476       if (req_mode == CCGCmode)
13477         return 0;
13478       /* FALLTHRU */
13479     case CCGCmode:
13480       if (req_mode == CCGOCmode || req_mode == CCNOmode)
13481         return 0;
13482       /* FALLTHRU */
13483     case CCGOCmode:
13484       if (req_mode == CCZmode)
13485         return 0;
13486       /* FALLTHRU */
13487     case CCAmode:
13488     case CCCmode:
13489     case CCOmode:
13490     case CCSmode:
13491     case CCZmode:
13492       break;
13493
13494     default:
13495       gcc_unreachable ();
13496     }
13497
13498   return (GET_MODE (SET_SRC (set)) == set_mode);
13499 }
13500
13501 /* Generate insn patterns to do an integer compare of OPERANDS.  */
13502
13503 static rtx
13504 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
13505 {
13506   enum machine_mode cmpmode;
13507   rtx tmp, flags;
13508
13509   cmpmode = SELECT_CC_MODE (code, op0, op1);
13510   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
13511
13512   /* This is very simple, but making the interface the same as in the
13513      FP case makes the rest of the code easier.  */
13514   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
13515   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
13516
13517   /* Return the test that should be put into the flags user, i.e.
13518      the bcc, scc, or cmov instruction.  */
13519   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
13520 }
13521
13522 /* Figure out whether to use ordered or unordered fp comparisons.
13523    Return the appropriate mode to use.  */
13524
13525 enum machine_mode
13526 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
13527 {
13528   /* ??? In order to make all comparisons reversible, we do all comparisons
13529      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
13530      all forms trapping and nontrapping comparisons, we can make inequality
13531      comparisons trapping again, since it results in better code when using
13532      FCOM based compares.  */
13533   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
13534 }
13535
13536 enum machine_mode
13537 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
13538 {
13539   enum machine_mode mode = GET_MODE (op0);
13540
13541   if (SCALAR_FLOAT_MODE_P (mode))
13542     {
13543       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
13544       return ix86_fp_compare_mode (code);
13545     }
13546
13547   switch (code)
13548     {
13549       /* Only zero flag is needed.  */
13550     case EQ:                    /* ZF=0 */
13551     case NE:                    /* ZF!=0 */
13552       return CCZmode;
13553       /* Codes needing carry flag.  */
13554     case GEU:                   /* CF=0 */
13555     case LTU:                   /* CF=1 */
13556       /* Detect overflow checks.  They need just the carry flag.  */
13557       if (GET_CODE (op0) == PLUS
13558           && rtx_equal_p (op1, XEXP (op0, 0)))
13559         return CCCmode;
13560       else
13561         return CCmode;
13562     case GTU:                   /* CF=0 & ZF=0 */
13563     case LEU:                   /* CF=1 | ZF=1 */
13564       /* Detect overflow checks.  They need just the carry flag.  */
13565       if (GET_CODE (op0) == MINUS
13566           && rtx_equal_p (op1, XEXP (op0, 0)))
13567         return CCCmode;
13568       else
13569         return CCmode;
13570       /* Codes possibly doable only with sign flag when
13571          comparing against zero.  */
13572     case GE:                    /* SF=OF   or   SF=0 */
13573     case LT:                    /* SF<>OF  or   SF=1 */
13574       if (op1 == const0_rtx)
13575         return CCGOCmode;
13576       else
13577         /* For other cases Carry flag is not required.  */
13578         return CCGCmode;
13579       /* Codes doable only with sign flag when comparing
13580          against zero, but we miss jump instruction for it
13581          so we need to use relational tests against overflow
13582          that thus needs to be zero.  */
13583     case GT:                    /* ZF=0 & SF=OF */
13584     case LE:                    /* ZF=1 | SF<>OF */
13585       if (op1 == const0_rtx)
13586         return CCNOmode;
13587       else
13588         return CCGCmode;
13589       /* strcmp pattern do (use flags) and combine may ask us for proper
13590          mode.  */
13591     case USE:
13592       return CCmode;
13593     default:
13594       gcc_unreachable ();
13595     }
13596 }
13597
13598 /* Return the fixed registers used for condition codes.  */
13599
13600 static bool
13601 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
13602 {
13603   *p1 = FLAGS_REG;
13604   *p2 = FPSR_REG;
13605   return true;
13606 }
13607
13608 /* If two condition code modes are compatible, return a condition code
13609    mode which is compatible with both.  Otherwise, return
13610    VOIDmode.  */
13611
13612 static enum machine_mode
13613 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
13614 {
13615   if (m1 == m2)
13616     return m1;
13617
13618   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
13619     return VOIDmode;
13620
13621   if ((m1 == CCGCmode && m2 == CCGOCmode)
13622       || (m1 == CCGOCmode && m2 == CCGCmode))
13623     return CCGCmode;
13624
13625   switch (m1)
13626     {
13627     default:
13628       gcc_unreachable ();
13629
13630     case CCmode:
13631     case CCGCmode:
13632     case CCGOCmode:
13633     case CCNOmode:
13634     case CCAmode:
13635     case CCCmode:
13636     case CCOmode:
13637     case CCSmode:
13638     case CCZmode:
13639       switch (m2)
13640         {
13641         default:
13642           return VOIDmode;
13643
13644         case CCmode:
13645         case CCGCmode:
13646         case CCGOCmode:
13647         case CCNOmode:
13648         case CCAmode:
13649         case CCCmode:
13650         case CCOmode:
13651         case CCSmode:
13652         case CCZmode:
13653           return CCmode;
13654         }
13655
13656     case CCFPmode:
13657     case CCFPUmode:
13658       /* These are only compatible with themselves, which we already
13659          checked above.  */
13660       return VOIDmode;
13661     }
13662 }
13663
13664 /* Split comparison code CODE into comparisons we can do using branch
13665    instructions.  BYPASS_CODE is comparison code for branch that will
13666    branch around FIRST_CODE and SECOND_CODE.  If some of branches
13667    is not required, set value to UNKNOWN.
13668    We never require more than two branches.  */
13669
13670 void
13671 ix86_fp_comparison_codes (enum rtx_code code, enum rtx_code *bypass_code,
13672                           enum rtx_code *first_code,
13673                           enum rtx_code *second_code)
13674 {
13675   *first_code = code;
13676   *bypass_code = UNKNOWN;
13677   *second_code = UNKNOWN;
13678
13679   /* The fcomi comparison sets flags as follows:
13680
13681      cmp    ZF PF CF
13682      >      0  0  0
13683      <      0  0  1
13684      =      1  0  0
13685      un     1  1  1 */
13686
13687   switch (code)
13688     {
13689     case GT:                    /* GTU - CF=0 & ZF=0 */
13690     case GE:                    /* GEU - CF=0 */
13691     case ORDERED:               /* PF=0 */
13692     case UNORDERED:             /* PF=1 */
13693     case UNEQ:                  /* EQ - ZF=1 */
13694     case UNLT:                  /* LTU - CF=1 */
13695     case UNLE:                  /* LEU - CF=1 | ZF=1 */
13696     case LTGT:                  /* EQ - ZF=0 */
13697       break;
13698     case LT:                    /* LTU - CF=1 - fails on unordered */
13699       *first_code = UNLT;
13700       *bypass_code = UNORDERED;
13701       break;
13702     case LE:                    /* LEU - CF=1 | ZF=1 - fails on unordered */
13703       *first_code = UNLE;
13704       *bypass_code = UNORDERED;
13705       break;
13706     case EQ:                    /* EQ - ZF=1 - fails on unordered */
13707       *first_code = UNEQ;
13708       *bypass_code = UNORDERED;
13709       break;
13710     case NE:                    /* NE - ZF=0 - fails on unordered */
13711       *first_code = LTGT;
13712       *second_code = UNORDERED;
13713       break;
13714     case UNGE:                  /* GEU - CF=0 - fails on unordered */
13715       *first_code = GE;
13716       *second_code = UNORDERED;
13717       break;
13718     case UNGT:                  /* GTU - CF=0 & ZF=0 - fails on unordered */
13719       *first_code = GT;
13720       *second_code = UNORDERED;
13721       break;
13722     default:
13723       gcc_unreachable ();
13724     }
13725   if (!TARGET_IEEE_FP)
13726     {
13727       *second_code = UNKNOWN;
13728       *bypass_code = UNKNOWN;
13729     }
13730 }
13731
13732 /* Return cost of comparison done fcom + arithmetics operations on AX.
13733    All following functions do use number of instructions as a cost metrics.
13734    In future this should be tweaked to compute bytes for optimize_size and
13735    take into account performance of various instructions on various CPUs.  */
13736 static int
13737 ix86_fp_comparison_arithmetics_cost (enum rtx_code code)
13738 {
13739   if (!TARGET_IEEE_FP)
13740     return 4;
13741   /* The cost of code output by ix86_expand_fp_compare.  */
13742   switch (code)
13743     {
13744     case UNLE:
13745     case UNLT:
13746     case LTGT:
13747     case GT:
13748     case GE:
13749     case UNORDERED:
13750     case ORDERED:
13751     case UNEQ:
13752       return 4;
13753       break;
13754     case LT:
13755     case NE:
13756     case EQ:
13757     case UNGE:
13758       return 5;
13759       break;
13760     case LE:
13761     case UNGT:
13762       return 6;
13763       break;
13764     default:
13765       gcc_unreachable ();
13766     }
13767 }
13768
13769 /* Return cost of comparison done using fcomi operation.
13770    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13771 static int
13772 ix86_fp_comparison_fcomi_cost (enum rtx_code code)
13773 {
13774   enum rtx_code bypass_code, first_code, second_code;
13775   /* Return arbitrarily high cost when instruction is not supported - this
13776      prevents gcc from using it.  */
13777   if (!TARGET_CMOVE)
13778     return 1024;
13779   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13780   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 2;
13781 }
13782
13783 /* Return cost of comparison done using sahf operation.
13784    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13785 static int
13786 ix86_fp_comparison_sahf_cost (enum rtx_code code)
13787 {
13788   enum rtx_code bypass_code, first_code, second_code;
13789   /* Return arbitrarily high cost when instruction is not preferred - this
13790      avoids gcc from using it.  */
13791   if (!(TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ())))
13792     return 1024;
13793   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13794   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 3;
13795 }
13796
13797 /* Compute cost of the comparison done using any method.
13798    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13799 static int
13800 ix86_fp_comparison_cost (enum rtx_code code)
13801 {
13802   int fcomi_cost, sahf_cost, arithmetics_cost = 1024;
13803   int min;
13804
13805   fcomi_cost = ix86_fp_comparison_fcomi_cost (code);
13806   sahf_cost = ix86_fp_comparison_sahf_cost (code);
13807
13808   min = arithmetics_cost = ix86_fp_comparison_arithmetics_cost (code);
13809   if (min > sahf_cost)
13810     min = sahf_cost;
13811   if (min > fcomi_cost)
13812     min = fcomi_cost;
13813   return min;
13814 }
13815
13816 /* Return true if we should use an FCOMI instruction for this
13817    fp comparison.  */
13818
13819 int
13820 ix86_use_fcomi_compare (enum rtx_code code ATTRIBUTE_UNUSED)
13821 {
13822   enum rtx_code swapped_code = swap_condition (code);
13823
13824   return ((ix86_fp_comparison_cost (code)
13825            == ix86_fp_comparison_fcomi_cost (code))
13826           || (ix86_fp_comparison_cost (swapped_code)
13827               == ix86_fp_comparison_fcomi_cost (swapped_code)));
13828 }
13829
13830 /* Swap, force into registers, or otherwise massage the two operands
13831    to a fp comparison.  The operands are updated in place; the new
13832    comparison code is returned.  */
13833
13834 static enum rtx_code
13835 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
13836 {
13837   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
13838   rtx op0 = *pop0, op1 = *pop1;
13839   enum machine_mode op_mode = GET_MODE (op0);
13840   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
13841
13842   /* All of the unordered compare instructions only work on registers.
13843      The same is true of the fcomi compare instructions.  The XFmode
13844      compare instructions require registers except when comparing
13845      against zero or when converting operand 1 from fixed point to
13846      floating point.  */
13847
13848   if (!is_sse
13849       && (fpcmp_mode == CCFPUmode
13850           || (op_mode == XFmode
13851               && ! (standard_80387_constant_p (op0) == 1
13852                     || standard_80387_constant_p (op1) == 1)
13853               && GET_CODE (op1) != FLOAT)
13854           || ix86_use_fcomi_compare (code)))
13855     {
13856       op0 = force_reg (op_mode, op0);
13857       op1 = force_reg (op_mode, op1);
13858     }
13859   else
13860     {
13861       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
13862          things around if they appear profitable, otherwise force op0
13863          into a register.  */
13864
13865       if (standard_80387_constant_p (op0) == 0
13866           || (MEM_P (op0)
13867               && ! (standard_80387_constant_p (op1) == 0
13868                     || MEM_P (op1))))
13869         {
13870           rtx tmp;
13871           tmp = op0, op0 = op1, op1 = tmp;
13872           code = swap_condition (code);
13873         }
13874
13875       if (!REG_P (op0))
13876         op0 = force_reg (op_mode, op0);
13877
13878       if (CONSTANT_P (op1))
13879         {
13880           int tmp = standard_80387_constant_p (op1);
13881           if (tmp == 0)
13882             op1 = validize_mem (force_const_mem (op_mode, op1));
13883           else if (tmp == 1)
13884             {
13885               if (TARGET_CMOVE)
13886                 op1 = force_reg (op_mode, op1);
13887             }
13888           else
13889             op1 = force_reg (op_mode, op1);
13890         }
13891     }
13892
13893   /* Try to rearrange the comparison to make it cheaper.  */
13894   if (ix86_fp_comparison_cost (code)
13895       > ix86_fp_comparison_cost (swap_condition (code))
13896       && (REG_P (op1) || can_create_pseudo_p ()))
13897     {
13898       rtx tmp;
13899       tmp = op0, op0 = op1, op1 = tmp;
13900       code = swap_condition (code);
13901       if (!REG_P (op0))
13902         op0 = force_reg (op_mode, op0);
13903     }
13904
13905   *pop0 = op0;
13906   *pop1 = op1;
13907   return code;
13908 }
13909
13910 /* Convert comparison codes we use to represent FP comparison to integer
13911    code that will result in proper branch.  Return UNKNOWN if no such code
13912    is available.  */
13913
13914 enum rtx_code
13915 ix86_fp_compare_code_to_integer (enum rtx_code code)
13916 {
13917   switch (code)
13918     {
13919     case GT:
13920       return GTU;
13921     case GE:
13922       return GEU;
13923     case ORDERED:
13924     case UNORDERED:
13925       return code;
13926       break;
13927     case UNEQ:
13928       return EQ;
13929       break;
13930     case UNLT:
13931       return LTU;
13932       break;
13933     case UNLE:
13934       return LEU;
13935       break;
13936     case LTGT:
13937       return NE;
13938       break;
13939     default:
13940       return UNKNOWN;
13941     }
13942 }
13943
13944 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
13945
13946 static rtx
13947 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch,
13948                         rtx *second_test, rtx *bypass_test)
13949 {
13950   enum machine_mode fpcmp_mode, intcmp_mode;
13951   rtx tmp, tmp2;
13952   int cost = ix86_fp_comparison_cost (code);
13953   enum rtx_code bypass_code, first_code, second_code;
13954
13955   fpcmp_mode = ix86_fp_compare_mode (code);
13956   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
13957
13958   if (second_test)
13959     *second_test = NULL_RTX;
13960   if (bypass_test)
13961     *bypass_test = NULL_RTX;
13962
13963   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13964
13965   /* Do fcomi/sahf based test when profitable.  */
13966   if (ix86_fp_comparison_arithmetics_cost (code) > cost
13967       && (bypass_code == UNKNOWN || bypass_test)
13968       && (second_code == UNKNOWN || second_test))
13969     {
13970       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
13971       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
13972                          tmp);
13973       if (TARGET_CMOVE)
13974         emit_insn (tmp);
13975       else
13976         {
13977           gcc_assert (TARGET_SAHF);
13978
13979           if (!scratch)
13980             scratch = gen_reg_rtx (HImode);
13981           tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
13982
13983           emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
13984         }
13985
13986       /* The FP codes work out to act like unsigned.  */
13987       intcmp_mode = fpcmp_mode;
13988       code = first_code;
13989       if (bypass_code != UNKNOWN)
13990         *bypass_test = gen_rtx_fmt_ee (bypass_code, VOIDmode,
13991                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
13992                                        const0_rtx);
13993       if (second_code != UNKNOWN)
13994         *second_test = gen_rtx_fmt_ee (second_code, VOIDmode,
13995                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
13996                                        const0_rtx);
13997     }
13998   else
13999     {
14000       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
14001       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14002       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
14003       if (!scratch)
14004         scratch = gen_reg_rtx (HImode);
14005       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
14006
14007       /* In the unordered case, we have to check C2 for NaN's, which
14008          doesn't happen to work out to anything nice combination-wise.
14009          So do some bit twiddling on the value we've got in AH to come
14010          up with an appropriate set of condition codes.  */
14011
14012       intcmp_mode = CCNOmode;
14013       switch (code)
14014         {
14015         case GT:
14016         case UNGT:
14017           if (code == GT || !TARGET_IEEE_FP)
14018             {
14019               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14020               code = EQ;
14021             }
14022           else
14023             {
14024               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14025               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14026               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
14027               intcmp_mode = CCmode;
14028               code = GEU;
14029             }
14030           break;
14031         case LT:
14032         case UNLT:
14033           if (code == LT && TARGET_IEEE_FP)
14034             {
14035               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14036               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x01)));
14037               intcmp_mode = CCmode;
14038               code = EQ;
14039             }
14040           else
14041             {
14042               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x01)));
14043               code = NE;
14044             }
14045           break;
14046         case GE:
14047         case UNGE:
14048           if (code == GE || !TARGET_IEEE_FP)
14049             {
14050               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
14051               code = EQ;
14052             }
14053           else
14054             {
14055               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14056               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14057                                              GEN_INT (0x01)));
14058               code = NE;
14059             }
14060           break;
14061         case LE:
14062         case UNLE:
14063           if (code == LE && TARGET_IEEE_FP)
14064             {
14065               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14066               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14067               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14068               intcmp_mode = CCmode;
14069               code = LTU;
14070             }
14071           else
14072             {
14073               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14074               code = NE;
14075             }
14076           break;
14077         case EQ:
14078         case UNEQ:
14079           if (code == EQ && TARGET_IEEE_FP)
14080             {
14081               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14082               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14083               intcmp_mode = CCmode;
14084               code = EQ;
14085             }
14086           else
14087             {
14088               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14089               code = NE;
14090               break;
14091             }
14092           break;
14093         case NE:
14094         case LTGT:
14095           if (code == NE && TARGET_IEEE_FP)
14096             {
14097               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14098               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14099                                              GEN_INT (0x40)));
14100               code = NE;
14101             }
14102           else
14103             {
14104               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14105               code = EQ;
14106             }
14107           break;
14108
14109         case UNORDERED:
14110           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14111           code = NE;
14112           break;
14113         case ORDERED:
14114           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14115           code = EQ;
14116           break;
14117
14118         default:
14119           gcc_unreachable ();
14120         }
14121     }
14122
14123   /* Return the test that should be put into the flags user, i.e.
14124      the bcc, scc, or cmov instruction.  */
14125   return gen_rtx_fmt_ee (code, VOIDmode,
14126                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
14127                          const0_rtx);
14128 }
14129
14130 rtx
14131 ix86_expand_compare (enum rtx_code code, rtx *second_test, rtx *bypass_test)
14132 {
14133   rtx op0, op1, ret;
14134   op0 = ix86_compare_op0;
14135   op1 = ix86_compare_op1;
14136
14137   if (second_test)
14138     *second_test = NULL_RTX;
14139   if (bypass_test)
14140     *bypass_test = NULL_RTX;
14141
14142   if (ix86_compare_emitted)
14143     {
14144       ret = gen_rtx_fmt_ee (code, VOIDmode, ix86_compare_emitted, const0_rtx);
14145       ix86_compare_emitted = NULL_RTX;
14146     }
14147   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
14148     {
14149       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
14150       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
14151                                     second_test, bypass_test);
14152     }
14153   else
14154     ret = ix86_expand_int_compare (code, op0, op1);
14155
14156   return ret;
14157 }
14158
14159 /* Return true if the CODE will result in nontrivial jump sequence.  */
14160 bool
14161 ix86_fp_jump_nontrivial_p (enum rtx_code code)
14162 {
14163   enum rtx_code bypass_code, first_code, second_code;
14164   if (!TARGET_CMOVE)
14165     return true;
14166   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14167   return bypass_code != UNKNOWN || second_code != UNKNOWN;
14168 }
14169
14170 void
14171 ix86_expand_branch (enum rtx_code code, rtx label)
14172 {
14173   rtx tmp;
14174
14175   /* If we have emitted a compare insn, go straight to simple.
14176      ix86_expand_compare won't emit anything if ix86_compare_emitted
14177      is non NULL.  */
14178   if (ix86_compare_emitted)
14179     goto simple;
14180
14181   switch (GET_MODE (ix86_compare_op0))
14182     {
14183     case QImode:
14184     case HImode:
14185     case SImode:
14186       simple:
14187       tmp = ix86_expand_compare (code, NULL, NULL);
14188       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14189                                   gen_rtx_LABEL_REF (VOIDmode, label),
14190                                   pc_rtx);
14191       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
14192       return;
14193
14194     case SFmode:
14195     case DFmode:
14196     case XFmode:
14197       {
14198         rtvec vec;
14199         int use_fcomi;
14200         enum rtx_code bypass_code, first_code, second_code;
14201
14202         code = ix86_prepare_fp_compare_args (code, &ix86_compare_op0,
14203                                              &ix86_compare_op1);
14204
14205         ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14206
14207         /* Check whether we will use the natural sequence with one jump.  If
14208            so, we can expand jump early.  Otherwise delay expansion by
14209            creating compound insn to not confuse optimizers.  */
14210         if (bypass_code == UNKNOWN && second_code == UNKNOWN)
14211           {
14212             ix86_split_fp_branch (code, ix86_compare_op0, ix86_compare_op1,
14213                                   gen_rtx_LABEL_REF (VOIDmode, label),
14214                                   pc_rtx, NULL_RTX, NULL_RTX);
14215           }
14216         else
14217           {
14218             tmp = gen_rtx_fmt_ee (code, VOIDmode,
14219                                   ix86_compare_op0, ix86_compare_op1);
14220             tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14221                                         gen_rtx_LABEL_REF (VOIDmode, label),
14222                                         pc_rtx);
14223             tmp = gen_rtx_SET (VOIDmode, pc_rtx, tmp);
14224
14225             use_fcomi = ix86_use_fcomi_compare (code);
14226             vec = rtvec_alloc (3 + !use_fcomi);
14227             RTVEC_ELT (vec, 0) = tmp;
14228             RTVEC_ELT (vec, 1)
14229               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FPSR_REG));
14230             RTVEC_ELT (vec, 2)
14231               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FLAGS_REG));
14232             if (! use_fcomi)
14233               RTVEC_ELT (vec, 3)
14234                 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (HImode));
14235
14236             emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, vec));
14237           }
14238         return;
14239       }
14240
14241     case DImode:
14242       if (TARGET_64BIT)
14243         goto simple;
14244     case TImode:
14245       /* Expand DImode branch into multiple compare+branch.  */
14246       {
14247         rtx lo[2], hi[2], label2;
14248         enum rtx_code code1, code2, code3;
14249         enum machine_mode submode;
14250
14251         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
14252           {
14253             tmp = ix86_compare_op0;
14254             ix86_compare_op0 = ix86_compare_op1;
14255             ix86_compare_op1 = tmp;
14256             code = swap_condition (code);
14257           }
14258         if (GET_MODE (ix86_compare_op0) == DImode)
14259           {
14260             split_di (&ix86_compare_op0, 1, lo+0, hi+0);
14261             split_di (&ix86_compare_op1, 1, lo+1, hi+1);
14262             submode = SImode;
14263           }
14264         else
14265           {
14266             split_ti (&ix86_compare_op0, 1, lo+0, hi+0);
14267             split_ti (&ix86_compare_op1, 1, lo+1, hi+1);
14268             submode = DImode;
14269           }
14270
14271         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
14272            avoid two branches.  This costs one extra insn, so disable when
14273            optimizing for size.  */
14274
14275         if ((code == EQ || code == NE)
14276             && (!optimize_insn_for_size_p ()
14277                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
14278           {
14279             rtx xor0, xor1;
14280
14281             xor1 = hi[0];
14282             if (hi[1] != const0_rtx)
14283               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
14284                                    NULL_RTX, 0, OPTAB_WIDEN);
14285
14286             xor0 = lo[0];
14287             if (lo[1] != const0_rtx)
14288               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
14289                                    NULL_RTX, 0, OPTAB_WIDEN);
14290
14291             tmp = expand_binop (submode, ior_optab, xor1, xor0,
14292                                 NULL_RTX, 0, OPTAB_WIDEN);
14293
14294             ix86_compare_op0 = tmp;
14295             ix86_compare_op1 = const0_rtx;
14296             ix86_expand_branch (code, label);
14297             return;
14298           }
14299
14300         /* Otherwise, if we are doing less-than or greater-or-equal-than,
14301            op1 is a constant and the low word is zero, then we can just
14302            examine the high word.  Similarly for low word -1 and
14303            less-or-equal-than or greater-than.  */
14304
14305         if (CONST_INT_P (hi[1]))
14306           switch (code)
14307             {
14308             case LT: case LTU: case GE: case GEU:
14309               if (lo[1] == const0_rtx)
14310                 {
14311                   ix86_compare_op0 = hi[0];
14312                   ix86_compare_op1 = hi[1];
14313                   ix86_expand_branch (code, label);
14314                   return;
14315                 }
14316               break;
14317             case LE: case LEU: case GT: case GTU:
14318               if (lo[1] == constm1_rtx)
14319                 {
14320                   ix86_compare_op0 = hi[0];
14321                   ix86_compare_op1 = hi[1];
14322                   ix86_expand_branch (code, label);
14323                   return;
14324                 }
14325               break;
14326             default:
14327               break;
14328             }
14329
14330         /* Otherwise, we need two or three jumps.  */
14331
14332         label2 = gen_label_rtx ();
14333
14334         code1 = code;
14335         code2 = swap_condition (code);
14336         code3 = unsigned_condition (code);
14337
14338         switch (code)
14339           {
14340           case LT: case GT: case LTU: case GTU:
14341             break;
14342
14343           case LE:   code1 = LT;  code2 = GT;  break;
14344           case GE:   code1 = GT;  code2 = LT;  break;
14345           case LEU:  code1 = LTU; code2 = GTU; break;
14346           case GEU:  code1 = GTU; code2 = LTU; break;
14347
14348           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
14349           case NE:   code2 = UNKNOWN; break;
14350
14351           default:
14352             gcc_unreachable ();
14353           }
14354
14355         /*
14356          * a < b =>
14357          *    if (hi(a) < hi(b)) goto true;
14358          *    if (hi(a) > hi(b)) goto false;
14359          *    if (lo(a) < lo(b)) goto true;
14360          *  false:
14361          */
14362
14363         ix86_compare_op0 = hi[0];
14364         ix86_compare_op1 = hi[1];
14365
14366         if (code1 != UNKNOWN)
14367           ix86_expand_branch (code1, label);
14368         if (code2 != UNKNOWN)
14369           ix86_expand_branch (code2, label2);
14370
14371         ix86_compare_op0 = lo[0];
14372         ix86_compare_op1 = lo[1];
14373         ix86_expand_branch (code3, label);
14374
14375         if (code2 != UNKNOWN)
14376           emit_label (label2);
14377         return;
14378       }
14379
14380     default:
14381       gcc_unreachable ();
14382     }
14383 }
14384
14385 /* Split branch based on floating point condition.  */
14386 void
14387 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
14388                       rtx target1, rtx target2, rtx tmp, rtx pushed)
14389 {
14390   rtx second, bypass;
14391   rtx label = NULL_RTX;
14392   rtx condition;
14393   int bypass_probability = -1, second_probability = -1, probability = -1;
14394   rtx i;
14395
14396   if (target2 != pc_rtx)
14397     {
14398       rtx tmp = target2;
14399       code = reverse_condition_maybe_unordered (code);
14400       target2 = target1;
14401       target1 = tmp;
14402     }
14403
14404   condition = ix86_expand_fp_compare (code, op1, op2,
14405                                       tmp, &second, &bypass);
14406
14407   /* Remove pushed operand from stack.  */
14408   if (pushed)
14409     ix86_free_from_memory (GET_MODE (pushed));
14410
14411   if (split_branch_probability >= 0)
14412     {
14413       /* Distribute the probabilities across the jumps.
14414          Assume the BYPASS and SECOND to be always test
14415          for UNORDERED.  */
14416       probability = split_branch_probability;
14417
14418       /* Value of 1 is low enough to make no need for probability
14419          to be updated.  Later we may run some experiments and see
14420          if unordered values are more frequent in practice.  */
14421       if (bypass)
14422         bypass_probability = 1;
14423       if (second)
14424         second_probability = 1;
14425     }
14426   if (bypass != NULL_RTX)
14427     {
14428       label = gen_label_rtx ();
14429       i = emit_jump_insn (gen_rtx_SET
14430                           (VOIDmode, pc_rtx,
14431                            gen_rtx_IF_THEN_ELSE (VOIDmode,
14432                                                  bypass,
14433                                                  gen_rtx_LABEL_REF (VOIDmode,
14434                                                                     label),
14435                                                  pc_rtx)));
14436       if (bypass_probability >= 0)
14437         REG_NOTES (i)
14438           = gen_rtx_EXPR_LIST (REG_BR_PROB,
14439                                GEN_INT (bypass_probability),
14440                                REG_NOTES (i));
14441     }
14442   i = emit_jump_insn (gen_rtx_SET
14443                       (VOIDmode, pc_rtx,
14444                        gen_rtx_IF_THEN_ELSE (VOIDmode,
14445                                              condition, target1, target2)));
14446   if (probability >= 0)
14447     REG_NOTES (i)
14448       = gen_rtx_EXPR_LIST (REG_BR_PROB,
14449                            GEN_INT (probability),
14450                            REG_NOTES (i));
14451   if (second != NULL_RTX)
14452     {
14453       i = emit_jump_insn (gen_rtx_SET
14454                           (VOIDmode, pc_rtx,
14455                            gen_rtx_IF_THEN_ELSE (VOIDmode, second, target1,
14456                                                  target2)));
14457       if (second_probability >= 0)
14458         REG_NOTES (i)
14459           = gen_rtx_EXPR_LIST (REG_BR_PROB,
14460                                GEN_INT (second_probability),
14461                                REG_NOTES (i));
14462     }
14463   if (label != NULL_RTX)
14464     emit_label (label);
14465 }
14466
14467 int
14468 ix86_expand_setcc (enum rtx_code code, rtx dest)
14469 {
14470   rtx ret, tmp, tmpreg, equiv;
14471   rtx second_test, bypass_test;
14472
14473   if (GET_MODE (ix86_compare_op0) == (TARGET_64BIT ? TImode : DImode))
14474     return 0; /* FAIL */
14475
14476   gcc_assert (GET_MODE (dest) == QImode);
14477
14478   ret = ix86_expand_compare (code, &second_test, &bypass_test);
14479   PUT_MODE (ret, QImode);
14480
14481   tmp = dest;
14482   tmpreg = dest;
14483
14484   emit_insn (gen_rtx_SET (VOIDmode, tmp, ret));
14485   if (bypass_test || second_test)
14486     {
14487       rtx test = second_test;
14488       int bypass = 0;
14489       rtx tmp2 = gen_reg_rtx (QImode);
14490       if (bypass_test)
14491         {
14492           gcc_assert (!second_test);
14493           test = bypass_test;
14494           bypass = 1;
14495           PUT_CODE (test, reverse_condition_maybe_unordered (GET_CODE (test)));
14496         }
14497       PUT_MODE (test, QImode);
14498       emit_insn (gen_rtx_SET (VOIDmode, tmp2, test));
14499
14500       if (bypass)
14501         emit_insn (gen_andqi3 (tmp, tmpreg, tmp2));
14502       else
14503         emit_insn (gen_iorqi3 (tmp, tmpreg, tmp2));
14504     }
14505
14506   /* Attach a REG_EQUAL note describing the comparison result.  */
14507   if (ix86_compare_op0 && ix86_compare_op1)
14508     {
14509       equiv = simplify_gen_relational (code, QImode,
14510                                        GET_MODE (ix86_compare_op0),
14511                                        ix86_compare_op0, ix86_compare_op1);
14512       set_unique_reg_note (get_last_insn (), REG_EQUAL, equiv);
14513     }
14514
14515   return 1; /* DONE */
14516 }
14517
14518 /* Expand comparison setting or clearing carry flag.  Return true when
14519    successful and set pop for the operation.  */
14520 static bool
14521 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
14522 {
14523   enum machine_mode mode =
14524     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
14525
14526   /* Do not handle DImode compares that go through special path.  */
14527   if (mode == (TARGET_64BIT ? TImode : DImode))
14528     return false;
14529
14530   if (SCALAR_FLOAT_MODE_P (mode))
14531     {
14532       rtx second_test = NULL, bypass_test = NULL;
14533       rtx compare_op, compare_seq;
14534
14535       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
14536
14537       /* Shortcut:  following common codes never translate
14538          into carry flag compares.  */
14539       if (code == EQ || code == NE || code == UNEQ || code == LTGT
14540           || code == ORDERED || code == UNORDERED)
14541         return false;
14542
14543       /* These comparisons require zero flag; swap operands so they won't.  */
14544       if ((code == GT || code == UNLE || code == LE || code == UNGT)
14545           && !TARGET_IEEE_FP)
14546         {
14547           rtx tmp = op0;
14548           op0 = op1;
14549           op1 = tmp;
14550           code = swap_condition (code);
14551         }
14552
14553       /* Try to expand the comparison and verify that we end up with
14554          carry flag based comparison.  This fails to be true only when
14555          we decide to expand comparison using arithmetic that is not
14556          too common scenario.  */
14557       start_sequence ();
14558       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
14559                                            &second_test, &bypass_test);
14560       compare_seq = get_insns ();
14561       end_sequence ();
14562
14563       if (second_test || bypass_test)
14564         return false;
14565
14566       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
14567           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
14568         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
14569       else
14570         code = GET_CODE (compare_op);
14571
14572       if (code != LTU && code != GEU)
14573         return false;
14574
14575       emit_insn (compare_seq);
14576       *pop = compare_op;
14577       return true;
14578     }
14579
14580   if (!INTEGRAL_MODE_P (mode))
14581     return false;
14582
14583   switch (code)
14584     {
14585     case LTU:
14586     case GEU:
14587       break;
14588
14589     /* Convert a==0 into (unsigned)a<1.  */
14590     case EQ:
14591     case NE:
14592       if (op1 != const0_rtx)
14593         return false;
14594       op1 = const1_rtx;
14595       code = (code == EQ ? LTU : GEU);
14596       break;
14597
14598     /* Convert a>b into b<a or a>=b-1.  */
14599     case GTU:
14600     case LEU:
14601       if (CONST_INT_P (op1))
14602         {
14603           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
14604           /* Bail out on overflow.  We still can swap operands but that
14605              would force loading of the constant into register.  */
14606           if (op1 == const0_rtx
14607               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
14608             return false;
14609           code = (code == GTU ? GEU : LTU);
14610         }
14611       else
14612         {
14613           rtx tmp = op1;
14614           op1 = op0;
14615           op0 = tmp;
14616           code = (code == GTU ? LTU : GEU);
14617         }
14618       break;
14619
14620     /* Convert a>=0 into (unsigned)a<0x80000000.  */
14621     case LT:
14622     case GE:
14623       if (mode == DImode || op1 != const0_rtx)
14624         return false;
14625       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
14626       code = (code == LT ? GEU : LTU);
14627       break;
14628     case LE:
14629     case GT:
14630       if (mode == DImode || op1 != constm1_rtx)
14631         return false;
14632       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
14633       code = (code == LE ? GEU : LTU);
14634       break;
14635
14636     default:
14637       return false;
14638     }
14639   /* Swapping operands may cause constant to appear as first operand.  */
14640   if (!nonimmediate_operand (op0, VOIDmode))
14641     {
14642       if (!can_create_pseudo_p ())
14643         return false;
14644       op0 = force_reg (mode, op0);
14645     }
14646   ix86_compare_op0 = op0;
14647   ix86_compare_op1 = op1;
14648   *pop = ix86_expand_compare (code, NULL, NULL);
14649   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
14650   return true;
14651 }
14652
14653 int
14654 ix86_expand_int_movcc (rtx operands[])
14655 {
14656   enum rtx_code code = GET_CODE (operands[1]), compare_code;
14657   rtx compare_seq, compare_op;
14658   rtx second_test, bypass_test;
14659   enum machine_mode mode = GET_MODE (operands[0]);
14660   bool sign_bit_compare_p = false;;
14661
14662   start_sequence ();
14663   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
14664   compare_seq = get_insns ();
14665   end_sequence ();
14666
14667   compare_code = GET_CODE (compare_op);
14668
14669   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
14670       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
14671     sign_bit_compare_p = true;
14672
14673   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
14674      HImode insns, we'd be swallowed in word prefix ops.  */
14675
14676   if ((mode != HImode || TARGET_FAST_PREFIX)
14677       && (mode != (TARGET_64BIT ? TImode : DImode))
14678       && CONST_INT_P (operands[2])
14679       && CONST_INT_P (operands[3]))
14680     {
14681       rtx out = operands[0];
14682       HOST_WIDE_INT ct = INTVAL (operands[2]);
14683       HOST_WIDE_INT cf = INTVAL (operands[3]);
14684       HOST_WIDE_INT diff;
14685
14686       diff = ct - cf;
14687       /*  Sign bit compares are better done using shifts than we do by using
14688           sbb.  */
14689       if (sign_bit_compare_p
14690           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
14691                                              ix86_compare_op1, &compare_op))
14692         {
14693           /* Detect overlap between destination and compare sources.  */
14694           rtx tmp = out;
14695
14696           if (!sign_bit_compare_p)
14697             {
14698               bool fpcmp = false;
14699
14700               compare_code = GET_CODE (compare_op);
14701
14702               if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
14703                   || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
14704                 {
14705                   fpcmp = true;
14706                   compare_code = ix86_fp_compare_code_to_integer (compare_code);
14707                 }
14708
14709               /* To simplify rest of code, restrict to the GEU case.  */
14710               if (compare_code == LTU)
14711                 {
14712                   HOST_WIDE_INT tmp = ct;
14713                   ct = cf;
14714                   cf = tmp;
14715                   compare_code = reverse_condition (compare_code);
14716                   code = reverse_condition (code);
14717                 }
14718               else
14719                 {
14720                   if (fpcmp)
14721                     PUT_CODE (compare_op,
14722                               reverse_condition_maybe_unordered
14723                                 (GET_CODE (compare_op)));
14724                   else
14725                     PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
14726                 }
14727               diff = ct - cf;
14728
14729               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
14730                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
14731                 tmp = gen_reg_rtx (mode);
14732
14733               if (mode == DImode)
14734                 emit_insn (gen_x86_movdicc_0_m1_rex64 (tmp, compare_op));
14735               else
14736                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp), compare_op));
14737             }
14738           else
14739             {
14740               if (code == GT || code == GE)
14741                 code = reverse_condition (code);
14742               else
14743                 {
14744                   HOST_WIDE_INT tmp = ct;
14745                   ct = cf;
14746                   cf = tmp;
14747                   diff = ct - cf;
14748                 }
14749               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
14750                                      ix86_compare_op1, VOIDmode, 0, -1);
14751             }
14752
14753           if (diff == 1)
14754             {
14755               /*
14756                * cmpl op0,op1
14757                * sbbl dest,dest
14758                * [addl dest, ct]
14759                *
14760                * Size 5 - 8.
14761                */
14762               if (ct)
14763                 tmp = expand_simple_binop (mode, PLUS,
14764                                            tmp, GEN_INT (ct),
14765                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14766             }
14767           else if (cf == -1)
14768             {
14769               /*
14770                * cmpl op0,op1
14771                * sbbl dest,dest
14772                * orl $ct, dest
14773                *
14774                * Size 8.
14775                */
14776               tmp = expand_simple_binop (mode, IOR,
14777                                          tmp, GEN_INT (ct),
14778                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
14779             }
14780           else if (diff == -1 && ct)
14781             {
14782               /*
14783                * cmpl op0,op1
14784                * sbbl dest,dest
14785                * notl dest
14786                * [addl dest, cf]
14787                *
14788                * Size 8 - 11.
14789                */
14790               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
14791               if (cf)
14792                 tmp = expand_simple_binop (mode, PLUS,
14793                                            copy_rtx (tmp), GEN_INT (cf),
14794                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14795             }
14796           else
14797             {
14798               /*
14799                * cmpl op0,op1
14800                * sbbl dest,dest
14801                * [notl dest]
14802                * andl cf - ct, dest
14803                * [addl dest, ct]
14804                *
14805                * Size 8 - 11.
14806                */
14807
14808               if (cf == 0)
14809                 {
14810                   cf = ct;
14811                   ct = 0;
14812                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
14813                 }
14814
14815               tmp = expand_simple_binop (mode, AND,
14816                                          copy_rtx (tmp),
14817                                          gen_int_mode (cf - ct, mode),
14818                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
14819               if (ct)
14820                 tmp = expand_simple_binop (mode, PLUS,
14821                                            copy_rtx (tmp), GEN_INT (ct),
14822                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14823             }
14824
14825           if (!rtx_equal_p (tmp, out))
14826             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
14827
14828           return 1; /* DONE */
14829         }
14830
14831       if (diff < 0)
14832         {
14833           enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
14834
14835           HOST_WIDE_INT tmp;
14836           tmp = ct, ct = cf, cf = tmp;
14837           diff = -diff;
14838
14839           if (SCALAR_FLOAT_MODE_P (cmp_mode))
14840             {
14841               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
14842
14843               /* We may be reversing unordered compare to normal compare, that
14844                  is not valid in general (we may convert non-trapping condition
14845                  to trapping one), however on i386 we currently emit all
14846                  comparisons unordered.  */
14847               compare_code = reverse_condition_maybe_unordered (compare_code);
14848               code = reverse_condition_maybe_unordered (code);
14849             }
14850           else
14851             {
14852               compare_code = reverse_condition (compare_code);
14853               code = reverse_condition (code);
14854             }
14855         }
14856
14857       compare_code = UNKNOWN;
14858       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
14859           && CONST_INT_P (ix86_compare_op1))
14860         {
14861           if (ix86_compare_op1 == const0_rtx
14862               && (code == LT || code == GE))
14863             compare_code = code;
14864           else if (ix86_compare_op1 == constm1_rtx)
14865             {
14866               if (code == LE)
14867                 compare_code = LT;
14868               else if (code == GT)
14869                 compare_code = GE;
14870             }
14871         }
14872
14873       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
14874       if (compare_code != UNKNOWN
14875           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
14876           && (cf == -1 || ct == -1))
14877         {
14878           /* If lea code below could be used, only optimize
14879              if it results in a 2 insn sequence.  */
14880
14881           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
14882                  || diff == 3 || diff == 5 || diff == 9)
14883               || (compare_code == LT && ct == -1)
14884               || (compare_code == GE && cf == -1))
14885             {
14886               /*
14887                * notl op1       (if necessary)
14888                * sarl $31, op1
14889                * orl cf, op1
14890                */
14891               if (ct != -1)
14892                 {
14893                   cf = ct;
14894                   ct = -1;
14895                   code = reverse_condition (code);
14896                 }
14897
14898               out = emit_store_flag (out, code, ix86_compare_op0,
14899                                      ix86_compare_op1, VOIDmode, 0, -1);
14900
14901               out = expand_simple_binop (mode, IOR,
14902                                          out, GEN_INT (cf),
14903                                          out, 1, OPTAB_DIRECT);
14904               if (out != operands[0])
14905                 emit_move_insn (operands[0], out);
14906
14907               return 1; /* DONE */
14908             }
14909         }
14910
14911
14912       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
14913            || diff == 3 || diff == 5 || diff == 9)
14914           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
14915           && (mode != DImode
14916               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
14917         {
14918           /*
14919            * xorl dest,dest
14920            * cmpl op1,op2
14921            * setcc dest
14922            * lea cf(dest*(ct-cf)),dest
14923            *
14924            * Size 14.
14925            *
14926            * This also catches the degenerate setcc-only case.
14927            */
14928
14929           rtx tmp;
14930           int nops;
14931
14932           out = emit_store_flag (out, code, ix86_compare_op0,
14933                                  ix86_compare_op1, VOIDmode, 0, 1);
14934
14935           nops = 0;
14936           /* On x86_64 the lea instruction operates on Pmode, so we need
14937              to get arithmetics done in proper mode to match.  */
14938           if (diff == 1)
14939             tmp = copy_rtx (out);
14940           else
14941             {
14942               rtx out1;
14943               out1 = copy_rtx (out);
14944               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
14945               nops++;
14946               if (diff & 1)
14947                 {
14948                   tmp = gen_rtx_PLUS (mode, tmp, out1);
14949                   nops++;
14950                 }
14951             }
14952           if (cf != 0)
14953             {
14954               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
14955               nops++;
14956             }
14957           if (!rtx_equal_p (tmp, out))
14958             {
14959               if (nops == 1)
14960                 out = force_operand (tmp, copy_rtx (out));
14961               else
14962                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
14963             }
14964           if (!rtx_equal_p (out, operands[0]))
14965             emit_move_insn (operands[0], copy_rtx (out));
14966
14967           return 1; /* DONE */
14968         }
14969
14970       /*
14971        * General case:                  Jumpful:
14972        *   xorl dest,dest               cmpl op1, op2
14973        *   cmpl op1, op2                movl ct, dest
14974        *   setcc dest                   jcc 1f
14975        *   decl dest                    movl cf, dest
14976        *   andl (cf-ct),dest            1:
14977        *   addl ct,dest
14978        *
14979        * Size 20.                       Size 14.
14980        *
14981        * This is reasonably steep, but branch mispredict costs are
14982        * high on modern cpus, so consider failing only if optimizing
14983        * for space.
14984        */
14985
14986       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
14987           && BRANCH_COST (optimize_insn_for_speed_p (),
14988                           false) >= 2)
14989         {
14990           if (cf == 0)
14991             {
14992               enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
14993
14994               cf = ct;
14995               ct = 0;
14996
14997               if (SCALAR_FLOAT_MODE_P (cmp_mode))
14998                 {
14999                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15000
15001                   /* We may be reversing unordered compare to normal compare,
15002                      that is not valid in general (we may convert non-trapping
15003                      condition to trapping one), however on i386 we currently
15004                      emit all comparisons unordered.  */
15005                   code = reverse_condition_maybe_unordered (code);
15006                 }
15007               else
15008                 {
15009                   code = reverse_condition (code);
15010                   if (compare_code != UNKNOWN)
15011                     compare_code = reverse_condition (compare_code);
15012                 }
15013             }
15014
15015           if (compare_code != UNKNOWN)
15016             {
15017               /* notl op1       (if needed)
15018                  sarl $31, op1
15019                  andl (cf-ct), op1
15020                  addl ct, op1
15021
15022                  For x < 0 (resp. x <= -1) there will be no notl,
15023                  so if possible swap the constants to get rid of the
15024                  complement.
15025                  True/false will be -1/0 while code below (store flag
15026                  followed by decrement) is 0/-1, so the constants need
15027                  to be exchanged once more.  */
15028
15029               if (compare_code == GE || !cf)
15030                 {
15031                   code = reverse_condition (code);
15032                   compare_code = LT;
15033                 }
15034               else
15035                 {
15036                   HOST_WIDE_INT tmp = cf;
15037                   cf = ct;
15038                   ct = tmp;
15039                 }
15040
15041               out = emit_store_flag (out, code, ix86_compare_op0,
15042                                      ix86_compare_op1, VOIDmode, 0, -1);
15043             }
15044           else
15045             {
15046               out = emit_store_flag (out, code, ix86_compare_op0,
15047                                      ix86_compare_op1, VOIDmode, 0, 1);
15048
15049               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
15050                                          copy_rtx (out), 1, OPTAB_DIRECT);
15051             }
15052
15053           out = expand_simple_binop (mode, AND, copy_rtx (out),
15054                                      gen_int_mode (cf - ct, mode),
15055                                      copy_rtx (out), 1, OPTAB_DIRECT);
15056           if (ct)
15057             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
15058                                        copy_rtx (out), 1, OPTAB_DIRECT);
15059           if (!rtx_equal_p (out, operands[0]))
15060             emit_move_insn (operands[0], copy_rtx (out));
15061
15062           return 1; /* DONE */
15063         }
15064     }
15065
15066   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15067     {
15068       /* Try a few things more with specific constants and a variable.  */
15069
15070       optab op;
15071       rtx var, orig_out, out, tmp;
15072
15073       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
15074         return 0; /* FAIL */
15075
15076       /* If one of the two operands is an interesting constant, load a
15077          constant with the above and mask it in with a logical operation.  */
15078
15079       if (CONST_INT_P (operands[2]))
15080         {
15081           var = operands[3];
15082           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
15083             operands[3] = constm1_rtx, op = and_optab;
15084           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
15085             operands[3] = const0_rtx, op = ior_optab;
15086           else
15087             return 0; /* FAIL */
15088         }
15089       else if (CONST_INT_P (operands[3]))
15090         {
15091           var = operands[2];
15092           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
15093             operands[2] = constm1_rtx, op = and_optab;
15094           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
15095             operands[2] = const0_rtx, op = ior_optab;
15096           else
15097             return 0; /* FAIL */
15098         }
15099       else
15100         return 0; /* FAIL */
15101
15102       orig_out = operands[0];
15103       tmp = gen_reg_rtx (mode);
15104       operands[0] = tmp;
15105
15106       /* Recurse to get the constant loaded.  */
15107       if (ix86_expand_int_movcc (operands) == 0)
15108         return 0; /* FAIL */
15109
15110       /* Mask in the interesting variable.  */
15111       out = expand_binop (mode, op, var, tmp, orig_out, 0,
15112                           OPTAB_WIDEN);
15113       if (!rtx_equal_p (out, orig_out))
15114         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
15115
15116       return 1; /* DONE */
15117     }
15118
15119   /*
15120    * For comparison with above,
15121    *
15122    * movl cf,dest
15123    * movl ct,tmp
15124    * cmpl op1,op2
15125    * cmovcc tmp,dest
15126    *
15127    * Size 15.
15128    */
15129
15130   if (! nonimmediate_operand (operands[2], mode))
15131     operands[2] = force_reg (mode, operands[2]);
15132   if (! nonimmediate_operand (operands[3], mode))
15133     operands[3] = force_reg (mode, operands[3]);
15134
15135   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15136     {
15137       rtx tmp = gen_reg_rtx (mode);
15138       emit_move_insn (tmp, operands[3]);
15139       operands[3] = tmp;
15140     }
15141   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15142     {
15143       rtx tmp = gen_reg_rtx (mode);
15144       emit_move_insn (tmp, operands[2]);
15145       operands[2] = tmp;
15146     }
15147
15148   if (! register_operand (operands[2], VOIDmode)
15149       && (mode == QImode
15150           || ! register_operand (operands[3], VOIDmode)))
15151     operands[2] = force_reg (mode, operands[2]);
15152
15153   if (mode == QImode
15154       && ! register_operand (operands[3], VOIDmode))
15155     operands[3] = force_reg (mode, operands[3]);
15156
15157   emit_insn (compare_seq);
15158   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15159                           gen_rtx_IF_THEN_ELSE (mode,
15160                                                 compare_op, operands[2],
15161                                                 operands[3])));
15162   if (bypass_test)
15163     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15164                             gen_rtx_IF_THEN_ELSE (mode,
15165                                   bypass_test,
15166                                   copy_rtx (operands[3]),
15167                                   copy_rtx (operands[0]))));
15168   if (second_test)
15169     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15170                             gen_rtx_IF_THEN_ELSE (mode,
15171                                   second_test,
15172                                   copy_rtx (operands[2]),
15173                                   copy_rtx (operands[0]))));
15174
15175   return 1; /* DONE */
15176 }
15177
15178 /* Swap, force into registers, or otherwise massage the two operands
15179    to an sse comparison with a mask result.  Thus we differ a bit from
15180    ix86_prepare_fp_compare_args which expects to produce a flags result.
15181
15182    The DEST operand exists to help determine whether to commute commutative
15183    operators.  The POP0/POP1 operands are updated in place.  The new
15184    comparison code is returned, or UNKNOWN if not implementable.  */
15185
15186 static enum rtx_code
15187 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
15188                                   rtx *pop0, rtx *pop1)
15189 {
15190   rtx tmp;
15191
15192   switch (code)
15193     {
15194     case LTGT:
15195     case UNEQ:
15196       /* We have no LTGT as an operator.  We could implement it with
15197          NE & ORDERED, but this requires an extra temporary.  It's
15198          not clear that it's worth it.  */
15199       return UNKNOWN;
15200
15201     case LT:
15202     case LE:
15203     case UNGT:
15204     case UNGE:
15205       /* These are supported directly.  */
15206       break;
15207
15208     case EQ:
15209     case NE:
15210     case UNORDERED:
15211     case ORDERED:
15212       /* For commutative operators, try to canonicalize the destination
15213          operand to be first in the comparison - this helps reload to
15214          avoid extra moves.  */
15215       if (!dest || !rtx_equal_p (dest, *pop1))
15216         break;
15217       /* FALLTHRU */
15218
15219     case GE:
15220     case GT:
15221     case UNLE:
15222     case UNLT:
15223       /* These are not supported directly.  Swap the comparison operands
15224          to transform into something that is supported.  */
15225       tmp = *pop0;
15226       *pop0 = *pop1;
15227       *pop1 = tmp;
15228       code = swap_condition (code);
15229       break;
15230
15231     default:
15232       gcc_unreachable ();
15233     }
15234
15235   return code;
15236 }
15237
15238 /* Detect conditional moves that exactly match min/max operational
15239    semantics.  Note that this is IEEE safe, as long as we don't
15240    interchange the operands.
15241
15242    Returns FALSE if this conditional move doesn't match a MIN/MAX,
15243    and TRUE if the operation is successful and instructions are emitted.  */
15244
15245 static bool
15246 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
15247                            rtx cmp_op1, rtx if_true, rtx if_false)
15248 {
15249   enum machine_mode mode;
15250   bool is_min;
15251   rtx tmp;
15252
15253   if (code == LT)
15254     ;
15255   else if (code == UNGE)
15256     {
15257       tmp = if_true;
15258       if_true = if_false;
15259       if_false = tmp;
15260     }
15261   else
15262     return false;
15263
15264   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
15265     is_min = true;
15266   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
15267     is_min = false;
15268   else
15269     return false;
15270
15271   mode = GET_MODE (dest);
15272
15273   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
15274      but MODE may be a vector mode and thus not appropriate.  */
15275   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
15276     {
15277       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
15278       rtvec v;
15279
15280       if_true = force_reg (mode, if_true);
15281       v = gen_rtvec (2, if_true, if_false);
15282       tmp = gen_rtx_UNSPEC (mode, v, u);
15283     }
15284   else
15285     {
15286       code = is_min ? SMIN : SMAX;
15287       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
15288     }
15289
15290   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
15291   return true;
15292 }
15293
15294 /* Expand an sse vector comparison.  Return the register with the result.  */
15295
15296 static rtx
15297 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
15298                      rtx op_true, rtx op_false)
15299 {
15300   enum machine_mode mode = GET_MODE (dest);
15301   rtx x;
15302
15303   cmp_op0 = force_reg (mode, cmp_op0);
15304   if (!nonimmediate_operand (cmp_op1, mode))
15305     cmp_op1 = force_reg (mode, cmp_op1);
15306
15307   if (optimize
15308       || reg_overlap_mentioned_p (dest, op_true)
15309       || reg_overlap_mentioned_p (dest, op_false))
15310     dest = gen_reg_rtx (mode);
15311
15312   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
15313   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15314
15315   return dest;
15316 }
15317
15318 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
15319    operations.  This is used for both scalar and vector conditional moves.  */
15320
15321 static void
15322 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
15323 {
15324   enum machine_mode mode = GET_MODE (dest);
15325   rtx t2, t3, x;
15326
15327   if (op_false == CONST0_RTX (mode))
15328     {
15329       op_true = force_reg (mode, op_true);
15330       x = gen_rtx_AND (mode, cmp, op_true);
15331       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15332     }
15333   else if (op_true == CONST0_RTX (mode))
15334     {
15335       op_false = force_reg (mode, op_false);
15336       x = gen_rtx_NOT (mode, cmp);
15337       x = gen_rtx_AND (mode, x, op_false);
15338       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15339     }
15340   else if (TARGET_SSE5)
15341     {
15342       rtx pcmov = gen_rtx_SET (mode, dest,
15343                                gen_rtx_IF_THEN_ELSE (mode, cmp,
15344                                                      op_true,
15345                                                      op_false));
15346       emit_insn (pcmov);
15347     }
15348   else
15349     {
15350       op_true = force_reg (mode, op_true);
15351       op_false = force_reg (mode, op_false);
15352
15353       t2 = gen_reg_rtx (mode);
15354       if (optimize)
15355         t3 = gen_reg_rtx (mode);
15356       else
15357         t3 = dest;
15358
15359       x = gen_rtx_AND (mode, op_true, cmp);
15360       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
15361
15362       x = gen_rtx_NOT (mode, cmp);
15363       x = gen_rtx_AND (mode, x, op_false);
15364       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
15365
15366       x = gen_rtx_IOR (mode, t3, t2);
15367       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15368     }
15369 }
15370
15371 /* Expand a floating-point conditional move.  Return true if successful.  */
15372
15373 int
15374 ix86_expand_fp_movcc (rtx operands[])
15375 {
15376   enum machine_mode mode = GET_MODE (operands[0]);
15377   enum rtx_code code = GET_CODE (operands[1]);
15378   rtx tmp, compare_op, second_test, bypass_test;
15379
15380   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
15381     {
15382       enum machine_mode cmode;
15383
15384       /* Since we've no cmove for sse registers, don't force bad register
15385          allocation just to gain access to it.  Deny movcc when the
15386          comparison mode doesn't match the move mode.  */
15387       cmode = GET_MODE (ix86_compare_op0);
15388       if (cmode == VOIDmode)
15389         cmode = GET_MODE (ix86_compare_op1);
15390       if (cmode != mode)
15391         return 0;
15392
15393       code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15394                                                &ix86_compare_op0,
15395                                                &ix86_compare_op1);
15396       if (code == UNKNOWN)
15397         return 0;
15398
15399       if (ix86_expand_sse_fp_minmax (operands[0], code, ix86_compare_op0,
15400                                      ix86_compare_op1, operands[2],
15401                                      operands[3]))
15402         return 1;
15403
15404       tmp = ix86_expand_sse_cmp (operands[0], code, ix86_compare_op0,
15405                                  ix86_compare_op1, operands[2], operands[3]);
15406       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
15407       return 1;
15408     }
15409
15410   /* The floating point conditional move instructions don't directly
15411      support conditions resulting from a signed integer comparison.  */
15412
15413   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
15414
15415   /* The floating point conditional move instructions don't directly
15416      support signed integer comparisons.  */
15417
15418   if (!fcmov_comparison_operator (compare_op, VOIDmode))
15419     {
15420       gcc_assert (!second_test && !bypass_test);
15421       tmp = gen_reg_rtx (QImode);
15422       ix86_expand_setcc (code, tmp);
15423       code = NE;
15424       ix86_compare_op0 = tmp;
15425       ix86_compare_op1 = const0_rtx;
15426       compare_op = ix86_expand_compare (code,  &second_test, &bypass_test);
15427     }
15428   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15429     {
15430       tmp = gen_reg_rtx (mode);
15431       emit_move_insn (tmp, operands[3]);
15432       operands[3] = tmp;
15433     }
15434   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15435     {
15436       tmp = gen_reg_rtx (mode);
15437       emit_move_insn (tmp, operands[2]);
15438       operands[2] = tmp;
15439     }
15440
15441   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15442                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
15443                                                 operands[2], operands[3])));
15444   if (bypass_test)
15445     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15446                             gen_rtx_IF_THEN_ELSE (mode, bypass_test,
15447                                                   operands[3], operands[0])));
15448   if (second_test)
15449     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15450                             gen_rtx_IF_THEN_ELSE (mode, second_test,
15451                                                   operands[2], operands[0])));
15452
15453   return 1;
15454 }
15455
15456 /* Expand a floating-point vector conditional move; a vcond operation
15457    rather than a movcc operation.  */
15458
15459 bool
15460 ix86_expand_fp_vcond (rtx operands[])
15461 {
15462   enum rtx_code code = GET_CODE (operands[3]);
15463   rtx cmp;
15464
15465   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15466                                            &operands[4], &operands[5]);
15467   if (code == UNKNOWN)
15468     return false;
15469
15470   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
15471                                  operands[5], operands[1], operands[2]))
15472     return true;
15473
15474   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
15475                              operands[1], operands[2]);
15476   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
15477   return true;
15478 }
15479
15480 /* Expand a signed/unsigned integral vector conditional move.  */
15481
15482 bool
15483 ix86_expand_int_vcond (rtx operands[])
15484 {
15485   enum machine_mode mode = GET_MODE (operands[0]);
15486   enum rtx_code code = GET_CODE (operands[3]);
15487   bool negate = false;
15488   rtx x, cop0, cop1;
15489
15490   cop0 = operands[4];
15491   cop1 = operands[5];
15492
15493   /* SSE5 supports all of the comparisons on all vector int types.  */
15494   if (!TARGET_SSE5)
15495     {
15496       /* Canonicalize the comparison to EQ, GT, GTU.  */
15497       switch (code)
15498         {
15499         case EQ:
15500         case GT:
15501         case GTU:
15502           break;
15503
15504         case NE:
15505         case LE:
15506         case LEU:
15507           code = reverse_condition (code);
15508           negate = true;
15509           break;
15510
15511         case GE:
15512         case GEU:
15513           code = reverse_condition (code);
15514           negate = true;
15515           /* FALLTHRU */
15516
15517         case LT:
15518         case LTU:
15519           code = swap_condition (code);
15520           x = cop0, cop0 = cop1, cop1 = x;
15521           break;
15522
15523         default:
15524           gcc_unreachable ();
15525         }
15526
15527       /* Only SSE4.1/SSE4.2 supports V2DImode.  */
15528       if (mode == V2DImode)
15529         {
15530           switch (code)
15531             {
15532             case EQ:
15533               /* SSE4.1 supports EQ.  */
15534               if (!TARGET_SSE4_1)
15535                 return false;
15536               break;
15537
15538             case GT:
15539             case GTU:
15540               /* SSE4.2 supports GT/GTU.  */
15541               if (!TARGET_SSE4_2)
15542                 return false;
15543               break;
15544
15545             default:
15546               gcc_unreachable ();
15547             }
15548         }
15549
15550       /* Unsigned parallel compare is not supported by the hardware.  Play some
15551          tricks to turn this into a signed comparison against 0.  */
15552       if (code == GTU)
15553         {
15554           cop0 = force_reg (mode, cop0);
15555
15556           switch (mode)
15557             {
15558             case V4SImode:
15559             case V2DImode:
15560               {
15561                 rtx t1, t2, mask;
15562
15563                 /* Perform a parallel modulo subtraction.  */
15564                 t1 = gen_reg_rtx (mode);
15565                 emit_insn ((mode == V4SImode
15566                             ? gen_subv4si3
15567                             : gen_subv2di3) (t1, cop0, cop1));
15568
15569                 /* Extract the original sign bit of op0.  */
15570                 mask = ix86_build_signbit_mask (GET_MODE_INNER (mode),
15571                                                 true, false);
15572                 t2 = gen_reg_rtx (mode);
15573                 emit_insn ((mode == V4SImode
15574                             ? gen_andv4si3
15575                             : gen_andv2di3) (t2, cop0, mask));
15576
15577                 /* XOR it back into the result of the subtraction.  This results
15578                    in the sign bit set iff we saw unsigned underflow.  */
15579                 x = gen_reg_rtx (mode);
15580                 emit_insn ((mode == V4SImode
15581                             ? gen_xorv4si3
15582                             : gen_xorv2di3) (x, t1, t2));
15583
15584                 code = GT;
15585               }
15586               break;
15587
15588             case V16QImode:
15589             case V8HImode:
15590               /* Perform a parallel unsigned saturating subtraction.  */
15591               x = gen_reg_rtx (mode);
15592               emit_insn (gen_rtx_SET (VOIDmode, x,
15593                                       gen_rtx_US_MINUS (mode, cop0, cop1)));
15594
15595               code = EQ;
15596               negate = !negate;
15597               break;
15598
15599             default:
15600               gcc_unreachable ();
15601             }
15602
15603           cop0 = x;
15604           cop1 = CONST0_RTX (mode);
15605         }
15606     }
15607
15608   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
15609                            operands[1+negate], operands[2-negate]);
15610
15611   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
15612                          operands[2-negate]);
15613   return true;
15614 }
15615
15616 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
15617    true if we should do zero extension, else sign extension.  HIGH_P is
15618    true if we want the N/2 high elements, else the low elements.  */
15619
15620 void
15621 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15622 {
15623   enum machine_mode imode = GET_MODE (operands[1]);
15624   rtx (*unpack)(rtx, rtx, rtx);
15625   rtx se, dest;
15626
15627   switch (imode)
15628     {
15629     case V16QImode:
15630       if (high_p)
15631         unpack = gen_vec_interleave_highv16qi;
15632       else
15633         unpack = gen_vec_interleave_lowv16qi;
15634       break;
15635     case V8HImode:
15636       if (high_p)
15637         unpack = gen_vec_interleave_highv8hi;
15638       else
15639         unpack = gen_vec_interleave_lowv8hi;
15640       break;
15641     case V4SImode:
15642       if (high_p)
15643         unpack = gen_vec_interleave_highv4si;
15644       else
15645         unpack = gen_vec_interleave_lowv4si;
15646       break;
15647     default:
15648       gcc_unreachable ();
15649     }
15650
15651   dest = gen_lowpart (imode, operands[0]);
15652
15653   if (unsigned_p)
15654     se = force_reg (imode, CONST0_RTX (imode));
15655   else
15656     se = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
15657                               operands[1], pc_rtx, pc_rtx);
15658
15659   emit_insn (unpack (dest, operands[1], se));
15660 }
15661
15662 /* This function performs the same task as ix86_expand_sse_unpack,
15663    but with SSE4.1 instructions.  */
15664
15665 void
15666 ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15667 {
15668   enum machine_mode imode = GET_MODE (operands[1]);
15669   rtx (*unpack)(rtx, rtx);
15670   rtx src, dest;
15671
15672   switch (imode)
15673     {
15674     case V16QImode:
15675       if (unsigned_p)
15676         unpack = gen_sse4_1_zero_extendv8qiv8hi2;
15677       else
15678         unpack = gen_sse4_1_extendv8qiv8hi2;
15679       break;
15680     case V8HImode:
15681       if (unsigned_p)
15682         unpack = gen_sse4_1_zero_extendv4hiv4si2;
15683       else
15684         unpack = gen_sse4_1_extendv4hiv4si2;
15685       break;
15686     case V4SImode:
15687       if (unsigned_p)
15688         unpack = gen_sse4_1_zero_extendv2siv2di2;
15689       else
15690         unpack = gen_sse4_1_extendv2siv2di2;
15691       break;
15692     default:
15693       gcc_unreachable ();
15694     }
15695
15696   dest = operands[0];
15697   if (high_p)
15698     {
15699       /* Shift higher 8 bytes to lower 8 bytes.  */
15700       src = gen_reg_rtx (imode);
15701       emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, src),
15702                                    gen_lowpart (TImode, operands[1]),
15703                                    GEN_INT (64)));
15704     }
15705   else
15706     src = operands[1];
15707
15708   emit_insn (unpack (dest, src));
15709 }
15710
15711 /* This function performs the same task as ix86_expand_sse_unpack,
15712    but with sse5 instructions.  */
15713
15714 void
15715 ix86_expand_sse5_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15716 {
15717   enum machine_mode imode = GET_MODE (operands[1]);
15718   int pperm_bytes[16];
15719   int i;
15720   int h = (high_p) ? 8 : 0;
15721   int h2;
15722   int sign_extend;
15723   rtvec v = rtvec_alloc (16);
15724   rtvec vs;
15725   rtx x, p;
15726   rtx op0 = operands[0], op1 = operands[1];
15727
15728   switch (imode)
15729     {
15730     case V16QImode:
15731       vs = rtvec_alloc (8);
15732       h2 = (high_p) ? 8 : 0;
15733       for (i = 0; i < 8; i++)
15734         {
15735           pperm_bytes[2*i+0] = PPERM_SRC | PPERM_SRC2 | i | h;
15736           pperm_bytes[2*i+1] = ((unsigned_p)
15737                                 ? PPERM_ZERO
15738                                 : PPERM_SIGN | PPERM_SRC2 | i | h);
15739         }
15740
15741       for (i = 0; i < 16; i++)
15742         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15743
15744       for (i = 0; i < 8; i++)
15745         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15746
15747       p = gen_rtx_PARALLEL (VOIDmode, vs);
15748       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15749       if (unsigned_p)
15750         emit_insn (gen_sse5_pperm_zero_v16qi_v8hi (op0, op1, p, x));
15751       else
15752         emit_insn (gen_sse5_pperm_sign_v16qi_v8hi (op0, op1, p, x));
15753       break;
15754
15755     case V8HImode:
15756       vs = rtvec_alloc (4);
15757       h2 = (high_p) ? 4 : 0;
15758       for (i = 0; i < 4; i++)
15759         {
15760           sign_extend = ((unsigned_p)
15761                          ? PPERM_ZERO
15762                          : PPERM_SIGN | PPERM_SRC2 | ((2*i) + 1 + h));
15763           pperm_bytes[4*i+0] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 0 + h);
15764           pperm_bytes[4*i+1] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 1 + h);
15765           pperm_bytes[4*i+2] = sign_extend;
15766           pperm_bytes[4*i+3] = sign_extend;
15767         }
15768
15769       for (i = 0; i < 16; i++)
15770         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15771
15772       for (i = 0; i < 4; i++)
15773         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15774
15775       p = gen_rtx_PARALLEL (VOIDmode, vs);
15776       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15777       if (unsigned_p)
15778         emit_insn (gen_sse5_pperm_zero_v8hi_v4si (op0, op1, p, x));
15779       else
15780         emit_insn (gen_sse5_pperm_sign_v8hi_v4si (op0, op1, p, x));
15781       break;
15782
15783     case V4SImode:
15784       vs = rtvec_alloc (2);
15785       h2 = (high_p) ? 2 : 0;
15786       for (i = 0; i < 2; i++)
15787         {
15788           sign_extend = ((unsigned_p)
15789                          ? PPERM_ZERO
15790                          : PPERM_SIGN | PPERM_SRC2 | ((4*i) + 3 + h));
15791           pperm_bytes[8*i+0] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 0 + h);
15792           pperm_bytes[8*i+1] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 1 + h);
15793           pperm_bytes[8*i+2] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 2 + h);
15794           pperm_bytes[8*i+3] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 3 + h);
15795           pperm_bytes[8*i+4] = sign_extend;
15796           pperm_bytes[8*i+5] = sign_extend;
15797           pperm_bytes[8*i+6] = sign_extend;
15798           pperm_bytes[8*i+7] = sign_extend;
15799         }
15800
15801       for (i = 0; i < 16; i++)
15802         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15803
15804       for (i = 0; i < 2; i++)
15805         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15806
15807       p = gen_rtx_PARALLEL (VOIDmode, vs);
15808       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15809       if (unsigned_p)
15810         emit_insn (gen_sse5_pperm_zero_v4si_v2di (op0, op1, p, x));
15811       else
15812         emit_insn (gen_sse5_pperm_sign_v4si_v2di (op0, op1, p, x));
15813       break;
15814
15815     default:
15816       gcc_unreachable ();
15817     }
15818
15819   return;
15820 }
15821
15822 /* Pack the high bits from OPERANDS[1] and low bits from OPERANDS[2] into the
15823    next narrower integer vector type */
15824 void
15825 ix86_expand_sse5_pack (rtx operands[3])
15826 {
15827   enum machine_mode imode = GET_MODE (operands[0]);
15828   int pperm_bytes[16];
15829   int i;
15830   rtvec v = rtvec_alloc (16);
15831   rtx x;
15832   rtx op0 = operands[0];
15833   rtx op1 = operands[1];
15834   rtx op2 = operands[2];
15835
15836   switch (imode)
15837     {
15838     case V16QImode:
15839       for (i = 0; i < 8; i++)
15840         {
15841           pperm_bytes[i+0] = PPERM_SRC | PPERM_SRC1 | (i*2);
15842           pperm_bytes[i+8] = PPERM_SRC | PPERM_SRC2 | (i*2);
15843         }
15844
15845       for (i = 0; i < 16; i++)
15846         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15847
15848       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15849       emit_insn (gen_sse5_pperm_pack_v8hi_v16qi (op0, op1, op2, x));
15850       break;
15851
15852     case V8HImode:
15853       for (i = 0; i < 4; i++)
15854         {
15855           pperm_bytes[(2*i)+0] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 0);
15856           pperm_bytes[(2*i)+1] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 1);
15857           pperm_bytes[(2*i)+8] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 0);
15858           pperm_bytes[(2*i)+9] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 1);
15859         }
15860
15861       for (i = 0; i < 16; i++)
15862         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15863
15864       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15865       emit_insn (gen_sse5_pperm_pack_v4si_v8hi (op0, op1, op2, x));
15866       break;
15867
15868     case V4SImode:
15869       for (i = 0; i < 2; i++)
15870         {
15871           pperm_bytes[(4*i)+0]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 0);
15872           pperm_bytes[(4*i)+1]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 1);
15873           pperm_bytes[(4*i)+2]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 2);
15874           pperm_bytes[(4*i)+3]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 3);
15875           pperm_bytes[(4*i)+8]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 0);
15876           pperm_bytes[(4*i)+9]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 1);
15877           pperm_bytes[(4*i)+10] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 2);
15878           pperm_bytes[(4*i)+11] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 3);
15879         }
15880
15881       for (i = 0; i < 16; i++)
15882         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15883
15884       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15885       emit_insn (gen_sse5_pperm_pack_v2di_v4si (op0, op1, op2, x));
15886       break;
15887
15888     default:
15889       gcc_unreachable ();
15890     }
15891
15892   return;
15893 }
15894
15895 /* Expand conditional increment or decrement using adb/sbb instructions.
15896    The default case using setcc followed by the conditional move can be
15897    done by generic code.  */
15898 int
15899 ix86_expand_int_addcc (rtx operands[])
15900 {
15901   enum rtx_code code = GET_CODE (operands[1]);
15902   rtx compare_op;
15903   rtx val = const0_rtx;
15904   bool fpcmp = false;
15905   enum machine_mode mode = GET_MODE (operands[0]);
15906
15907   if (operands[3] != const1_rtx
15908       && operands[3] != constm1_rtx)
15909     return 0;
15910   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
15911                                        ix86_compare_op1, &compare_op))
15912      return 0;
15913   code = GET_CODE (compare_op);
15914
15915   if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
15916       || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
15917     {
15918       fpcmp = true;
15919       code = ix86_fp_compare_code_to_integer (code);
15920     }
15921
15922   if (code != LTU)
15923     {
15924       val = constm1_rtx;
15925       if (fpcmp)
15926         PUT_CODE (compare_op,
15927                   reverse_condition_maybe_unordered
15928                     (GET_CODE (compare_op)));
15929       else
15930         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
15931     }
15932   PUT_MODE (compare_op, mode);
15933
15934   /* Construct either adc or sbb insn.  */
15935   if ((code == LTU) == (operands[3] == constm1_rtx))
15936     {
15937       switch (GET_MODE (operands[0]))
15938         {
15939           case QImode:
15940             emit_insn (gen_subqi3_carry (operands[0], operands[2], val, compare_op));
15941             break;
15942           case HImode:
15943             emit_insn (gen_subhi3_carry (operands[0], operands[2], val, compare_op));
15944             break;
15945           case SImode:
15946             emit_insn (gen_subsi3_carry (operands[0], operands[2], val, compare_op));
15947             break;
15948           case DImode:
15949             emit_insn (gen_subdi3_carry_rex64 (operands[0], operands[2], val, compare_op));
15950             break;
15951           default:
15952             gcc_unreachable ();
15953         }
15954     }
15955   else
15956     {
15957       switch (GET_MODE (operands[0]))
15958         {
15959           case QImode:
15960             emit_insn (gen_addqi3_carry (operands[0], operands[2], val, compare_op));
15961             break;
15962           case HImode:
15963             emit_insn (gen_addhi3_carry (operands[0], operands[2], val, compare_op));
15964             break;
15965           case SImode:
15966             emit_insn (gen_addsi3_carry (operands[0], operands[2], val, compare_op));
15967             break;
15968           case DImode:
15969             emit_insn (gen_adddi3_carry_rex64 (operands[0], operands[2], val, compare_op));
15970             break;
15971           default:
15972             gcc_unreachable ();
15973         }
15974     }
15975   return 1; /* DONE */
15976 }
15977
15978
15979 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
15980    works for floating pointer parameters and nonoffsetable memories.
15981    For pushes, it returns just stack offsets; the values will be saved
15982    in the right order.  Maximally three parts are generated.  */
15983
15984 static int
15985 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
15986 {
15987   int size;
15988
15989   if (!TARGET_64BIT)
15990     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
15991   else
15992     size = (GET_MODE_SIZE (mode) + 4) / 8;
15993
15994   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
15995   gcc_assert (size >= 2 && size <= 4);
15996
15997   /* Optimize constant pool reference to immediates.  This is used by fp
15998      moves, that force all constants to memory to allow combining.  */
15999   if (MEM_P (operand) && MEM_READONLY_P (operand))
16000     {
16001       rtx tmp = maybe_get_pool_constant (operand);
16002       if (tmp)
16003         operand = tmp;
16004     }
16005
16006   if (MEM_P (operand) && !offsettable_memref_p (operand))
16007     {
16008       /* The only non-offsetable memories we handle are pushes.  */
16009       int ok = push_operand (operand, VOIDmode);
16010
16011       gcc_assert (ok);
16012
16013       operand = copy_rtx (operand);
16014       PUT_MODE (operand, Pmode);
16015       parts[0] = parts[1] = parts[2] = parts[3] = operand;
16016       return size;
16017     }
16018
16019   if (GET_CODE (operand) == CONST_VECTOR)
16020     {
16021       enum machine_mode imode = int_mode_for_mode (mode);
16022       /* Caution: if we looked through a constant pool memory above,
16023          the operand may actually have a different mode now.  That's
16024          ok, since we want to pun this all the way back to an integer.  */
16025       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
16026       gcc_assert (operand != NULL);
16027       mode = imode;
16028     }
16029
16030   if (!TARGET_64BIT)
16031     {
16032       if (mode == DImode)
16033         split_di (&operand, 1, &parts[0], &parts[1]);
16034       else
16035         {
16036           int i;
16037
16038           if (REG_P (operand))
16039             {
16040               gcc_assert (reload_completed);
16041               for (i = 0; i < size; i++)
16042                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
16043             }
16044           else if (offsettable_memref_p (operand))
16045             {
16046               operand = adjust_address (operand, SImode, 0);
16047               parts[0] = operand;
16048               for (i = 1; i < size; i++)
16049                 parts[i] = adjust_address (operand, SImode, 4 * i);
16050             }
16051           else if (GET_CODE (operand) == CONST_DOUBLE)
16052             {
16053               REAL_VALUE_TYPE r;
16054               long l[4];
16055
16056               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16057               switch (mode)
16058                 {
16059                 case TFmode:
16060                   real_to_target (l, &r, mode);
16061                   parts[3] = gen_int_mode (l[3], SImode);
16062                   parts[2] = gen_int_mode (l[2], SImode);
16063                   break;
16064                 case XFmode:
16065                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
16066                   parts[2] = gen_int_mode (l[2], SImode);
16067                   break;
16068                 case DFmode:
16069                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
16070                   break;
16071                 default:
16072                   gcc_unreachable ();
16073                 }
16074               parts[1] = gen_int_mode (l[1], SImode);
16075               parts[0] = gen_int_mode (l[0], SImode);
16076             }
16077           else
16078             gcc_unreachable ();
16079         }
16080     }
16081   else
16082     {
16083       if (mode == TImode)
16084         split_ti (&operand, 1, &parts[0], &parts[1]);
16085       if (mode == XFmode || mode == TFmode)
16086         {
16087           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
16088           if (REG_P (operand))
16089             {
16090               gcc_assert (reload_completed);
16091               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
16092               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
16093             }
16094           else if (offsettable_memref_p (operand))
16095             {
16096               operand = adjust_address (operand, DImode, 0);
16097               parts[0] = operand;
16098               parts[1] = adjust_address (operand, upper_mode, 8);
16099             }
16100           else if (GET_CODE (operand) == CONST_DOUBLE)
16101             {
16102               REAL_VALUE_TYPE r;
16103               long l[4];
16104
16105               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16106               real_to_target (l, &r, mode);
16107
16108               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
16109               if (HOST_BITS_PER_WIDE_INT >= 64)
16110                 parts[0]
16111                   = gen_int_mode
16112                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
16113                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
16114                        DImode);
16115               else
16116                 parts[0] = immed_double_const (l[0], l[1], DImode);
16117
16118               if (upper_mode == SImode)
16119                 parts[1] = gen_int_mode (l[2], SImode);
16120               else if (HOST_BITS_PER_WIDE_INT >= 64)
16121                 parts[1]
16122                   = gen_int_mode
16123                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
16124                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
16125                        DImode);
16126               else
16127                 parts[1] = immed_double_const (l[2], l[3], DImode);
16128             }
16129           else
16130             gcc_unreachable ();
16131         }
16132     }
16133
16134   return size;
16135 }
16136
16137 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
16138    Return false when normal moves are needed; true when all required
16139    insns have been emitted.  Operands 2-4 contain the input values
16140    int the correct order; operands 5-7 contain the output values.  */
16141
16142 void
16143 ix86_split_long_move (rtx operands[])
16144 {
16145   rtx part[2][4];
16146   int nparts, i, j;
16147   int push = 0;
16148   int collisions = 0;
16149   enum machine_mode mode = GET_MODE (operands[0]);
16150   bool collisionparts[4];
16151
16152   /* The DFmode expanders may ask us to move double.
16153      For 64bit target this is single move.  By hiding the fact
16154      here we simplify i386.md splitters.  */
16155   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
16156     {
16157       /* Optimize constant pool reference to immediates.  This is used by
16158          fp moves, that force all constants to memory to allow combining.  */
16159
16160       if (MEM_P (operands[1])
16161           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
16162           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
16163         operands[1] = get_pool_constant (XEXP (operands[1], 0));
16164       if (push_operand (operands[0], VOIDmode))
16165         {
16166           operands[0] = copy_rtx (operands[0]);
16167           PUT_MODE (operands[0], Pmode);
16168         }
16169       else
16170         operands[0] = gen_lowpart (DImode, operands[0]);
16171       operands[1] = gen_lowpart (DImode, operands[1]);
16172       emit_move_insn (operands[0], operands[1]);
16173       return;
16174     }
16175
16176   /* The only non-offsettable memory we handle is push.  */
16177   if (push_operand (operands[0], VOIDmode))
16178     push = 1;
16179   else
16180     gcc_assert (!MEM_P (operands[0])
16181                 || offsettable_memref_p (operands[0]));
16182
16183   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
16184   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
16185
16186   /* When emitting push, take care for source operands on the stack.  */
16187   if (push && MEM_P (operands[1])
16188       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
16189     for (i = 0; i < nparts - 1; i++)
16190       part[1][i] = change_address (part[1][i],
16191                                    GET_MODE (part[1][i]),
16192                                    XEXP (part[1][i + 1], 0));
16193
16194   /* We need to do copy in the right order in case an address register
16195      of the source overlaps the destination.  */
16196   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
16197     {
16198       rtx tmp;
16199
16200       for (i = 0; i < nparts; i++)
16201         {
16202           collisionparts[i]
16203             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
16204           if (collisionparts[i])
16205             collisions++;
16206         }
16207
16208       /* Collision in the middle part can be handled by reordering.  */
16209       if (collisions == 1 && nparts == 3 && collisionparts [1])
16210         {
16211           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16212           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16213         }
16214       else if (collisions == 1
16215                && nparts == 4
16216                && (collisionparts [1] || collisionparts [2]))
16217         {
16218           if (collisionparts [1])
16219             {
16220               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16221               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16222             }
16223           else
16224             {
16225               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
16226               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
16227             }
16228         }
16229
16230       /* If there are more collisions, we can't handle it by reordering.
16231          Do an lea to the last part and use only one colliding move.  */
16232       else if (collisions > 1)
16233         {
16234           rtx base;
16235
16236           collisions = 1;
16237
16238           base = part[0][nparts - 1];
16239
16240           /* Handle the case when the last part isn't valid for lea.
16241              Happens in 64-bit mode storing the 12-byte XFmode.  */
16242           if (GET_MODE (base) != Pmode)
16243             base = gen_rtx_REG (Pmode, REGNO (base));
16244
16245           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
16246           part[1][0] = replace_equiv_address (part[1][0], base);
16247           for (i = 1; i < nparts; i++)
16248             {
16249               tmp = plus_constant (base, UNITS_PER_WORD * i);
16250               part[1][i] = replace_equiv_address (part[1][i], tmp);
16251             }
16252         }
16253     }
16254
16255   if (push)
16256     {
16257       if (!TARGET_64BIT)
16258         {
16259           if (nparts == 3)
16260             {
16261               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
16262                 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, GEN_INT (-4)));
16263               emit_move_insn (part[0][2], part[1][2]);
16264             }
16265           else if (nparts == 4)
16266             {
16267               emit_move_insn (part[0][3], part[1][3]);
16268               emit_move_insn (part[0][2], part[1][2]);
16269             }
16270         }
16271       else
16272         {
16273           /* In 64bit mode we don't have 32bit push available.  In case this is
16274              register, it is OK - we will just use larger counterpart.  We also
16275              retype memory - these comes from attempt to avoid REX prefix on
16276              moving of second half of TFmode value.  */
16277           if (GET_MODE (part[1][1]) == SImode)
16278             {
16279               switch (GET_CODE (part[1][1]))
16280                 {
16281                 case MEM:
16282                   part[1][1] = adjust_address (part[1][1], DImode, 0);
16283                   break;
16284
16285                 case REG:
16286                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
16287                   break;
16288
16289                 default:
16290                   gcc_unreachable ();
16291                 }
16292
16293               if (GET_MODE (part[1][0]) == SImode)
16294                 part[1][0] = part[1][1];
16295             }
16296         }
16297       emit_move_insn (part[0][1], part[1][1]);
16298       emit_move_insn (part[0][0], part[1][0]);
16299       return;
16300     }
16301
16302   /* Choose correct order to not overwrite the source before it is copied.  */
16303   if ((REG_P (part[0][0])
16304        && REG_P (part[1][1])
16305        && (REGNO (part[0][0]) == REGNO (part[1][1])
16306            || (nparts == 3
16307                && REGNO (part[0][0]) == REGNO (part[1][2]))
16308            || (nparts == 4
16309                && REGNO (part[0][0]) == REGNO (part[1][3]))))
16310       || (collisions > 0
16311           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
16312     {
16313       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
16314         {
16315           operands[2 + i] = part[0][j];
16316           operands[6 + i] = part[1][j];
16317         }
16318     }
16319   else
16320     {
16321       for (i = 0; i < nparts; i++)
16322         {
16323           operands[2 + i] = part[0][i];
16324           operands[6 + i] = part[1][i];
16325         }
16326     }
16327
16328   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
16329   if (optimize_insn_for_size_p ())
16330     {
16331       for (j = 0; j < nparts - 1; j++)
16332         if (CONST_INT_P (operands[6 + j])
16333             && operands[6 + j] != const0_rtx
16334             && REG_P (operands[2 + j]))
16335           for (i = j; i < nparts - 1; i++)
16336             if (CONST_INT_P (operands[7 + i])
16337                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
16338               operands[7 + i] = operands[2 + j];
16339     }
16340
16341   for (i = 0; i < nparts; i++)
16342     emit_move_insn (operands[2 + i], operands[6 + i]);
16343
16344   return;
16345 }
16346
16347 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
16348    left shift by a constant, either using a single shift or
16349    a sequence of add instructions.  */
16350
16351 static void
16352 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
16353 {
16354   if (count == 1)
16355     {
16356       emit_insn ((mode == DImode
16357                   ? gen_addsi3
16358                   : gen_adddi3) (operand, operand, operand));
16359     }
16360   else if (!optimize_insn_for_size_p ()
16361            && count * ix86_cost->add <= ix86_cost->shift_const)
16362     {
16363       int i;
16364       for (i=0; i<count; i++)
16365         {
16366           emit_insn ((mode == DImode
16367                       ? gen_addsi3
16368                       : gen_adddi3) (operand, operand, operand));
16369         }
16370     }
16371   else
16372     emit_insn ((mode == DImode
16373                 ? gen_ashlsi3
16374                 : gen_ashldi3) (operand, operand, GEN_INT (count)));
16375 }
16376
16377 void
16378 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
16379 {
16380   rtx low[2], high[2];
16381   int count;
16382   const int single_width = mode == DImode ? 32 : 64;
16383
16384   if (CONST_INT_P (operands[2]))
16385     {
16386       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16387       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16388
16389       if (count >= single_width)
16390         {
16391           emit_move_insn (high[0], low[1]);
16392           emit_move_insn (low[0], const0_rtx);
16393
16394           if (count > single_width)
16395             ix86_expand_ashl_const (high[0], count - single_width, mode);
16396         }
16397       else
16398         {
16399           if (!rtx_equal_p (operands[0], operands[1]))
16400             emit_move_insn (operands[0], operands[1]);
16401           emit_insn ((mode == DImode
16402                      ? gen_x86_shld
16403                      : gen_x86_64_shld) (high[0], low[0], GEN_INT (count)));
16404           ix86_expand_ashl_const (low[0], count, mode);
16405         }
16406       return;
16407     }
16408
16409   (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16410
16411   if (operands[1] == const1_rtx)
16412     {
16413       /* Assuming we've chosen a QImode capable registers, then 1 << N
16414          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
16415       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
16416         {
16417           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
16418
16419           ix86_expand_clear (low[0]);
16420           ix86_expand_clear (high[0]);
16421           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (single_width)));
16422
16423           d = gen_lowpart (QImode, low[0]);
16424           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16425           s = gen_rtx_EQ (QImode, flags, const0_rtx);
16426           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16427
16428           d = gen_lowpart (QImode, high[0]);
16429           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16430           s = gen_rtx_NE (QImode, flags, const0_rtx);
16431           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16432         }
16433
16434       /* Otherwise, we can get the same results by manually performing
16435          a bit extract operation on bit 5/6, and then performing the two
16436          shifts.  The two methods of getting 0/1 into low/high are exactly
16437          the same size.  Avoiding the shift in the bit extract case helps
16438          pentium4 a bit; no one else seems to care much either way.  */
16439       else
16440         {
16441           rtx x;
16442
16443           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
16444             x = gen_rtx_ZERO_EXTEND (mode == DImode ? SImode : DImode, operands[2]);
16445           else
16446             x = gen_lowpart (mode == DImode ? SImode : DImode, operands[2]);
16447           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
16448
16449           emit_insn ((mode == DImode
16450                       ? gen_lshrsi3
16451                       : gen_lshrdi3) (high[0], high[0], GEN_INT (mode == DImode ? 5 : 6)));
16452           emit_insn ((mode == DImode
16453                       ? gen_andsi3
16454                       : gen_anddi3) (high[0], high[0], GEN_INT (1)));
16455           emit_move_insn (low[0], high[0]);
16456           emit_insn ((mode == DImode
16457                       ? gen_xorsi3
16458                       : gen_xordi3) (low[0], low[0], GEN_INT (1)));
16459         }
16460
16461       emit_insn ((mode == DImode
16462                     ? gen_ashlsi3
16463                     : gen_ashldi3) (low[0], low[0], operands[2]));
16464       emit_insn ((mode == DImode
16465                     ? gen_ashlsi3
16466                     : gen_ashldi3) (high[0], high[0], operands[2]));
16467       return;
16468     }
16469
16470   if (operands[1] == constm1_rtx)
16471     {
16472       /* For -1 << N, we can avoid the shld instruction, because we
16473          know that we're shifting 0...31/63 ones into a -1.  */
16474       emit_move_insn (low[0], constm1_rtx);
16475       if (optimize_insn_for_size_p ())
16476         emit_move_insn (high[0], low[0]);
16477       else
16478         emit_move_insn (high[0], constm1_rtx);
16479     }
16480   else
16481     {
16482       if (!rtx_equal_p (operands[0], operands[1]))
16483         emit_move_insn (operands[0], operands[1]);
16484
16485       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16486       emit_insn ((mode == DImode
16487                   ? gen_x86_shld
16488                   : gen_x86_64_shld) (high[0], low[0], operands[2]));
16489     }
16490
16491   emit_insn ((mode == DImode ? gen_ashlsi3 : gen_ashldi3) (low[0], low[0], operands[2]));
16492
16493   if (TARGET_CMOVE && scratch)
16494     {
16495       ix86_expand_clear (scratch);
16496       emit_insn ((mode == DImode
16497                   ? gen_x86_shift_adj_1
16498                   : gen_x86_64_shift_adj_1) (high[0], low[0], operands[2],
16499                                              scratch));
16500     }
16501   else
16502     emit_insn ((mode == DImode
16503                 ? gen_x86_shift_adj_2
16504                 : gen_x86_64_shift_adj_2) (high[0], low[0], operands[2]));
16505 }
16506
16507 void
16508 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
16509 {
16510   rtx low[2], high[2];
16511   int count;
16512   const int single_width = mode == DImode ? 32 : 64;
16513
16514   if (CONST_INT_P (operands[2]))
16515     {
16516       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16517       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16518
16519       if (count == single_width * 2 - 1)
16520         {
16521           emit_move_insn (high[0], high[1]);
16522           emit_insn ((mode == DImode
16523                       ? gen_ashrsi3
16524                       : gen_ashrdi3) (high[0], high[0],
16525                                       GEN_INT (single_width - 1)));
16526           emit_move_insn (low[0], high[0]);
16527
16528         }
16529       else if (count >= single_width)
16530         {
16531           emit_move_insn (low[0], high[1]);
16532           emit_move_insn (high[0], low[0]);
16533           emit_insn ((mode == DImode
16534                       ? gen_ashrsi3
16535                       : gen_ashrdi3) (high[0], high[0],
16536                                       GEN_INT (single_width - 1)));
16537           if (count > single_width)
16538             emit_insn ((mode == DImode
16539                         ? gen_ashrsi3
16540                         : gen_ashrdi3) (low[0], low[0],
16541                                         GEN_INT (count - single_width)));
16542         }
16543       else
16544         {
16545           if (!rtx_equal_p (operands[0], operands[1]))
16546             emit_move_insn (operands[0], operands[1]);
16547           emit_insn ((mode == DImode
16548                       ? gen_x86_shrd
16549                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
16550           emit_insn ((mode == DImode
16551                       ? gen_ashrsi3
16552                       : gen_ashrdi3) (high[0], high[0], GEN_INT (count)));
16553         }
16554     }
16555   else
16556     {
16557       if (!rtx_equal_p (operands[0], operands[1]))
16558         emit_move_insn (operands[0], operands[1]);
16559
16560       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16561
16562       emit_insn ((mode == DImode
16563                   ? gen_x86_shrd
16564                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
16565       emit_insn ((mode == DImode
16566                   ? gen_ashrsi3
16567                   : gen_ashrdi3)  (high[0], high[0], operands[2]));
16568
16569       if (TARGET_CMOVE && scratch)
16570         {
16571           emit_move_insn (scratch, high[0]);
16572           emit_insn ((mode == DImode
16573                       ? gen_ashrsi3
16574                       : gen_ashrdi3) (scratch, scratch,
16575                                       GEN_INT (single_width - 1)));
16576           emit_insn ((mode == DImode
16577                       ? gen_x86_shift_adj_1
16578                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
16579                                                  scratch));
16580         }
16581       else
16582         emit_insn ((mode == DImode
16583                     ? gen_x86_shift_adj_3
16584                     : gen_x86_64_shift_adj_3) (low[0], high[0], operands[2]));
16585     }
16586 }
16587
16588 void
16589 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
16590 {
16591   rtx low[2], high[2];
16592   int count;
16593   const int single_width = mode == DImode ? 32 : 64;
16594
16595   if (CONST_INT_P (operands[2]))
16596     {
16597       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16598       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16599
16600       if (count >= single_width)
16601         {
16602           emit_move_insn (low[0], high[1]);
16603           ix86_expand_clear (high[0]);
16604
16605           if (count > single_width)
16606             emit_insn ((mode == DImode
16607                         ? gen_lshrsi3
16608                         : gen_lshrdi3) (low[0], low[0],
16609                                         GEN_INT (count - single_width)));
16610         }
16611       else
16612         {
16613           if (!rtx_equal_p (operands[0], operands[1]))
16614             emit_move_insn (operands[0], operands[1]);
16615           emit_insn ((mode == DImode
16616                       ? gen_x86_shrd
16617                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
16618           emit_insn ((mode == DImode
16619                       ? gen_lshrsi3
16620                       : gen_lshrdi3) (high[0], high[0], GEN_INT (count)));
16621         }
16622     }
16623   else
16624     {
16625       if (!rtx_equal_p (operands[0], operands[1]))
16626         emit_move_insn (operands[0], operands[1]);
16627
16628       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16629
16630       emit_insn ((mode == DImode
16631                   ? gen_x86_shrd
16632                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
16633       emit_insn ((mode == DImode
16634                   ? gen_lshrsi3
16635                   : gen_lshrdi3) (high[0], high[0], operands[2]));
16636
16637       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
16638       if (TARGET_CMOVE && scratch)
16639         {
16640           ix86_expand_clear (scratch);
16641           emit_insn ((mode == DImode
16642                       ? gen_x86_shift_adj_1
16643                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
16644                                                  scratch));
16645         }
16646       else
16647         emit_insn ((mode == DImode
16648                     ? gen_x86_shift_adj_2
16649                     : gen_x86_64_shift_adj_2) (low[0], high[0], operands[2]));
16650     }
16651 }
16652
16653 /* Predict just emitted jump instruction to be taken with probability PROB.  */
16654 static void
16655 predict_jump (int prob)
16656 {
16657   rtx insn = get_last_insn ();
16658   gcc_assert (JUMP_P (insn));
16659   REG_NOTES (insn)
16660     = gen_rtx_EXPR_LIST (REG_BR_PROB,
16661                          GEN_INT (prob),
16662                          REG_NOTES (insn));
16663 }
16664
16665 /* Helper function for the string operations below.  Dest VARIABLE whether
16666    it is aligned to VALUE bytes.  If true, jump to the label.  */
16667 static rtx
16668 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
16669 {
16670   rtx label = gen_label_rtx ();
16671   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
16672   if (GET_MODE (variable) == DImode)
16673     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
16674   else
16675     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
16676   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
16677                            1, label);
16678   if (epilogue)
16679     predict_jump (REG_BR_PROB_BASE * 50 / 100);
16680   else
16681     predict_jump (REG_BR_PROB_BASE * 90 / 100);
16682   return label;
16683 }
16684
16685 /* Adjust COUNTER by the VALUE.  */
16686 static void
16687 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
16688 {
16689   if (GET_MODE (countreg) == DImode)
16690     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
16691   else
16692     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
16693 }
16694
16695 /* Zero extend possibly SImode EXP to Pmode register.  */
16696 rtx
16697 ix86_zero_extend_to_Pmode (rtx exp)
16698 {
16699   rtx r;
16700   if (GET_MODE (exp) == VOIDmode)
16701     return force_reg (Pmode, exp);
16702   if (GET_MODE (exp) == Pmode)
16703     return copy_to_mode_reg (Pmode, exp);
16704   r = gen_reg_rtx (Pmode);
16705   emit_insn (gen_zero_extendsidi2 (r, exp));
16706   return r;
16707 }
16708
16709 /* Divide COUNTREG by SCALE.  */
16710 static rtx
16711 scale_counter (rtx countreg, int scale)
16712 {
16713   rtx sc;
16714   rtx piece_size_mask;
16715
16716   if (scale == 1)
16717     return countreg;
16718   if (CONST_INT_P (countreg))
16719     return GEN_INT (INTVAL (countreg) / scale);
16720   gcc_assert (REG_P (countreg));
16721
16722   piece_size_mask = GEN_INT (scale - 1);
16723   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
16724                             GEN_INT (exact_log2 (scale)),
16725                             NULL, 1, OPTAB_DIRECT);
16726   return sc;
16727 }
16728
16729 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
16730    DImode for constant loop counts.  */
16731
16732 static enum machine_mode
16733 counter_mode (rtx count_exp)
16734 {
16735   if (GET_MODE (count_exp) != VOIDmode)
16736     return GET_MODE (count_exp);
16737   if (GET_CODE (count_exp) != CONST_INT)
16738     return Pmode;
16739   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
16740     return DImode;
16741   return SImode;
16742 }
16743
16744 /* When SRCPTR is non-NULL, output simple loop to move memory
16745    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
16746    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
16747    equivalent loop to set memory by VALUE (supposed to be in MODE).
16748
16749    The size is rounded down to whole number of chunk size moved at once.
16750    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
16751
16752
16753 static void
16754 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
16755                                rtx destptr, rtx srcptr, rtx value,
16756                                rtx count, enum machine_mode mode, int unroll,
16757                                int expected_size)
16758 {
16759   rtx out_label, top_label, iter, tmp;
16760   enum machine_mode iter_mode = counter_mode (count);
16761   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
16762   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
16763   rtx size;
16764   rtx x_addr;
16765   rtx y_addr;
16766   int i;
16767
16768   top_label = gen_label_rtx ();
16769   out_label = gen_label_rtx ();
16770   iter = gen_reg_rtx (iter_mode);
16771
16772   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
16773                               NULL, 1, OPTAB_DIRECT);
16774   /* Those two should combine.  */
16775   if (piece_size == const1_rtx)
16776     {
16777       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
16778                                true, out_label);
16779       predict_jump (REG_BR_PROB_BASE * 10 / 100);
16780     }
16781   emit_move_insn (iter, const0_rtx);
16782
16783   emit_label (top_label);
16784
16785   tmp = convert_modes (Pmode, iter_mode, iter, true);
16786   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
16787   destmem = change_address (destmem, mode, x_addr);
16788
16789   if (srcmem)
16790     {
16791       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
16792       srcmem = change_address (srcmem, mode, y_addr);
16793
16794       /* When unrolling for chips that reorder memory reads and writes,
16795          we can save registers by using single temporary.
16796          Also using 4 temporaries is overkill in 32bit mode.  */
16797       if (!TARGET_64BIT && 0)
16798         {
16799           for (i = 0; i < unroll; i++)
16800             {
16801               if (i)
16802                 {
16803                   destmem =
16804                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
16805                   srcmem =
16806                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
16807                 }
16808               emit_move_insn (destmem, srcmem);
16809             }
16810         }
16811       else
16812         {
16813           rtx tmpreg[4];
16814           gcc_assert (unroll <= 4);
16815           for (i = 0; i < unroll; i++)
16816             {
16817               tmpreg[i] = gen_reg_rtx (mode);
16818               if (i)
16819                 {
16820                   srcmem =
16821                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
16822                 }
16823               emit_move_insn (tmpreg[i], srcmem);
16824             }
16825           for (i = 0; i < unroll; i++)
16826             {
16827               if (i)
16828                 {
16829                   destmem =
16830                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
16831                 }
16832               emit_move_insn (destmem, tmpreg[i]);
16833             }
16834         }
16835     }
16836   else
16837     for (i = 0; i < unroll; i++)
16838       {
16839         if (i)
16840           destmem =
16841             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
16842         emit_move_insn (destmem, value);
16843       }
16844
16845   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
16846                              true, OPTAB_LIB_WIDEN);
16847   if (tmp != iter)
16848     emit_move_insn (iter, tmp);
16849
16850   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
16851                            true, top_label);
16852   if (expected_size != -1)
16853     {
16854       expected_size /= GET_MODE_SIZE (mode) * unroll;
16855       if (expected_size == 0)
16856         predict_jump (0);
16857       else if (expected_size > REG_BR_PROB_BASE)
16858         predict_jump (REG_BR_PROB_BASE - 1);
16859       else
16860         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
16861     }
16862   else
16863     predict_jump (REG_BR_PROB_BASE * 80 / 100);
16864   iter = ix86_zero_extend_to_Pmode (iter);
16865   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
16866                              true, OPTAB_LIB_WIDEN);
16867   if (tmp != destptr)
16868     emit_move_insn (destptr, tmp);
16869   if (srcptr)
16870     {
16871       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
16872                                  true, OPTAB_LIB_WIDEN);
16873       if (tmp != srcptr)
16874         emit_move_insn (srcptr, tmp);
16875     }
16876   emit_label (out_label);
16877 }
16878
16879 /* Output "rep; mov" instruction.
16880    Arguments have same meaning as for previous function */
16881 static void
16882 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
16883                            rtx destptr, rtx srcptr,
16884                            rtx count,
16885                            enum machine_mode mode)
16886 {
16887   rtx destexp;
16888   rtx srcexp;
16889   rtx countreg;
16890
16891   /* If the size is known, it is shorter to use rep movs.  */
16892   if (mode == QImode && CONST_INT_P (count)
16893       && !(INTVAL (count) & 3))
16894     mode = SImode;
16895
16896   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
16897     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
16898   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
16899     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
16900   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
16901   if (mode != QImode)
16902     {
16903       destexp = gen_rtx_ASHIFT (Pmode, countreg,
16904                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
16905       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
16906       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
16907                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
16908       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
16909     }
16910   else
16911     {
16912       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
16913       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
16914     }
16915   if (CONST_INT_P (count))
16916     {
16917       count = GEN_INT (INTVAL (count)
16918                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
16919       destmem = shallow_copy_rtx (destmem);
16920       srcmem = shallow_copy_rtx (srcmem);
16921       set_mem_size (destmem, count);
16922       set_mem_size (srcmem, count);
16923     }
16924   else
16925     {
16926       if (MEM_SIZE (destmem))
16927         set_mem_size (destmem, NULL_RTX);
16928       if (MEM_SIZE (srcmem))
16929         set_mem_size (srcmem, NULL_RTX);
16930     }
16931   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
16932                           destexp, srcexp));
16933 }
16934
16935 /* Output "rep; stos" instruction.
16936    Arguments have same meaning as for previous function */
16937 static void
16938 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
16939                             rtx count, enum machine_mode mode,
16940                             rtx orig_value)
16941 {
16942   rtx destexp;
16943   rtx countreg;
16944
16945   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
16946     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
16947   value = force_reg (mode, gen_lowpart (mode, value));
16948   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
16949   if (mode != QImode)
16950     {
16951       destexp = gen_rtx_ASHIFT (Pmode, countreg,
16952                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
16953       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
16954     }
16955   else
16956     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
16957   if (orig_value == const0_rtx && CONST_INT_P (count))
16958     {
16959       count = GEN_INT (INTVAL (count)
16960                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
16961       destmem = shallow_copy_rtx (destmem);
16962       set_mem_size (destmem, count);
16963     }
16964   else if (MEM_SIZE (destmem))
16965     set_mem_size (destmem, NULL_RTX);
16966   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
16967 }
16968
16969 static void
16970 emit_strmov (rtx destmem, rtx srcmem,
16971              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
16972 {
16973   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
16974   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
16975   emit_insn (gen_strmov (destptr, dest, srcptr, src));
16976 }
16977
16978 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
16979 static void
16980 expand_movmem_epilogue (rtx destmem, rtx srcmem,
16981                         rtx destptr, rtx srcptr, rtx count, int max_size)
16982 {
16983   rtx src, dest;
16984   if (CONST_INT_P (count))
16985     {
16986       HOST_WIDE_INT countval = INTVAL (count);
16987       int offset = 0;
16988
16989       if ((countval & 0x10) && max_size > 16)
16990         {
16991           if (TARGET_64BIT)
16992             {
16993               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
16994               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
16995             }
16996           else
16997             gcc_unreachable ();
16998           offset += 16;
16999         }
17000       if ((countval & 0x08) && max_size > 8)
17001         {
17002           if (TARGET_64BIT)
17003             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17004           else
17005             {
17006               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17007               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
17008             }
17009           offset += 8;
17010         }
17011       if ((countval & 0x04) && max_size > 4)
17012         {
17013           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17014           offset += 4;
17015         }
17016       if ((countval & 0x02) && max_size > 2)
17017         {
17018           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
17019           offset += 2;
17020         }
17021       if ((countval & 0x01) && max_size > 1)
17022         {
17023           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
17024           offset += 1;
17025         }
17026       return;
17027     }
17028   if (max_size > 8)
17029     {
17030       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
17031                                     count, 1, OPTAB_DIRECT);
17032       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
17033                                      count, QImode, 1, 4);
17034       return;
17035     }
17036
17037   /* When there are stringops, we can cheaply increase dest and src pointers.
17038      Otherwise we save code size by maintaining offset (zero is readily
17039      available from preceding rep operation) and using x86 addressing modes.
17040    */
17041   if (TARGET_SINGLE_STRINGOP)
17042     {
17043       if (max_size > 4)
17044         {
17045           rtx label = ix86_expand_aligntest (count, 4, true);
17046           src = change_address (srcmem, SImode, srcptr);
17047           dest = change_address (destmem, SImode, destptr);
17048           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17049           emit_label (label);
17050           LABEL_NUSES (label) = 1;
17051         }
17052       if (max_size > 2)
17053         {
17054           rtx label = ix86_expand_aligntest (count, 2, true);
17055           src = change_address (srcmem, HImode, srcptr);
17056           dest = change_address (destmem, HImode, destptr);
17057           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17058           emit_label (label);
17059           LABEL_NUSES (label) = 1;
17060         }
17061       if (max_size > 1)
17062         {
17063           rtx label = ix86_expand_aligntest (count, 1, true);
17064           src = change_address (srcmem, QImode, srcptr);
17065           dest = change_address (destmem, QImode, destptr);
17066           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17067           emit_label (label);
17068           LABEL_NUSES (label) = 1;
17069         }
17070     }
17071   else
17072     {
17073       rtx offset = force_reg (Pmode, const0_rtx);
17074       rtx tmp;
17075
17076       if (max_size > 4)
17077         {
17078           rtx label = ix86_expand_aligntest (count, 4, true);
17079           src = change_address (srcmem, SImode, srcptr);
17080           dest = change_address (destmem, SImode, destptr);
17081           emit_move_insn (dest, src);
17082           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
17083                                      true, OPTAB_LIB_WIDEN);
17084           if (tmp != offset)
17085             emit_move_insn (offset, tmp);
17086           emit_label (label);
17087           LABEL_NUSES (label) = 1;
17088         }
17089       if (max_size > 2)
17090         {
17091           rtx label = ix86_expand_aligntest (count, 2, true);
17092           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17093           src = change_address (srcmem, HImode, tmp);
17094           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17095           dest = change_address (destmem, HImode, tmp);
17096           emit_move_insn (dest, src);
17097           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
17098                                      true, OPTAB_LIB_WIDEN);
17099           if (tmp != offset)
17100             emit_move_insn (offset, tmp);
17101           emit_label (label);
17102           LABEL_NUSES (label) = 1;
17103         }
17104       if (max_size > 1)
17105         {
17106           rtx label = ix86_expand_aligntest (count, 1, true);
17107           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17108           src = change_address (srcmem, QImode, tmp);
17109           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17110           dest = change_address (destmem, QImode, tmp);
17111           emit_move_insn (dest, src);
17112           emit_label (label);
17113           LABEL_NUSES (label) = 1;
17114         }
17115     }
17116 }
17117
17118 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17119 static void
17120 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
17121                                  rtx count, int max_size)
17122 {
17123   count =
17124     expand_simple_binop (counter_mode (count), AND, count,
17125                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
17126   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
17127                                  gen_lowpart (QImode, value), count, QImode,
17128                                  1, max_size / 2);
17129 }
17130
17131 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17132 static void
17133 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
17134 {
17135   rtx dest;
17136
17137   if (CONST_INT_P (count))
17138     {
17139       HOST_WIDE_INT countval = INTVAL (count);
17140       int offset = 0;
17141
17142       if ((countval & 0x10) && max_size > 16)
17143         {
17144           if (TARGET_64BIT)
17145             {
17146               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17147               emit_insn (gen_strset (destptr, dest, value));
17148               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
17149               emit_insn (gen_strset (destptr, dest, value));
17150             }
17151           else
17152             gcc_unreachable ();
17153           offset += 16;
17154         }
17155       if ((countval & 0x08) && max_size > 8)
17156         {
17157           if (TARGET_64BIT)
17158             {
17159               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17160               emit_insn (gen_strset (destptr, dest, value));
17161             }
17162           else
17163             {
17164               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17165               emit_insn (gen_strset (destptr, dest, value));
17166               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
17167               emit_insn (gen_strset (destptr, dest, value));
17168             }
17169           offset += 8;
17170         }
17171       if ((countval & 0x04) && max_size > 4)
17172         {
17173           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17174           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17175           offset += 4;
17176         }
17177       if ((countval & 0x02) && max_size > 2)
17178         {
17179           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
17180           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17181           offset += 2;
17182         }
17183       if ((countval & 0x01) && max_size > 1)
17184         {
17185           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
17186           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17187           offset += 1;
17188         }
17189       return;
17190     }
17191   if (max_size > 32)
17192     {
17193       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
17194       return;
17195     }
17196   if (max_size > 16)
17197     {
17198       rtx label = ix86_expand_aligntest (count, 16, true);
17199       if (TARGET_64BIT)
17200         {
17201           dest = change_address (destmem, DImode, destptr);
17202           emit_insn (gen_strset (destptr, dest, value));
17203           emit_insn (gen_strset (destptr, dest, value));
17204         }
17205       else
17206         {
17207           dest = change_address (destmem, SImode, destptr);
17208           emit_insn (gen_strset (destptr, dest, value));
17209           emit_insn (gen_strset (destptr, dest, value));
17210           emit_insn (gen_strset (destptr, dest, value));
17211           emit_insn (gen_strset (destptr, dest, value));
17212         }
17213       emit_label (label);
17214       LABEL_NUSES (label) = 1;
17215     }
17216   if (max_size > 8)
17217     {
17218       rtx label = ix86_expand_aligntest (count, 8, true);
17219       if (TARGET_64BIT)
17220         {
17221           dest = change_address (destmem, DImode, destptr);
17222           emit_insn (gen_strset (destptr, dest, value));
17223         }
17224       else
17225         {
17226           dest = change_address (destmem, SImode, destptr);
17227           emit_insn (gen_strset (destptr, dest, value));
17228           emit_insn (gen_strset (destptr, dest, value));
17229         }
17230       emit_label (label);
17231       LABEL_NUSES (label) = 1;
17232     }
17233   if (max_size > 4)
17234     {
17235       rtx label = ix86_expand_aligntest (count, 4, true);
17236       dest = change_address (destmem, SImode, destptr);
17237       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17238       emit_label (label);
17239       LABEL_NUSES (label) = 1;
17240     }
17241   if (max_size > 2)
17242     {
17243       rtx label = ix86_expand_aligntest (count, 2, true);
17244       dest = change_address (destmem, HImode, destptr);
17245       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17246       emit_label (label);
17247       LABEL_NUSES (label) = 1;
17248     }
17249   if (max_size > 1)
17250     {
17251       rtx label = ix86_expand_aligntest (count, 1, true);
17252       dest = change_address (destmem, QImode, destptr);
17253       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17254       emit_label (label);
17255       LABEL_NUSES (label) = 1;
17256     }
17257 }
17258
17259 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
17260    DESIRED_ALIGNMENT.  */
17261 static void
17262 expand_movmem_prologue (rtx destmem, rtx srcmem,
17263                         rtx destptr, rtx srcptr, rtx count,
17264                         int align, int desired_alignment)
17265 {
17266   if (align <= 1 && desired_alignment > 1)
17267     {
17268       rtx label = ix86_expand_aligntest (destptr, 1, false);
17269       srcmem = change_address (srcmem, QImode, srcptr);
17270       destmem = change_address (destmem, QImode, destptr);
17271       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17272       ix86_adjust_counter (count, 1);
17273       emit_label (label);
17274       LABEL_NUSES (label) = 1;
17275     }
17276   if (align <= 2 && desired_alignment > 2)
17277     {
17278       rtx label = ix86_expand_aligntest (destptr, 2, false);
17279       srcmem = change_address (srcmem, HImode, srcptr);
17280       destmem = change_address (destmem, HImode, destptr);
17281       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17282       ix86_adjust_counter (count, 2);
17283       emit_label (label);
17284       LABEL_NUSES (label) = 1;
17285     }
17286   if (align <= 4 && desired_alignment > 4)
17287     {
17288       rtx label = ix86_expand_aligntest (destptr, 4, false);
17289       srcmem = change_address (srcmem, SImode, srcptr);
17290       destmem = change_address (destmem, SImode, destptr);
17291       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17292       ix86_adjust_counter (count, 4);
17293       emit_label (label);
17294       LABEL_NUSES (label) = 1;
17295     }
17296   gcc_assert (desired_alignment <= 8);
17297 }
17298
17299 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
17300    ALIGN_BYTES is how many bytes need to be copied.  */
17301 static rtx
17302 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
17303                                  int desired_align, int align_bytes)
17304 {
17305   rtx src = *srcp;
17306   rtx src_size, dst_size;
17307   int off = 0;
17308   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
17309   if (src_align_bytes >= 0)
17310     src_align_bytes = desired_align - src_align_bytes;
17311   src_size = MEM_SIZE (src);
17312   dst_size = MEM_SIZE (dst);
17313   if (align_bytes & 1)
17314     {
17315       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17316       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
17317       off = 1;
17318       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17319     }
17320   if (align_bytes & 2)
17321     {
17322       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17323       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
17324       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17325         set_mem_align (dst, 2 * BITS_PER_UNIT);
17326       if (src_align_bytes >= 0
17327           && (src_align_bytes & 1) == (align_bytes & 1)
17328           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
17329         set_mem_align (src, 2 * BITS_PER_UNIT);
17330       off = 2;
17331       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17332     }
17333   if (align_bytes & 4)
17334     {
17335       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17336       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
17337       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17338         set_mem_align (dst, 4 * BITS_PER_UNIT);
17339       if (src_align_bytes >= 0)
17340         {
17341           unsigned int src_align = 0;
17342           if ((src_align_bytes & 3) == (align_bytes & 3))
17343             src_align = 4;
17344           else if ((src_align_bytes & 1) == (align_bytes & 1))
17345             src_align = 2;
17346           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17347             set_mem_align (src, src_align * BITS_PER_UNIT);
17348         }
17349       off = 4;
17350       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17351     }
17352   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17353   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
17354   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17355     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17356   if (src_align_bytes >= 0)
17357     {
17358       unsigned int src_align = 0;
17359       if ((src_align_bytes & 7) == (align_bytes & 7))
17360         src_align = 8;
17361       else if ((src_align_bytes & 3) == (align_bytes & 3))
17362         src_align = 4;
17363       else if ((src_align_bytes & 1) == (align_bytes & 1))
17364         src_align = 2;
17365       if (src_align > (unsigned int) desired_align)
17366         src_align = desired_align;
17367       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17368         set_mem_align (src, src_align * BITS_PER_UNIT);
17369     }
17370   if (dst_size)
17371     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17372   if (src_size)
17373     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
17374   *srcp = src;
17375   return dst;
17376 }
17377
17378 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
17379    DESIRED_ALIGNMENT.  */
17380 static void
17381 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
17382                         int align, int desired_alignment)
17383 {
17384   if (align <= 1 && desired_alignment > 1)
17385     {
17386       rtx label = ix86_expand_aligntest (destptr, 1, false);
17387       destmem = change_address (destmem, QImode, destptr);
17388       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
17389       ix86_adjust_counter (count, 1);
17390       emit_label (label);
17391       LABEL_NUSES (label) = 1;
17392     }
17393   if (align <= 2 && desired_alignment > 2)
17394     {
17395       rtx label = ix86_expand_aligntest (destptr, 2, false);
17396       destmem = change_address (destmem, HImode, destptr);
17397       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
17398       ix86_adjust_counter (count, 2);
17399       emit_label (label);
17400       LABEL_NUSES (label) = 1;
17401     }
17402   if (align <= 4 && desired_alignment > 4)
17403     {
17404       rtx label = ix86_expand_aligntest (destptr, 4, false);
17405       destmem = change_address (destmem, SImode, destptr);
17406       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
17407       ix86_adjust_counter (count, 4);
17408       emit_label (label);
17409       LABEL_NUSES (label) = 1;
17410     }
17411   gcc_assert (desired_alignment <= 8);
17412 }
17413
17414 /* Set enough from DST to align DST known to by aligned by ALIGN to
17415    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
17416 static rtx
17417 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
17418                                  int desired_align, int align_bytes)
17419 {
17420   int off = 0;
17421   rtx dst_size = MEM_SIZE (dst);
17422   if (align_bytes & 1)
17423     {
17424       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17425       off = 1;
17426       emit_insn (gen_strset (destreg, dst,
17427                              gen_lowpart (QImode, value)));
17428     }
17429   if (align_bytes & 2)
17430     {
17431       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17432       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17433         set_mem_align (dst, 2 * BITS_PER_UNIT);
17434       off = 2;
17435       emit_insn (gen_strset (destreg, dst,
17436                              gen_lowpart (HImode, value)));
17437     }
17438   if (align_bytes & 4)
17439     {
17440       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17441       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17442         set_mem_align (dst, 4 * BITS_PER_UNIT);
17443       off = 4;
17444       emit_insn (gen_strset (destreg, dst,
17445                              gen_lowpart (SImode, value)));
17446     }
17447   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17448   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17449     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17450   if (dst_size)
17451     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17452   return dst;
17453 }
17454
17455 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
17456 static enum stringop_alg
17457 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
17458             int *dynamic_check)
17459 {
17460   const struct stringop_algs * algs;
17461   bool optimize_for_speed;
17462   /* Algorithms using the rep prefix want at least edi and ecx;
17463      additionally, memset wants eax and memcpy wants esi.  Don't
17464      consider such algorithms if the user has appropriated those
17465      registers for their own purposes.  */
17466   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
17467                              || (memset
17468                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
17469
17470 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
17471                            || (alg != rep_prefix_1_byte         \
17472                                && alg != rep_prefix_4_byte      \
17473                                && alg != rep_prefix_8_byte))
17474   const struct processor_costs *cost;
17475   
17476   /* Even if the string operation call is cold, we still might spend a lot
17477      of time processing large blocks.  */
17478   if (optimize_function_for_size_p (cfun)
17479       || (optimize_insn_for_size_p ()
17480           && expected_size != -1 && expected_size < 256))
17481     optimize_for_speed = false;
17482   else
17483     optimize_for_speed = true;
17484
17485   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
17486
17487   *dynamic_check = -1;
17488   if (memset)
17489     algs = &cost->memset[TARGET_64BIT != 0];
17490   else
17491     algs = &cost->memcpy[TARGET_64BIT != 0];
17492   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
17493     return stringop_alg;
17494   /* rep; movq or rep; movl is the smallest variant.  */
17495   else if (!optimize_for_speed)
17496     {
17497       if (!count || (count & 3))
17498         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
17499       else
17500         return rep_prefix_usable ? rep_prefix_4_byte : loop;
17501     }
17502   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
17503    */
17504   else if (expected_size != -1 && expected_size < 4)
17505     return loop_1_byte;
17506   else if (expected_size != -1)
17507     {
17508       unsigned int i;
17509       enum stringop_alg alg = libcall;
17510       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
17511         {
17512           /* We get here if the algorithms that were not libcall-based
17513              were rep-prefix based and we are unable to use rep prefixes
17514              based on global register usage.  Break out of the loop and
17515              use the heuristic below.  */
17516           if (algs->size[i].max == 0)
17517             break;
17518           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
17519             {
17520               enum stringop_alg candidate = algs->size[i].alg;
17521
17522               if (candidate != libcall && ALG_USABLE_P (candidate))
17523                 alg = candidate;
17524               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
17525                  last non-libcall inline algorithm.  */
17526               if (TARGET_INLINE_ALL_STRINGOPS)
17527                 {
17528                   /* When the current size is best to be copied by a libcall,
17529                      but we are still forced to inline, run the heuristic below
17530                      that will pick code for medium sized blocks.  */
17531                   if (alg != libcall)
17532                     return alg;
17533                   break;
17534                 }
17535               else if (ALG_USABLE_P (candidate))
17536                 return candidate;
17537             }
17538         }
17539       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
17540     }
17541   /* When asked to inline the call anyway, try to pick meaningful choice.
17542      We look for maximal size of block that is faster to copy by hand and
17543      take blocks of at most of that size guessing that average size will
17544      be roughly half of the block.
17545
17546      If this turns out to be bad, we might simply specify the preferred
17547      choice in ix86_costs.  */
17548   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17549       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
17550     {
17551       int max = -1;
17552       enum stringop_alg alg;
17553       int i;
17554       bool any_alg_usable_p = true;
17555
17556       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
17557         {
17558           enum stringop_alg candidate = algs->size[i].alg;
17559           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
17560
17561           if (candidate != libcall && candidate
17562               && ALG_USABLE_P (candidate))
17563               max = algs->size[i].max;
17564         }
17565       /* If there aren't any usable algorithms, then recursing on
17566          smaller sizes isn't going to find anything.  Just return the
17567          simple byte-at-a-time copy loop.  */
17568       if (!any_alg_usable_p)
17569         {
17570           /* Pick something reasonable.  */
17571           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17572             *dynamic_check = 128;
17573           return loop_1_byte;
17574         }
17575       if (max == -1)
17576         max = 4096;
17577       alg = decide_alg (count, max / 2, memset, dynamic_check);
17578       gcc_assert (*dynamic_check == -1);
17579       gcc_assert (alg != libcall);
17580       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17581         *dynamic_check = max;
17582       return alg;
17583     }
17584   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
17585 #undef ALG_USABLE_P
17586 }
17587
17588 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
17589    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
17590 static int
17591 decide_alignment (int align,
17592                   enum stringop_alg alg,
17593                   int expected_size)
17594 {
17595   int desired_align = 0;
17596   switch (alg)
17597     {
17598       case no_stringop:
17599         gcc_unreachable ();
17600       case loop:
17601       case unrolled_loop:
17602         desired_align = GET_MODE_SIZE (Pmode);
17603         break;
17604       case rep_prefix_8_byte:
17605         desired_align = 8;
17606         break;
17607       case rep_prefix_4_byte:
17608         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
17609            copying whole cacheline at once.  */
17610         if (TARGET_PENTIUMPRO)
17611           desired_align = 8;
17612         else
17613           desired_align = 4;
17614         break;
17615       case rep_prefix_1_byte:
17616         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
17617            copying whole cacheline at once.  */
17618         if (TARGET_PENTIUMPRO)
17619           desired_align = 8;
17620         else
17621           desired_align = 1;
17622         break;
17623       case loop_1_byte:
17624         desired_align = 1;
17625         break;
17626       case libcall:
17627         return 0;
17628     }
17629
17630   if (optimize_size)
17631     desired_align = 1;
17632   if (desired_align < align)
17633     desired_align = align;
17634   if (expected_size != -1 && expected_size < 4)
17635     desired_align = align;
17636   return desired_align;
17637 }
17638
17639 /* Return the smallest power of 2 greater than VAL.  */
17640 static int
17641 smallest_pow2_greater_than (int val)
17642 {
17643   int ret = 1;
17644   while (ret <= val)
17645     ret <<= 1;
17646   return ret;
17647 }
17648
17649 /* Expand string move (memcpy) operation.  Use i386 string operations when
17650    profitable.  expand_setmem contains similar code.  The code depends upon
17651    architecture, block size and alignment, but always has the same
17652    overall structure:
17653
17654    1) Prologue guard: Conditional that jumps up to epilogues for small
17655       blocks that can be handled by epilogue alone.  This is faster but
17656       also needed for correctness, since prologue assume the block is larger
17657       than the desired alignment.
17658
17659       Optional dynamic check for size and libcall for large
17660       blocks is emitted here too, with -minline-stringops-dynamically.
17661
17662    2) Prologue: copy first few bytes in order to get destination aligned
17663       to DESIRED_ALIGN.  It is emitted only when ALIGN is less than
17664       DESIRED_ALIGN and and up to DESIRED_ALIGN - ALIGN bytes can be copied.
17665       We emit either a jump tree on power of two sized blocks, or a byte loop.
17666
17667    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
17668       with specified algorithm.
17669
17670    4) Epilogue: code copying tail of the block that is too small to be
17671       handled by main body (or up to size guarded by prologue guard).  */
17672
17673 int
17674 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
17675                     rtx expected_align_exp, rtx expected_size_exp)
17676 {
17677   rtx destreg;
17678   rtx srcreg;
17679   rtx label = NULL;
17680   rtx tmp;
17681   rtx jump_around_label = NULL;
17682   HOST_WIDE_INT align = 1;
17683   unsigned HOST_WIDE_INT count = 0;
17684   HOST_WIDE_INT expected_size = -1;
17685   int size_needed = 0, epilogue_size_needed;
17686   int desired_align = 0, align_bytes = 0;
17687   enum stringop_alg alg;
17688   int dynamic_check;
17689   bool need_zero_guard = false;
17690
17691   if (CONST_INT_P (align_exp))
17692     align = INTVAL (align_exp);
17693   /* i386 can do misaligned access on reasonably increased cost.  */
17694   if (CONST_INT_P (expected_align_exp)
17695       && INTVAL (expected_align_exp) > align)
17696     align = INTVAL (expected_align_exp);
17697   /* ALIGN is the minimum of destination and source alignment, but we care here
17698      just about destination alignment.  */
17699   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
17700     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
17701
17702   if (CONST_INT_P (count_exp))
17703     count = expected_size = INTVAL (count_exp);
17704   if (CONST_INT_P (expected_size_exp) && count == 0)
17705     expected_size = INTVAL (expected_size_exp);
17706
17707   /* Make sure we don't need to care about overflow later on.  */
17708   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
17709     return 0;
17710
17711   /* Step 0: Decide on preferred algorithm, desired alignment and
17712      size of chunks to be copied by main loop.  */
17713
17714   alg = decide_alg (count, expected_size, false, &dynamic_check);
17715   desired_align = decide_alignment (align, alg, expected_size);
17716
17717   if (!TARGET_ALIGN_STRINGOPS)
17718     align = desired_align;
17719
17720   if (alg == libcall)
17721     return 0;
17722   gcc_assert (alg != no_stringop);
17723   if (!count)
17724     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
17725   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
17726   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
17727   switch (alg)
17728     {
17729     case libcall:
17730     case no_stringop:
17731       gcc_unreachable ();
17732     case loop:
17733       need_zero_guard = true;
17734       size_needed = GET_MODE_SIZE (Pmode);
17735       break;
17736     case unrolled_loop:
17737       need_zero_guard = true;
17738       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
17739       break;
17740     case rep_prefix_8_byte:
17741       size_needed = 8;
17742       break;
17743     case rep_prefix_4_byte:
17744       size_needed = 4;
17745       break;
17746     case rep_prefix_1_byte:
17747       size_needed = 1;
17748       break;
17749     case loop_1_byte:
17750       need_zero_guard = true;
17751       size_needed = 1;
17752       break;
17753     }
17754
17755   epilogue_size_needed = size_needed;
17756
17757   /* Step 1: Prologue guard.  */
17758
17759   /* Alignment code needs count to be in register.  */
17760   if (CONST_INT_P (count_exp) && desired_align > align)
17761     {
17762       if (INTVAL (count_exp) > desired_align
17763           && INTVAL (count_exp) > size_needed)
17764         {
17765           align_bytes
17766             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
17767           if (align_bytes <= 0)
17768             align_bytes = 0;
17769           else
17770             align_bytes = desired_align - align_bytes;
17771         }
17772       if (align_bytes == 0)
17773         count_exp = force_reg (counter_mode (count_exp), count_exp);
17774     }
17775   gcc_assert (desired_align >= 1 && align >= 1);
17776
17777   /* Ensure that alignment prologue won't copy past end of block.  */
17778   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
17779     {
17780       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
17781       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
17782          Make sure it is power of 2.  */
17783       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
17784
17785       if (count)
17786         {
17787           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
17788             {
17789               /* If main algorithm works on QImode, no epilogue is needed.
17790                  For small sizes just don't align anything.  */
17791               if (size_needed == 1)
17792                 desired_align = align;
17793               else
17794                 goto epilogue;
17795             }
17796         }
17797       else
17798         {
17799           label = gen_label_rtx ();
17800           emit_cmp_and_jump_insns (count_exp,
17801                                    GEN_INT (epilogue_size_needed),
17802                                    LTU, 0, counter_mode (count_exp), 1, label);
17803           if (expected_size == -1 || expected_size < epilogue_size_needed)
17804             predict_jump (REG_BR_PROB_BASE * 60 / 100);
17805           else
17806             predict_jump (REG_BR_PROB_BASE * 20 / 100);
17807         }
17808     }
17809
17810   /* Emit code to decide on runtime whether library call or inline should be
17811      used.  */
17812   if (dynamic_check != -1)
17813     {
17814       if (CONST_INT_P (count_exp))
17815         {
17816           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
17817             {
17818               emit_block_move_via_libcall (dst, src, count_exp, false);
17819               count_exp = const0_rtx;
17820               goto epilogue;
17821             }
17822         }
17823       else
17824         {
17825           rtx hot_label = gen_label_rtx ();
17826           jump_around_label = gen_label_rtx ();
17827           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
17828                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
17829           predict_jump (REG_BR_PROB_BASE * 90 / 100);
17830           emit_block_move_via_libcall (dst, src, count_exp, false);
17831           emit_jump (jump_around_label);
17832           emit_label (hot_label);
17833         }
17834     }
17835
17836   /* Step 2: Alignment prologue.  */
17837
17838   if (desired_align > align)
17839     {
17840       if (align_bytes == 0)
17841         {
17842           /* Except for the first move in epilogue, we no longer know
17843              constant offset in aliasing info.  It don't seems to worth
17844              the pain to maintain it for the first move, so throw away
17845              the info early.  */
17846           src = change_address (src, BLKmode, srcreg);
17847           dst = change_address (dst, BLKmode, destreg);
17848           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
17849                                   desired_align);
17850         }
17851       else
17852         {
17853           /* If we know how many bytes need to be stored before dst is
17854              sufficiently aligned, maintain aliasing info accurately.  */
17855           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
17856                                                  desired_align, align_bytes);
17857           count_exp = plus_constant (count_exp, -align_bytes);
17858           count -= align_bytes;
17859         }
17860       if (need_zero_guard
17861           && (count < (unsigned HOST_WIDE_INT) size_needed
17862               || (align_bytes == 0
17863                   && count < ((unsigned HOST_WIDE_INT) size_needed
17864                               + desired_align - align))))
17865         {
17866           /* It is possible that we copied enough so the main loop will not
17867              execute.  */
17868           gcc_assert (size_needed > 1);
17869           if (label == NULL_RTX)
17870             label = gen_label_rtx ();
17871           emit_cmp_and_jump_insns (count_exp,
17872                                    GEN_INT (size_needed),
17873                                    LTU, 0, counter_mode (count_exp), 1, label);
17874           if (expected_size == -1
17875               || expected_size < (desired_align - align) / 2 + size_needed)
17876             predict_jump (REG_BR_PROB_BASE * 20 / 100);
17877           else
17878             predict_jump (REG_BR_PROB_BASE * 60 / 100);
17879         }
17880     }
17881   if (label && size_needed == 1)
17882     {
17883       emit_label (label);
17884       LABEL_NUSES (label) = 1;
17885       label = NULL;
17886       epilogue_size_needed = 1;
17887     }
17888   else if (label == NULL_RTX)
17889     epilogue_size_needed = size_needed;
17890
17891   /* Step 3: Main loop.  */
17892
17893   switch (alg)
17894     {
17895     case libcall:
17896     case no_stringop:
17897       gcc_unreachable ();
17898     case loop_1_byte:
17899       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
17900                                      count_exp, QImode, 1, expected_size);
17901       break;
17902     case loop:
17903       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
17904                                      count_exp, Pmode, 1, expected_size);
17905       break;
17906     case unrolled_loop:
17907       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
17908          registers for 4 temporaries anyway.  */
17909       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
17910                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
17911                                      expected_size);
17912       break;
17913     case rep_prefix_8_byte:
17914       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
17915                                  DImode);
17916       break;
17917     case rep_prefix_4_byte:
17918       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
17919                                  SImode);
17920       break;
17921     case rep_prefix_1_byte:
17922       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
17923                                  QImode);
17924       break;
17925     }
17926   /* Adjust properly the offset of src and dest memory for aliasing.  */
17927   if (CONST_INT_P (count_exp))
17928     {
17929       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
17930                                           (count / size_needed) * size_needed);
17931       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
17932                                           (count / size_needed) * size_needed);
17933     }
17934   else
17935     {
17936       src = change_address (src, BLKmode, srcreg);
17937       dst = change_address (dst, BLKmode, destreg);
17938     }
17939
17940   /* Step 4: Epilogue to copy the remaining bytes.  */
17941  epilogue:
17942   if (label)
17943     {
17944       /* When the main loop is done, COUNT_EXP might hold original count,
17945          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
17946          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
17947          bytes. Compensate if needed.  */
17948
17949       if (size_needed < epilogue_size_needed)
17950         {
17951           tmp =
17952             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
17953                                  GEN_INT (size_needed - 1), count_exp, 1,
17954                                  OPTAB_DIRECT);
17955           if (tmp != count_exp)
17956             emit_move_insn (count_exp, tmp);
17957         }
17958       emit_label (label);
17959       LABEL_NUSES (label) = 1;
17960     }
17961
17962   if (count_exp != const0_rtx && epilogue_size_needed > 1)
17963     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
17964                             epilogue_size_needed);
17965   if (jump_around_label)
17966     emit_label (jump_around_label);
17967   return 1;
17968 }
17969
17970 /* Helper function for memcpy.  For QImode value 0xXY produce
17971    0xXYXYXYXY of wide specified by MODE.  This is essentially
17972    a * 0x10101010, but we can do slightly better than
17973    synth_mult by unwinding the sequence by hand on CPUs with
17974    slow multiply.  */
17975 static rtx
17976 promote_duplicated_reg (enum machine_mode mode, rtx val)
17977 {
17978   enum machine_mode valmode = GET_MODE (val);
17979   rtx tmp;
17980   int nops = mode == DImode ? 3 : 2;
17981
17982   gcc_assert (mode == SImode || mode == DImode);
17983   if (val == const0_rtx)
17984     return copy_to_mode_reg (mode, const0_rtx);
17985   if (CONST_INT_P (val))
17986     {
17987       HOST_WIDE_INT v = INTVAL (val) & 255;
17988
17989       v |= v << 8;
17990       v |= v << 16;
17991       if (mode == DImode)
17992         v |= (v << 16) << 16;
17993       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
17994     }
17995
17996   if (valmode == VOIDmode)
17997     valmode = QImode;
17998   if (valmode != QImode)
17999     val = gen_lowpart (QImode, val);
18000   if (mode == QImode)
18001     return val;
18002   if (!TARGET_PARTIAL_REG_STALL)
18003     nops--;
18004   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
18005       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
18006       <= (ix86_cost->shift_const + ix86_cost->add) * nops
18007           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
18008     {
18009       rtx reg = convert_modes (mode, QImode, val, true);
18010       tmp = promote_duplicated_reg (mode, const1_rtx);
18011       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
18012                                   OPTAB_DIRECT);
18013     }
18014   else
18015     {
18016       rtx reg = convert_modes (mode, QImode, val, true);
18017
18018       if (!TARGET_PARTIAL_REG_STALL)
18019         if (mode == SImode)
18020           emit_insn (gen_movsi_insv_1 (reg, reg));
18021         else
18022           emit_insn (gen_movdi_insv_1_rex64 (reg, reg));
18023       else
18024         {
18025           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
18026                                      NULL, 1, OPTAB_DIRECT);
18027           reg =
18028             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18029         }
18030       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
18031                                  NULL, 1, OPTAB_DIRECT);
18032       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18033       if (mode == SImode)
18034         return reg;
18035       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
18036                                  NULL, 1, OPTAB_DIRECT);
18037       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18038       return reg;
18039     }
18040 }
18041
18042 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
18043    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
18044    alignment from ALIGN to DESIRED_ALIGN.  */
18045 static rtx
18046 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
18047 {
18048   rtx promoted_val;
18049
18050   if (TARGET_64BIT
18051       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
18052     promoted_val = promote_duplicated_reg (DImode, val);
18053   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
18054     promoted_val = promote_duplicated_reg (SImode, val);
18055   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
18056     promoted_val = promote_duplicated_reg (HImode, val);
18057   else
18058     promoted_val = val;
18059
18060   return promoted_val;
18061 }
18062
18063 /* Expand string clear operation (bzero).  Use i386 string operations when
18064    profitable.  See expand_movmem comment for explanation of individual
18065    steps performed.  */
18066 int
18067 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
18068                     rtx expected_align_exp, rtx expected_size_exp)
18069 {
18070   rtx destreg;
18071   rtx label = NULL;
18072   rtx tmp;
18073   rtx jump_around_label = NULL;
18074   HOST_WIDE_INT align = 1;
18075   unsigned HOST_WIDE_INT count = 0;
18076   HOST_WIDE_INT expected_size = -1;
18077   int size_needed = 0, epilogue_size_needed;
18078   int desired_align = 0, align_bytes = 0;
18079   enum stringop_alg alg;
18080   rtx promoted_val = NULL;
18081   bool force_loopy_epilogue = false;
18082   int dynamic_check;
18083   bool need_zero_guard = false;
18084
18085   if (CONST_INT_P (align_exp))
18086     align = INTVAL (align_exp);
18087   /* i386 can do misaligned access on reasonably increased cost.  */
18088   if (CONST_INT_P (expected_align_exp)
18089       && INTVAL (expected_align_exp) > align)
18090     align = INTVAL (expected_align_exp);
18091   if (CONST_INT_P (count_exp))
18092     count = expected_size = INTVAL (count_exp);
18093   if (CONST_INT_P (expected_size_exp) && count == 0)
18094     expected_size = INTVAL (expected_size_exp);
18095
18096   /* Make sure we don't need to care about overflow later on.  */
18097   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18098     return 0;
18099
18100   /* Step 0: Decide on preferred algorithm, desired alignment and
18101      size of chunks to be copied by main loop.  */
18102
18103   alg = decide_alg (count, expected_size, true, &dynamic_check);
18104   desired_align = decide_alignment (align, alg, expected_size);
18105
18106   if (!TARGET_ALIGN_STRINGOPS)
18107     align = desired_align;
18108
18109   if (alg == libcall)
18110     return 0;
18111   gcc_assert (alg != no_stringop);
18112   if (!count)
18113     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
18114   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18115   switch (alg)
18116     {
18117     case libcall:
18118     case no_stringop:
18119       gcc_unreachable ();
18120     case loop:
18121       need_zero_guard = true;
18122       size_needed = GET_MODE_SIZE (Pmode);
18123       break;
18124     case unrolled_loop:
18125       need_zero_guard = true;
18126       size_needed = GET_MODE_SIZE (Pmode) * 4;
18127       break;
18128     case rep_prefix_8_byte:
18129       size_needed = 8;
18130       break;
18131     case rep_prefix_4_byte:
18132       size_needed = 4;
18133       break;
18134     case rep_prefix_1_byte:
18135       size_needed = 1;
18136       break;
18137     case loop_1_byte:
18138       need_zero_guard = true;
18139       size_needed = 1;
18140       break;
18141     }
18142   epilogue_size_needed = size_needed;
18143
18144   /* Step 1: Prologue guard.  */
18145
18146   /* Alignment code needs count to be in register.  */
18147   if (CONST_INT_P (count_exp) && desired_align > align)
18148     {
18149       if (INTVAL (count_exp) > desired_align
18150           && INTVAL (count_exp) > size_needed)
18151         {
18152           align_bytes
18153             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18154           if (align_bytes <= 0)
18155             align_bytes = 0;
18156           else
18157             align_bytes = desired_align - align_bytes;
18158         }
18159       if (align_bytes == 0)
18160         {
18161           enum machine_mode mode = SImode;
18162           if (TARGET_64BIT && (count & ~0xffffffff))
18163             mode = DImode;
18164           count_exp = force_reg (mode, count_exp);
18165         }
18166     }
18167   /* Do the cheap promotion to allow better CSE across the
18168      main loop and epilogue (ie one load of the big constant in the
18169      front of all code.  */
18170   if (CONST_INT_P (val_exp))
18171     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18172                                                    desired_align, align);
18173   /* Ensure that alignment prologue won't copy past end of block.  */
18174   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18175     {
18176       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18177       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
18178          Make sure it is power of 2.  */
18179       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18180
18181       /* To improve performance of small blocks, we jump around the VAL
18182          promoting mode.  This mean that if the promoted VAL is not constant,
18183          we might not use it in the epilogue and have to use byte
18184          loop variant.  */
18185       if (epilogue_size_needed > 2 && !promoted_val)
18186         force_loopy_epilogue = true;
18187       if (count)
18188         {
18189           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18190             {
18191               /* If main algorithm works on QImode, no epilogue is needed.
18192                  For small sizes just don't align anything.  */
18193               if (size_needed == 1)
18194                 desired_align = align;
18195               else
18196                 goto epilogue;
18197             }
18198         }
18199       else
18200         {
18201           label = gen_label_rtx ();
18202           emit_cmp_and_jump_insns (count_exp,
18203                                    GEN_INT (epilogue_size_needed),
18204                                    LTU, 0, counter_mode (count_exp), 1, label);
18205           if (expected_size == -1 || expected_size <= epilogue_size_needed)
18206             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18207           else
18208             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18209         }
18210     }
18211   if (dynamic_check != -1)
18212     {
18213       rtx hot_label = gen_label_rtx ();
18214       jump_around_label = gen_label_rtx ();
18215       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18216                                LEU, 0, counter_mode (count_exp), 1, hot_label);
18217       predict_jump (REG_BR_PROB_BASE * 90 / 100);
18218       set_storage_via_libcall (dst, count_exp, val_exp, false);
18219       emit_jump (jump_around_label);
18220       emit_label (hot_label);
18221     }
18222
18223   /* Step 2: Alignment prologue.  */
18224
18225   /* Do the expensive promotion once we branched off the small blocks.  */
18226   if (!promoted_val)
18227     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18228                                                    desired_align, align);
18229   gcc_assert (desired_align >= 1 && align >= 1);
18230
18231   if (desired_align > align)
18232     {
18233       if (align_bytes == 0)
18234         {
18235           /* Except for the first move in epilogue, we no longer know
18236              constant offset in aliasing info.  It don't seems to worth
18237              the pain to maintain it for the first move, so throw away
18238              the info early.  */
18239           dst = change_address (dst, BLKmode, destreg);
18240           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
18241                                   desired_align);
18242         }
18243       else
18244         {
18245           /* If we know how many bytes need to be stored before dst is
18246              sufficiently aligned, maintain aliasing info accurately.  */
18247           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
18248                                                  desired_align, align_bytes);
18249           count_exp = plus_constant (count_exp, -align_bytes);
18250           count -= align_bytes;
18251         }
18252       if (need_zero_guard
18253           && (count < (unsigned HOST_WIDE_INT) size_needed
18254               || (align_bytes == 0
18255                   && count < ((unsigned HOST_WIDE_INT) size_needed
18256                               + desired_align - align))))
18257         {
18258           /* It is possible that we copied enough so the main loop will not
18259              execute.  */
18260           gcc_assert (size_needed > 1);
18261           if (label == NULL_RTX)
18262             label = gen_label_rtx ();
18263           emit_cmp_and_jump_insns (count_exp,
18264                                    GEN_INT (size_needed),
18265                                    LTU, 0, counter_mode (count_exp), 1, label);
18266           if (expected_size == -1
18267               || expected_size < (desired_align - align) / 2 + size_needed)
18268             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18269           else
18270             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18271         }
18272     }
18273   if (label && size_needed == 1)
18274     {
18275       emit_label (label);
18276       LABEL_NUSES (label) = 1;
18277       label = NULL;
18278       promoted_val = val_exp;
18279       epilogue_size_needed = 1;
18280     }
18281   else if (label == NULL_RTX)
18282     epilogue_size_needed = size_needed;
18283
18284   /* Step 3: Main loop.  */
18285
18286   switch (alg)
18287     {
18288     case libcall:
18289     case no_stringop:
18290       gcc_unreachable ();
18291     case loop_1_byte:
18292       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18293                                      count_exp, QImode, 1, expected_size);
18294       break;
18295     case loop:
18296       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18297                                      count_exp, Pmode, 1, expected_size);
18298       break;
18299     case unrolled_loop:
18300       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18301                                      count_exp, Pmode, 4, expected_size);
18302       break;
18303     case rep_prefix_8_byte:
18304       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18305                                   DImode, val_exp);
18306       break;
18307     case rep_prefix_4_byte:
18308       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18309                                   SImode, val_exp);
18310       break;
18311     case rep_prefix_1_byte:
18312       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18313                                   QImode, val_exp);
18314       break;
18315     }
18316   /* Adjust properly the offset of src and dest memory for aliasing.  */
18317   if (CONST_INT_P (count_exp))
18318     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18319                                         (count / size_needed) * size_needed);
18320   else
18321     dst = change_address (dst, BLKmode, destreg);
18322
18323   /* Step 4: Epilogue to copy the remaining bytes.  */
18324
18325   if (label)
18326     {
18327       /* When the main loop is done, COUNT_EXP might hold original count,
18328          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18329          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18330          bytes. Compensate if needed.  */
18331
18332       if (size_needed < epilogue_size_needed)
18333         {
18334           tmp =
18335             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18336                                  GEN_INT (size_needed - 1), count_exp, 1,
18337                                  OPTAB_DIRECT);
18338           if (tmp != count_exp)
18339             emit_move_insn (count_exp, tmp);
18340         }
18341       emit_label (label);
18342       LABEL_NUSES (label) = 1;
18343     }
18344  epilogue:
18345   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18346     {
18347       if (force_loopy_epilogue)
18348         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
18349                                          epilogue_size_needed);
18350       else
18351         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
18352                                 epilogue_size_needed);
18353     }
18354   if (jump_around_label)
18355     emit_label (jump_around_label);
18356   return 1;
18357 }
18358
18359 /* Expand the appropriate insns for doing strlen if not just doing
18360    repnz; scasb
18361
18362    out = result, initialized with the start address
18363    align_rtx = alignment of the address.
18364    scratch = scratch register, initialized with the startaddress when
18365         not aligned, otherwise undefined
18366
18367    This is just the body. It needs the initializations mentioned above and
18368    some address computing at the end.  These things are done in i386.md.  */
18369
18370 static void
18371 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
18372 {
18373   int align;
18374   rtx tmp;
18375   rtx align_2_label = NULL_RTX;
18376   rtx align_3_label = NULL_RTX;
18377   rtx align_4_label = gen_label_rtx ();
18378   rtx end_0_label = gen_label_rtx ();
18379   rtx mem;
18380   rtx tmpreg = gen_reg_rtx (SImode);
18381   rtx scratch = gen_reg_rtx (SImode);
18382   rtx cmp;
18383
18384   align = 0;
18385   if (CONST_INT_P (align_rtx))
18386     align = INTVAL (align_rtx);
18387
18388   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
18389
18390   /* Is there a known alignment and is it less than 4?  */
18391   if (align < 4)
18392     {
18393       rtx scratch1 = gen_reg_rtx (Pmode);
18394       emit_move_insn (scratch1, out);
18395       /* Is there a known alignment and is it not 2? */
18396       if (align != 2)
18397         {
18398           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
18399           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
18400
18401           /* Leave just the 3 lower bits.  */
18402           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
18403                                     NULL_RTX, 0, OPTAB_WIDEN);
18404
18405           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18406                                    Pmode, 1, align_4_label);
18407           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
18408                                    Pmode, 1, align_2_label);
18409           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
18410                                    Pmode, 1, align_3_label);
18411         }
18412       else
18413         {
18414           /* Since the alignment is 2, we have to check 2 or 0 bytes;
18415              check if is aligned to 4 - byte.  */
18416
18417           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
18418                                     NULL_RTX, 0, OPTAB_WIDEN);
18419
18420           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18421                                    Pmode, 1, align_4_label);
18422         }
18423
18424       mem = change_address (src, QImode, out);
18425
18426       /* Now compare the bytes.  */
18427
18428       /* Compare the first n unaligned byte on a byte per byte basis.  */
18429       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
18430                                QImode, 1, end_0_label);
18431
18432       /* Increment the address.  */
18433       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18434
18435       /* Not needed with an alignment of 2 */
18436       if (align != 2)
18437         {
18438           emit_label (align_2_label);
18439
18440           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18441                                    end_0_label);
18442
18443           emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18444
18445           emit_label (align_3_label);
18446         }
18447
18448       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18449                                end_0_label);
18450
18451       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18452     }
18453
18454   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
18455      align this loop.  It gives only huge programs, but does not help to
18456      speed up.  */
18457   emit_label (align_4_label);
18458
18459   mem = change_address (src, SImode, out);
18460   emit_move_insn (scratch, mem);
18461   emit_insn ((*ix86_gen_add3) (out, out, GEN_INT (4)));
18462
18463   /* This formula yields a nonzero result iff one of the bytes is zero.
18464      This saves three branches inside loop and many cycles.  */
18465
18466   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
18467   emit_insn (gen_one_cmplsi2 (scratch, scratch));
18468   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
18469   emit_insn (gen_andsi3 (tmpreg, tmpreg,
18470                          gen_int_mode (0x80808080, SImode)));
18471   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
18472                            align_4_label);
18473
18474   if (TARGET_CMOVE)
18475     {
18476        rtx reg = gen_reg_rtx (SImode);
18477        rtx reg2 = gen_reg_rtx (Pmode);
18478        emit_move_insn (reg, tmpreg);
18479        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
18480
18481        /* If zero is not in the first two bytes, move two bytes forward.  */
18482        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18483        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18484        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18485        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
18486                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
18487                                                      reg,
18488                                                      tmpreg)));
18489        /* Emit lea manually to avoid clobbering of flags.  */
18490        emit_insn (gen_rtx_SET (SImode, reg2,
18491                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
18492
18493        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18494        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18495        emit_insn (gen_rtx_SET (VOIDmode, out,
18496                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
18497                                                      reg2,
18498                                                      out)));
18499
18500     }
18501   else
18502     {
18503        rtx end_2_label = gen_label_rtx ();
18504        /* Is zero in the first two bytes? */
18505
18506        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18507        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18508        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
18509        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
18510                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
18511                             pc_rtx);
18512        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
18513        JUMP_LABEL (tmp) = end_2_label;
18514
18515        /* Not in the first two.  Move two bytes forward.  */
18516        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
18517        emit_insn ((*ix86_gen_add3) (out, out, const2_rtx));
18518
18519        emit_label (end_2_label);
18520
18521     }
18522
18523   /* Avoid branch in fixing the byte.  */
18524   tmpreg = gen_lowpart (QImode, tmpreg);
18525   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
18526   cmp = gen_rtx_LTU (Pmode, gen_rtx_REG (CCmode, FLAGS_REG), const0_rtx);
18527   emit_insn ((*ix86_gen_sub3_carry) (out, out, GEN_INT (3), cmp));
18528
18529   emit_label (end_0_label);
18530 }
18531
18532 /* Expand strlen.  */
18533
18534 int
18535 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
18536 {
18537   rtx addr, scratch1, scratch2, scratch3, scratch4;
18538
18539   /* The generic case of strlen expander is long.  Avoid it's
18540      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
18541
18542   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
18543       && !TARGET_INLINE_ALL_STRINGOPS
18544       && !optimize_insn_for_size_p ()
18545       && (!CONST_INT_P (align) || INTVAL (align) < 4))
18546     return 0;
18547
18548   addr = force_reg (Pmode, XEXP (src, 0));
18549   scratch1 = gen_reg_rtx (Pmode);
18550
18551   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
18552       && !optimize_insn_for_size_p ())
18553     {
18554       /* Well it seems that some optimizer does not combine a call like
18555          foo(strlen(bar), strlen(bar));
18556          when the move and the subtraction is done here.  It does calculate
18557          the length just once when these instructions are done inside of
18558          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
18559          often used and I use one fewer register for the lifetime of
18560          output_strlen_unroll() this is better.  */
18561
18562       emit_move_insn (out, addr);
18563
18564       ix86_expand_strlensi_unroll_1 (out, src, align);
18565
18566       /* strlensi_unroll_1 returns the address of the zero at the end of
18567          the string, like memchr(), so compute the length by subtracting
18568          the start address.  */
18569       emit_insn ((*ix86_gen_sub3) (out, out, addr));
18570     }
18571   else
18572     {
18573       rtx unspec;
18574
18575       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
18576       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
18577         return false;
18578
18579       scratch2 = gen_reg_rtx (Pmode);
18580       scratch3 = gen_reg_rtx (Pmode);
18581       scratch4 = force_reg (Pmode, constm1_rtx);
18582
18583       emit_move_insn (scratch3, addr);
18584       eoschar = force_reg (QImode, eoschar);
18585
18586       src = replace_equiv_address_nv (src, scratch3);
18587
18588       /* If .md starts supporting :P, this can be done in .md.  */
18589       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
18590                                                  scratch4), UNSPEC_SCAS);
18591       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
18592       emit_insn ((*ix86_gen_one_cmpl2) (scratch2, scratch1));
18593       emit_insn ((*ix86_gen_add3) (out, scratch2, constm1_rtx));
18594     }
18595   return 1;
18596 }
18597
18598 /* For given symbol (function) construct code to compute address of it's PLT
18599    entry in large x86-64 PIC model.  */
18600 rtx
18601 construct_plt_address (rtx symbol)
18602 {
18603   rtx tmp = gen_reg_rtx (Pmode);
18604   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
18605
18606   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
18607   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
18608
18609   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
18610   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
18611   return tmp;
18612 }
18613
18614 void
18615 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
18616                   rtx callarg2,
18617                   rtx pop, int sibcall)
18618 {
18619   rtx use = NULL, call;
18620   enum calling_abi function_call_abi;
18621
18622   if (callarg2 && INTVAL (callarg2) == -2)
18623     function_call_abi = MS_ABI;
18624   else
18625     function_call_abi = SYSV_ABI;
18626   if (pop == const0_rtx)
18627     pop = NULL;
18628   gcc_assert (!TARGET_64BIT || !pop);
18629
18630   if (TARGET_MACHO && !TARGET_64BIT)
18631     {
18632 #if TARGET_MACHO
18633       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
18634         fnaddr = machopic_indirect_call_target (fnaddr);
18635 #endif
18636     }
18637   else
18638     {
18639       /* Static functions and indirect calls don't need the pic register.  */
18640       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
18641           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
18642           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
18643         use_reg (&use, pic_offset_table_rtx);
18644     }
18645
18646   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
18647     {
18648       rtx al = gen_rtx_REG (QImode, AX_REG);
18649       emit_move_insn (al, callarg2);
18650       use_reg (&use, al);
18651     }
18652
18653   if (ix86_cmodel == CM_LARGE_PIC
18654       && GET_CODE (fnaddr) == MEM
18655       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
18656       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
18657     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
18658   else if (! call_insn_operand (XEXP (fnaddr, 0), Pmode))
18659     {
18660       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
18661       fnaddr = gen_rtx_MEM (QImode, fnaddr);
18662     }
18663   if (sibcall && TARGET_64BIT
18664       && !constant_call_address_operand (XEXP (fnaddr, 0), Pmode))
18665     {
18666       rtx addr;
18667       addr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
18668       fnaddr = gen_rtx_REG (Pmode, R11_REG);
18669       emit_move_insn (fnaddr, addr);
18670       fnaddr = gen_rtx_MEM (QImode, fnaddr);
18671     }
18672
18673   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
18674   if (retval)
18675     call = gen_rtx_SET (VOIDmode, retval, call);
18676   if (pop)
18677     {
18678       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
18679       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
18680       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
18681       gcc_assert (ix86_cfun_abi () != MS_ABI || function_call_abi != SYSV_ABI);
18682     }
18683   /* We need to represent that SI and DI registers are clobbered
18684      by SYSV calls.  */
18685   if (ix86_cfun_abi () == MS_ABI && function_call_abi == SYSV_ABI)
18686     {
18687       static int clobbered_registers[] = {27, 28, 45, 46, 47, 48, 49, 50, 51,
18688                                           52, SI_REG, DI_REG};
18689       unsigned int i;
18690       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
18691       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
18692                                    UNSPEC_MS_TO_SYSV_CALL);
18693
18694       vec[0] = call;
18695       vec[1] = unspec;
18696       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
18697         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
18698                                       ? TImode : DImode,
18699                                       gen_rtx_REG
18700                                         (SSE_REGNO_P (clobbered_registers[i])
18701                                                       ? TImode : DImode,
18702                                          clobbered_registers[i]));
18703
18704       call = gen_rtx_PARALLEL (VOIDmode,
18705                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
18706                                + 2, vec));
18707     }
18708
18709   call = emit_call_insn (call);
18710   if (use)
18711     CALL_INSN_FUNCTION_USAGE (call) = use;
18712 }
18713
18714 \f
18715 /* Clear stack slot assignments remembered from previous functions.
18716    This is called from INIT_EXPANDERS once before RTL is emitted for each
18717    function.  */
18718
18719 static struct machine_function *
18720 ix86_init_machine_status (void)
18721 {
18722   struct machine_function *f;
18723
18724   f = GGC_CNEW (struct machine_function);
18725   f->use_fast_prologue_epilogue_nregs = -1;
18726   f->tls_descriptor_call_expanded_p = 0;
18727   f->call_abi = DEFAULT_ABI;
18728
18729   return f;
18730 }
18731
18732 /* Return a MEM corresponding to a stack slot with mode MODE.
18733    Allocate a new slot if necessary.
18734
18735    The RTL for a function can have several slots available: N is
18736    which slot to use.  */
18737
18738 rtx
18739 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
18740 {
18741   struct stack_local_entry *s;
18742
18743   gcc_assert (n < MAX_386_STACK_LOCALS);
18744
18745   /* Virtual slot is valid only before vregs are instantiated.  */
18746   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
18747
18748   for (s = ix86_stack_locals; s; s = s->next)
18749     if (s->mode == mode && s->n == n)
18750       return copy_rtx (s->rtl);
18751
18752   s = (struct stack_local_entry *)
18753     ggc_alloc (sizeof (struct stack_local_entry));
18754   s->n = n;
18755   s->mode = mode;
18756   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
18757
18758   s->next = ix86_stack_locals;
18759   ix86_stack_locals = s;
18760   return s->rtl;
18761 }
18762
18763 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
18764
18765 static GTY(()) rtx ix86_tls_symbol;
18766 rtx
18767 ix86_tls_get_addr (void)
18768 {
18769
18770   if (!ix86_tls_symbol)
18771     {
18772       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
18773                                             (TARGET_ANY_GNU_TLS
18774                                              && !TARGET_64BIT)
18775                                             ? "___tls_get_addr"
18776                                             : "__tls_get_addr");
18777     }
18778
18779   return ix86_tls_symbol;
18780 }
18781
18782 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
18783
18784 static GTY(()) rtx ix86_tls_module_base_symbol;
18785 rtx
18786 ix86_tls_module_base (void)
18787 {
18788
18789   if (!ix86_tls_module_base_symbol)
18790     {
18791       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
18792                                                         "_TLS_MODULE_BASE_");
18793       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
18794         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
18795     }
18796
18797   return ix86_tls_module_base_symbol;
18798 }
18799 \f
18800 /* Calculate the length of the memory address in the instruction
18801    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
18802
18803 int
18804 memory_address_length (rtx addr)
18805 {
18806   struct ix86_address parts;
18807   rtx base, index, disp;
18808   int len;
18809   int ok;
18810
18811   if (GET_CODE (addr) == PRE_DEC
18812       || GET_CODE (addr) == POST_INC
18813       || GET_CODE (addr) == PRE_MODIFY
18814       || GET_CODE (addr) == POST_MODIFY)
18815     return 0;
18816
18817   ok = ix86_decompose_address (addr, &parts);
18818   gcc_assert (ok);
18819
18820   if (parts.base && GET_CODE (parts.base) == SUBREG)
18821     parts.base = SUBREG_REG (parts.base);
18822   if (parts.index && GET_CODE (parts.index) == SUBREG)
18823     parts.index = SUBREG_REG (parts.index);
18824
18825   base = parts.base;
18826   index = parts.index;
18827   disp = parts.disp;
18828   len = 0;
18829
18830   /* Rule of thumb:
18831        - esp as the base always wants an index,
18832        - ebp as the base always wants a displacement.  */
18833
18834   /* Register Indirect.  */
18835   if (base && !index && !disp)
18836     {
18837       /* esp (for its index) and ebp (for its displacement) need
18838          the two-byte modrm form.  */
18839       if (addr == stack_pointer_rtx
18840           || addr == arg_pointer_rtx
18841           || addr == frame_pointer_rtx
18842           || addr == hard_frame_pointer_rtx)
18843         len = 1;
18844     }
18845
18846   /* Direct Addressing.  */
18847   else if (disp && !base && !index)
18848     len = 4;
18849
18850   else
18851     {
18852       /* Find the length of the displacement constant.  */
18853       if (disp)
18854         {
18855           if (base && satisfies_constraint_K (disp))
18856             len = 1;
18857           else
18858             len = 4;
18859         }
18860       /* ebp always wants a displacement.  */
18861       else if (base == hard_frame_pointer_rtx)
18862         len = 1;
18863
18864       /* An index requires the two-byte modrm form....  */
18865       if (index
18866           /* ...like esp, which always wants an index.  */
18867           || base == stack_pointer_rtx
18868           || base == arg_pointer_rtx
18869           || base == frame_pointer_rtx)
18870         len += 1;
18871     }
18872
18873   return len;
18874 }
18875
18876 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
18877    is set, expect that insn have 8bit immediate alternative.  */
18878 int
18879 ix86_attr_length_immediate_default (rtx insn, int shortform)
18880 {
18881   int len = 0;
18882   int i;
18883   extract_insn_cached (insn);
18884   for (i = recog_data.n_operands - 1; i >= 0; --i)
18885     if (CONSTANT_P (recog_data.operand[i]))
18886       {
18887         gcc_assert (!len);
18888         if (shortform && satisfies_constraint_K (recog_data.operand[i]))
18889           len = 1;
18890         else
18891           {
18892             switch (get_attr_mode (insn))
18893               {
18894                 case MODE_QI:
18895                   len+=1;
18896                   break;
18897                 case MODE_HI:
18898                   len+=2;
18899                   break;
18900                 case MODE_SI:
18901                   len+=4;
18902                   break;
18903                 /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
18904                 case MODE_DI:
18905                   len+=4;
18906                   break;
18907                 default:
18908                   fatal_insn ("unknown insn mode", insn);
18909               }
18910           }
18911       }
18912   return len;
18913 }
18914 /* Compute default value for "length_address" attribute.  */
18915 int
18916 ix86_attr_length_address_default (rtx insn)
18917 {
18918   int i;
18919
18920   if (get_attr_type (insn) == TYPE_LEA)
18921     {
18922       rtx set = PATTERN (insn);
18923
18924       if (GET_CODE (set) == PARALLEL)
18925         set = XVECEXP (set, 0, 0);
18926
18927       gcc_assert (GET_CODE (set) == SET);
18928
18929       return memory_address_length (SET_SRC (set));
18930     }
18931
18932   extract_insn_cached (insn);
18933   for (i = recog_data.n_operands - 1; i >= 0; --i)
18934     if (MEM_P (recog_data.operand[i]))
18935       {
18936         return memory_address_length (XEXP (recog_data.operand[i], 0));
18937         break;
18938       }
18939   return 0;
18940 }
18941
18942 /* Compute default value for "length_vex" attribute. It includes
18943    2 or 3 byte VEX prefix and 1 opcode byte.  */
18944
18945 int
18946 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
18947                               int has_vex_w)
18948 {
18949   int i;
18950
18951   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
18952      byte VEX prefix.  */
18953   if (!has_0f_opcode || has_vex_w)
18954     return 3 + 1;
18955
18956  /* We can always use 2 byte VEX prefix in 32bit.  */
18957   if (!TARGET_64BIT)
18958     return 2 + 1;
18959
18960   extract_insn_cached (insn);
18961
18962   for (i = recog_data.n_operands - 1; i >= 0; --i)
18963     if (REG_P (recog_data.operand[i]))
18964       {
18965         /* REX.W bit uses 3 byte VEX prefix.  */
18966         if (GET_MODE (recog_data.operand[i]) == DImode)
18967           return 3 + 1;
18968       }
18969     else
18970       {
18971         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
18972         if (MEM_P (recog_data.operand[i])
18973             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
18974           return 3 + 1;
18975       }
18976
18977   return 2 + 1;
18978 }
18979 \f
18980 /* Return the maximum number of instructions a cpu can issue.  */
18981
18982 static int
18983 ix86_issue_rate (void)
18984 {
18985   switch (ix86_tune)
18986     {
18987     case PROCESSOR_PENTIUM:
18988     case PROCESSOR_K6:
18989       return 2;
18990
18991     case PROCESSOR_PENTIUMPRO:
18992     case PROCESSOR_PENTIUM4:
18993     case PROCESSOR_ATHLON:
18994     case PROCESSOR_K8:
18995     case PROCESSOR_AMDFAM10:
18996     case PROCESSOR_NOCONA:
18997     case PROCESSOR_GENERIC32:
18998     case PROCESSOR_GENERIC64:
18999       return 3;
19000
19001     case PROCESSOR_CORE2:
19002       return 4;
19003
19004     default:
19005       return 1;
19006     }
19007 }
19008
19009 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
19010    by DEP_INSN and nothing set by DEP_INSN.  */
19011
19012 static int
19013 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19014 {
19015   rtx set, set2;
19016
19017   /* Simplify the test for uninteresting insns.  */
19018   if (insn_type != TYPE_SETCC
19019       && insn_type != TYPE_ICMOV
19020       && insn_type != TYPE_FCMOV
19021       && insn_type != TYPE_IBR)
19022     return 0;
19023
19024   if ((set = single_set (dep_insn)) != 0)
19025     {
19026       set = SET_DEST (set);
19027       set2 = NULL_RTX;
19028     }
19029   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
19030            && XVECLEN (PATTERN (dep_insn), 0) == 2
19031            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
19032            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
19033     {
19034       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19035       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19036     }
19037   else
19038     return 0;
19039
19040   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
19041     return 0;
19042
19043   /* This test is true if the dependent insn reads the flags but
19044      not any other potentially set register.  */
19045   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
19046     return 0;
19047
19048   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
19049     return 0;
19050
19051   return 1;
19052 }
19053
19054 /* A subroutine of ix86_adjust_cost -- return true iff INSN has a memory
19055    address with operands set by DEP_INSN.  */
19056
19057 static int
19058 ix86_agi_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19059 {
19060   rtx addr;
19061
19062   if (insn_type == TYPE_LEA
19063       && TARGET_PENTIUM)
19064     {
19065       addr = PATTERN (insn);
19066
19067       if (GET_CODE (addr) == PARALLEL)
19068         addr = XVECEXP (addr, 0, 0);
19069
19070       gcc_assert (GET_CODE (addr) == SET);
19071
19072       addr = SET_SRC (addr);
19073     }
19074   else
19075     {
19076       int i;
19077       extract_insn_cached (insn);
19078       for (i = recog_data.n_operands - 1; i >= 0; --i)
19079         if (MEM_P (recog_data.operand[i]))
19080           {
19081             addr = XEXP (recog_data.operand[i], 0);
19082             goto found;
19083           }
19084       return 0;
19085     found:;
19086     }
19087
19088   return modified_in_p (addr, dep_insn);
19089 }
19090
19091 static int
19092 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
19093 {
19094   enum attr_type insn_type, dep_insn_type;
19095   enum attr_memory memory;
19096   rtx set, set2;
19097   int dep_insn_code_number;
19098
19099   /* Anti and output dependencies have zero cost on all CPUs.  */
19100   if (REG_NOTE_KIND (link) != 0)
19101     return 0;
19102
19103   dep_insn_code_number = recog_memoized (dep_insn);
19104
19105   /* If we can't recognize the insns, we can't really do anything.  */
19106   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
19107     return cost;
19108
19109   insn_type = get_attr_type (insn);
19110   dep_insn_type = get_attr_type (dep_insn);
19111
19112   switch (ix86_tune)
19113     {
19114     case PROCESSOR_PENTIUM:
19115       /* Address Generation Interlock adds a cycle of latency.  */
19116       if (ix86_agi_dependent (insn, dep_insn, insn_type))
19117         cost += 1;
19118
19119       /* ??? Compares pair with jump/setcc.  */
19120       if (ix86_flags_dependent (insn, dep_insn, insn_type))
19121         cost = 0;
19122
19123       /* Floating point stores require value to be ready one cycle earlier.  */
19124       if (insn_type == TYPE_FMOV
19125           && get_attr_memory (insn) == MEMORY_STORE
19126           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19127         cost += 1;
19128       break;
19129
19130     case PROCESSOR_PENTIUMPRO:
19131       memory = get_attr_memory (insn);
19132
19133       /* INT->FP conversion is expensive.  */
19134       if (get_attr_fp_int_src (dep_insn))
19135         cost += 5;
19136
19137       /* There is one cycle extra latency between an FP op and a store.  */
19138       if (insn_type == TYPE_FMOV
19139           && (set = single_set (dep_insn)) != NULL_RTX
19140           && (set2 = single_set (insn)) != NULL_RTX
19141           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
19142           && MEM_P (SET_DEST (set2)))
19143         cost += 1;
19144
19145       /* Show ability of reorder buffer to hide latency of load by executing
19146          in parallel with previous instruction in case
19147          previous instruction is not needed to compute the address.  */
19148       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19149           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19150         {
19151           /* Claim moves to take one cycle, as core can issue one load
19152              at time and the next load can start cycle later.  */
19153           if (dep_insn_type == TYPE_IMOV
19154               || dep_insn_type == TYPE_FMOV)
19155             cost = 1;
19156           else if (cost > 1)
19157             cost--;
19158         }
19159       break;
19160
19161     case PROCESSOR_K6:
19162       memory = get_attr_memory (insn);
19163
19164       /* The esp dependency is resolved before the instruction is really
19165          finished.  */
19166       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
19167           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
19168         return 1;
19169
19170       /* INT->FP conversion is expensive.  */
19171       if (get_attr_fp_int_src (dep_insn))
19172         cost += 5;
19173
19174       /* Show ability of reorder buffer to hide latency of load by executing
19175          in parallel with previous instruction in case
19176          previous instruction is not needed to compute the address.  */
19177       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19178           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19179         {
19180           /* Claim moves to take one cycle, as core can issue one load
19181              at time and the next load can start cycle later.  */
19182           if (dep_insn_type == TYPE_IMOV
19183               || dep_insn_type == TYPE_FMOV)
19184             cost = 1;
19185           else if (cost > 2)
19186             cost -= 2;
19187           else
19188             cost = 1;
19189         }
19190       break;
19191
19192     case PROCESSOR_ATHLON:
19193     case PROCESSOR_K8:
19194     case PROCESSOR_AMDFAM10:
19195     case PROCESSOR_GENERIC32:
19196     case PROCESSOR_GENERIC64:
19197       memory = get_attr_memory (insn);
19198
19199       /* Show ability of reorder buffer to hide latency of load by executing
19200          in parallel with previous instruction in case
19201          previous instruction is not needed to compute the address.  */
19202       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19203           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19204         {
19205           enum attr_unit unit = get_attr_unit (insn);
19206           int loadcost = 3;
19207
19208           /* Because of the difference between the length of integer and
19209              floating unit pipeline preparation stages, the memory operands
19210              for floating point are cheaper.
19211
19212              ??? For Athlon it the difference is most probably 2.  */
19213           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
19214             loadcost = 3;
19215           else
19216             loadcost = TARGET_ATHLON ? 2 : 0;
19217
19218           if (cost >= loadcost)
19219             cost -= loadcost;
19220           else
19221             cost = 0;
19222         }
19223
19224     default:
19225       break;
19226     }
19227
19228   return cost;
19229 }
19230
19231 /* How many alternative schedules to try.  This should be as wide as the
19232    scheduling freedom in the DFA, but no wider.  Making this value too
19233    large results extra work for the scheduler.  */
19234
19235 static int
19236 ia32_multipass_dfa_lookahead (void)
19237 {
19238   switch (ix86_tune)
19239     {
19240     case PROCESSOR_PENTIUM:
19241       return 2;
19242
19243     case PROCESSOR_PENTIUMPRO:
19244     case PROCESSOR_K6:
19245       return 1;
19246
19247     default:
19248       return 0;
19249     }
19250 }
19251
19252 \f
19253 /* Compute the alignment given to a constant that is being placed in memory.
19254    EXP is the constant and ALIGN is the alignment that the object would
19255    ordinarily have.
19256    The value of this function is used instead of that alignment to align
19257    the object.  */
19258
19259 int
19260 ix86_constant_alignment (tree exp, int align)
19261 {
19262   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
19263       || TREE_CODE (exp) == INTEGER_CST)
19264     {
19265       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
19266         return 64;
19267       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
19268         return 128;
19269     }
19270   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
19271            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
19272     return BITS_PER_WORD;
19273
19274   return align;
19275 }
19276
19277 /* Compute the alignment for a static variable.
19278    TYPE is the data type, and ALIGN is the alignment that
19279    the object would ordinarily have.  The value of this function is used
19280    instead of that alignment to align the object.  */
19281
19282 int
19283 ix86_data_alignment (tree type, int align)
19284 {
19285   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
19286
19287   if (AGGREGATE_TYPE_P (type)
19288       && TYPE_SIZE (type)
19289       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19290       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
19291           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
19292       && align < max_align)
19293     align = max_align;
19294
19295   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19296      to 16byte boundary.  */
19297   if (TARGET_64BIT)
19298     {
19299       if (AGGREGATE_TYPE_P (type)
19300            && TYPE_SIZE (type)
19301            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19302            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
19303                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19304         return 128;
19305     }
19306
19307   if (TREE_CODE (type) == ARRAY_TYPE)
19308     {
19309       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19310         return 64;
19311       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19312         return 128;
19313     }
19314   else if (TREE_CODE (type) == COMPLEX_TYPE)
19315     {
19316
19317       if (TYPE_MODE (type) == DCmode && align < 64)
19318         return 64;
19319       if ((TYPE_MODE (type) == XCmode
19320            || TYPE_MODE (type) == TCmode) && align < 128)
19321         return 128;
19322     }
19323   else if ((TREE_CODE (type) == RECORD_TYPE
19324             || TREE_CODE (type) == UNION_TYPE
19325             || TREE_CODE (type) == QUAL_UNION_TYPE)
19326            && TYPE_FIELDS (type))
19327     {
19328       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19329         return 64;
19330       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19331         return 128;
19332     }
19333   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19334            || TREE_CODE (type) == INTEGER_TYPE)
19335     {
19336       if (TYPE_MODE (type) == DFmode && align < 64)
19337         return 64;
19338       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19339         return 128;
19340     }
19341
19342   return align;
19343 }
19344
19345 /* Compute the alignment for a local variable or a stack slot.  TYPE is
19346    the data type, MODE is the widest mode available and ALIGN is the
19347    alignment that the object would ordinarily have.  The value of this
19348    macro is used instead of that alignment to align the object.  */
19349
19350 unsigned int
19351 ix86_local_alignment (tree type, enum machine_mode mode,
19352                       unsigned int align)
19353 {
19354   /* If TYPE is NULL, we are allocating a stack slot for caller-save
19355      register in MODE.  We will return the largest alignment of XF
19356      and DF.  */
19357   if (!type)
19358     {
19359       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
19360         align = GET_MODE_ALIGNMENT (DFmode);
19361       return align;
19362     }
19363
19364   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19365      to 16byte boundary.  */
19366   if (TARGET_64BIT)
19367     {
19368       if (AGGREGATE_TYPE_P (type)
19369            && TYPE_SIZE (type)
19370            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19371            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
19372                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19373         return 128;
19374     }
19375   if (TREE_CODE (type) == ARRAY_TYPE)
19376     {
19377       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19378         return 64;
19379       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19380         return 128;
19381     }
19382   else if (TREE_CODE (type) == COMPLEX_TYPE)
19383     {
19384       if (TYPE_MODE (type) == DCmode && align < 64)
19385         return 64;
19386       if ((TYPE_MODE (type) == XCmode
19387            || TYPE_MODE (type) == TCmode) && align < 128)
19388         return 128;
19389     }
19390   else if ((TREE_CODE (type) == RECORD_TYPE
19391             || TREE_CODE (type) == UNION_TYPE
19392             || TREE_CODE (type) == QUAL_UNION_TYPE)
19393            && TYPE_FIELDS (type))
19394     {
19395       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19396         return 64;
19397       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19398         return 128;
19399     }
19400   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19401            || TREE_CODE (type) == INTEGER_TYPE)
19402     {
19403
19404       if (TYPE_MODE (type) == DFmode && align < 64)
19405         return 64;
19406       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19407         return 128;
19408     }
19409   return align;
19410 }
19411 \f
19412 /* Emit RTL insns to initialize the variable parts of a trampoline.
19413    FNADDR is an RTX for the address of the function's pure code.
19414    CXT is an RTX for the static chain value for the function.  */
19415 void
19416 x86_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
19417 {
19418   if (!TARGET_64BIT)
19419     {
19420       /* Compute offset from the end of the jmp to the target function.  */
19421       rtx disp = expand_binop (SImode, sub_optab, fnaddr,
19422                                plus_constant (tramp, 10),
19423                                NULL_RTX, 1, OPTAB_DIRECT);
19424       emit_move_insn (gen_rtx_MEM (QImode, tramp),
19425                       gen_int_mode (0xb9, QImode));
19426       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 1)), cxt);
19427       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, 5)),
19428                       gen_int_mode (0xe9, QImode));
19429       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 6)), disp);
19430     }
19431   else
19432     {
19433       int offset = 0;
19434       /* Try to load address using shorter movl instead of movabs.
19435          We may want to support movq for kernel mode, but kernel does not use
19436          trampolines at the moment.  */
19437       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
19438         {
19439           fnaddr = copy_to_mode_reg (DImode, fnaddr);
19440           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19441                           gen_int_mode (0xbb41, HImode));
19442           emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, offset + 2)),
19443                           gen_lowpart (SImode, fnaddr));
19444           offset += 6;
19445         }
19446       else
19447         {
19448           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19449                           gen_int_mode (0xbb49, HImode));
19450           emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19451                           fnaddr);
19452           offset += 10;
19453         }
19454       /* Load static chain using movabs to r10.  */
19455       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19456                       gen_int_mode (0xba49, HImode));
19457       emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19458                       cxt);
19459       offset += 10;
19460       /* Jump to the r11 */
19461       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19462                       gen_int_mode (0xff49, HImode));
19463       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, offset+2)),
19464                       gen_int_mode (0xe3, QImode));
19465       offset += 3;
19466       gcc_assert (offset <= TRAMPOLINE_SIZE);
19467     }
19468
19469 #ifdef ENABLE_EXECUTE_STACK
19470   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
19471                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
19472 #endif
19473 }
19474 \f
19475 /* Codes for all the SSE/MMX builtins.  */
19476 enum ix86_builtins
19477 {
19478   IX86_BUILTIN_ADDPS,
19479   IX86_BUILTIN_ADDSS,
19480   IX86_BUILTIN_DIVPS,
19481   IX86_BUILTIN_DIVSS,
19482   IX86_BUILTIN_MULPS,
19483   IX86_BUILTIN_MULSS,
19484   IX86_BUILTIN_SUBPS,
19485   IX86_BUILTIN_SUBSS,
19486
19487   IX86_BUILTIN_CMPEQPS,
19488   IX86_BUILTIN_CMPLTPS,
19489   IX86_BUILTIN_CMPLEPS,
19490   IX86_BUILTIN_CMPGTPS,
19491   IX86_BUILTIN_CMPGEPS,
19492   IX86_BUILTIN_CMPNEQPS,
19493   IX86_BUILTIN_CMPNLTPS,
19494   IX86_BUILTIN_CMPNLEPS,
19495   IX86_BUILTIN_CMPNGTPS,
19496   IX86_BUILTIN_CMPNGEPS,
19497   IX86_BUILTIN_CMPORDPS,
19498   IX86_BUILTIN_CMPUNORDPS,
19499   IX86_BUILTIN_CMPEQSS,
19500   IX86_BUILTIN_CMPLTSS,
19501   IX86_BUILTIN_CMPLESS,
19502   IX86_BUILTIN_CMPNEQSS,
19503   IX86_BUILTIN_CMPNLTSS,
19504   IX86_BUILTIN_CMPNLESS,
19505   IX86_BUILTIN_CMPNGTSS,
19506   IX86_BUILTIN_CMPNGESS,
19507   IX86_BUILTIN_CMPORDSS,
19508   IX86_BUILTIN_CMPUNORDSS,
19509
19510   IX86_BUILTIN_COMIEQSS,
19511   IX86_BUILTIN_COMILTSS,
19512   IX86_BUILTIN_COMILESS,
19513   IX86_BUILTIN_COMIGTSS,
19514   IX86_BUILTIN_COMIGESS,
19515   IX86_BUILTIN_COMINEQSS,
19516   IX86_BUILTIN_UCOMIEQSS,
19517   IX86_BUILTIN_UCOMILTSS,
19518   IX86_BUILTIN_UCOMILESS,
19519   IX86_BUILTIN_UCOMIGTSS,
19520   IX86_BUILTIN_UCOMIGESS,
19521   IX86_BUILTIN_UCOMINEQSS,
19522
19523   IX86_BUILTIN_CVTPI2PS,
19524   IX86_BUILTIN_CVTPS2PI,
19525   IX86_BUILTIN_CVTSI2SS,
19526   IX86_BUILTIN_CVTSI642SS,
19527   IX86_BUILTIN_CVTSS2SI,
19528   IX86_BUILTIN_CVTSS2SI64,
19529   IX86_BUILTIN_CVTTPS2PI,
19530   IX86_BUILTIN_CVTTSS2SI,
19531   IX86_BUILTIN_CVTTSS2SI64,
19532
19533   IX86_BUILTIN_MAXPS,
19534   IX86_BUILTIN_MAXSS,
19535   IX86_BUILTIN_MINPS,
19536   IX86_BUILTIN_MINSS,
19537
19538   IX86_BUILTIN_LOADUPS,
19539   IX86_BUILTIN_STOREUPS,
19540   IX86_BUILTIN_MOVSS,
19541
19542   IX86_BUILTIN_MOVHLPS,
19543   IX86_BUILTIN_MOVLHPS,
19544   IX86_BUILTIN_LOADHPS,
19545   IX86_BUILTIN_LOADLPS,
19546   IX86_BUILTIN_STOREHPS,
19547   IX86_BUILTIN_STORELPS,
19548
19549   IX86_BUILTIN_MASKMOVQ,
19550   IX86_BUILTIN_MOVMSKPS,
19551   IX86_BUILTIN_PMOVMSKB,
19552
19553   IX86_BUILTIN_MOVNTPS,
19554   IX86_BUILTIN_MOVNTQ,
19555
19556   IX86_BUILTIN_LOADDQU,
19557   IX86_BUILTIN_STOREDQU,
19558
19559   IX86_BUILTIN_PACKSSWB,
19560   IX86_BUILTIN_PACKSSDW,
19561   IX86_BUILTIN_PACKUSWB,
19562
19563   IX86_BUILTIN_PADDB,
19564   IX86_BUILTIN_PADDW,
19565   IX86_BUILTIN_PADDD,
19566   IX86_BUILTIN_PADDQ,
19567   IX86_BUILTIN_PADDSB,
19568   IX86_BUILTIN_PADDSW,
19569   IX86_BUILTIN_PADDUSB,
19570   IX86_BUILTIN_PADDUSW,
19571   IX86_BUILTIN_PSUBB,
19572   IX86_BUILTIN_PSUBW,
19573   IX86_BUILTIN_PSUBD,
19574   IX86_BUILTIN_PSUBQ,
19575   IX86_BUILTIN_PSUBSB,
19576   IX86_BUILTIN_PSUBSW,
19577   IX86_BUILTIN_PSUBUSB,
19578   IX86_BUILTIN_PSUBUSW,
19579
19580   IX86_BUILTIN_PAND,
19581   IX86_BUILTIN_PANDN,
19582   IX86_BUILTIN_POR,
19583   IX86_BUILTIN_PXOR,
19584
19585   IX86_BUILTIN_PAVGB,
19586   IX86_BUILTIN_PAVGW,
19587
19588   IX86_BUILTIN_PCMPEQB,
19589   IX86_BUILTIN_PCMPEQW,
19590   IX86_BUILTIN_PCMPEQD,
19591   IX86_BUILTIN_PCMPGTB,
19592   IX86_BUILTIN_PCMPGTW,
19593   IX86_BUILTIN_PCMPGTD,
19594
19595   IX86_BUILTIN_PMADDWD,
19596
19597   IX86_BUILTIN_PMAXSW,
19598   IX86_BUILTIN_PMAXUB,
19599   IX86_BUILTIN_PMINSW,
19600   IX86_BUILTIN_PMINUB,
19601
19602   IX86_BUILTIN_PMULHUW,
19603   IX86_BUILTIN_PMULHW,
19604   IX86_BUILTIN_PMULLW,
19605
19606   IX86_BUILTIN_PSADBW,
19607   IX86_BUILTIN_PSHUFW,
19608
19609   IX86_BUILTIN_PSLLW,
19610   IX86_BUILTIN_PSLLD,
19611   IX86_BUILTIN_PSLLQ,
19612   IX86_BUILTIN_PSRAW,
19613   IX86_BUILTIN_PSRAD,
19614   IX86_BUILTIN_PSRLW,
19615   IX86_BUILTIN_PSRLD,
19616   IX86_BUILTIN_PSRLQ,
19617   IX86_BUILTIN_PSLLWI,
19618   IX86_BUILTIN_PSLLDI,
19619   IX86_BUILTIN_PSLLQI,
19620   IX86_BUILTIN_PSRAWI,
19621   IX86_BUILTIN_PSRADI,
19622   IX86_BUILTIN_PSRLWI,
19623   IX86_BUILTIN_PSRLDI,
19624   IX86_BUILTIN_PSRLQI,
19625
19626   IX86_BUILTIN_PUNPCKHBW,
19627   IX86_BUILTIN_PUNPCKHWD,
19628   IX86_BUILTIN_PUNPCKHDQ,
19629   IX86_BUILTIN_PUNPCKLBW,
19630   IX86_BUILTIN_PUNPCKLWD,
19631   IX86_BUILTIN_PUNPCKLDQ,
19632
19633   IX86_BUILTIN_SHUFPS,
19634
19635   IX86_BUILTIN_RCPPS,
19636   IX86_BUILTIN_RCPSS,
19637   IX86_BUILTIN_RSQRTPS,
19638   IX86_BUILTIN_RSQRTPS_NR,
19639   IX86_BUILTIN_RSQRTSS,
19640   IX86_BUILTIN_RSQRTF,
19641   IX86_BUILTIN_SQRTPS,
19642   IX86_BUILTIN_SQRTPS_NR,
19643   IX86_BUILTIN_SQRTSS,
19644
19645   IX86_BUILTIN_UNPCKHPS,
19646   IX86_BUILTIN_UNPCKLPS,
19647
19648   IX86_BUILTIN_ANDPS,
19649   IX86_BUILTIN_ANDNPS,
19650   IX86_BUILTIN_ORPS,
19651   IX86_BUILTIN_XORPS,
19652
19653   IX86_BUILTIN_EMMS,
19654   IX86_BUILTIN_LDMXCSR,
19655   IX86_BUILTIN_STMXCSR,
19656   IX86_BUILTIN_SFENCE,
19657
19658   /* 3DNow! Original */
19659   IX86_BUILTIN_FEMMS,
19660   IX86_BUILTIN_PAVGUSB,
19661   IX86_BUILTIN_PF2ID,
19662   IX86_BUILTIN_PFACC,
19663   IX86_BUILTIN_PFADD,
19664   IX86_BUILTIN_PFCMPEQ,
19665   IX86_BUILTIN_PFCMPGE,
19666   IX86_BUILTIN_PFCMPGT,
19667   IX86_BUILTIN_PFMAX,
19668   IX86_BUILTIN_PFMIN,
19669   IX86_BUILTIN_PFMUL,
19670   IX86_BUILTIN_PFRCP,
19671   IX86_BUILTIN_PFRCPIT1,
19672   IX86_BUILTIN_PFRCPIT2,
19673   IX86_BUILTIN_PFRSQIT1,
19674   IX86_BUILTIN_PFRSQRT,
19675   IX86_BUILTIN_PFSUB,
19676   IX86_BUILTIN_PFSUBR,
19677   IX86_BUILTIN_PI2FD,
19678   IX86_BUILTIN_PMULHRW,
19679
19680   /* 3DNow! Athlon Extensions */
19681   IX86_BUILTIN_PF2IW,
19682   IX86_BUILTIN_PFNACC,
19683   IX86_BUILTIN_PFPNACC,
19684   IX86_BUILTIN_PI2FW,
19685   IX86_BUILTIN_PSWAPDSI,
19686   IX86_BUILTIN_PSWAPDSF,
19687
19688   /* SSE2 */
19689   IX86_BUILTIN_ADDPD,
19690   IX86_BUILTIN_ADDSD,
19691   IX86_BUILTIN_DIVPD,
19692   IX86_BUILTIN_DIVSD,
19693   IX86_BUILTIN_MULPD,
19694   IX86_BUILTIN_MULSD,
19695   IX86_BUILTIN_SUBPD,
19696   IX86_BUILTIN_SUBSD,
19697
19698   IX86_BUILTIN_CMPEQPD,
19699   IX86_BUILTIN_CMPLTPD,
19700   IX86_BUILTIN_CMPLEPD,
19701   IX86_BUILTIN_CMPGTPD,
19702   IX86_BUILTIN_CMPGEPD,
19703   IX86_BUILTIN_CMPNEQPD,
19704   IX86_BUILTIN_CMPNLTPD,
19705   IX86_BUILTIN_CMPNLEPD,
19706   IX86_BUILTIN_CMPNGTPD,
19707   IX86_BUILTIN_CMPNGEPD,
19708   IX86_BUILTIN_CMPORDPD,
19709   IX86_BUILTIN_CMPUNORDPD,
19710   IX86_BUILTIN_CMPEQSD,
19711   IX86_BUILTIN_CMPLTSD,
19712   IX86_BUILTIN_CMPLESD,
19713   IX86_BUILTIN_CMPNEQSD,
19714   IX86_BUILTIN_CMPNLTSD,
19715   IX86_BUILTIN_CMPNLESD,
19716   IX86_BUILTIN_CMPORDSD,
19717   IX86_BUILTIN_CMPUNORDSD,
19718
19719   IX86_BUILTIN_COMIEQSD,
19720   IX86_BUILTIN_COMILTSD,
19721   IX86_BUILTIN_COMILESD,
19722   IX86_BUILTIN_COMIGTSD,
19723   IX86_BUILTIN_COMIGESD,
19724   IX86_BUILTIN_COMINEQSD,
19725   IX86_BUILTIN_UCOMIEQSD,
19726   IX86_BUILTIN_UCOMILTSD,
19727   IX86_BUILTIN_UCOMILESD,
19728   IX86_BUILTIN_UCOMIGTSD,
19729   IX86_BUILTIN_UCOMIGESD,
19730   IX86_BUILTIN_UCOMINEQSD,
19731
19732   IX86_BUILTIN_MAXPD,
19733   IX86_BUILTIN_MAXSD,
19734   IX86_BUILTIN_MINPD,
19735   IX86_BUILTIN_MINSD,
19736
19737   IX86_BUILTIN_ANDPD,
19738   IX86_BUILTIN_ANDNPD,
19739   IX86_BUILTIN_ORPD,
19740   IX86_BUILTIN_XORPD,
19741
19742   IX86_BUILTIN_SQRTPD,
19743   IX86_BUILTIN_SQRTSD,
19744
19745   IX86_BUILTIN_UNPCKHPD,
19746   IX86_BUILTIN_UNPCKLPD,
19747
19748   IX86_BUILTIN_SHUFPD,
19749
19750   IX86_BUILTIN_LOADUPD,
19751   IX86_BUILTIN_STOREUPD,
19752   IX86_BUILTIN_MOVSD,
19753
19754   IX86_BUILTIN_LOADHPD,
19755   IX86_BUILTIN_LOADLPD,
19756
19757   IX86_BUILTIN_CVTDQ2PD,
19758   IX86_BUILTIN_CVTDQ2PS,
19759
19760   IX86_BUILTIN_CVTPD2DQ,
19761   IX86_BUILTIN_CVTPD2PI,
19762   IX86_BUILTIN_CVTPD2PS,
19763   IX86_BUILTIN_CVTTPD2DQ,
19764   IX86_BUILTIN_CVTTPD2PI,
19765
19766   IX86_BUILTIN_CVTPI2PD,
19767   IX86_BUILTIN_CVTSI2SD,
19768   IX86_BUILTIN_CVTSI642SD,
19769
19770   IX86_BUILTIN_CVTSD2SI,
19771   IX86_BUILTIN_CVTSD2SI64,
19772   IX86_BUILTIN_CVTSD2SS,
19773   IX86_BUILTIN_CVTSS2SD,
19774   IX86_BUILTIN_CVTTSD2SI,
19775   IX86_BUILTIN_CVTTSD2SI64,
19776
19777   IX86_BUILTIN_CVTPS2DQ,
19778   IX86_BUILTIN_CVTPS2PD,
19779   IX86_BUILTIN_CVTTPS2DQ,
19780
19781   IX86_BUILTIN_MOVNTI,
19782   IX86_BUILTIN_MOVNTPD,
19783   IX86_BUILTIN_MOVNTDQ,
19784
19785   IX86_BUILTIN_MOVQ128,
19786
19787   /* SSE2 MMX */
19788   IX86_BUILTIN_MASKMOVDQU,
19789   IX86_BUILTIN_MOVMSKPD,
19790   IX86_BUILTIN_PMOVMSKB128,
19791
19792   IX86_BUILTIN_PACKSSWB128,
19793   IX86_BUILTIN_PACKSSDW128,
19794   IX86_BUILTIN_PACKUSWB128,
19795
19796   IX86_BUILTIN_PADDB128,
19797   IX86_BUILTIN_PADDW128,
19798   IX86_BUILTIN_PADDD128,
19799   IX86_BUILTIN_PADDQ128,
19800   IX86_BUILTIN_PADDSB128,
19801   IX86_BUILTIN_PADDSW128,
19802   IX86_BUILTIN_PADDUSB128,
19803   IX86_BUILTIN_PADDUSW128,
19804   IX86_BUILTIN_PSUBB128,
19805   IX86_BUILTIN_PSUBW128,
19806   IX86_BUILTIN_PSUBD128,
19807   IX86_BUILTIN_PSUBQ128,
19808   IX86_BUILTIN_PSUBSB128,
19809   IX86_BUILTIN_PSUBSW128,
19810   IX86_BUILTIN_PSUBUSB128,
19811   IX86_BUILTIN_PSUBUSW128,
19812
19813   IX86_BUILTIN_PAND128,
19814   IX86_BUILTIN_PANDN128,
19815   IX86_BUILTIN_POR128,
19816   IX86_BUILTIN_PXOR128,
19817
19818   IX86_BUILTIN_PAVGB128,
19819   IX86_BUILTIN_PAVGW128,
19820
19821   IX86_BUILTIN_PCMPEQB128,
19822   IX86_BUILTIN_PCMPEQW128,
19823   IX86_BUILTIN_PCMPEQD128,
19824   IX86_BUILTIN_PCMPGTB128,
19825   IX86_BUILTIN_PCMPGTW128,
19826   IX86_BUILTIN_PCMPGTD128,
19827
19828   IX86_BUILTIN_PMADDWD128,
19829
19830   IX86_BUILTIN_PMAXSW128,
19831   IX86_BUILTIN_PMAXUB128,
19832   IX86_BUILTIN_PMINSW128,
19833   IX86_BUILTIN_PMINUB128,
19834
19835   IX86_BUILTIN_PMULUDQ,
19836   IX86_BUILTIN_PMULUDQ128,
19837   IX86_BUILTIN_PMULHUW128,
19838   IX86_BUILTIN_PMULHW128,
19839   IX86_BUILTIN_PMULLW128,
19840
19841   IX86_BUILTIN_PSADBW128,
19842   IX86_BUILTIN_PSHUFHW,
19843   IX86_BUILTIN_PSHUFLW,
19844   IX86_BUILTIN_PSHUFD,
19845
19846   IX86_BUILTIN_PSLLDQI128,
19847   IX86_BUILTIN_PSLLWI128,
19848   IX86_BUILTIN_PSLLDI128,
19849   IX86_BUILTIN_PSLLQI128,
19850   IX86_BUILTIN_PSRAWI128,
19851   IX86_BUILTIN_PSRADI128,
19852   IX86_BUILTIN_PSRLDQI128,
19853   IX86_BUILTIN_PSRLWI128,
19854   IX86_BUILTIN_PSRLDI128,
19855   IX86_BUILTIN_PSRLQI128,
19856
19857   IX86_BUILTIN_PSLLDQ128,
19858   IX86_BUILTIN_PSLLW128,
19859   IX86_BUILTIN_PSLLD128,
19860   IX86_BUILTIN_PSLLQ128,
19861   IX86_BUILTIN_PSRAW128,
19862   IX86_BUILTIN_PSRAD128,
19863   IX86_BUILTIN_PSRLW128,
19864   IX86_BUILTIN_PSRLD128,
19865   IX86_BUILTIN_PSRLQ128,
19866
19867   IX86_BUILTIN_PUNPCKHBW128,
19868   IX86_BUILTIN_PUNPCKHWD128,
19869   IX86_BUILTIN_PUNPCKHDQ128,
19870   IX86_BUILTIN_PUNPCKHQDQ128,
19871   IX86_BUILTIN_PUNPCKLBW128,
19872   IX86_BUILTIN_PUNPCKLWD128,
19873   IX86_BUILTIN_PUNPCKLDQ128,
19874   IX86_BUILTIN_PUNPCKLQDQ128,
19875
19876   IX86_BUILTIN_CLFLUSH,
19877   IX86_BUILTIN_MFENCE,
19878   IX86_BUILTIN_LFENCE,
19879
19880   /* SSE3.  */
19881   IX86_BUILTIN_ADDSUBPS,
19882   IX86_BUILTIN_HADDPS,
19883   IX86_BUILTIN_HSUBPS,
19884   IX86_BUILTIN_MOVSHDUP,
19885   IX86_BUILTIN_MOVSLDUP,
19886   IX86_BUILTIN_ADDSUBPD,
19887   IX86_BUILTIN_HADDPD,
19888   IX86_BUILTIN_HSUBPD,
19889   IX86_BUILTIN_LDDQU,
19890
19891   IX86_BUILTIN_MONITOR,
19892   IX86_BUILTIN_MWAIT,
19893
19894   /* SSSE3.  */
19895   IX86_BUILTIN_PHADDW,
19896   IX86_BUILTIN_PHADDD,
19897   IX86_BUILTIN_PHADDSW,
19898   IX86_BUILTIN_PHSUBW,
19899   IX86_BUILTIN_PHSUBD,
19900   IX86_BUILTIN_PHSUBSW,
19901   IX86_BUILTIN_PMADDUBSW,
19902   IX86_BUILTIN_PMULHRSW,
19903   IX86_BUILTIN_PSHUFB,
19904   IX86_BUILTIN_PSIGNB,
19905   IX86_BUILTIN_PSIGNW,
19906   IX86_BUILTIN_PSIGND,
19907   IX86_BUILTIN_PALIGNR,
19908   IX86_BUILTIN_PABSB,
19909   IX86_BUILTIN_PABSW,
19910   IX86_BUILTIN_PABSD,
19911
19912   IX86_BUILTIN_PHADDW128,
19913   IX86_BUILTIN_PHADDD128,
19914   IX86_BUILTIN_PHADDSW128,
19915   IX86_BUILTIN_PHSUBW128,
19916   IX86_BUILTIN_PHSUBD128,
19917   IX86_BUILTIN_PHSUBSW128,
19918   IX86_BUILTIN_PMADDUBSW128,
19919   IX86_BUILTIN_PMULHRSW128,
19920   IX86_BUILTIN_PSHUFB128,
19921   IX86_BUILTIN_PSIGNB128,
19922   IX86_BUILTIN_PSIGNW128,
19923   IX86_BUILTIN_PSIGND128,
19924   IX86_BUILTIN_PALIGNR128,
19925   IX86_BUILTIN_PABSB128,
19926   IX86_BUILTIN_PABSW128,
19927   IX86_BUILTIN_PABSD128,
19928
19929   /* AMDFAM10 - SSE4A New Instructions.  */
19930   IX86_BUILTIN_MOVNTSD,
19931   IX86_BUILTIN_MOVNTSS,
19932   IX86_BUILTIN_EXTRQI,
19933   IX86_BUILTIN_EXTRQ,
19934   IX86_BUILTIN_INSERTQI,
19935   IX86_BUILTIN_INSERTQ,
19936
19937   /* SSE4.1.  */
19938   IX86_BUILTIN_BLENDPD,
19939   IX86_BUILTIN_BLENDPS,
19940   IX86_BUILTIN_BLENDVPD,
19941   IX86_BUILTIN_BLENDVPS,
19942   IX86_BUILTIN_PBLENDVB128,
19943   IX86_BUILTIN_PBLENDW128,
19944
19945   IX86_BUILTIN_DPPD,
19946   IX86_BUILTIN_DPPS,
19947
19948   IX86_BUILTIN_INSERTPS128,
19949
19950   IX86_BUILTIN_MOVNTDQA,
19951   IX86_BUILTIN_MPSADBW128,
19952   IX86_BUILTIN_PACKUSDW128,
19953   IX86_BUILTIN_PCMPEQQ,
19954   IX86_BUILTIN_PHMINPOSUW128,
19955
19956   IX86_BUILTIN_PMAXSB128,
19957   IX86_BUILTIN_PMAXSD128,
19958   IX86_BUILTIN_PMAXUD128,
19959   IX86_BUILTIN_PMAXUW128,
19960
19961   IX86_BUILTIN_PMINSB128,
19962   IX86_BUILTIN_PMINSD128,
19963   IX86_BUILTIN_PMINUD128,
19964   IX86_BUILTIN_PMINUW128,
19965
19966   IX86_BUILTIN_PMOVSXBW128,
19967   IX86_BUILTIN_PMOVSXBD128,
19968   IX86_BUILTIN_PMOVSXBQ128,
19969   IX86_BUILTIN_PMOVSXWD128,
19970   IX86_BUILTIN_PMOVSXWQ128,
19971   IX86_BUILTIN_PMOVSXDQ128,
19972
19973   IX86_BUILTIN_PMOVZXBW128,
19974   IX86_BUILTIN_PMOVZXBD128,
19975   IX86_BUILTIN_PMOVZXBQ128,
19976   IX86_BUILTIN_PMOVZXWD128,
19977   IX86_BUILTIN_PMOVZXWQ128,
19978   IX86_BUILTIN_PMOVZXDQ128,
19979
19980   IX86_BUILTIN_PMULDQ128,
19981   IX86_BUILTIN_PMULLD128,
19982
19983   IX86_BUILTIN_ROUNDPD,
19984   IX86_BUILTIN_ROUNDPS,
19985   IX86_BUILTIN_ROUNDSD,
19986   IX86_BUILTIN_ROUNDSS,
19987
19988   IX86_BUILTIN_PTESTZ,
19989   IX86_BUILTIN_PTESTC,
19990   IX86_BUILTIN_PTESTNZC,
19991
19992   IX86_BUILTIN_VEC_INIT_V2SI,
19993   IX86_BUILTIN_VEC_INIT_V4HI,
19994   IX86_BUILTIN_VEC_INIT_V8QI,
19995   IX86_BUILTIN_VEC_EXT_V2DF,
19996   IX86_BUILTIN_VEC_EXT_V2DI,
19997   IX86_BUILTIN_VEC_EXT_V4SF,
19998   IX86_BUILTIN_VEC_EXT_V4SI,
19999   IX86_BUILTIN_VEC_EXT_V8HI,
20000   IX86_BUILTIN_VEC_EXT_V2SI,
20001   IX86_BUILTIN_VEC_EXT_V4HI,
20002   IX86_BUILTIN_VEC_EXT_V16QI,
20003   IX86_BUILTIN_VEC_SET_V2DI,
20004   IX86_BUILTIN_VEC_SET_V4SF,
20005   IX86_BUILTIN_VEC_SET_V4SI,
20006   IX86_BUILTIN_VEC_SET_V8HI,
20007   IX86_BUILTIN_VEC_SET_V4HI,
20008   IX86_BUILTIN_VEC_SET_V16QI,
20009
20010   IX86_BUILTIN_VEC_PACK_SFIX,
20011
20012   /* SSE4.2.  */
20013   IX86_BUILTIN_CRC32QI,
20014   IX86_BUILTIN_CRC32HI,
20015   IX86_BUILTIN_CRC32SI,
20016   IX86_BUILTIN_CRC32DI,
20017
20018   IX86_BUILTIN_PCMPESTRI128,
20019   IX86_BUILTIN_PCMPESTRM128,
20020   IX86_BUILTIN_PCMPESTRA128,
20021   IX86_BUILTIN_PCMPESTRC128,
20022   IX86_BUILTIN_PCMPESTRO128,
20023   IX86_BUILTIN_PCMPESTRS128,
20024   IX86_BUILTIN_PCMPESTRZ128,
20025   IX86_BUILTIN_PCMPISTRI128,
20026   IX86_BUILTIN_PCMPISTRM128,
20027   IX86_BUILTIN_PCMPISTRA128,
20028   IX86_BUILTIN_PCMPISTRC128,
20029   IX86_BUILTIN_PCMPISTRO128,
20030   IX86_BUILTIN_PCMPISTRS128,
20031   IX86_BUILTIN_PCMPISTRZ128,
20032
20033   IX86_BUILTIN_PCMPGTQ,
20034
20035   /* AES instructions */
20036   IX86_BUILTIN_AESENC128,
20037   IX86_BUILTIN_AESENCLAST128,
20038   IX86_BUILTIN_AESDEC128,
20039   IX86_BUILTIN_AESDECLAST128,
20040   IX86_BUILTIN_AESIMC128,
20041   IX86_BUILTIN_AESKEYGENASSIST128,
20042
20043   /* PCLMUL instruction */
20044   IX86_BUILTIN_PCLMULQDQ128,
20045
20046   /* AVX */
20047   IX86_BUILTIN_ADDPD256,
20048   IX86_BUILTIN_ADDPS256,
20049   IX86_BUILTIN_ADDSUBPD256,
20050   IX86_BUILTIN_ADDSUBPS256,
20051   IX86_BUILTIN_ANDPD256,
20052   IX86_BUILTIN_ANDPS256,
20053   IX86_BUILTIN_ANDNPD256,
20054   IX86_BUILTIN_ANDNPS256,
20055   IX86_BUILTIN_BLENDPD256,
20056   IX86_BUILTIN_BLENDPS256,
20057   IX86_BUILTIN_BLENDVPD256,
20058   IX86_BUILTIN_BLENDVPS256,
20059   IX86_BUILTIN_DIVPD256,
20060   IX86_BUILTIN_DIVPS256,
20061   IX86_BUILTIN_DPPS256,
20062   IX86_BUILTIN_HADDPD256,
20063   IX86_BUILTIN_HADDPS256,
20064   IX86_BUILTIN_HSUBPD256,
20065   IX86_BUILTIN_HSUBPS256,
20066   IX86_BUILTIN_MAXPD256,
20067   IX86_BUILTIN_MAXPS256,
20068   IX86_BUILTIN_MINPD256,
20069   IX86_BUILTIN_MINPS256,
20070   IX86_BUILTIN_MULPD256,
20071   IX86_BUILTIN_MULPS256,
20072   IX86_BUILTIN_ORPD256,
20073   IX86_BUILTIN_ORPS256,
20074   IX86_BUILTIN_SHUFPD256,
20075   IX86_BUILTIN_SHUFPS256,
20076   IX86_BUILTIN_SUBPD256,
20077   IX86_BUILTIN_SUBPS256,
20078   IX86_BUILTIN_XORPD256,
20079   IX86_BUILTIN_XORPS256,
20080   IX86_BUILTIN_CMPSD,
20081   IX86_BUILTIN_CMPSS,
20082   IX86_BUILTIN_CMPPD,
20083   IX86_BUILTIN_CMPPS,
20084   IX86_BUILTIN_CMPPD256,
20085   IX86_BUILTIN_CMPPS256,
20086   IX86_BUILTIN_CVTDQ2PD256,
20087   IX86_BUILTIN_CVTDQ2PS256,
20088   IX86_BUILTIN_CVTPD2PS256,
20089   IX86_BUILTIN_CVTPS2DQ256,
20090   IX86_BUILTIN_CVTPS2PD256,
20091   IX86_BUILTIN_CVTTPD2DQ256,
20092   IX86_BUILTIN_CVTPD2DQ256,
20093   IX86_BUILTIN_CVTTPS2DQ256,
20094   IX86_BUILTIN_EXTRACTF128PD256,
20095   IX86_BUILTIN_EXTRACTF128PS256,
20096   IX86_BUILTIN_EXTRACTF128SI256,
20097   IX86_BUILTIN_VZEROALL,
20098   IX86_BUILTIN_VZEROUPPER,
20099   IX86_BUILTIN_VZEROUPPER_REX64,
20100   IX86_BUILTIN_VPERMILVARPD,
20101   IX86_BUILTIN_VPERMILVARPS,
20102   IX86_BUILTIN_VPERMILVARPD256,
20103   IX86_BUILTIN_VPERMILVARPS256,
20104   IX86_BUILTIN_VPERMILPD,
20105   IX86_BUILTIN_VPERMILPS,
20106   IX86_BUILTIN_VPERMILPD256,
20107   IX86_BUILTIN_VPERMILPS256,
20108   IX86_BUILTIN_VPERM2F128PD256,
20109   IX86_BUILTIN_VPERM2F128PS256,
20110   IX86_BUILTIN_VPERM2F128SI256,
20111   IX86_BUILTIN_VBROADCASTSS,
20112   IX86_BUILTIN_VBROADCASTSD256,
20113   IX86_BUILTIN_VBROADCASTSS256,
20114   IX86_BUILTIN_VBROADCASTPD256,
20115   IX86_BUILTIN_VBROADCASTPS256,
20116   IX86_BUILTIN_VINSERTF128PD256,
20117   IX86_BUILTIN_VINSERTF128PS256,
20118   IX86_BUILTIN_VINSERTF128SI256,
20119   IX86_BUILTIN_LOADUPD256,
20120   IX86_BUILTIN_LOADUPS256,
20121   IX86_BUILTIN_STOREUPD256,
20122   IX86_BUILTIN_STOREUPS256,
20123   IX86_BUILTIN_LDDQU256,
20124   IX86_BUILTIN_MOVNTDQ256,
20125   IX86_BUILTIN_MOVNTPD256,
20126   IX86_BUILTIN_MOVNTPS256,
20127   IX86_BUILTIN_LOADDQU256,
20128   IX86_BUILTIN_STOREDQU256,
20129   IX86_BUILTIN_MASKLOADPD,
20130   IX86_BUILTIN_MASKLOADPS,
20131   IX86_BUILTIN_MASKSTOREPD,
20132   IX86_BUILTIN_MASKSTOREPS,
20133   IX86_BUILTIN_MASKLOADPD256,
20134   IX86_BUILTIN_MASKLOADPS256,
20135   IX86_BUILTIN_MASKSTOREPD256,
20136   IX86_BUILTIN_MASKSTOREPS256,
20137   IX86_BUILTIN_MOVSHDUP256,
20138   IX86_BUILTIN_MOVSLDUP256,
20139   IX86_BUILTIN_MOVDDUP256,
20140
20141   IX86_BUILTIN_SQRTPD256,
20142   IX86_BUILTIN_SQRTPS256,
20143   IX86_BUILTIN_SQRTPS_NR256,
20144   IX86_BUILTIN_RSQRTPS256,
20145   IX86_BUILTIN_RSQRTPS_NR256,
20146
20147   IX86_BUILTIN_RCPPS256,
20148
20149   IX86_BUILTIN_ROUNDPD256,
20150   IX86_BUILTIN_ROUNDPS256,
20151
20152   IX86_BUILTIN_UNPCKHPD256,
20153   IX86_BUILTIN_UNPCKLPD256,
20154   IX86_BUILTIN_UNPCKHPS256,
20155   IX86_BUILTIN_UNPCKLPS256,
20156
20157   IX86_BUILTIN_SI256_SI,
20158   IX86_BUILTIN_PS256_PS,
20159   IX86_BUILTIN_PD256_PD,
20160   IX86_BUILTIN_SI_SI256,
20161   IX86_BUILTIN_PS_PS256,
20162   IX86_BUILTIN_PD_PD256,
20163
20164   IX86_BUILTIN_VTESTZPD,
20165   IX86_BUILTIN_VTESTCPD,
20166   IX86_BUILTIN_VTESTNZCPD,
20167   IX86_BUILTIN_VTESTZPS,
20168   IX86_BUILTIN_VTESTCPS,
20169   IX86_BUILTIN_VTESTNZCPS,
20170   IX86_BUILTIN_VTESTZPD256,
20171   IX86_BUILTIN_VTESTCPD256,
20172   IX86_BUILTIN_VTESTNZCPD256,
20173   IX86_BUILTIN_VTESTZPS256,
20174   IX86_BUILTIN_VTESTCPS256,
20175   IX86_BUILTIN_VTESTNZCPS256,
20176   IX86_BUILTIN_PTESTZ256,
20177   IX86_BUILTIN_PTESTC256,
20178   IX86_BUILTIN_PTESTNZC256,
20179
20180   IX86_BUILTIN_MOVMSKPD256,
20181   IX86_BUILTIN_MOVMSKPS256,
20182
20183   /* TFmode support builtins.  */
20184   IX86_BUILTIN_INFQ,
20185   IX86_BUILTIN_FABSQ,
20186   IX86_BUILTIN_COPYSIGNQ,
20187
20188   /* SSE5 instructions */
20189   IX86_BUILTIN_FMADDSS,
20190   IX86_BUILTIN_FMADDSD,
20191   IX86_BUILTIN_FMADDPS,
20192   IX86_BUILTIN_FMADDPD,
20193   IX86_BUILTIN_FMSUBSS,
20194   IX86_BUILTIN_FMSUBSD,
20195   IX86_BUILTIN_FMSUBPS,
20196   IX86_BUILTIN_FMSUBPD,
20197   IX86_BUILTIN_FNMADDSS,
20198   IX86_BUILTIN_FNMADDSD,
20199   IX86_BUILTIN_FNMADDPS,
20200   IX86_BUILTIN_FNMADDPD,
20201   IX86_BUILTIN_FNMSUBSS,
20202   IX86_BUILTIN_FNMSUBSD,
20203   IX86_BUILTIN_FNMSUBPS,
20204   IX86_BUILTIN_FNMSUBPD,
20205   IX86_BUILTIN_PCMOV,
20206   IX86_BUILTIN_PCMOV_V2DI,
20207   IX86_BUILTIN_PCMOV_V4SI,
20208   IX86_BUILTIN_PCMOV_V8HI,
20209   IX86_BUILTIN_PCMOV_V16QI,
20210   IX86_BUILTIN_PCMOV_V4SF,
20211   IX86_BUILTIN_PCMOV_V2DF,
20212   IX86_BUILTIN_PPERM,
20213   IX86_BUILTIN_PERMPS,
20214   IX86_BUILTIN_PERMPD,
20215   IX86_BUILTIN_PMACSSWW,
20216   IX86_BUILTIN_PMACSWW,
20217   IX86_BUILTIN_PMACSSWD,
20218   IX86_BUILTIN_PMACSWD,
20219   IX86_BUILTIN_PMACSSDD,
20220   IX86_BUILTIN_PMACSDD,
20221   IX86_BUILTIN_PMACSSDQL,
20222   IX86_BUILTIN_PMACSSDQH,
20223   IX86_BUILTIN_PMACSDQL,
20224   IX86_BUILTIN_PMACSDQH,
20225   IX86_BUILTIN_PMADCSSWD,
20226   IX86_BUILTIN_PMADCSWD,
20227   IX86_BUILTIN_PHADDBW,
20228   IX86_BUILTIN_PHADDBD,
20229   IX86_BUILTIN_PHADDBQ,
20230   IX86_BUILTIN_PHADDWD,
20231   IX86_BUILTIN_PHADDWQ,
20232   IX86_BUILTIN_PHADDDQ,
20233   IX86_BUILTIN_PHADDUBW,
20234   IX86_BUILTIN_PHADDUBD,
20235   IX86_BUILTIN_PHADDUBQ,
20236   IX86_BUILTIN_PHADDUWD,
20237   IX86_BUILTIN_PHADDUWQ,
20238   IX86_BUILTIN_PHADDUDQ,
20239   IX86_BUILTIN_PHSUBBW,
20240   IX86_BUILTIN_PHSUBWD,
20241   IX86_BUILTIN_PHSUBDQ,
20242   IX86_BUILTIN_PROTB,
20243   IX86_BUILTIN_PROTW,
20244   IX86_BUILTIN_PROTD,
20245   IX86_BUILTIN_PROTQ,
20246   IX86_BUILTIN_PROTB_IMM,
20247   IX86_BUILTIN_PROTW_IMM,
20248   IX86_BUILTIN_PROTD_IMM,
20249   IX86_BUILTIN_PROTQ_IMM,
20250   IX86_BUILTIN_PSHLB,
20251   IX86_BUILTIN_PSHLW,
20252   IX86_BUILTIN_PSHLD,
20253   IX86_BUILTIN_PSHLQ,
20254   IX86_BUILTIN_PSHAB,
20255   IX86_BUILTIN_PSHAW,
20256   IX86_BUILTIN_PSHAD,
20257   IX86_BUILTIN_PSHAQ,
20258   IX86_BUILTIN_FRCZSS,
20259   IX86_BUILTIN_FRCZSD,
20260   IX86_BUILTIN_FRCZPS,
20261   IX86_BUILTIN_FRCZPD,
20262   IX86_BUILTIN_CVTPH2PS,
20263   IX86_BUILTIN_CVTPS2PH,
20264
20265   IX86_BUILTIN_COMEQSS,
20266   IX86_BUILTIN_COMNESS,
20267   IX86_BUILTIN_COMLTSS,
20268   IX86_BUILTIN_COMLESS,
20269   IX86_BUILTIN_COMGTSS,
20270   IX86_BUILTIN_COMGESS,
20271   IX86_BUILTIN_COMUEQSS,
20272   IX86_BUILTIN_COMUNESS,
20273   IX86_BUILTIN_COMULTSS,
20274   IX86_BUILTIN_COMULESS,
20275   IX86_BUILTIN_COMUGTSS,
20276   IX86_BUILTIN_COMUGESS,
20277   IX86_BUILTIN_COMORDSS,
20278   IX86_BUILTIN_COMUNORDSS,
20279   IX86_BUILTIN_COMFALSESS,
20280   IX86_BUILTIN_COMTRUESS,
20281
20282   IX86_BUILTIN_COMEQSD,
20283   IX86_BUILTIN_COMNESD,
20284   IX86_BUILTIN_COMLTSD,
20285   IX86_BUILTIN_COMLESD,
20286   IX86_BUILTIN_COMGTSD,
20287   IX86_BUILTIN_COMGESD,
20288   IX86_BUILTIN_COMUEQSD,
20289   IX86_BUILTIN_COMUNESD,
20290   IX86_BUILTIN_COMULTSD,
20291   IX86_BUILTIN_COMULESD,
20292   IX86_BUILTIN_COMUGTSD,
20293   IX86_BUILTIN_COMUGESD,
20294   IX86_BUILTIN_COMORDSD,
20295   IX86_BUILTIN_COMUNORDSD,
20296   IX86_BUILTIN_COMFALSESD,
20297   IX86_BUILTIN_COMTRUESD,
20298
20299   IX86_BUILTIN_COMEQPS,
20300   IX86_BUILTIN_COMNEPS,
20301   IX86_BUILTIN_COMLTPS,
20302   IX86_BUILTIN_COMLEPS,
20303   IX86_BUILTIN_COMGTPS,
20304   IX86_BUILTIN_COMGEPS,
20305   IX86_BUILTIN_COMUEQPS,
20306   IX86_BUILTIN_COMUNEPS,
20307   IX86_BUILTIN_COMULTPS,
20308   IX86_BUILTIN_COMULEPS,
20309   IX86_BUILTIN_COMUGTPS,
20310   IX86_BUILTIN_COMUGEPS,
20311   IX86_BUILTIN_COMORDPS,
20312   IX86_BUILTIN_COMUNORDPS,
20313   IX86_BUILTIN_COMFALSEPS,
20314   IX86_BUILTIN_COMTRUEPS,
20315
20316   IX86_BUILTIN_COMEQPD,
20317   IX86_BUILTIN_COMNEPD,
20318   IX86_BUILTIN_COMLTPD,
20319   IX86_BUILTIN_COMLEPD,
20320   IX86_BUILTIN_COMGTPD,
20321   IX86_BUILTIN_COMGEPD,
20322   IX86_BUILTIN_COMUEQPD,
20323   IX86_BUILTIN_COMUNEPD,
20324   IX86_BUILTIN_COMULTPD,
20325   IX86_BUILTIN_COMULEPD,
20326   IX86_BUILTIN_COMUGTPD,
20327   IX86_BUILTIN_COMUGEPD,
20328   IX86_BUILTIN_COMORDPD,
20329   IX86_BUILTIN_COMUNORDPD,
20330   IX86_BUILTIN_COMFALSEPD,
20331   IX86_BUILTIN_COMTRUEPD,
20332
20333   IX86_BUILTIN_PCOMEQUB,
20334   IX86_BUILTIN_PCOMNEUB,
20335   IX86_BUILTIN_PCOMLTUB,
20336   IX86_BUILTIN_PCOMLEUB,
20337   IX86_BUILTIN_PCOMGTUB,
20338   IX86_BUILTIN_PCOMGEUB,
20339   IX86_BUILTIN_PCOMFALSEUB,
20340   IX86_BUILTIN_PCOMTRUEUB,
20341   IX86_BUILTIN_PCOMEQUW,
20342   IX86_BUILTIN_PCOMNEUW,
20343   IX86_BUILTIN_PCOMLTUW,
20344   IX86_BUILTIN_PCOMLEUW,
20345   IX86_BUILTIN_PCOMGTUW,
20346   IX86_BUILTIN_PCOMGEUW,
20347   IX86_BUILTIN_PCOMFALSEUW,
20348   IX86_BUILTIN_PCOMTRUEUW,
20349   IX86_BUILTIN_PCOMEQUD,
20350   IX86_BUILTIN_PCOMNEUD,
20351   IX86_BUILTIN_PCOMLTUD,
20352   IX86_BUILTIN_PCOMLEUD,
20353   IX86_BUILTIN_PCOMGTUD,
20354   IX86_BUILTIN_PCOMGEUD,
20355   IX86_BUILTIN_PCOMFALSEUD,
20356   IX86_BUILTIN_PCOMTRUEUD,
20357   IX86_BUILTIN_PCOMEQUQ,
20358   IX86_BUILTIN_PCOMNEUQ,
20359   IX86_BUILTIN_PCOMLTUQ,
20360   IX86_BUILTIN_PCOMLEUQ,
20361   IX86_BUILTIN_PCOMGTUQ,
20362   IX86_BUILTIN_PCOMGEUQ,
20363   IX86_BUILTIN_PCOMFALSEUQ,
20364   IX86_BUILTIN_PCOMTRUEUQ,
20365
20366   IX86_BUILTIN_PCOMEQB,
20367   IX86_BUILTIN_PCOMNEB,
20368   IX86_BUILTIN_PCOMLTB,
20369   IX86_BUILTIN_PCOMLEB,
20370   IX86_BUILTIN_PCOMGTB,
20371   IX86_BUILTIN_PCOMGEB,
20372   IX86_BUILTIN_PCOMFALSEB,
20373   IX86_BUILTIN_PCOMTRUEB,
20374   IX86_BUILTIN_PCOMEQW,
20375   IX86_BUILTIN_PCOMNEW,
20376   IX86_BUILTIN_PCOMLTW,
20377   IX86_BUILTIN_PCOMLEW,
20378   IX86_BUILTIN_PCOMGTW,
20379   IX86_BUILTIN_PCOMGEW,
20380   IX86_BUILTIN_PCOMFALSEW,
20381   IX86_BUILTIN_PCOMTRUEW,
20382   IX86_BUILTIN_PCOMEQD,
20383   IX86_BUILTIN_PCOMNED,
20384   IX86_BUILTIN_PCOMLTD,
20385   IX86_BUILTIN_PCOMLED,
20386   IX86_BUILTIN_PCOMGTD,
20387   IX86_BUILTIN_PCOMGED,
20388   IX86_BUILTIN_PCOMFALSED,
20389   IX86_BUILTIN_PCOMTRUED,
20390   IX86_BUILTIN_PCOMEQQ,
20391   IX86_BUILTIN_PCOMNEQ,
20392   IX86_BUILTIN_PCOMLTQ,
20393   IX86_BUILTIN_PCOMLEQ,
20394   IX86_BUILTIN_PCOMGTQ,
20395   IX86_BUILTIN_PCOMGEQ,
20396   IX86_BUILTIN_PCOMFALSEQ,
20397   IX86_BUILTIN_PCOMTRUEQ,
20398
20399   IX86_BUILTIN_MAX
20400 };
20401
20402 /* Table for the ix86 builtin decls.  */
20403 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
20404
20405 /* Table of all of the builtin functions that are possible with different ISA's
20406    but are waiting to be built until a function is declared to use that
20407    ISA.  */
20408 struct builtin_isa GTY(())
20409 {
20410   tree type;                    /* builtin type to use in the declaration */
20411   const char *name;             /* function name */
20412   int isa;                      /* isa_flags this builtin is defined for */
20413   bool const_p;                 /* true if the declaration is constant */
20414 };
20415
20416 static GTY(()) struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
20417
20418
20419 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
20420  * of which isa_flags to use in the ix86_builtins_isa array.  Stores the
20421  * function decl in the ix86_builtins array.  Returns the function decl or
20422  * NULL_TREE, if the builtin was not added.
20423  *
20424  * If the front end has a special hook for builtin functions, delay adding
20425  * builtin functions that aren't in the current ISA until the ISA is changed
20426  * with function specific optimization.  Doing so, can save about 300K for the
20427  * default compiler.  When the builtin is expanded, check at that time whether
20428  * it is valid.
20429  *
20430  * If the front end doesn't have a special hook, record all builtins, even if
20431  * it isn't an instruction set in the current ISA in case the user uses
20432  * function specific options for a different ISA, so that we don't get scope
20433  * errors if a builtin is added in the middle of a function scope.  */
20434
20435 static inline tree
20436 def_builtin (int mask, const char *name, tree type, enum ix86_builtins code)
20437 {
20438   tree decl = NULL_TREE;
20439
20440   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
20441     {
20442       ix86_builtins_isa[(int) code].isa = mask;
20443
20444       if ((mask & ix86_isa_flags) != 0
20445           || (lang_hooks.builtin_function
20446               == lang_hooks.builtin_function_ext_scope))
20447
20448         {
20449           decl = add_builtin_function (name, type, code, BUILT_IN_MD, NULL,
20450                                        NULL_TREE);
20451           ix86_builtins[(int) code] = decl;
20452           ix86_builtins_isa[(int) code].type = NULL_TREE;
20453         }
20454       else
20455         {
20456           ix86_builtins[(int) code] = NULL_TREE;
20457           ix86_builtins_isa[(int) code].const_p = false;
20458           ix86_builtins_isa[(int) code].type = type;
20459           ix86_builtins_isa[(int) code].name = name;
20460         }
20461     }
20462
20463   return decl;
20464 }
20465
20466 /* Like def_builtin, but also marks the function decl "const".  */
20467
20468 static inline tree
20469 def_builtin_const (int mask, const char *name, tree type,
20470                    enum ix86_builtins code)
20471 {
20472   tree decl = def_builtin (mask, name, type, code);
20473   if (decl)
20474     TREE_READONLY (decl) = 1;
20475   else
20476     ix86_builtins_isa[(int) code].const_p = true;
20477
20478   return decl;
20479 }
20480
20481 /* Add any new builtin functions for a given ISA that may not have been
20482    declared.  This saves a bit of space compared to adding all of the
20483    declarations to the tree, even if we didn't use them.  */
20484
20485 static void
20486 ix86_add_new_builtins (int isa)
20487 {
20488   int i;
20489   tree decl;
20490
20491   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
20492     {
20493       if ((ix86_builtins_isa[i].isa & isa) != 0
20494           && ix86_builtins_isa[i].type != NULL_TREE)
20495         {
20496           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
20497                                                  ix86_builtins_isa[i].type,
20498                                                  i, BUILT_IN_MD, NULL,
20499                                                  NULL_TREE);
20500
20501           ix86_builtins[i] = decl;
20502           ix86_builtins_isa[i].type = NULL_TREE;
20503           if (ix86_builtins_isa[i].const_p)
20504             TREE_READONLY (decl) = 1;
20505         }
20506     }
20507 }
20508
20509 /* Bits for builtin_description.flag.  */
20510
20511 /* Set when we don't support the comparison natively, and should
20512    swap_comparison in order to support it.  */
20513 #define BUILTIN_DESC_SWAP_OPERANDS      1
20514
20515 struct builtin_description
20516 {
20517   const unsigned int mask;
20518   const enum insn_code icode;
20519   const char *const name;
20520   const enum ix86_builtins code;
20521   const enum rtx_code comparison;
20522   const int flag;
20523 };
20524
20525 static const struct builtin_description bdesc_comi[] =
20526 {
20527   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
20528   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
20529   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
20530   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
20531   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
20532   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
20533   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
20534   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
20535   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
20536   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
20537   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
20538   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
20539   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
20540   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
20541   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
20542   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
20543   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
20544   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
20545   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
20546   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
20547   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
20548   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
20549   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
20550   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
20551 };
20552
20553 static const struct builtin_description bdesc_pcmpestr[] =
20554 {
20555   /* SSE4.2 */
20556   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
20557   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
20558   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
20559   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
20560   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
20561   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
20562   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
20563 };
20564
20565 static const struct builtin_description bdesc_pcmpistr[] =
20566 {
20567   /* SSE4.2 */
20568   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
20569   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
20570   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
20571   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
20572   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
20573   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
20574   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
20575 };
20576
20577 /* Special builtin types */
20578 enum ix86_special_builtin_type
20579 {
20580   SPECIAL_FTYPE_UNKNOWN,
20581   VOID_FTYPE_VOID,
20582   V32QI_FTYPE_PCCHAR,
20583   V16QI_FTYPE_PCCHAR,
20584   V8SF_FTYPE_PCV4SF,
20585   V8SF_FTYPE_PCFLOAT,
20586   V4DF_FTYPE_PCV2DF,
20587   V4DF_FTYPE_PCDOUBLE,
20588   V4SF_FTYPE_PCFLOAT,
20589   V2DF_FTYPE_PCDOUBLE,
20590   V8SF_FTYPE_PCV8SF_V8SF,
20591   V4DF_FTYPE_PCV4DF_V4DF,
20592   V4SF_FTYPE_V4SF_PCV2SF,
20593   V4SF_FTYPE_PCV4SF_V4SF,
20594   V2DF_FTYPE_V2DF_PCDOUBLE,
20595   V2DF_FTYPE_PCV2DF_V2DF,
20596   V2DI_FTYPE_PV2DI,
20597   VOID_FTYPE_PV2SF_V4SF,
20598   VOID_FTYPE_PV4DI_V4DI,
20599   VOID_FTYPE_PV2DI_V2DI,
20600   VOID_FTYPE_PCHAR_V32QI,
20601   VOID_FTYPE_PCHAR_V16QI,
20602   VOID_FTYPE_PFLOAT_V8SF,
20603   VOID_FTYPE_PFLOAT_V4SF,
20604   VOID_FTYPE_PDOUBLE_V4DF,
20605   VOID_FTYPE_PDOUBLE_V2DF,
20606   VOID_FTYPE_PDI_DI,
20607   VOID_FTYPE_PINT_INT,
20608   VOID_FTYPE_PV8SF_V8SF_V8SF,
20609   VOID_FTYPE_PV4DF_V4DF_V4DF,
20610   VOID_FTYPE_PV4SF_V4SF_V4SF,
20611   VOID_FTYPE_PV2DF_V2DF_V2DF
20612 };
20613
20614 /* Builtin types */
20615 enum ix86_builtin_type
20616 {
20617   FTYPE_UNKNOWN,
20618   FLOAT128_FTYPE_FLOAT128,
20619   FLOAT_FTYPE_FLOAT,
20620   FLOAT128_FTYPE_FLOAT128_FLOAT128,
20621   INT_FTYPE_V8SF_V8SF_PTEST,
20622   INT_FTYPE_V4DI_V4DI_PTEST,
20623   INT_FTYPE_V4DF_V4DF_PTEST,
20624   INT_FTYPE_V4SF_V4SF_PTEST,
20625   INT_FTYPE_V2DI_V2DI_PTEST,
20626   INT_FTYPE_V2DF_V2DF_PTEST,
20627   INT64_FTYPE_V4SF,
20628   INT64_FTYPE_V2DF,
20629   INT_FTYPE_V16QI,
20630   INT_FTYPE_V8QI,
20631   INT_FTYPE_V8SF,
20632   INT_FTYPE_V4DF,
20633   INT_FTYPE_V4SF,
20634   INT_FTYPE_V2DF,
20635   V16QI_FTYPE_V16QI,
20636   V8SI_FTYPE_V8SF,
20637   V8SI_FTYPE_V4SI,
20638   V8HI_FTYPE_V8HI,
20639   V8HI_FTYPE_V16QI,
20640   V8QI_FTYPE_V8QI,
20641   V8SF_FTYPE_V8SF,
20642   V8SF_FTYPE_V8SI,
20643   V8SF_FTYPE_V4SF,
20644   V4SI_FTYPE_V4SI,
20645   V4SI_FTYPE_V16QI,
20646   V4SI_FTYPE_V8SI,
20647   V4SI_FTYPE_V8HI,
20648   V4SI_FTYPE_V4DF,
20649   V4SI_FTYPE_V4SF,
20650   V4SI_FTYPE_V2DF,
20651   V4HI_FTYPE_V4HI,
20652   V4DF_FTYPE_V4DF,
20653   V4DF_FTYPE_V4SI,
20654   V4DF_FTYPE_V4SF,
20655   V4DF_FTYPE_V2DF,
20656   V4SF_FTYPE_V4DF,
20657   V4SF_FTYPE_V4SF,
20658   V4SF_FTYPE_V4SF_VEC_MERGE,
20659   V4SF_FTYPE_V8SF,
20660   V4SF_FTYPE_V4SI,
20661   V4SF_FTYPE_V2DF,
20662   V2DI_FTYPE_V2DI,
20663   V2DI_FTYPE_V16QI,
20664   V2DI_FTYPE_V8HI,
20665   V2DI_FTYPE_V4SI,
20666   V2DF_FTYPE_V2DF,
20667   V2DF_FTYPE_V2DF_VEC_MERGE,
20668   V2DF_FTYPE_V4SI,
20669   V2DF_FTYPE_V4DF,
20670   V2DF_FTYPE_V4SF,
20671   V2DF_FTYPE_V2SI,
20672   V2SI_FTYPE_V2SI,
20673   V2SI_FTYPE_V4SF,
20674   V2SI_FTYPE_V2SF,
20675   V2SI_FTYPE_V2DF,
20676   V2SF_FTYPE_V2SF,
20677   V2SF_FTYPE_V2SI,
20678   V16QI_FTYPE_V16QI_V16QI,
20679   V16QI_FTYPE_V8HI_V8HI,
20680   V8QI_FTYPE_V8QI_V8QI,
20681   V8QI_FTYPE_V4HI_V4HI,
20682   V8HI_FTYPE_V8HI_V8HI,
20683   V8HI_FTYPE_V8HI_V8HI_COUNT,
20684   V8HI_FTYPE_V16QI_V16QI,
20685   V8HI_FTYPE_V4SI_V4SI,
20686   V8HI_FTYPE_V8HI_SI_COUNT,
20687   V8SF_FTYPE_V8SF_V8SF,
20688   V8SF_FTYPE_V8SF_V8SI,
20689   V4SI_FTYPE_V4SI_V4SI,
20690   V4SI_FTYPE_V4SI_V4SI_COUNT,
20691   V4SI_FTYPE_V8HI_V8HI,
20692   V4SI_FTYPE_V4SF_V4SF,
20693   V4SI_FTYPE_V2DF_V2DF,
20694   V4SI_FTYPE_V4SI_SI_COUNT,
20695   V4HI_FTYPE_V4HI_V4HI,
20696   V4HI_FTYPE_V4HI_V4HI_COUNT,
20697   V4HI_FTYPE_V8QI_V8QI,
20698   V4HI_FTYPE_V2SI_V2SI,
20699   V4HI_FTYPE_V4HI_SI_COUNT,
20700   V4DF_FTYPE_V4DF_V4DF,
20701   V4DF_FTYPE_V4DF_V4DI,
20702   V4SF_FTYPE_V4SF_V4SF,
20703   V4SF_FTYPE_V4SF_V4SF_SWAP,
20704   V4SF_FTYPE_V4SF_V4SI,
20705   V4SF_FTYPE_V4SF_V2SI,
20706   V4SF_FTYPE_V4SF_V2DF,
20707   V4SF_FTYPE_V4SF_DI,
20708   V4SF_FTYPE_V4SF_SI,
20709   V2DI_FTYPE_V2DI_V2DI,
20710   V2DI_FTYPE_V2DI_V2DI_COUNT,
20711   V2DI_FTYPE_V16QI_V16QI,
20712   V2DI_FTYPE_V4SI_V4SI,
20713   V2DI_FTYPE_V2DI_V16QI,
20714   V2DI_FTYPE_V2DF_V2DF,
20715   V2DI_FTYPE_V2DI_SI_COUNT,
20716   V2SI_FTYPE_V2SI_V2SI,
20717   V2SI_FTYPE_V2SI_V2SI_COUNT,
20718   V2SI_FTYPE_V4HI_V4HI,
20719   V2SI_FTYPE_V2SF_V2SF,
20720   V2SI_FTYPE_V2SI_SI_COUNT,
20721   V2DF_FTYPE_V2DF_V2DF,
20722   V2DF_FTYPE_V2DF_V2DF_SWAP,
20723   V2DF_FTYPE_V2DF_V4SF,
20724   V2DF_FTYPE_V2DF_V2DI,
20725   V2DF_FTYPE_V2DF_DI,
20726   V2DF_FTYPE_V2DF_SI,
20727   V2SF_FTYPE_V2SF_V2SF,
20728   V1DI_FTYPE_V1DI_V1DI,
20729   V1DI_FTYPE_V1DI_V1DI_COUNT,
20730   V1DI_FTYPE_V8QI_V8QI,
20731   V1DI_FTYPE_V2SI_V2SI,
20732   V1DI_FTYPE_V1DI_SI_COUNT,
20733   UINT64_FTYPE_UINT64_UINT64,
20734   UINT_FTYPE_UINT_UINT,
20735   UINT_FTYPE_UINT_USHORT,
20736   UINT_FTYPE_UINT_UCHAR,
20737   V8HI_FTYPE_V8HI_INT,
20738   V4SI_FTYPE_V4SI_INT,
20739   V4HI_FTYPE_V4HI_INT,
20740   V8SF_FTYPE_V8SF_INT,
20741   V4SI_FTYPE_V8SI_INT,
20742   V4SF_FTYPE_V8SF_INT,
20743   V2DF_FTYPE_V4DF_INT,
20744   V4DF_FTYPE_V4DF_INT,
20745   V4SF_FTYPE_V4SF_INT,
20746   V2DI_FTYPE_V2DI_INT,
20747   V2DI2TI_FTYPE_V2DI_INT,
20748   V2DF_FTYPE_V2DF_INT,
20749   V16QI_FTYPE_V16QI_V16QI_V16QI,
20750   V8SF_FTYPE_V8SF_V8SF_V8SF,
20751   V4DF_FTYPE_V4DF_V4DF_V4DF,
20752   V4SF_FTYPE_V4SF_V4SF_V4SF,
20753   V2DF_FTYPE_V2DF_V2DF_V2DF,
20754   V16QI_FTYPE_V16QI_V16QI_INT,
20755   V8SI_FTYPE_V8SI_V8SI_INT,
20756   V8SI_FTYPE_V8SI_V4SI_INT,
20757   V8HI_FTYPE_V8HI_V8HI_INT,
20758   V8SF_FTYPE_V8SF_V8SF_INT,
20759   V8SF_FTYPE_V8SF_V4SF_INT,
20760   V4SI_FTYPE_V4SI_V4SI_INT,
20761   V4DF_FTYPE_V4DF_V4DF_INT,
20762   V4DF_FTYPE_V4DF_V2DF_INT,
20763   V4SF_FTYPE_V4SF_V4SF_INT,
20764   V2DI_FTYPE_V2DI_V2DI_INT,
20765   V2DI2TI_FTYPE_V2DI_V2DI_INT,
20766   V1DI2DI_FTYPE_V1DI_V1DI_INT,
20767   V2DF_FTYPE_V2DF_V2DF_INT,
20768   V2DI_FTYPE_V2DI_UINT_UINT,
20769   V2DI_FTYPE_V2DI_V2DI_UINT_UINT
20770 };
20771
20772 /* Special builtins with variable number of arguments.  */
20773 static const struct builtin_description bdesc_special_args[] =
20774 {
20775   /* MMX */
20776   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
20777
20778   /* 3DNow! */
20779   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
20780
20781   /* SSE */
20782   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
20783   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
20784   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
20785
20786   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
20787   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
20788   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
20789   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
20790
20791   /* SSE or 3DNow!A  */
20792   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
20793   { 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 },
20794
20795   /* SSE2 */
20796   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
20797   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
20798   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
20799   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
20800   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
20801   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
20802   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
20803   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
20804   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
20805
20806   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
20807   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
20808
20809   /* SSE3 */
20810   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
20811
20812   /* SSE4.1 */
20813   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
20814
20815   /* SSE4A */
20816   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
20817   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
20818
20819   /* AVX */
20820   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
20821   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, 0, IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
20822   { OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_64BIT, CODE_FOR_avx_vzeroupper_rex64, 0, IX86_BUILTIN_VZEROUPPER_REX64, UNKNOWN, (int) VOID_FTYPE_VOID },
20823
20824   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
20825   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastsd256, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
20826   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss256, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
20827   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_pd256, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
20828   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_ps256, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
20829
20830   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
20831   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
20832   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
20833   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
20834   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
20835   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
20836   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
20837
20838   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
20839   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
20840   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
20841
20842   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DF },
20843   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SF },
20844   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DF },
20845   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SF },
20846   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DF_V2DF },
20847   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SF_V4SF },
20848   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DF_V4DF },
20849   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SF_V8SF },
20850 };
20851
20852 /* Builtins with variable number of arguments.  */
20853 static const struct builtin_description bdesc_args[] =
20854 {
20855   /* MMX */
20856   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20857   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20858   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20859   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20860   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20861   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20862
20863   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20864   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20865   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20866   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20867   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20868   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20869   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20870   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20871
20872   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20873   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20874
20875   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20876   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20877   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20878   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20879
20880   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20881   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20882   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20883   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20884   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20885   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20886
20887   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20888   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20889   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20890   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20891   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
20892   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
20893
20894   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
20895   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
20896   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
20897
20898   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
20899
20900   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
20901   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
20902   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
20903   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
20904   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
20905   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
20906
20907   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
20908   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
20909   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
20910   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
20911   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
20912   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
20913
20914   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
20915   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
20916   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
20917   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
20918
20919   /* 3DNow! */
20920   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
20921   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
20922   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
20923   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
20924
20925   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20926   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20927   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20928   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
20929   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
20930   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
20931   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20932   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20933   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20934   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20935   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20936   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20937   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20938   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20939   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20940
20941   /* 3DNow!A */
20942   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
20943   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
20944   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
20945   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
20946   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20947   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20948
20949   /* SSE */
20950   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
20951   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20952   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20953   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20954   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20955   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20956   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
20957   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
20958   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
20959   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
20960   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
20961   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
20962
20963   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
20964
20965   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20966   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20967   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20968   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20969   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20970   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20971   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20972   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20973
20974   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
20975   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
20976   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
20977   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
20978   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
20979   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
20980   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
20981   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
20982   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
20983   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
20984   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
20985   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
20986   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
20987   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
20988   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
20989   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
20990   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
20991   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
20992   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
20993   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
20994   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
20995   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
20996
20997   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20998   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20999   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21000   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21001
21002   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21003   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21004   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21005   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21006
21007   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21008   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21009   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21010   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpckhps, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21011   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpcklps, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21012
21013   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
21014   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
21015   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
21016
21017   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
21018
21019   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21020   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21021   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21022
21023   /* SSE MMX or 3Dnow!A */
21024   { 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 },
21025   { 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 },
21026   { 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 },
21027
21028   { 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 },
21029   { 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 },
21030   { 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 },
21031   { 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 },
21032
21033   { 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 },
21034   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
21035
21036   { 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 },
21037
21038   /* SSE2 */
21039   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21040
21041   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
21042   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
21043   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
21044   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
21045   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21046
21047   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21048   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21049   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
21050   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21051   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21052
21053   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
21054
21055   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21056   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21057   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21058   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21059
21060   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21061   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
21062   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21063
21064   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21065   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21066   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21067   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21068   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21069   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21070   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21071   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21072
21073   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21074   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21075   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21076   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21077   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
21078   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21079   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21080   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21081   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21082   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21083   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21084   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21085   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21086   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21087   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21088   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21089   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21090   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21091   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21092   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21093
21094   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21095   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21096   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21097   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21098
21099   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21100   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21101   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21102   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21103
21104   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21105   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpckhpd_exp, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21106   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpcklpd_exp, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21107
21108   { 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 },
21109
21110   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21111   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21112   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21113   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21114   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21115   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21116   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21117   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21118
21119   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21120   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21121   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21122   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21123   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21124   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21125   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21126   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21127
21128   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21129   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
21130
21131   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21132   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21133   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21134   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21135
21136   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21137   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21138
21139   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21140   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21141   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21142   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21143   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21144   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21145
21146   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21147   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21148   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21149   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21150
21151   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhbw, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21152   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhwd, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
21153   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhdq, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
21154   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhqdq, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21155   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklbw, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21156   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklwd, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21157   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckldq, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21158   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklqdq, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21159
21160   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21161   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21162   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21163
21164   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21165   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
21166
21167   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
21168   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21169
21170   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
21171
21172   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
21173   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
21174   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
21175   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
21176
21177   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21178   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21179   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21180   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21181   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21182   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21183   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21184
21185   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21186   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21187   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21188   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21189   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21190   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21191   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21192
21193   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21194   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21195   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21196   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21197
21198   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
21199   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21200   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21201
21202   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
21203
21204   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
21205   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
21206
21207   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21208
21209   /* SSE2 MMX */
21210   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21211   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21212
21213   /* SSE3 */
21214   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
21215   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21216
21217   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21218   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21219   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21220   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21221   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21222   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21223
21224   /* SSSE3 */
21225   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
21226   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
21227   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21228   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
21229   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
21230   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21231
21232   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21233   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21234   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21235   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21236   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21237   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21238   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21239   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21240   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21241   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21242   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21243   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21244   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
21245   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
21246   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21247   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21248   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21249   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21250   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21251   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21252   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21253   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21254   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21255   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21256
21257   /* SSSE3.  */
21258   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_V2DI_INT },
21259   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI2DI_FTYPE_V1DI_V1DI_INT },
21260
21261   /* SSE4.1 */
21262   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21263   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21264   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
21265   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
21266   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21267   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21268   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21269   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
21270   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
21271   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
21272
21273   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21274   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21275   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21276   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21277   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21278   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21279   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21280   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21281   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21282   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21283   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21284   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21285   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21286
21287   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21288   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21289   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21290   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21291   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21292   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21293   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21294   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21295   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21296   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21297   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21298   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21299
21300   /* SSE4.1 and SSE5 */
21301   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21302   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21303   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21304   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21305
21306   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21307   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21308   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21309
21310   /* SSE4.2 */
21311   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21312   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32qi, "__builtin_ia32_crc32qi", IX86_BUILTIN_CRC32QI, UNKNOWN, (int) UINT_FTYPE_UINT_UCHAR },
21313   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32hi, "__builtin_ia32_crc32hi", IX86_BUILTIN_CRC32HI, UNKNOWN, (int) UINT_FTYPE_UINT_USHORT },
21314   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32si, "__builtin_ia32_crc32si", IX86_BUILTIN_CRC32SI, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
21315   { 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 },
21316
21317   /* SSE4A */
21318   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
21319   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
21320   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
21321   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21322
21323   /* AES */
21324   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
21325   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21326
21327   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21328   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21329   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21330   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21331
21332   /* PCLMUL */
21333   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
21334
21335   /* AVX */
21336   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21337   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21338   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21339   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21340   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21341   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21342   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21343   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21344   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21345   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21346   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21347   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21348   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21349   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21350   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21351   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21352   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21353   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21354   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21355   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21356   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21357   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21358   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21359   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21360   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21361   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21362
21363   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
21364   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
21365   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
21366   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
21367
21368   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21369   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21370   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
21371   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
21372   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21373   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21374   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21375   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpsdv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21376   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpssv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21377   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21378   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21379   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21380   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21381   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
21382   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
21383   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
21384   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
21385   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
21386   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
21387   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21388   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
21389   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21390   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21391   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21392   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21393   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21394   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
21395   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21396   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21397   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21398   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21399   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
21400   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
21401   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
21402
21403   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21404   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21405   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21406
21407   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21408   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21409   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21410   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21411   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21412
21413   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21414
21415   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21416   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21417
21418   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21419   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21420   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21421   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21422
21423   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
21424   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
21425   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
21426   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si_si256, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
21427   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps_ps256, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
21428   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd_pd256, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
21429
21430   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21431   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21432   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21433   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21434   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21435   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21436   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21437   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21438   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21439   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21440   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21441   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21442   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21443   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21444   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21445
21446   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
21447   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
21448 };
21449
21450 /* SSE5 */
21451 enum multi_arg_type {
21452   MULTI_ARG_UNKNOWN,
21453   MULTI_ARG_3_SF,
21454   MULTI_ARG_3_DF,
21455   MULTI_ARG_3_DI,
21456   MULTI_ARG_3_SI,
21457   MULTI_ARG_3_SI_DI,
21458   MULTI_ARG_3_HI,
21459   MULTI_ARG_3_HI_SI,
21460   MULTI_ARG_3_QI,
21461   MULTI_ARG_3_PERMPS,
21462   MULTI_ARG_3_PERMPD,
21463   MULTI_ARG_2_SF,
21464   MULTI_ARG_2_DF,
21465   MULTI_ARG_2_DI,
21466   MULTI_ARG_2_SI,
21467   MULTI_ARG_2_HI,
21468   MULTI_ARG_2_QI,
21469   MULTI_ARG_2_DI_IMM,
21470   MULTI_ARG_2_SI_IMM,
21471   MULTI_ARG_2_HI_IMM,
21472   MULTI_ARG_2_QI_IMM,
21473   MULTI_ARG_2_SF_CMP,
21474   MULTI_ARG_2_DF_CMP,
21475   MULTI_ARG_2_DI_CMP,
21476   MULTI_ARG_2_SI_CMP,
21477   MULTI_ARG_2_HI_CMP,
21478   MULTI_ARG_2_QI_CMP,
21479   MULTI_ARG_2_DI_TF,
21480   MULTI_ARG_2_SI_TF,
21481   MULTI_ARG_2_HI_TF,
21482   MULTI_ARG_2_QI_TF,
21483   MULTI_ARG_2_SF_TF,
21484   MULTI_ARG_2_DF_TF,
21485   MULTI_ARG_1_SF,
21486   MULTI_ARG_1_DF,
21487   MULTI_ARG_1_DI,
21488   MULTI_ARG_1_SI,
21489   MULTI_ARG_1_HI,
21490   MULTI_ARG_1_QI,
21491   MULTI_ARG_1_SI_DI,
21492   MULTI_ARG_1_HI_DI,
21493   MULTI_ARG_1_HI_SI,
21494   MULTI_ARG_1_QI_DI,
21495   MULTI_ARG_1_QI_SI,
21496   MULTI_ARG_1_QI_HI,
21497   MULTI_ARG_1_PH2PS,
21498   MULTI_ARG_1_PS2PH
21499 };
21500
21501 static const struct builtin_description bdesc_multi_arg[] =
21502 {
21503   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv4sf4,     "__builtin_ia32_fmaddss",    IX86_BUILTIN_FMADDSS,    0,            (int)MULTI_ARG_3_SF },
21504   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv2df4,     "__builtin_ia32_fmaddsd",    IX86_BUILTIN_FMADDSD,    0,            (int)MULTI_ARG_3_DF },
21505   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv4sf4,       "__builtin_ia32_fmaddps",    IX86_BUILTIN_FMADDPS,    0,            (int)MULTI_ARG_3_SF },
21506   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv2df4,       "__builtin_ia32_fmaddpd",    IX86_BUILTIN_FMADDPD,    0,            (int)MULTI_ARG_3_DF },
21507   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv4sf4,     "__builtin_ia32_fmsubss",    IX86_BUILTIN_FMSUBSS,    0,            (int)MULTI_ARG_3_SF },
21508   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv2df4,     "__builtin_ia32_fmsubsd",    IX86_BUILTIN_FMSUBSD,    0,            (int)MULTI_ARG_3_DF },
21509   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv4sf4,       "__builtin_ia32_fmsubps",    IX86_BUILTIN_FMSUBPS,    0,            (int)MULTI_ARG_3_SF },
21510   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv2df4,       "__builtin_ia32_fmsubpd",    IX86_BUILTIN_FMSUBPD,    0,            (int)MULTI_ARG_3_DF },
21511   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv4sf4,    "__builtin_ia32_fnmaddss",   IX86_BUILTIN_FNMADDSS,   0,            (int)MULTI_ARG_3_SF },
21512   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv2df4,    "__builtin_ia32_fnmaddsd",   IX86_BUILTIN_FNMADDSD,   0,            (int)MULTI_ARG_3_DF },
21513   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv4sf4,      "__builtin_ia32_fnmaddps",   IX86_BUILTIN_FNMADDPS,   0,            (int)MULTI_ARG_3_SF },
21514   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv2df4,      "__builtin_ia32_fnmaddpd",   IX86_BUILTIN_FNMADDPD,   0,            (int)MULTI_ARG_3_DF },
21515   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv4sf4,    "__builtin_ia32_fnmsubss",   IX86_BUILTIN_FNMSUBSS,   0,            (int)MULTI_ARG_3_SF },
21516   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv2df4,    "__builtin_ia32_fnmsubsd",   IX86_BUILTIN_FNMSUBSD,   0,            (int)MULTI_ARG_3_DF },
21517   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv4sf4,      "__builtin_ia32_fnmsubps",   IX86_BUILTIN_FNMSUBPS,   0,            (int)MULTI_ARG_3_SF },
21518   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv2df4,      "__builtin_ia32_fnmsubpd",   IX86_BUILTIN_FNMSUBPD,   0,            (int)MULTI_ARG_3_DF },
21519   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov",      IX86_BUILTIN_PCMOV,      0,            (int)MULTI_ARG_3_DI },
21520   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov_v2di", IX86_BUILTIN_PCMOV_V2DI, 0,            (int)MULTI_ARG_3_DI },
21521   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4si,        "__builtin_ia32_pcmov_v4si", IX86_BUILTIN_PCMOV_V4SI, 0,            (int)MULTI_ARG_3_SI },
21522   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v8hi,        "__builtin_ia32_pcmov_v8hi", IX86_BUILTIN_PCMOV_V8HI, 0,            (int)MULTI_ARG_3_HI },
21523   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v16qi,       "__builtin_ia32_pcmov_v16qi",IX86_BUILTIN_PCMOV_V16QI,0,            (int)MULTI_ARG_3_QI },
21524   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2df,        "__builtin_ia32_pcmov_v2df", IX86_BUILTIN_PCMOV_V2DF, 0,            (int)MULTI_ARG_3_DF },
21525   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4sf,        "__builtin_ia32_pcmov_v4sf", IX86_BUILTIN_PCMOV_V4SF, 0,            (int)MULTI_ARG_3_SF },
21526   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pperm,             "__builtin_ia32_pperm",      IX86_BUILTIN_PPERM,      0,            (int)MULTI_ARG_3_QI },
21527   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv4sf,          "__builtin_ia32_permps",     IX86_BUILTIN_PERMPS,     0,            (int)MULTI_ARG_3_PERMPS },
21528   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv2df,          "__builtin_ia32_permpd",     IX86_BUILTIN_PERMPD,     0,            (int)MULTI_ARG_3_PERMPD },
21529   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssww,          "__builtin_ia32_pmacssww",   IX86_BUILTIN_PMACSSWW,   0,            (int)MULTI_ARG_3_HI },
21530   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsww,           "__builtin_ia32_pmacsww",    IX86_BUILTIN_PMACSWW,    0,            (int)MULTI_ARG_3_HI },
21531   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsswd,          "__builtin_ia32_pmacsswd",   IX86_BUILTIN_PMACSSWD,   0,            (int)MULTI_ARG_3_HI_SI },
21532   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacswd,           "__builtin_ia32_pmacswd",    IX86_BUILTIN_PMACSWD,    0,            (int)MULTI_ARG_3_HI_SI },
21533   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdd,          "__builtin_ia32_pmacssdd",   IX86_BUILTIN_PMACSSDD,   0,            (int)MULTI_ARG_3_SI },
21534   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdd,           "__builtin_ia32_pmacsdd",    IX86_BUILTIN_PMACSDD,    0,            (int)MULTI_ARG_3_SI },
21535   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdql,         "__builtin_ia32_pmacssdql",  IX86_BUILTIN_PMACSSDQL,  0,            (int)MULTI_ARG_3_SI_DI },
21536   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdqh,         "__builtin_ia32_pmacssdqh",  IX86_BUILTIN_PMACSSDQH,  0,            (int)MULTI_ARG_3_SI_DI },
21537   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdql,          "__builtin_ia32_pmacsdql",   IX86_BUILTIN_PMACSDQL,   0,            (int)MULTI_ARG_3_SI_DI },
21538   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdqh,          "__builtin_ia32_pmacsdqh",   IX86_BUILTIN_PMACSDQH,   0,            (int)MULTI_ARG_3_SI_DI },
21539   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcsswd,         "__builtin_ia32_pmadcsswd",  IX86_BUILTIN_PMADCSSWD,  0,            (int)MULTI_ARG_3_HI_SI },
21540   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcswd,          "__builtin_ia32_pmadcswd",   IX86_BUILTIN_PMADCSWD,   0,            (int)MULTI_ARG_3_HI_SI },
21541   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv2di3,        "__builtin_ia32_protq",      IX86_BUILTIN_PROTQ,      0,            (int)MULTI_ARG_2_DI },
21542   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv4si3,        "__builtin_ia32_protd",      IX86_BUILTIN_PROTD,      0,            (int)MULTI_ARG_2_SI },
21543   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv8hi3,        "__builtin_ia32_protw",      IX86_BUILTIN_PROTW,      0,            (int)MULTI_ARG_2_HI },
21544   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv16qi3,       "__builtin_ia32_protb",      IX86_BUILTIN_PROTB,      0,            (int)MULTI_ARG_2_QI },
21545   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv2di3,         "__builtin_ia32_protqi",     IX86_BUILTIN_PROTQ_IMM,  0,            (int)MULTI_ARG_2_DI_IMM },
21546   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv4si3,         "__builtin_ia32_protdi",     IX86_BUILTIN_PROTD_IMM,  0,            (int)MULTI_ARG_2_SI_IMM },
21547   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv8hi3,         "__builtin_ia32_protwi",     IX86_BUILTIN_PROTW_IMM,  0,            (int)MULTI_ARG_2_HI_IMM },
21548   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv16qi3,        "__builtin_ia32_protbi",     IX86_BUILTIN_PROTB_IMM,  0,            (int)MULTI_ARG_2_QI_IMM },
21549   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv2di3,         "__builtin_ia32_pshaq",      IX86_BUILTIN_PSHAQ,      0,            (int)MULTI_ARG_2_DI },
21550   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv4si3,         "__builtin_ia32_pshad",      IX86_BUILTIN_PSHAD,      0,            (int)MULTI_ARG_2_SI },
21551   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv8hi3,         "__builtin_ia32_pshaw",      IX86_BUILTIN_PSHAW,      0,            (int)MULTI_ARG_2_HI },
21552   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv16qi3,        "__builtin_ia32_pshab",      IX86_BUILTIN_PSHAB,      0,            (int)MULTI_ARG_2_QI },
21553   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv2di3,         "__builtin_ia32_pshlq",      IX86_BUILTIN_PSHLQ,      0,            (int)MULTI_ARG_2_DI },
21554   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv4si3,         "__builtin_ia32_pshld",      IX86_BUILTIN_PSHLD,      0,            (int)MULTI_ARG_2_SI },
21555   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv8hi3,         "__builtin_ia32_pshlw",      IX86_BUILTIN_PSHLW,      0,            (int)MULTI_ARG_2_HI },
21556   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv16qi3,        "__builtin_ia32_pshlb",      IX86_BUILTIN_PSHLB,      0,            (int)MULTI_ARG_2_QI },
21557   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv4sf2,       "__builtin_ia32_frczss",     IX86_BUILTIN_FRCZSS,     0,            (int)MULTI_ARG_2_SF },
21558   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv2df2,       "__builtin_ia32_frczsd",     IX86_BUILTIN_FRCZSD,     0,            (int)MULTI_ARG_2_DF },
21559   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv4sf2,         "__builtin_ia32_frczps",     IX86_BUILTIN_FRCZPS,     0,            (int)MULTI_ARG_1_SF },
21560   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv2df2,         "__builtin_ia32_frczpd",     IX86_BUILTIN_FRCZPD,     0,            (int)MULTI_ARG_1_DF },
21561   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtph2ps,          "__builtin_ia32_cvtph2ps",   IX86_BUILTIN_CVTPH2PS,   0,            (int)MULTI_ARG_1_PH2PS },
21562   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtps2ph,          "__builtin_ia32_cvtps2ph",   IX86_BUILTIN_CVTPS2PH,   0,            (int)MULTI_ARG_1_PS2PH },
21563   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbw,           "__builtin_ia32_phaddbw",    IX86_BUILTIN_PHADDBW,    0,            (int)MULTI_ARG_1_QI_HI },
21564   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbd,           "__builtin_ia32_phaddbd",    IX86_BUILTIN_PHADDBD,    0,            (int)MULTI_ARG_1_QI_SI },
21565   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbq,           "__builtin_ia32_phaddbq",    IX86_BUILTIN_PHADDBQ,    0,            (int)MULTI_ARG_1_QI_DI },
21566   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwd,           "__builtin_ia32_phaddwd",    IX86_BUILTIN_PHADDWD,    0,            (int)MULTI_ARG_1_HI_SI },
21567   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwq,           "__builtin_ia32_phaddwq",    IX86_BUILTIN_PHADDWQ,    0,            (int)MULTI_ARG_1_HI_DI },
21568   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadddq,           "__builtin_ia32_phadddq",    IX86_BUILTIN_PHADDDQ,    0,            (int)MULTI_ARG_1_SI_DI },
21569   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubw,          "__builtin_ia32_phaddubw",   IX86_BUILTIN_PHADDUBW,   0,            (int)MULTI_ARG_1_QI_HI },
21570   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubd,          "__builtin_ia32_phaddubd",   IX86_BUILTIN_PHADDUBD,   0,            (int)MULTI_ARG_1_QI_SI },
21571   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubq,          "__builtin_ia32_phaddubq",   IX86_BUILTIN_PHADDUBQ,   0,            (int)MULTI_ARG_1_QI_DI },
21572   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwd,          "__builtin_ia32_phadduwd",   IX86_BUILTIN_PHADDUWD,   0,            (int)MULTI_ARG_1_HI_SI },
21573   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwq,          "__builtin_ia32_phadduwq",   IX86_BUILTIN_PHADDUWQ,   0,            (int)MULTI_ARG_1_HI_DI },
21574   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddudq,          "__builtin_ia32_phaddudq",   IX86_BUILTIN_PHADDUDQ,   0,            (int)MULTI_ARG_1_SI_DI },
21575   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubbw,           "__builtin_ia32_phsubbw",    IX86_BUILTIN_PHSUBBW,    0,            (int)MULTI_ARG_1_QI_HI },
21576   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubwd,           "__builtin_ia32_phsubwd",    IX86_BUILTIN_PHSUBWD,    0,            (int)MULTI_ARG_1_HI_SI },
21577   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubdq,           "__builtin_ia32_phsubdq",    IX86_BUILTIN_PHSUBDQ,    0,            (int)MULTI_ARG_1_SI_DI },
21578
21579   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comeqss",    IX86_BUILTIN_COMEQSS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
21580   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comness",    IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21581   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comneqss",   IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21582   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comltss",    IX86_BUILTIN_COMLTSS,    LT,           (int)MULTI_ARG_2_SF_CMP },
21583   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comless",    IX86_BUILTIN_COMLESS,    LE,           (int)MULTI_ARG_2_SF_CMP },
21584   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgtss",    IX86_BUILTIN_COMGTSS,    GT,           (int)MULTI_ARG_2_SF_CMP },
21585   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgess",    IX86_BUILTIN_COMGESS,    GE,           (int)MULTI_ARG_2_SF_CMP },
21586   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comueqss",   IX86_BUILTIN_COMUEQSS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
21587   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuness",   IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21588   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuneqss",  IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21589   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunltss",  IX86_BUILTIN_COMULTSS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
21590   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunless",  IX86_BUILTIN_COMULESS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
21591   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungtss",  IX86_BUILTIN_COMUGTSS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
21592   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungess",  IX86_BUILTIN_COMUGESS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
21593   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comordss",   IX86_BUILTIN_COMORDSS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
21594   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunordss", IX86_BUILTIN_COMUNORDSS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
21595
21596   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comeqsd",    IX86_BUILTIN_COMEQSD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
21597   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comnesd",    IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21598   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comneqsd",   IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21599   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comltsd",    IX86_BUILTIN_COMLTSD,    LT,           (int)MULTI_ARG_2_DF_CMP },
21600   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comlesd",    IX86_BUILTIN_COMLESD,    LE,           (int)MULTI_ARG_2_DF_CMP },
21601   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgtsd",    IX86_BUILTIN_COMGTSD,    GT,           (int)MULTI_ARG_2_DF_CMP },
21602   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgesd",    IX86_BUILTIN_COMGESD,    GE,           (int)MULTI_ARG_2_DF_CMP },
21603   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comueqsd",   IX86_BUILTIN_COMUEQSD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
21604   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunesd",   IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21605   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comuneqsd",  IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21606   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunltsd",  IX86_BUILTIN_COMULTSD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
21607   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunlesd",  IX86_BUILTIN_COMULESD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
21608   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungtsd",  IX86_BUILTIN_COMUGTSD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
21609   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungesd",  IX86_BUILTIN_COMUGESD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
21610   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comordsd",   IX86_BUILTIN_COMORDSD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
21611   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunordsd", IX86_BUILTIN_COMUNORDSD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
21612
21613   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comeqps",    IX86_BUILTIN_COMEQPS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
21614   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneps",    IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21615   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneqps",   IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21616   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comltps",    IX86_BUILTIN_COMLTPS,    LT,           (int)MULTI_ARG_2_SF_CMP },
21617   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comleps",    IX86_BUILTIN_COMLEPS,    LE,           (int)MULTI_ARG_2_SF_CMP },
21618   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgtps",    IX86_BUILTIN_COMGTPS,    GT,           (int)MULTI_ARG_2_SF_CMP },
21619   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgeps",    IX86_BUILTIN_COMGEPS,    GE,           (int)MULTI_ARG_2_SF_CMP },
21620   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comueqps",   IX86_BUILTIN_COMUEQPS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
21621   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneps",   IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21622   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneqps",  IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21623   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunltps",  IX86_BUILTIN_COMULTPS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
21624   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunleps",  IX86_BUILTIN_COMULEPS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
21625   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungtps",  IX86_BUILTIN_COMUGTPS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
21626   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungeps",  IX86_BUILTIN_COMUGEPS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
21627   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comordps",   IX86_BUILTIN_COMORDPS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
21628   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunordps", IX86_BUILTIN_COMUNORDPS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
21629
21630   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comeqpd",    IX86_BUILTIN_COMEQPD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
21631   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comnepd",    IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21632   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comneqpd",   IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21633   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comltpd",    IX86_BUILTIN_COMLTPD,    LT,           (int)MULTI_ARG_2_DF_CMP },
21634   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comlepd",    IX86_BUILTIN_COMLEPD,    LE,           (int)MULTI_ARG_2_DF_CMP },
21635   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgtpd",    IX86_BUILTIN_COMGTPD,    GT,           (int)MULTI_ARG_2_DF_CMP },
21636   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgepd",    IX86_BUILTIN_COMGEPD,    GE,           (int)MULTI_ARG_2_DF_CMP },
21637   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comueqpd",   IX86_BUILTIN_COMUEQPD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
21638   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunepd",   IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21639   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comuneqpd",  IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21640   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunltpd",  IX86_BUILTIN_COMULTPD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
21641   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunlepd",  IX86_BUILTIN_COMULEPD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
21642   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungtpd",  IX86_BUILTIN_COMUGTPD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
21643   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungepd",  IX86_BUILTIN_COMUGEPD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
21644   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comordpd",   IX86_BUILTIN_COMORDPD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
21645   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunordpd", IX86_BUILTIN_COMUNORDPD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
21646
21647   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomeqb",    IX86_BUILTIN_PCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
21648   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneb",    IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
21649   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneqb",   IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
21650   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomltb",    IX86_BUILTIN_PCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
21651   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomleb",    IX86_BUILTIN_PCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
21652   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgtb",    IX86_BUILTIN_PCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
21653   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgeb",    IX86_BUILTIN_PCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
21654
21655   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomeqw",    IX86_BUILTIN_PCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
21656   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomnew",    IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
21657   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomneqw",   IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
21658   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomltw",    IX86_BUILTIN_PCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
21659   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomlew",    IX86_BUILTIN_PCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
21660   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgtw",    IX86_BUILTIN_PCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
21661   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgew",    IX86_BUILTIN_PCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
21662
21663   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomeqd",    IX86_BUILTIN_PCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
21664   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomned",    IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
21665   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomneqd",   IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
21666   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomltd",    IX86_BUILTIN_PCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
21667   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomled",    IX86_BUILTIN_PCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
21668   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomgtd",    IX86_BUILTIN_PCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
21669   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomged",    IX86_BUILTIN_PCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
21670
21671   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomeqq",    IX86_BUILTIN_PCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
21672   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneq",    IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
21673   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneqq",   IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
21674   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomltq",    IX86_BUILTIN_PCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
21675   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomleq",    IX86_BUILTIN_PCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
21676   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgtq",    IX86_BUILTIN_PCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
21677   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgeq",    IX86_BUILTIN_PCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
21678
21679   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomequb",   IX86_BUILTIN_PCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
21680   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomneub",   IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
21681   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomnequb",  IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
21682   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomltub",   IX86_BUILTIN_PCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
21683   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomleub",   IX86_BUILTIN_PCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
21684   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgtub",   IX86_BUILTIN_PCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
21685   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgeub",   IX86_BUILTIN_PCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
21686
21687   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomequw",   IX86_BUILTIN_PCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
21688   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomneuw",   IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
21689   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomnequw",  IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
21690   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomltuw",   IX86_BUILTIN_PCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
21691   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomleuw",   IX86_BUILTIN_PCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
21692   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgtuw",   IX86_BUILTIN_PCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
21693   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgeuw",   IX86_BUILTIN_PCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
21694
21695   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomequd",   IX86_BUILTIN_PCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
21696   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomneud",   IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
21697   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomnequd",  IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
21698   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomltud",   IX86_BUILTIN_PCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
21699   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomleud",   IX86_BUILTIN_PCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
21700   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgtud",   IX86_BUILTIN_PCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
21701   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgeud",   IX86_BUILTIN_PCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
21702
21703   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomequq",   IX86_BUILTIN_PCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
21704   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomneuq",   IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
21705   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomnequq",  IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
21706   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomltuq",   IX86_BUILTIN_PCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
21707   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomleuq",   IX86_BUILTIN_PCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
21708   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgtuq",   IX86_BUILTIN_PCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
21709   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgeuq",   IX86_BUILTIN_PCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
21710
21711   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalsess", IX86_BUILTIN_COMFALSESS, COM_FALSE_S,  (int)MULTI_ARG_2_SF_TF },
21712   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtruess",  IX86_BUILTIN_COMTRUESS,  COM_TRUE_S,   (int)MULTI_ARG_2_SF_TF },
21713   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalseps", IX86_BUILTIN_COMFALSEPS, COM_FALSE_P,  (int)MULTI_ARG_2_SF_TF },
21714   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtrueps",  IX86_BUILTIN_COMTRUEPS,  COM_TRUE_P,   (int)MULTI_ARG_2_SF_TF },
21715   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsesd", IX86_BUILTIN_COMFALSESD, COM_FALSE_S,  (int)MULTI_ARG_2_DF_TF },
21716   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruesd",  IX86_BUILTIN_COMTRUESD,  COM_TRUE_S,   (int)MULTI_ARG_2_DF_TF },
21717   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsepd", IX86_BUILTIN_COMFALSEPD, COM_FALSE_P,  (int)MULTI_ARG_2_DF_TF },
21718   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruepd",  IX86_BUILTIN_COMTRUEPD,  COM_TRUE_P,   (int)MULTI_ARG_2_DF_TF },
21719
21720   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseb", IX86_BUILTIN_PCOMFALSEB, PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
21721   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalsew", IX86_BUILTIN_PCOMFALSEW, PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
21722   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalsed", IX86_BUILTIN_PCOMFALSED, PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
21723   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseq", IX86_BUILTIN_PCOMFALSEQ, PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
21724   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseub",IX86_BUILTIN_PCOMFALSEUB,PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
21725   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalseuw",IX86_BUILTIN_PCOMFALSEUW,PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
21726   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalseud",IX86_BUILTIN_PCOMFALSEUD,PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
21727   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseuq",IX86_BUILTIN_PCOMFALSEUQ,PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
21728
21729   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueb",  IX86_BUILTIN_PCOMTRUEB,  PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
21730   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtruew",  IX86_BUILTIN_PCOMTRUEW,  PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
21731   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrued",  IX86_BUILTIN_PCOMTRUED,  PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
21732   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueq",  IX86_BUILTIN_PCOMTRUEQ,  PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
21733   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueub", IX86_BUILTIN_PCOMTRUEUB, PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
21734   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtrueuw", IX86_BUILTIN_PCOMTRUEUW, PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
21735   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrueud", IX86_BUILTIN_PCOMTRUEUD, PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
21736   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueuq", IX86_BUILTIN_PCOMTRUEUQ, PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
21737 };
21738
21739 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
21740    in the current target ISA to allow the user to compile particular modules
21741    with different target specific options that differ from the command line
21742    options.  */
21743 static void
21744 ix86_init_mmx_sse_builtins (void)
21745 {
21746   const struct builtin_description * d;
21747   size_t i;
21748
21749   tree V16QI_type_node = build_vector_type_for_mode (char_type_node, V16QImode);
21750   tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
21751   tree V1DI_type_node
21752     = build_vector_type_for_mode (long_long_integer_type_node, V1DImode);
21753   tree V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
21754   tree V2DI_type_node
21755     = build_vector_type_for_mode (long_long_integer_type_node, V2DImode);
21756   tree V2DF_type_node = build_vector_type_for_mode (double_type_node, V2DFmode);
21757   tree V4SF_type_node = build_vector_type_for_mode (float_type_node, V4SFmode);
21758   tree V4SI_type_node = build_vector_type_for_mode (intSI_type_node, V4SImode);
21759   tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
21760   tree V8QI_type_node = build_vector_type_for_mode (char_type_node, V8QImode);
21761   tree V8HI_type_node = build_vector_type_for_mode (intHI_type_node, V8HImode);
21762
21763   tree pchar_type_node = build_pointer_type (char_type_node);
21764   tree pcchar_type_node
21765     = build_pointer_type (build_type_variant (char_type_node, 1, 0));
21766   tree pfloat_type_node = build_pointer_type (float_type_node);
21767   tree pcfloat_type_node
21768     = build_pointer_type (build_type_variant (float_type_node, 1, 0));
21769   tree pv2sf_type_node = build_pointer_type (V2SF_type_node);
21770   tree pcv2sf_type_node
21771     = build_pointer_type (build_type_variant (V2SF_type_node, 1, 0));
21772   tree pv2di_type_node = build_pointer_type (V2DI_type_node);
21773   tree pdi_type_node = build_pointer_type (long_long_unsigned_type_node);
21774
21775   /* Comparisons.  */
21776   tree int_ftype_v4sf_v4sf
21777     = build_function_type_list (integer_type_node,
21778                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
21779   tree v4si_ftype_v4sf_v4sf
21780     = build_function_type_list (V4SI_type_node,
21781                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
21782   /* MMX/SSE/integer conversions.  */
21783   tree int_ftype_v4sf
21784     = build_function_type_list (integer_type_node,
21785                                 V4SF_type_node, NULL_TREE);
21786   tree int64_ftype_v4sf
21787     = build_function_type_list (long_long_integer_type_node,
21788                                 V4SF_type_node, NULL_TREE);
21789   tree int_ftype_v8qi
21790     = build_function_type_list (integer_type_node, V8QI_type_node, NULL_TREE);
21791   tree v4sf_ftype_v4sf_int
21792     = build_function_type_list (V4SF_type_node,
21793                                 V4SF_type_node, integer_type_node, NULL_TREE);
21794   tree v4sf_ftype_v4sf_int64
21795     = build_function_type_list (V4SF_type_node,
21796                                 V4SF_type_node, long_long_integer_type_node,
21797                                 NULL_TREE);
21798   tree v4sf_ftype_v4sf_v2si
21799     = build_function_type_list (V4SF_type_node,
21800                                 V4SF_type_node, V2SI_type_node, NULL_TREE);
21801
21802   /* Miscellaneous.  */
21803   tree v8qi_ftype_v4hi_v4hi
21804     = build_function_type_list (V8QI_type_node,
21805                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
21806   tree v4hi_ftype_v2si_v2si
21807     = build_function_type_list (V4HI_type_node,
21808                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
21809   tree v4sf_ftype_v4sf_v4sf_int
21810     = build_function_type_list (V4SF_type_node,
21811                                 V4SF_type_node, V4SF_type_node,
21812                                 integer_type_node, NULL_TREE);
21813   tree v2si_ftype_v4hi_v4hi
21814     = build_function_type_list (V2SI_type_node,
21815                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
21816   tree v4hi_ftype_v4hi_int
21817     = build_function_type_list (V4HI_type_node,
21818                                 V4HI_type_node, integer_type_node, NULL_TREE);
21819   tree v2si_ftype_v2si_int
21820     = build_function_type_list (V2SI_type_node,
21821                                 V2SI_type_node, integer_type_node, NULL_TREE);
21822   tree v1di_ftype_v1di_int
21823     = build_function_type_list (V1DI_type_node,
21824                                 V1DI_type_node, integer_type_node, NULL_TREE);
21825
21826   tree void_ftype_void
21827     = build_function_type (void_type_node, void_list_node);
21828   tree void_ftype_unsigned
21829     = build_function_type_list (void_type_node, unsigned_type_node, NULL_TREE);
21830   tree void_ftype_unsigned_unsigned
21831     = build_function_type_list (void_type_node, unsigned_type_node,
21832                                 unsigned_type_node, NULL_TREE);
21833   tree void_ftype_pcvoid_unsigned_unsigned
21834     = build_function_type_list (void_type_node, const_ptr_type_node,
21835                                 unsigned_type_node, unsigned_type_node,
21836                                 NULL_TREE);
21837   tree unsigned_ftype_void
21838     = build_function_type (unsigned_type_node, void_list_node);
21839   tree v2si_ftype_v4sf
21840     = build_function_type_list (V2SI_type_node, V4SF_type_node, NULL_TREE);
21841   /* Loads/stores.  */
21842   tree void_ftype_v8qi_v8qi_pchar
21843     = build_function_type_list (void_type_node,
21844                                 V8QI_type_node, V8QI_type_node,
21845                                 pchar_type_node, NULL_TREE);
21846   tree v4sf_ftype_pcfloat
21847     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
21848   tree v4sf_ftype_v4sf_pcv2sf
21849     = build_function_type_list (V4SF_type_node,
21850                                 V4SF_type_node, pcv2sf_type_node, NULL_TREE);
21851   tree void_ftype_pv2sf_v4sf
21852     = build_function_type_list (void_type_node,
21853                                 pv2sf_type_node, V4SF_type_node, NULL_TREE);
21854   tree void_ftype_pfloat_v4sf
21855     = build_function_type_list (void_type_node,
21856                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
21857   tree void_ftype_pdi_di
21858     = build_function_type_list (void_type_node,
21859                                 pdi_type_node, long_long_unsigned_type_node,
21860                                 NULL_TREE);
21861   tree void_ftype_pv2di_v2di
21862     = build_function_type_list (void_type_node,
21863                                 pv2di_type_node, V2DI_type_node, NULL_TREE);
21864   /* Normal vector unops.  */
21865   tree v4sf_ftype_v4sf
21866     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
21867   tree v16qi_ftype_v16qi
21868     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
21869   tree v8hi_ftype_v8hi
21870     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
21871   tree v4si_ftype_v4si
21872     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
21873   tree v8qi_ftype_v8qi
21874     = build_function_type_list (V8QI_type_node, V8QI_type_node, NULL_TREE);
21875   tree v4hi_ftype_v4hi
21876     = build_function_type_list (V4HI_type_node, V4HI_type_node, NULL_TREE);
21877
21878   /* Normal vector binops.  */
21879   tree v4sf_ftype_v4sf_v4sf
21880     = build_function_type_list (V4SF_type_node,
21881                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
21882   tree v8qi_ftype_v8qi_v8qi
21883     = build_function_type_list (V8QI_type_node,
21884                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
21885   tree v4hi_ftype_v4hi_v4hi
21886     = build_function_type_list (V4HI_type_node,
21887                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
21888   tree v2si_ftype_v2si_v2si
21889     = build_function_type_list (V2SI_type_node,
21890                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
21891   tree v1di_ftype_v1di_v1di
21892     = build_function_type_list (V1DI_type_node,
21893                                 V1DI_type_node, V1DI_type_node, NULL_TREE);
21894   tree v1di_ftype_v1di_v1di_int
21895     = build_function_type_list (V1DI_type_node,
21896                                 V1DI_type_node, V1DI_type_node,
21897                                 integer_type_node, NULL_TREE);
21898   tree v2si_ftype_v2sf
21899     = build_function_type_list (V2SI_type_node, V2SF_type_node, NULL_TREE);
21900   tree v2sf_ftype_v2si
21901     = build_function_type_list (V2SF_type_node, V2SI_type_node, NULL_TREE);
21902   tree v2si_ftype_v2si
21903     = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
21904   tree v2sf_ftype_v2sf
21905     = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
21906   tree v2sf_ftype_v2sf_v2sf
21907     = build_function_type_list (V2SF_type_node,
21908                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
21909   tree v2si_ftype_v2sf_v2sf
21910     = build_function_type_list (V2SI_type_node,
21911                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
21912   tree pint_type_node    = build_pointer_type (integer_type_node);
21913   tree pdouble_type_node = build_pointer_type (double_type_node);
21914   tree pcdouble_type_node = build_pointer_type (
21915                                 build_type_variant (double_type_node, 1, 0));
21916   tree int_ftype_v2df_v2df
21917     = build_function_type_list (integer_type_node,
21918                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
21919
21920   tree void_ftype_pcvoid
21921     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
21922   tree v4sf_ftype_v4si
21923     = build_function_type_list (V4SF_type_node, V4SI_type_node, NULL_TREE);
21924   tree v4si_ftype_v4sf
21925     = build_function_type_list (V4SI_type_node, V4SF_type_node, NULL_TREE);
21926   tree v2df_ftype_v4si
21927     = build_function_type_list (V2DF_type_node, V4SI_type_node, NULL_TREE);
21928   tree v4si_ftype_v2df
21929     = build_function_type_list (V4SI_type_node, V2DF_type_node, NULL_TREE);
21930   tree v4si_ftype_v2df_v2df
21931     = build_function_type_list (V4SI_type_node,
21932                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
21933   tree v2si_ftype_v2df
21934     = build_function_type_list (V2SI_type_node, V2DF_type_node, NULL_TREE);
21935   tree v4sf_ftype_v2df
21936     = build_function_type_list (V4SF_type_node, V2DF_type_node, NULL_TREE);
21937   tree v2df_ftype_v2si
21938     = build_function_type_list (V2DF_type_node, V2SI_type_node, NULL_TREE);
21939   tree v2df_ftype_v4sf
21940     = build_function_type_list (V2DF_type_node, V4SF_type_node, NULL_TREE);
21941   tree int_ftype_v2df
21942     = build_function_type_list (integer_type_node, V2DF_type_node, NULL_TREE);
21943   tree int64_ftype_v2df
21944     = build_function_type_list (long_long_integer_type_node,
21945                                 V2DF_type_node, NULL_TREE);
21946   tree v2df_ftype_v2df_int
21947     = build_function_type_list (V2DF_type_node,
21948                                 V2DF_type_node, integer_type_node, NULL_TREE);
21949   tree v2df_ftype_v2df_int64
21950     = build_function_type_list (V2DF_type_node,
21951                                 V2DF_type_node, long_long_integer_type_node,
21952                                 NULL_TREE);
21953   tree v4sf_ftype_v4sf_v2df
21954     = build_function_type_list (V4SF_type_node,
21955                                 V4SF_type_node, V2DF_type_node, NULL_TREE);
21956   tree v2df_ftype_v2df_v4sf
21957     = build_function_type_list (V2DF_type_node,
21958                                 V2DF_type_node, V4SF_type_node, NULL_TREE);
21959   tree v2df_ftype_v2df_v2df_int
21960     = build_function_type_list (V2DF_type_node,
21961                                 V2DF_type_node, V2DF_type_node,
21962                                 integer_type_node,
21963                                 NULL_TREE);
21964   tree v2df_ftype_v2df_pcdouble
21965     = build_function_type_list (V2DF_type_node,
21966                                 V2DF_type_node, pcdouble_type_node, NULL_TREE);
21967   tree void_ftype_pdouble_v2df
21968     = build_function_type_list (void_type_node,
21969                                 pdouble_type_node, V2DF_type_node, NULL_TREE);
21970   tree void_ftype_pint_int
21971     = build_function_type_list (void_type_node,
21972                                 pint_type_node, integer_type_node, NULL_TREE);
21973   tree void_ftype_v16qi_v16qi_pchar
21974     = build_function_type_list (void_type_node,
21975                                 V16QI_type_node, V16QI_type_node,
21976                                 pchar_type_node, NULL_TREE);
21977   tree v2df_ftype_pcdouble
21978     = build_function_type_list (V2DF_type_node, pcdouble_type_node, NULL_TREE);
21979   tree v2df_ftype_v2df_v2df
21980     = build_function_type_list (V2DF_type_node,
21981                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
21982   tree v16qi_ftype_v16qi_v16qi
21983     = build_function_type_list (V16QI_type_node,
21984                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
21985   tree v8hi_ftype_v8hi_v8hi
21986     = build_function_type_list (V8HI_type_node,
21987                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
21988   tree v4si_ftype_v4si_v4si
21989     = build_function_type_list (V4SI_type_node,
21990                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
21991   tree v2di_ftype_v2di_v2di
21992     = build_function_type_list (V2DI_type_node,
21993                                 V2DI_type_node, V2DI_type_node, NULL_TREE);
21994   tree v2di_ftype_v2df_v2df
21995     = build_function_type_list (V2DI_type_node,
21996                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
21997   tree v2df_ftype_v2df
21998     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
21999   tree v2di_ftype_v2di_int
22000     = build_function_type_list (V2DI_type_node,
22001                                 V2DI_type_node, integer_type_node, NULL_TREE);
22002   tree v2di_ftype_v2di_v2di_int
22003     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22004                                 V2DI_type_node, integer_type_node, NULL_TREE);
22005   tree v4si_ftype_v4si_int
22006     = build_function_type_list (V4SI_type_node,
22007                                 V4SI_type_node, integer_type_node, NULL_TREE);
22008   tree v8hi_ftype_v8hi_int
22009     = build_function_type_list (V8HI_type_node,
22010                                 V8HI_type_node, integer_type_node, NULL_TREE);
22011   tree v4si_ftype_v8hi_v8hi
22012     = build_function_type_list (V4SI_type_node,
22013                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22014   tree v1di_ftype_v8qi_v8qi
22015     = build_function_type_list (V1DI_type_node,
22016                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22017   tree v1di_ftype_v2si_v2si
22018     = build_function_type_list (V1DI_type_node,
22019                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22020   tree v2di_ftype_v16qi_v16qi
22021     = build_function_type_list (V2DI_type_node,
22022                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22023   tree v2di_ftype_v4si_v4si
22024     = build_function_type_list (V2DI_type_node,
22025                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22026   tree int_ftype_v16qi
22027     = build_function_type_list (integer_type_node, V16QI_type_node, NULL_TREE);
22028   tree v16qi_ftype_pcchar
22029     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
22030   tree void_ftype_pchar_v16qi
22031     = build_function_type_list (void_type_node,
22032                                 pchar_type_node, V16QI_type_node, NULL_TREE);
22033
22034   tree v2di_ftype_v2di_unsigned_unsigned
22035     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22036                                 unsigned_type_node, unsigned_type_node,
22037                                 NULL_TREE);
22038   tree v2di_ftype_v2di_v2di_unsigned_unsigned
22039     = build_function_type_list (V2DI_type_node, V2DI_type_node, V2DI_type_node,
22040                                 unsigned_type_node, unsigned_type_node,
22041                                 NULL_TREE);
22042   tree v2di_ftype_v2di_v16qi
22043     = build_function_type_list (V2DI_type_node, V2DI_type_node, V16QI_type_node,
22044                                 NULL_TREE);
22045   tree v2df_ftype_v2df_v2df_v2df
22046     = build_function_type_list (V2DF_type_node,
22047                                 V2DF_type_node, V2DF_type_node,
22048                                 V2DF_type_node, NULL_TREE);
22049   tree v4sf_ftype_v4sf_v4sf_v4sf
22050     = build_function_type_list (V4SF_type_node,
22051                                 V4SF_type_node, V4SF_type_node,
22052                                 V4SF_type_node, NULL_TREE);
22053   tree v8hi_ftype_v16qi
22054     = build_function_type_list (V8HI_type_node, V16QI_type_node,
22055                                 NULL_TREE);
22056   tree v4si_ftype_v16qi
22057     = build_function_type_list (V4SI_type_node, V16QI_type_node,
22058                                 NULL_TREE);
22059   tree v2di_ftype_v16qi
22060     = build_function_type_list (V2DI_type_node, V16QI_type_node,
22061                                 NULL_TREE);
22062   tree v4si_ftype_v8hi
22063     = build_function_type_list (V4SI_type_node, V8HI_type_node,
22064                                 NULL_TREE);
22065   tree v2di_ftype_v8hi
22066     = build_function_type_list (V2DI_type_node, V8HI_type_node,
22067                                 NULL_TREE);
22068   tree v2di_ftype_v4si
22069     = build_function_type_list (V2DI_type_node, V4SI_type_node,
22070                                 NULL_TREE);
22071   tree v2di_ftype_pv2di
22072     = build_function_type_list (V2DI_type_node, pv2di_type_node,
22073                                 NULL_TREE);
22074   tree v16qi_ftype_v16qi_v16qi_int
22075     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22076                                 V16QI_type_node, integer_type_node,
22077                                 NULL_TREE);
22078   tree v16qi_ftype_v16qi_v16qi_v16qi
22079     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22080                                 V16QI_type_node, V16QI_type_node,
22081                                 NULL_TREE);
22082   tree v8hi_ftype_v8hi_v8hi_int
22083     = build_function_type_list (V8HI_type_node, V8HI_type_node,
22084                                 V8HI_type_node, integer_type_node,
22085                                 NULL_TREE);
22086   tree v4si_ftype_v4si_v4si_int
22087     = build_function_type_list (V4SI_type_node, V4SI_type_node,
22088                                 V4SI_type_node, integer_type_node,
22089                                 NULL_TREE);
22090   tree int_ftype_v2di_v2di
22091     = build_function_type_list (integer_type_node,
22092                                 V2DI_type_node, V2DI_type_node,
22093                                 NULL_TREE);
22094   tree int_ftype_v16qi_int_v16qi_int_int
22095     = build_function_type_list (integer_type_node,
22096                                 V16QI_type_node,
22097                                 integer_type_node,
22098                                 V16QI_type_node,
22099                                 integer_type_node,
22100                                 integer_type_node,
22101                                 NULL_TREE);
22102   tree v16qi_ftype_v16qi_int_v16qi_int_int
22103     = build_function_type_list (V16QI_type_node,
22104                                 V16QI_type_node,
22105                                 integer_type_node,
22106                                 V16QI_type_node,
22107                                 integer_type_node,
22108                                 integer_type_node,
22109                                 NULL_TREE);
22110   tree int_ftype_v16qi_v16qi_int
22111     = build_function_type_list (integer_type_node,
22112                                 V16QI_type_node,
22113                                 V16QI_type_node,
22114                                 integer_type_node,
22115                                 NULL_TREE);
22116
22117   /* SSE5 instructions */
22118   tree v2di_ftype_v2di_v2di_v2di
22119     = build_function_type_list (V2DI_type_node,
22120                                 V2DI_type_node,
22121                                 V2DI_type_node,
22122                                 V2DI_type_node,
22123                                 NULL_TREE);
22124
22125   tree v4si_ftype_v4si_v4si_v4si
22126     = build_function_type_list (V4SI_type_node,
22127                                 V4SI_type_node,
22128                                 V4SI_type_node,
22129                                 V4SI_type_node,
22130                                 NULL_TREE);
22131
22132   tree v4si_ftype_v4si_v4si_v2di
22133     = build_function_type_list (V4SI_type_node,
22134                                 V4SI_type_node,
22135                                 V4SI_type_node,
22136                                 V2DI_type_node,
22137                                 NULL_TREE);
22138
22139   tree v8hi_ftype_v8hi_v8hi_v8hi
22140     = build_function_type_list (V8HI_type_node,
22141                                 V8HI_type_node,
22142                                 V8HI_type_node,
22143                                 V8HI_type_node,
22144                                 NULL_TREE);
22145
22146   tree v8hi_ftype_v8hi_v8hi_v4si
22147     = build_function_type_list (V8HI_type_node,
22148                                 V8HI_type_node,
22149                                 V8HI_type_node,
22150                                 V4SI_type_node,
22151                                 NULL_TREE);
22152
22153   tree v2df_ftype_v2df_v2df_v16qi
22154     = build_function_type_list (V2DF_type_node,
22155                                 V2DF_type_node,
22156                                 V2DF_type_node,
22157                                 V16QI_type_node,
22158                                 NULL_TREE);
22159
22160   tree v4sf_ftype_v4sf_v4sf_v16qi
22161     = build_function_type_list (V4SF_type_node,
22162                                 V4SF_type_node,
22163                                 V4SF_type_node,
22164                                 V16QI_type_node,
22165                                 NULL_TREE);
22166
22167   tree v2di_ftype_v2di_si
22168     = build_function_type_list (V2DI_type_node,
22169                                 V2DI_type_node,
22170                                 integer_type_node,
22171                                 NULL_TREE);
22172
22173   tree v4si_ftype_v4si_si
22174     = build_function_type_list (V4SI_type_node,
22175                                 V4SI_type_node,
22176                                 integer_type_node,
22177                                 NULL_TREE);
22178
22179   tree v8hi_ftype_v8hi_si
22180     = build_function_type_list (V8HI_type_node,
22181                                 V8HI_type_node,
22182                                 integer_type_node,
22183                                 NULL_TREE);
22184
22185   tree v16qi_ftype_v16qi_si
22186     = build_function_type_list (V16QI_type_node,
22187                                 V16QI_type_node,
22188                                 integer_type_node,
22189                                 NULL_TREE);
22190   tree v4sf_ftype_v4hi
22191     = build_function_type_list (V4SF_type_node,
22192                                 V4HI_type_node,
22193                                 NULL_TREE);
22194
22195   tree v4hi_ftype_v4sf
22196     = build_function_type_list (V4HI_type_node,
22197                                 V4SF_type_node,
22198                                 NULL_TREE);
22199
22200   tree v2di_ftype_v2di
22201     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
22202
22203   tree v16qi_ftype_v8hi_v8hi
22204     = build_function_type_list (V16QI_type_node,
22205                                 V8HI_type_node, V8HI_type_node,
22206                                 NULL_TREE);
22207   tree v8hi_ftype_v4si_v4si
22208     = build_function_type_list (V8HI_type_node,
22209                                 V4SI_type_node, V4SI_type_node,
22210                                 NULL_TREE);
22211   tree v8hi_ftype_v16qi_v16qi 
22212     = build_function_type_list (V8HI_type_node,
22213                                 V16QI_type_node, V16QI_type_node,
22214                                 NULL_TREE);
22215   tree v4hi_ftype_v8qi_v8qi 
22216     = build_function_type_list (V4HI_type_node,
22217                                 V8QI_type_node, V8QI_type_node,
22218                                 NULL_TREE);
22219   tree unsigned_ftype_unsigned_uchar
22220     = build_function_type_list (unsigned_type_node,
22221                                 unsigned_type_node,
22222                                 unsigned_char_type_node,
22223                                 NULL_TREE);
22224   tree unsigned_ftype_unsigned_ushort
22225     = build_function_type_list (unsigned_type_node,
22226                                 unsigned_type_node,
22227                                 short_unsigned_type_node,
22228                                 NULL_TREE);
22229   tree unsigned_ftype_unsigned_unsigned
22230     = build_function_type_list (unsigned_type_node,
22231                                 unsigned_type_node,
22232                                 unsigned_type_node,
22233                                 NULL_TREE);
22234   tree uint64_ftype_uint64_uint64
22235     = build_function_type_list (long_long_unsigned_type_node,
22236                                 long_long_unsigned_type_node,
22237                                 long_long_unsigned_type_node,
22238                                 NULL_TREE);
22239   tree float_ftype_float
22240     = build_function_type_list (float_type_node,
22241                                 float_type_node,
22242                                 NULL_TREE);
22243
22244   /* AVX builtins  */
22245   tree V32QI_type_node = build_vector_type_for_mode (char_type_node,
22246                                                      V32QImode);
22247   tree V8SI_type_node = build_vector_type_for_mode (intSI_type_node,
22248                                                     V8SImode);
22249   tree V8SF_type_node = build_vector_type_for_mode (float_type_node,
22250                                                     V8SFmode);
22251   tree V4DI_type_node = build_vector_type_for_mode (long_long_integer_type_node,
22252                                                     V4DImode);
22253   tree V4DF_type_node = build_vector_type_for_mode (double_type_node,
22254                                                     V4DFmode);
22255   tree v8sf_ftype_v8sf
22256     = build_function_type_list (V8SF_type_node,
22257                                 V8SF_type_node,
22258                                 NULL_TREE);
22259   tree v8si_ftype_v8sf
22260     = build_function_type_list (V8SI_type_node,
22261                                 V8SF_type_node,
22262                                 NULL_TREE);
22263   tree v8sf_ftype_v8si
22264     = build_function_type_list (V8SF_type_node,
22265                                 V8SI_type_node,
22266                                 NULL_TREE);
22267   tree v4si_ftype_v4df
22268     = build_function_type_list (V4SI_type_node,
22269                                 V4DF_type_node,
22270                                 NULL_TREE);
22271   tree v4df_ftype_v4df
22272     = build_function_type_list (V4DF_type_node,
22273                                 V4DF_type_node,
22274                                 NULL_TREE);
22275   tree v4df_ftype_v4si
22276     = build_function_type_list (V4DF_type_node,
22277                                 V4SI_type_node,
22278                                 NULL_TREE);
22279   tree v4df_ftype_v4sf
22280     = build_function_type_list (V4DF_type_node,
22281                                 V4SF_type_node,
22282                                 NULL_TREE);
22283   tree v4sf_ftype_v4df
22284     = build_function_type_list (V4SF_type_node,
22285                                 V4DF_type_node,
22286                                 NULL_TREE);
22287   tree v8sf_ftype_v8sf_v8sf
22288     = build_function_type_list (V8SF_type_node,
22289                                 V8SF_type_node, V8SF_type_node,
22290                                 NULL_TREE);
22291   tree v4df_ftype_v4df_v4df
22292     = build_function_type_list (V4DF_type_node,
22293                                 V4DF_type_node, V4DF_type_node,
22294                                 NULL_TREE);
22295   tree v8sf_ftype_v8sf_int
22296     = build_function_type_list (V8SF_type_node,
22297                                 V8SF_type_node, integer_type_node,
22298                                 NULL_TREE);
22299   tree v4si_ftype_v8si_int
22300     = build_function_type_list (V4SI_type_node,
22301                                 V8SI_type_node, integer_type_node,
22302                                 NULL_TREE);
22303   tree v4df_ftype_v4df_int
22304     = build_function_type_list (V4DF_type_node,
22305                                 V4DF_type_node, integer_type_node,
22306                                 NULL_TREE);
22307   tree v4sf_ftype_v8sf_int
22308     = build_function_type_list (V4SF_type_node,
22309                                 V8SF_type_node, integer_type_node,
22310                                 NULL_TREE);
22311   tree v2df_ftype_v4df_int
22312     = build_function_type_list (V2DF_type_node,
22313                                 V4DF_type_node, integer_type_node,
22314                                 NULL_TREE);
22315   tree v8sf_ftype_v8sf_v8sf_int
22316     = build_function_type_list (V8SF_type_node,
22317                                 V8SF_type_node, V8SF_type_node,
22318                                 integer_type_node,
22319                                 NULL_TREE);
22320   tree v8sf_ftype_v8sf_v8sf_v8sf
22321     = build_function_type_list (V8SF_type_node,
22322                                 V8SF_type_node, V8SF_type_node,
22323                                 V8SF_type_node,
22324                                 NULL_TREE);
22325   tree v4df_ftype_v4df_v4df_v4df
22326     = build_function_type_list (V4DF_type_node,
22327                                 V4DF_type_node, V4DF_type_node,
22328                                 V4DF_type_node,
22329                                 NULL_TREE);
22330   tree v8si_ftype_v8si_v8si_int
22331     = build_function_type_list (V8SI_type_node,
22332                                 V8SI_type_node, V8SI_type_node,
22333                                 integer_type_node,
22334                                 NULL_TREE);
22335   tree v4df_ftype_v4df_v4df_int
22336     = build_function_type_list (V4DF_type_node,
22337                                 V4DF_type_node, V4DF_type_node,
22338                                 integer_type_node,
22339                                 NULL_TREE);
22340   tree v8sf_ftype_pcfloat
22341     = build_function_type_list (V8SF_type_node,
22342                                 pcfloat_type_node,
22343                                 NULL_TREE);
22344   tree v4df_ftype_pcdouble
22345     = build_function_type_list (V4DF_type_node,
22346                                 pcdouble_type_node,
22347                                 NULL_TREE);
22348   tree pcv4sf_type_node
22349     = build_pointer_type (build_type_variant (V4SF_type_node, 1, 0));
22350   tree pcv2df_type_node
22351     = build_pointer_type (build_type_variant (V2DF_type_node, 1, 0));
22352   tree v8sf_ftype_pcv4sf
22353     = build_function_type_list (V8SF_type_node,
22354                                 pcv4sf_type_node,
22355                                 NULL_TREE);
22356   tree v4df_ftype_pcv2df
22357     = build_function_type_list (V4DF_type_node,
22358                                 pcv2df_type_node,
22359                                 NULL_TREE);
22360   tree v32qi_ftype_pcchar
22361     = build_function_type_list (V32QI_type_node,
22362                                 pcchar_type_node,
22363                                 NULL_TREE);
22364   tree void_ftype_pchar_v32qi
22365     = build_function_type_list (void_type_node,
22366                                 pchar_type_node, V32QI_type_node,
22367                                 NULL_TREE);
22368   tree v8si_ftype_v8si_v4si_int
22369     = build_function_type_list (V8SI_type_node,
22370                                 V8SI_type_node, V4SI_type_node,
22371                                 integer_type_node,
22372                                 NULL_TREE);
22373   tree pv4di_type_node = build_pointer_type (V4DI_type_node);
22374   tree void_ftype_pv4di_v4di
22375     = build_function_type_list (void_type_node,
22376                                 pv4di_type_node, V4DI_type_node,
22377                                 NULL_TREE);
22378   tree v8sf_ftype_v8sf_v4sf_int
22379     = build_function_type_list (V8SF_type_node,
22380                                 V8SF_type_node, V4SF_type_node,
22381                                 integer_type_node,
22382                                 NULL_TREE);
22383   tree v4df_ftype_v4df_v2df_int
22384     = build_function_type_list (V4DF_type_node,
22385                                 V4DF_type_node, V2DF_type_node,
22386                                 integer_type_node,
22387                                 NULL_TREE);
22388   tree void_ftype_pfloat_v8sf
22389     = build_function_type_list (void_type_node,
22390                                 pfloat_type_node, V8SF_type_node,
22391                                 NULL_TREE);
22392   tree void_ftype_pdouble_v4df
22393     = build_function_type_list (void_type_node,
22394                                 pdouble_type_node, V4DF_type_node,
22395                                 NULL_TREE);
22396   tree pv8sf_type_node = build_pointer_type (V8SF_type_node);
22397   tree pv4sf_type_node = build_pointer_type (V4SF_type_node);
22398   tree pv4df_type_node = build_pointer_type (V4DF_type_node);
22399   tree pv2df_type_node = build_pointer_type (V2DF_type_node);
22400   tree pcv8sf_type_node
22401     = build_pointer_type (build_type_variant (V8SF_type_node, 1, 0));
22402   tree pcv4df_type_node
22403     = build_pointer_type (build_type_variant (V4DF_type_node, 1, 0));
22404   tree v8sf_ftype_pcv8sf_v8sf
22405     = build_function_type_list (V8SF_type_node,
22406                                 pcv8sf_type_node, V8SF_type_node,
22407                                 NULL_TREE);
22408   tree v4df_ftype_pcv4df_v4df
22409     = build_function_type_list (V4DF_type_node,
22410                                 pcv4df_type_node, V4DF_type_node,
22411                                 NULL_TREE);
22412   tree v4sf_ftype_pcv4sf_v4sf
22413     = build_function_type_list (V4SF_type_node,
22414                                 pcv4sf_type_node, V4SF_type_node,
22415                                 NULL_TREE);
22416   tree v2df_ftype_pcv2df_v2df
22417     = build_function_type_list (V2DF_type_node,
22418                                 pcv2df_type_node, V2DF_type_node,
22419                                 NULL_TREE);
22420   tree void_ftype_pv8sf_v8sf_v8sf
22421     = build_function_type_list (void_type_node,
22422                                 pv8sf_type_node, V8SF_type_node,
22423                                 V8SF_type_node,
22424                                 NULL_TREE);
22425   tree void_ftype_pv4df_v4df_v4df
22426     = build_function_type_list (void_type_node,
22427                                 pv4df_type_node, V4DF_type_node,
22428                                 V4DF_type_node,
22429                                 NULL_TREE);
22430   tree void_ftype_pv4sf_v4sf_v4sf
22431     = build_function_type_list (void_type_node,
22432                                 pv4sf_type_node, V4SF_type_node,
22433                                 V4SF_type_node,
22434                                 NULL_TREE);
22435   tree void_ftype_pv2df_v2df_v2df
22436     = build_function_type_list (void_type_node,
22437                                 pv2df_type_node, V2DF_type_node,
22438                                 V2DF_type_node,
22439                                 NULL_TREE);
22440   tree v4df_ftype_v2df
22441     = build_function_type_list (V4DF_type_node,
22442                                 V2DF_type_node,
22443                                 NULL_TREE);
22444   tree v8sf_ftype_v4sf
22445     = build_function_type_list (V8SF_type_node,
22446                                 V4SF_type_node,
22447                                 NULL_TREE);
22448   tree v8si_ftype_v4si
22449     = build_function_type_list (V8SI_type_node,
22450                                 V4SI_type_node,
22451                                 NULL_TREE);
22452   tree v2df_ftype_v4df
22453     = build_function_type_list (V2DF_type_node,
22454                                 V4DF_type_node,
22455                                 NULL_TREE);
22456   tree v4sf_ftype_v8sf
22457     = build_function_type_list (V4SF_type_node,
22458                                 V8SF_type_node,
22459                                 NULL_TREE);
22460   tree v4si_ftype_v8si
22461     = build_function_type_list (V4SI_type_node,
22462                                 V8SI_type_node,
22463                                 NULL_TREE);
22464   tree int_ftype_v4df
22465     = build_function_type_list (integer_type_node,
22466                                 V4DF_type_node,
22467                                 NULL_TREE);
22468   tree int_ftype_v8sf
22469     = build_function_type_list (integer_type_node,
22470                                 V8SF_type_node,
22471                                 NULL_TREE);
22472   tree int_ftype_v8sf_v8sf
22473     = build_function_type_list (integer_type_node,
22474                                 V8SF_type_node, V8SF_type_node,
22475                                 NULL_TREE);
22476   tree int_ftype_v4di_v4di
22477     = build_function_type_list (integer_type_node,
22478                                 V4DI_type_node, V4DI_type_node,
22479                                 NULL_TREE);
22480   tree int_ftype_v4df_v4df
22481     = build_function_type_list (integer_type_node,
22482                                 V4DF_type_node, V4DF_type_node,
22483                                 NULL_TREE);
22484   tree v8sf_ftype_v8sf_v8si
22485     = build_function_type_list (V8SF_type_node,
22486                                 V8SF_type_node, V8SI_type_node,
22487                                 NULL_TREE);
22488   tree v4df_ftype_v4df_v4di
22489     = build_function_type_list (V4DF_type_node,
22490                                 V4DF_type_node, V4DI_type_node,
22491                                 NULL_TREE);
22492   tree v4sf_ftype_v4sf_v4si
22493     = build_function_type_list (V4SF_type_node,
22494                                 V4SF_type_node, V4SI_type_node, NULL_TREE);
22495   tree v2df_ftype_v2df_v2di
22496     = build_function_type_list (V2DF_type_node,
22497                                 V2DF_type_node, V2DI_type_node, NULL_TREE);
22498
22499   tree ftype;
22500
22501   /* Add all special builtins with variable number of operands.  */
22502   for (i = 0, d = bdesc_special_args;
22503        i < ARRAY_SIZE (bdesc_special_args);
22504        i++, d++)
22505     {
22506       tree type;
22507
22508       if (d->name == 0)
22509         continue;
22510
22511       switch ((enum ix86_special_builtin_type) d->flag)
22512         {
22513         case VOID_FTYPE_VOID:
22514           type = void_ftype_void;
22515           break;
22516         case V32QI_FTYPE_PCCHAR:
22517           type = v32qi_ftype_pcchar;
22518           break;
22519         case V16QI_FTYPE_PCCHAR:
22520           type = v16qi_ftype_pcchar;
22521           break;
22522         case V8SF_FTYPE_PCV4SF:
22523           type = v8sf_ftype_pcv4sf;
22524           break;
22525         case V8SF_FTYPE_PCFLOAT:
22526           type = v8sf_ftype_pcfloat;
22527           break;
22528         case V4DF_FTYPE_PCV2DF:
22529           type = v4df_ftype_pcv2df;
22530           break;
22531         case V4DF_FTYPE_PCDOUBLE:
22532           type = v4df_ftype_pcdouble;
22533           break;
22534         case V4SF_FTYPE_PCFLOAT:
22535           type = v4sf_ftype_pcfloat;
22536           break;
22537         case V2DI_FTYPE_PV2DI:
22538           type = v2di_ftype_pv2di;
22539           break;
22540         case V2DF_FTYPE_PCDOUBLE:
22541           type = v2df_ftype_pcdouble;
22542           break;
22543         case V8SF_FTYPE_PCV8SF_V8SF:
22544           type = v8sf_ftype_pcv8sf_v8sf;
22545           break;
22546         case V4DF_FTYPE_PCV4DF_V4DF:
22547           type = v4df_ftype_pcv4df_v4df;
22548           break;
22549         case V4SF_FTYPE_V4SF_PCV2SF:
22550           type = v4sf_ftype_v4sf_pcv2sf;
22551           break;
22552         case V4SF_FTYPE_PCV4SF_V4SF:
22553           type = v4sf_ftype_pcv4sf_v4sf;
22554           break;
22555         case V2DF_FTYPE_V2DF_PCDOUBLE:
22556           type = v2df_ftype_v2df_pcdouble;
22557           break;
22558         case V2DF_FTYPE_PCV2DF_V2DF:
22559           type = v2df_ftype_pcv2df_v2df;
22560           break;
22561         case VOID_FTYPE_PV2SF_V4SF:
22562           type = void_ftype_pv2sf_v4sf;
22563           break;
22564         case VOID_FTYPE_PV4DI_V4DI:
22565           type = void_ftype_pv4di_v4di;
22566           break;
22567         case VOID_FTYPE_PV2DI_V2DI:
22568           type = void_ftype_pv2di_v2di;
22569           break;
22570         case VOID_FTYPE_PCHAR_V32QI:
22571           type = void_ftype_pchar_v32qi;
22572           break;
22573         case VOID_FTYPE_PCHAR_V16QI:
22574           type = void_ftype_pchar_v16qi;
22575           break;
22576         case VOID_FTYPE_PFLOAT_V8SF:
22577           type = void_ftype_pfloat_v8sf;
22578           break;
22579         case VOID_FTYPE_PFLOAT_V4SF:
22580           type = void_ftype_pfloat_v4sf;
22581           break;
22582         case VOID_FTYPE_PDOUBLE_V4DF:
22583           type = void_ftype_pdouble_v4df;
22584           break;
22585         case VOID_FTYPE_PDOUBLE_V2DF:
22586           type = void_ftype_pdouble_v2df;
22587           break;
22588         case VOID_FTYPE_PDI_DI:
22589           type = void_ftype_pdi_di;
22590           break;
22591         case VOID_FTYPE_PINT_INT:
22592           type = void_ftype_pint_int;
22593           break;
22594         case VOID_FTYPE_PV8SF_V8SF_V8SF:
22595           type = void_ftype_pv8sf_v8sf_v8sf;
22596           break;
22597         case VOID_FTYPE_PV4DF_V4DF_V4DF:
22598           type = void_ftype_pv4df_v4df_v4df;
22599           break;
22600         case VOID_FTYPE_PV4SF_V4SF_V4SF:
22601           type = void_ftype_pv4sf_v4sf_v4sf;
22602           break;
22603         case VOID_FTYPE_PV2DF_V2DF_V2DF:
22604           type = void_ftype_pv2df_v2df_v2df;
22605           break;
22606         default:
22607           gcc_unreachable ();
22608         }
22609
22610       def_builtin (d->mask, d->name, type, d->code);
22611     }
22612
22613   /* Add all builtins with variable number of operands.  */
22614   for (i = 0, d = bdesc_args;
22615        i < ARRAY_SIZE (bdesc_args);
22616        i++, d++)
22617     {
22618       tree type;
22619
22620       if (d->name == 0)
22621         continue;
22622
22623       switch ((enum ix86_builtin_type) d->flag)
22624         {
22625         case FLOAT_FTYPE_FLOAT:
22626           type = float_ftype_float;
22627           break;
22628         case INT_FTYPE_V8SF_V8SF_PTEST:
22629           type = int_ftype_v8sf_v8sf;
22630           break;
22631         case INT_FTYPE_V4DI_V4DI_PTEST:
22632           type = int_ftype_v4di_v4di;
22633           break;
22634         case INT_FTYPE_V4DF_V4DF_PTEST:
22635           type = int_ftype_v4df_v4df;
22636           break;
22637         case INT_FTYPE_V4SF_V4SF_PTEST:
22638           type = int_ftype_v4sf_v4sf;
22639           break;
22640         case INT_FTYPE_V2DI_V2DI_PTEST:
22641           type = int_ftype_v2di_v2di;
22642           break;
22643         case INT_FTYPE_V2DF_V2DF_PTEST:
22644           type = int_ftype_v2df_v2df;
22645           break;
22646         case INT64_FTYPE_V4SF:
22647           type = int64_ftype_v4sf;
22648           break;
22649         case INT64_FTYPE_V2DF:
22650           type = int64_ftype_v2df;
22651           break;
22652         case INT_FTYPE_V16QI:
22653           type = int_ftype_v16qi;
22654           break;
22655         case INT_FTYPE_V8QI:
22656           type = int_ftype_v8qi;
22657           break;
22658         case INT_FTYPE_V8SF:
22659           type = int_ftype_v8sf;
22660           break;
22661         case INT_FTYPE_V4DF:
22662           type = int_ftype_v4df;
22663           break;
22664         case INT_FTYPE_V4SF:
22665           type = int_ftype_v4sf;
22666           break;
22667         case INT_FTYPE_V2DF:
22668           type = int_ftype_v2df;
22669           break;
22670         case V16QI_FTYPE_V16QI:
22671           type = v16qi_ftype_v16qi;
22672           break;
22673         case V8SI_FTYPE_V8SF:
22674           type = v8si_ftype_v8sf;
22675           break;
22676         case V8SI_FTYPE_V4SI:
22677           type = v8si_ftype_v4si;
22678           break;
22679         case V8HI_FTYPE_V8HI:
22680           type = v8hi_ftype_v8hi;
22681           break;
22682         case V8HI_FTYPE_V16QI:
22683           type = v8hi_ftype_v16qi;
22684           break;
22685         case V8QI_FTYPE_V8QI:
22686           type = v8qi_ftype_v8qi;
22687           break;
22688         case V8SF_FTYPE_V8SF:
22689           type = v8sf_ftype_v8sf;
22690           break;
22691         case V8SF_FTYPE_V8SI:
22692           type = v8sf_ftype_v8si;
22693           break;
22694         case V8SF_FTYPE_V4SF:
22695           type = v8sf_ftype_v4sf;
22696           break;
22697         case V4SI_FTYPE_V4DF:
22698           type = v4si_ftype_v4df;
22699           break;
22700         case V4SI_FTYPE_V4SI:
22701           type = v4si_ftype_v4si;
22702           break;
22703         case V4SI_FTYPE_V16QI:
22704           type = v4si_ftype_v16qi;
22705           break;
22706         case V4SI_FTYPE_V8SI:
22707           type = v4si_ftype_v8si;
22708           break;
22709         case V4SI_FTYPE_V8HI:
22710           type = v4si_ftype_v8hi;
22711           break;
22712         case V4SI_FTYPE_V4SF:
22713           type = v4si_ftype_v4sf;
22714           break;
22715         case V4SI_FTYPE_V2DF:
22716           type = v4si_ftype_v2df;
22717           break;
22718         case V4HI_FTYPE_V4HI:
22719           type = v4hi_ftype_v4hi;
22720           break;
22721         case V4DF_FTYPE_V4DF:
22722           type = v4df_ftype_v4df;
22723           break;
22724         case V4DF_FTYPE_V4SI:
22725           type = v4df_ftype_v4si;
22726           break;
22727         case V4DF_FTYPE_V4SF:
22728           type = v4df_ftype_v4sf;
22729           break;
22730         case V4DF_FTYPE_V2DF:
22731           type = v4df_ftype_v2df;
22732           break;
22733         case V4SF_FTYPE_V4SF:
22734         case V4SF_FTYPE_V4SF_VEC_MERGE:
22735           type = v4sf_ftype_v4sf;
22736           break;
22737         case V4SF_FTYPE_V8SF:
22738           type = v4sf_ftype_v8sf;
22739           break;
22740         case V4SF_FTYPE_V4SI:
22741           type = v4sf_ftype_v4si;
22742           break;
22743         case V4SF_FTYPE_V4DF:
22744           type = v4sf_ftype_v4df;
22745           break;
22746         case V4SF_FTYPE_V2DF:
22747           type = v4sf_ftype_v2df;
22748           break;
22749         case V2DI_FTYPE_V2DI:
22750           type = v2di_ftype_v2di;
22751           break;
22752         case V2DI_FTYPE_V16QI:
22753           type = v2di_ftype_v16qi;
22754           break;
22755         case V2DI_FTYPE_V8HI:
22756           type = v2di_ftype_v8hi;
22757           break;
22758         case V2DI_FTYPE_V4SI:
22759           type = v2di_ftype_v4si;
22760           break;
22761         case V2SI_FTYPE_V2SI:
22762           type = v2si_ftype_v2si;
22763           break;
22764         case V2SI_FTYPE_V4SF:
22765           type = v2si_ftype_v4sf;
22766           break;
22767         case V2SI_FTYPE_V2DF:
22768           type = v2si_ftype_v2df;
22769           break;
22770         case V2SI_FTYPE_V2SF:
22771           type = v2si_ftype_v2sf;
22772           break;
22773         case V2DF_FTYPE_V4DF:
22774           type = v2df_ftype_v4df;
22775           break;
22776         case V2DF_FTYPE_V4SF:
22777           type = v2df_ftype_v4sf;
22778           break;
22779         case V2DF_FTYPE_V2DF:
22780         case V2DF_FTYPE_V2DF_VEC_MERGE:
22781           type = v2df_ftype_v2df;
22782           break;
22783         case V2DF_FTYPE_V2SI:
22784           type = v2df_ftype_v2si;
22785           break;
22786         case V2DF_FTYPE_V4SI:
22787           type = v2df_ftype_v4si;
22788           break;
22789         case V2SF_FTYPE_V2SF:
22790           type = v2sf_ftype_v2sf;
22791           break;
22792         case V2SF_FTYPE_V2SI:
22793           type = v2sf_ftype_v2si;
22794           break;
22795         case V16QI_FTYPE_V16QI_V16QI:
22796           type = v16qi_ftype_v16qi_v16qi;
22797           break;
22798         case V16QI_FTYPE_V8HI_V8HI:
22799           type = v16qi_ftype_v8hi_v8hi;
22800           break;
22801         case V8QI_FTYPE_V8QI_V8QI:
22802           type = v8qi_ftype_v8qi_v8qi;
22803           break;
22804         case V8QI_FTYPE_V4HI_V4HI:
22805           type = v8qi_ftype_v4hi_v4hi;
22806           break;
22807         case V8HI_FTYPE_V8HI_V8HI:
22808         case V8HI_FTYPE_V8HI_V8HI_COUNT:
22809           type = v8hi_ftype_v8hi_v8hi;
22810           break;
22811         case V8HI_FTYPE_V16QI_V16QI:
22812           type = v8hi_ftype_v16qi_v16qi;
22813           break;
22814         case V8HI_FTYPE_V4SI_V4SI:
22815           type = v8hi_ftype_v4si_v4si;
22816           break;
22817         case V8HI_FTYPE_V8HI_SI_COUNT:
22818           type = v8hi_ftype_v8hi_int;
22819           break;
22820         case V8SF_FTYPE_V8SF_V8SF:
22821           type = v8sf_ftype_v8sf_v8sf;
22822           break;
22823         case V8SF_FTYPE_V8SF_V8SI:
22824           type = v8sf_ftype_v8sf_v8si;
22825           break;
22826         case V4SI_FTYPE_V4SI_V4SI:
22827         case V4SI_FTYPE_V4SI_V4SI_COUNT:
22828           type = v4si_ftype_v4si_v4si;
22829           break;
22830         case V4SI_FTYPE_V8HI_V8HI:
22831           type = v4si_ftype_v8hi_v8hi;
22832           break;
22833         case V4SI_FTYPE_V4SF_V4SF:
22834           type = v4si_ftype_v4sf_v4sf;
22835           break;
22836         case V4SI_FTYPE_V2DF_V2DF:
22837           type = v4si_ftype_v2df_v2df;
22838           break;
22839         case V4SI_FTYPE_V4SI_SI_COUNT:
22840           type = v4si_ftype_v4si_int;
22841           break;
22842         case V4HI_FTYPE_V4HI_V4HI:
22843         case V4HI_FTYPE_V4HI_V4HI_COUNT:
22844           type = v4hi_ftype_v4hi_v4hi;
22845           break;
22846         case V4HI_FTYPE_V8QI_V8QI:
22847           type = v4hi_ftype_v8qi_v8qi;
22848           break;
22849         case V4HI_FTYPE_V2SI_V2SI:
22850           type = v4hi_ftype_v2si_v2si;
22851           break;
22852         case V4HI_FTYPE_V4HI_SI_COUNT:
22853           type = v4hi_ftype_v4hi_int;
22854           break;
22855         case V4DF_FTYPE_V4DF_V4DF:
22856           type = v4df_ftype_v4df_v4df;
22857           break;
22858         case V4DF_FTYPE_V4DF_V4DI:
22859           type = v4df_ftype_v4df_v4di;
22860           break;
22861         case V4SF_FTYPE_V4SF_V4SF:
22862         case V4SF_FTYPE_V4SF_V4SF_SWAP:
22863           type = v4sf_ftype_v4sf_v4sf;
22864           break;
22865         case V4SF_FTYPE_V4SF_V4SI:
22866           type = v4sf_ftype_v4sf_v4si;
22867           break;
22868         case V4SF_FTYPE_V4SF_V2SI:
22869           type = v4sf_ftype_v4sf_v2si;
22870           break;
22871         case V4SF_FTYPE_V4SF_V2DF:
22872           type = v4sf_ftype_v4sf_v2df;
22873           break;
22874         case V4SF_FTYPE_V4SF_DI:
22875           type = v4sf_ftype_v4sf_int64;
22876           break;
22877         case V4SF_FTYPE_V4SF_SI:
22878           type = v4sf_ftype_v4sf_int;
22879           break;
22880         case V2DI_FTYPE_V2DI_V2DI:
22881         case V2DI_FTYPE_V2DI_V2DI_COUNT:
22882           type = v2di_ftype_v2di_v2di;
22883           break;
22884         case V2DI_FTYPE_V16QI_V16QI:
22885           type = v2di_ftype_v16qi_v16qi;
22886           break;
22887         case V2DI_FTYPE_V4SI_V4SI:
22888           type = v2di_ftype_v4si_v4si;
22889           break;
22890         case V2DI_FTYPE_V2DI_V16QI:
22891           type = v2di_ftype_v2di_v16qi;
22892           break;
22893         case V2DI_FTYPE_V2DF_V2DF:
22894           type = v2di_ftype_v2df_v2df;
22895           break;
22896         case V2DI_FTYPE_V2DI_SI_COUNT:
22897           type = v2di_ftype_v2di_int;
22898           break;
22899         case V2SI_FTYPE_V2SI_V2SI:
22900         case V2SI_FTYPE_V2SI_V2SI_COUNT:
22901           type = v2si_ftype_v2si_v2si;
22902           break;
22903         case V2SI_FTYPE_V4HI_V4HI:
22904           type = v2si_ftype_v4hi_v4hi;
22905           break;
22906         case V2SI_FTYPE_V2SF_V2SF:
22907           type = v2si_ftype_v2sf_v2sf;
22908           break;
22909         case V2SI_FTYPE_V2SI_SI_COUNT:
22910           type = v2si_ftype_v2si_int;
22911           break;
22912         case V2DF_FTYPE_V2DF_V2DF:
22913         case V2DF_FTYPE_V2DF_V2DF_SWAP:
22914           type = v2df_ftype_v2df_v2df;
22915           break;
22916         case V2DF_FTYPE_V2DF_V4SF:
22917           type = v2df_ftype_v2df_v4sf;
22918           break;
22919         case V2DF_FTYPE_V2DF_V2DI:
22920           type = v2df_ftype_v2df_v2di;
22921           break;
22922         case V2DF_FTYPE_V2DF_DI:
22923           type = v2df_ftype_v2df_int64;
22924           break;
22925         case V2DF_FTYPE_V2DF_SI:
22926           type = v2df_ftype_v2df_int;
22927           break;
22928         case V2SF_FTYPE_V2SF_V2SF:
22929           type = v2sf_ftype_v2sf_v2sf;
22930           break;
22931         case V1DI_FTYPE_V1DI_V1DI:
22932         case V1DI_FTYPE_V1DI_V1DI_COUNT:
22933           type = v1di_ftype_v1di_v1di;
22934           break;
22935         case V1DI_FTYPE_V8QI_V8QI:
22936           type = v1di_ftype_v8qi_v8qi;
22937           break;
22938         case V1DI_FTYPE_V2SI_V2SI:
22939           type = v1di_ftype_v2si_v2si;
22940           break;
22941         case V1DI_FTYPE_V1DI_SI_COUNT:
22942           type = v1di_ftype_v1di_int;
22943           break;
22944         case UINT64_FTYPE_UINT64_UINT64:
22945           type = uint64_ftype_uint64_uint64;
22946           break;
22947         case UINT_FTYPE_UINT_UINT:
22948           type = unsigned_ftype_unsigned_unsigned;
22949           break;
22950         case UINT_FTYPE_UINT_USHORT:
22951           type = unsigned_ftype_unsigned_ushort;
22952           break;
22953         case UINT_FTYPE_UINT_UCHAR:
22954           type = unsigned_ftype_unsigned_uchar;
22955           break;
22956         case V8HI_FTYPE_V8HI_INT:
22957           type = v8hi_ftype_v8hi_int;
22958           break;
22959         case V8SF_FTYPE_V8SF_INT:
22960           type = v8sf_ftype_v8sf_int;
22961           break;
22962         case V4SI_FTYPE_V4SI_INT:
22963           type = v4si_ftype_v4si_int;
22964           break;
22965         case V4SI_FTYPE_V8SI_INT:
22966           type = v4si_ftype_v8si_int;
22967           break;
22968         case V4HI_FTYPE_V4HI_INT:
22969           type = v4hi_ftype_v4hi_int;
22970           break;
22971         case V4DF_FTYPE_V4DF_INT:
22972           type = v4df_ftype_v4df_int;
22973           break;
22974         case V4SF_FTYPE_V4SF_INT:
22975           type = v4sf_ftype_v4sf_int;
22976           break;
22977         case V4SF_FTYPE_V8SF_INT:
22978           type = v4sf_ftype_v8sf_int;
22979           break;
22980         case V2DI_FTYPE_V2DI_INT:
22981         case V2DI2TI_FTYPE_V2DI_INT:
22982           type = v2di_ftype_v2di_int;
22983           break;
22984         case V2DF_FTYPE_V2DF_INT:
22985           type = v2df_ftype_v2df_int;
22986           break;
22987         case V2DF_FTYPE_V4DF_INT:
22988           type = v2df_ftype_v4df_int;
22989           break;
22990         case V16QI_FTYPE_V16QI_V16QI_V16QI:
22991           type = v16qi_ftype_v16qi_v16qi_v16qi;
22992           break;
22993         case V8SF_FTYPE_V8SF_V8SF_V8SF:
22994           type = v8sf_ftype_v8sf_v8sf_v8sf;
22995           break;
22996         case V4DF_FTYPE_V4DF_V4DF_V4DF:
22997           type = v4df_ftype_v4df_v4df_v4df;
22998           break;
22999         case V4SF_FTYPE_V4SF_V4SF_V4SF:
23000           type = v4sf_ftype_v4sf_v4sf_v4sf;
23001           break;
23002         case V2DF_FTYPE_V2DF_V2DF_V2DF:
23003           type = v2df_ftype_v2df_v2df_v2df;
23004           break;
23005         case V16QI_FTYPE_V16QI_V16QI_INT:
23006           type = v16qi_ftype_v16qi_v16qi_int;
23007           break;
23008         case V8SI_FTYPE_V8SI_V8SI_INT:
23009           type = v8si_ftype_v8si_v8si_int;
23010           break;
23011         case V8SI_FTYPE_V8SI_V4SI_INT:
23012           type = v8si_ftype_v8si_v4si_int;
23013           break;
23014         case V8HI_FTYPE_V8HI_V8HI_INT:
23015           type = v8hi_ftype_v8hi_v8hi_int;
23016           break;
23017         case V8SF_FTYPE_V8SF_V8SF_INT:
23018           type = v8sf_ftype_v8sf_v8sf_int;
23019           break;
23020         case V8SF_FTYPE_V8SF_V4SF_INT:
23021           type = v8sf_ftype_v8sf_v4sf_int;
23022           break;
23023         case V4SI_FTYPE_V4SI_V4SI_INT:
23024           type = v4si_ftype_v4si_v4si_int;
23025           break;
23026         case V4DF_FTYPE_V4DF_V4DF_INT:
23027           type = v4df_ftype_v4df_v4df_int;
23028           break;
23029         case V4DF_FTYPE_V4DF_V2DF_INT:
23030           type = v4df_ftype_v4df_v2df_int;
23031           break;
23032         case V4SF_FTYPE_V4SF_V4SF_INT:
23033           type = v4sf_ftype_v4sf_v4sf_int;
23034           break;
23035         case V2DI_FTYPE_V2DI_V2DI_INT:
23036         case V2DI2TI_FTYPE_V2DI_V2DI_INT:
23037           type = v2di_ftype_v2di_v2di_int;
23038           break;
23039         case V2DF_FTYPE_V2DF_V2DF_INT:
23040           type = v2df_ftype_v2df_v2df_int;
23041           break;
23042         case V2DI_FTYPE_V2DI_UINT_UINT:
23043           type = v2di_ftype_v2di_unsigned_unsigned;
23044           break;
23045         case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
23046           type = v2di_ftype_v2di_v2di_unsigned_unsigned;
23047           break;
23048         case V1DI2DI_FTYPE_V1DI_V1DI_INT:
23049           type = v1di_ftype_v1di_v1di_int;
23050           break;
23051         default:
23052           gcc_unreachable ();
23053         }
23054
23055       def_builtin_const (d->mask, d->name, type, d->code);
23056     }
23057
23058   /* pcmpestr[im] insns.  */
23059   for (i = 0, d = bdesc_pcmpestr;
23060        i < ARRAY_SIZE (bdesc_pcmpestr);
23061        i++, d++)
23062     {
23063       if (d->code == IX86_BUILTIN_PCMPESTRM128)
23064         ftype = v16qi_ftype_v16qi_int_v16qi_int_int;
23065       else
23066         ftype = int_ftype_v16qi_int_v16qi_int_int;
23067       def_builtin_const (d->mask, d->name, ftype, d->code);
23068     }
23069
23070   /* pcmpistr[im] insns.  */
23071   for (i = 0, d = bdesc_pcmpistr;
23072        i < ARRAY_SIZE (bdesc_pcmpistr);
23073        i++, d++)
23074     {
23075       if (d->code == IX86_BUILTIN_PCMPISTRM128)
23076         ftype = v16qi_ftype_v16qi_v16qi_int;
23077       else
23078         ftype = int_ftype_v16qi_v16qi_int;
23079       def_builtin_const (d->mask, d->name, ftype, d->code);
23080     }
23081
23082   /* comi/ucomi insns.  */
23083   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
23084     if (d->mask == OPTION_MASK_ISA_SSE2)
23085       def_builtin_const (d->mask, d->name, int_ftype_v2df_v2df, d->code);
23086     else
23087       def_builtin_const (d->mask, d->name, int_ftype_v4sf_v4sf, d->code);
23088
23089   /* SSE */
23090   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr", void_ftype_unsigned, IX86_BUILTIN_LDMXCSR);
23091   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr", unsigned_ftype_void, IX86_BUILTIN_STMXCSR);
23092
23093   /* SSE or 3DNow!A */
23094   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_maskmovq", void_ftype_v8qi_v8qi_pchar, IX86_BUILTIN_MASKMOVQ);
23095
23096   /* SSE2 */
23097   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu", void_ftype_v16qi_v16qi_pchar, IX86_BUILTIN_MASKMOVDQU);
23098
23099   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush", void_ftype_pcvoid, IX86_BUILTIN_CLFLUSH);
23100   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence", void_ftype_void, IX86_BUILTIN_MFENCE);
23101
23102   /* SSE3.  */
23103   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor", void_ftype_pcvoid_unsigned_unsigned, IX86_BUILTIN_MONITOR);
23104   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait", void_ftype_unsigned_unsigned, IX86_BUILTIN_MWAIT);
23105
23106   /* AES */
23107   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENC128);
23108   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENCLAST128);
23109   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDEC128);
23110   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDECLAST128);
23111   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128", v2di_ftype_v2di, IX86_BUILTIN_AESIMC128);
23112   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128", v2di_ftype_v2di_int, IX86_BUILTIN_AESKEYGENASSIST128);
23113
23114   /* PCLMUL */
23115   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128", v2di_ftype_v2di_v2di_int, IX86_BUILTIN_PCLMULQDQ128);
23116
23117   /* AVX */
23118   def_builtin (OPTION_MASK_ISA_AVX, "__builtin_ia32_vzeroupper", void_ftype_void,
23119                TARGET_64BIT ? IX86_BUILTIN_VZEROUPPER_REX64 : IX86_BUILTIN_VZEROUPPER);
23120
23121   /* Access to the vec_init patterns.  */
23122   ftype = build_function_type_list (V2SI_type_node, integer_type_node,
23123                                     integer_type_node, NULL_TREE);
23124   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si", ftype, IX86_BUILTIN_VEC_INIT_V2SI);
23125
23126   ftype = build_function_type_list (V4HI_type_node, short_integer_type_node,
23127                                     short_integer_type_node,
23128                                     short_integer_type_node,
23129                                     short_integer_type_node, NULL_TREE);
23130   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi", ftype, IX86_BUILTIN_VEC_INIT_V4HI);
23131
23132   ftype = build_function_type_list (V8QI_type_node, char_type_node,
23133                                     char_type_node, char_type_node,
23134                                     char_type_node, char_type_node,
23135                                     char_type_node, char_type_node,
23136                                     char_type_node, NULL_TREE);
23137   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi", ftype, IX86_BUILTIN_VEC_INIT_V8QI);
23138
23139   /* Access to the vec_extract patterns.  */
23140   ftype = build_function_type_list (double_type_node, V2DF_type_node,
23141                                     integer_type_node, NULL_TREE);
23142   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df", ftype, IX86_BUILTIN_VEC_EXT_V2DF);
23143
23144   ftype = build_function_type_list (long_long_integer_type_node,
23145                                     V2DI_type_node, integer_type_node,
23146                                     NULL_TREE);
23147   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di", ftype, IX86_BUILTIN_VEC_EXT_V2DI);
23148
23149   ftype = build_function_type_list (float_type_node, V4SF_type_node,
23150                                     integer_type_node, NULL_TREE);
23151   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf", ftype, IX86_BUILTIN_VEC_EXT_V4SF);
23152
23153   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
23154                                     integer_type_node, NULL_TREE);
23155   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si", ftype, IX86_BUILTIN_VEC_EXT_V4SI);
23156
23157   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
23158                                     integer_type_node, NULL_TREE);
23159   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi", ftype, IX86_BUILTIN_VEC_EXT_V8HI);
23160
23161   ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
23162                                     integer_type_node, NULL_TREE);
23163   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_ext_v4hi", ftype, IX86_BUILTIN_VEC_EXT_V4HI);
23164
23165   ftype = build_function_type_list (intSI_type_node, V2SI_type_node,
23166                                     integer_type_node, NULL_TREE);
23167   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si", ftype, IX86_BUILTIN_VEC_EXT_V2SI);
23168
23169   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
23170                                     integer_type_node, NULL_TREE);
23171   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi", ftype, IX86_BUILTIN_VEC_EXT_V16QI);
23172
23173   /* Access to the vec_set patterns.  */
23174   ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
23175                                     intDI_type_node,
23176                                     integer_type_node, NULL_TREE);
23177   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT, "__builtin_ia32_vec_set_v2di", ftype, IX86_BUILTIN_VEC_SET_V2DI);
23178
23179   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
23180                                     float_type_node,
23181                                     integer_type_node, NULL_TREE);
23182   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf", ftype, IX86_BUILTIN_VEC_SET_V4SF);
23183
23184   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
23185                                     intSI_type_node,
23186                                     integer_type_node, NULL_TREE);
23187   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si", ftype, IX86_BUILTIN_VEC_SET_V4SI);
23188
23189   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
23190                                     intHI_type_node,
23191                                     integer_type_node, NULL_TREE);
23192   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi", ftype, IX86_BUILTIN_VEC_SET_V8HI);
23193
23194   ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
23195                                     intHI_type_node,
23196                                     integer_type_node, NULL_TREE);
23197   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_set_v4hi", ftype, IX86_BUILTIN_VEC_SET_V4HI);
23198
23199   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
23200                                     intQI_type_node,
23201                                     integer_type_node, NULL_TREE);
23202   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi", ftype, IX86_BUILTIN_VEC_SET_V16QI);
23203
23204   /* Add SSE5 multi-arg argument instructions */
23205   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
23206     {
23207       tree mtype = NULL_TREE;
23208
23209       if (d->name == 0)
23210         continue;
23211
23212       switch ((enum multi_arg_type)d->flag)
23213         {
23214         case MULTI_ARG_3_SF:     mtype = v4sf_ftype_v4sf_v4sf_v4sf;     break;
23215         case MULTI_ARG_3_DF:     mtype = v2df_ftype_v2df_v2df_v2df;     break;
23216         case MULTI_ARG_3_DI:     mtype = v2di_ftype_v2di_v2di_v2di;     break;
23217         case MULTI_ARG_3_SI:     mtype = v4si_ftype_v4si_v4si_v4si;     break;
23218         case MULTI_ARG_3_SI_DI:  mtype = v4si_ftype_v4si_v4si_v2di;     break;
23219         case MULTI_ARG_3_HI:     mtype = v8hi_ftype_v8hi_v8hi_v8hi;     break;
23220         case MULTI_ARG_3_HI_SI:  mtype = v8hi_ftype_v8hi_v8hi_v4si;     break;
23221         case MULTI_ARG_3_QI:     mtype = v16qi_ftype_v16qi_v16qi_v16qi; break;
23222         case MULTI_ARG_3_PERMPS: mtype = v4sf_ftype_v4sf_v4sf_v16qi;    break;
23223         case MULTI_ARG_3_PERMPD: mtype = v2df_ftype_v2df_v2df_v16qi;    break;
23224         case MULTI_ARG_2_SF:     mtype = v4sf_ftype_v4sf_v4sf;          break;
23225         case MULTI_ARG_2_DF:     mtype = v2df_ftype_v2df_v2df;          break;
23226         case MULTI_ARG_2_DI:     mtype = v2di_ftype_v2di_v2di;          break;
23227         case MULTI_ARG_2_SI:     mtype = v4si_ftype_v4si_v4si;          break;
23228         case MULTI_ARG_2_HI:     mtype = v8hi_ftype_v8hi_v8hi;          break;
23229         case MULTI_ARG_2_QI:     mtype = v16qi_ftype_v16qi_v16qi;       break;
23230         case MULTI_ARG_2_DI_IMM: mtype = v2di_ftype_v2di_si;            break;
23231         case MULTI_ARG_2_SI_IMM: mtype = v4si_ftype_v4si_si;            break;
23232         case MULTI_ARG_2_HI_IMM: mtype = v8hi_ftype_v8hi_si;            break;
23233         case MULTI_ARG_2_QI_IMM: mtype = v16qi_ftype_v16qi_si;          break;
23234         case MULTI_ARG_2_SF_CMP: mtype = v4sf_ftype_v4sf_v4sf;          break;
23235         case MULTI_ARG_2_DF_CMP: mtype = v2df_ftype_v2df_v2df;          break;
23236         case MULTI_ARG_2_DI_CMP: mtype = v2di_ftype_v2di_v2di;          break;
23237         case MULTI_ARG_2_SI_CMP: mtype = v4si_ftype_v4si_v4si;          break;
23238         case MULTI_ARG_2_HI_CMP: mtype = v8hi_ftype_v8hi_v8hi;          break;
23239         case MULTI_ARG_2_QI_CMP: mtype = v16qi_ftype_v16qi_v16qi;       break;
23240         case MULTI_ARG_2_SF_TF:  mtype = v4sf_ftype_v4sf_v4sf;          break;
23241         case MULTI_ARG_2_DF_TF:  mtype = v2df_ftype_v2df_v2df;          break;
23242         case MULTI_ARG_2_DI_TF:  mtype = v2di_ftype_v2di_v2di;          break;
23243         case MULTI_ARG_2_SI_TF:  mtype = v4si_ftype_v4si_v4si;          break;
23244         case MULTI_ARG_2_HI_TF:  mtype = v8hi_ftype_v8hi_v8hi;          break;
23245         case MULTI_ARG_2_QI_TF:  mtype = v16qi_ftype_v16qi_v16qi;       break;
23246         case MULTI_ARG_1_SF:     mtype = v4sf_ftype_v4sf;               break;
23247         case MULTI_ARG_1_DF:     mtype = v2df_ftype_v2df;               break;
23248         case MULTI_ARG_1_DI:     mtype = v2di_ftype_v2di;               break;
23249         case MULTI_ARG_1_SI:     mtype = v4si_ftype_v4si;               break;
23250         case MULTI_ARG_1_HI:     mtype = v8hi_ftype_v8hi;               break;
23251         case MULTI_ARG_1_QI:     mtype = v16qi_ftype_v16qi;             break;
23252         case MULTI_ARG_1_SI_DI:  mtype = v2di_ftype_v4si;               break;
23253         case MULTI_ARG_1_HI_DI:  mtype = v2di_ftype_v8hi;               break;
23254         case MULTI_ARG_1_HI_SI:  mtype = v4si_ftype_v8hi;               break;
23255         case MULTI_ARG_1_QI_DI:  mtype = v2di_ftype_v16qi;              break;
23256         case MULTI_ARG_1_QI_SI:  mtype = v4si_ftype_v16qi;              break;
23257         case MULTI_ARG_1_QI_HI:  mtype = v8hi_ftype_v16qi;              break;
23258         case MULTI_ARG_1_PH2PS:  mtype = v4sf_ftype_v4hi;               break;
23259         case MULTI_ARG_1_PS2PH:  mtype = v4hi_ftype_v4sf;               break;
23260         case MULTI_ARG_UNKNOWN:
23261         default:
23262           gcc_unreachable ();
23263         }
23264
23265       if (mtype)
23266         def_builtin_const (d->mask, d->name, mtype, d->code);
23267     }
23268 }
23269
23270 /* Internal method for ix86_init_builtins.  */
23271
23272 static void
23273 ix86_init_builtins_va_builtins_abi (void)
23274 {
23275   tree ms_va_ref, sysv_va_ref;
23276   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
23277   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
23278   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
23279   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
23280
23281   if (!TARGET_64BIT)
23282     return;
23283   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
23284   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
23285   ms_va_ref = build_reference_type (ms_va_list_type_node);
23286   sysv_va_ref =
23287     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
23288
23289   fnvoid_va_end_ms =
23290     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23291   fnvoid_va_start_ms =
23292     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23293   fnvoid_va_end_sysv =
23294     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
23295   fnvoid_va_start_sysv =
23296     build_varargs_function_type_list (void_type_node, sysv_va_ref,
23297                                        NULL_TREE);
23298   fnvoid_va_copy_ms =
23299     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
23300                               NULL_TREE);
23301   fnvoid_va_copy_sysv =
23302     build_function_type_list (void_type_node, sysv_va_ref,
23303                               sysv_va_ref, NULL_TREE);
23304
23305   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
23306                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
23307   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
23308                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
23309   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
23310                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
23311   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
23312                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23313   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
23314                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23315   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
23316                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23317 }
23318
23319 static void
23320 ix86_init_builtins (void)
23321 {
23322   tree float128_type_node = make_node (REAL_TYPE);
23323   tree ftype, decl;
23324
23325   /* The __float80 type.  */
23326   if (TYPE_MODE (long_double_type_node) == XFmode)
23327     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
23328                                                "__float80");
23329   else
23330     {
23331       /* The __float80 type.  */
23332       tree float80_type_node = make_node (REAL_TYPE);
23333
23334       TYPE_PRECISION (float80_type_node) = 80;
23335       layout_type (float80_type_node);
23336       (*lang_hooks.types.register_builtin_type) (float80_type_node,
23337                                                  "__float80");
23338     }
23339
23340   /* The __float128 type.  */
23341   TYPE_PRECISION (float128_type_node) = 128;
23342   layout_type (float128_type_node);
23343   (*lang_hooks.types.register_builtin_type) (float128_type_node,
23344                                              "__float128");
23345
23346   /* TFmode support builtins.  */
23347   ftype = build_function_type (float128_type_node, void_list_node);
23348   decl = add_builtin_function ("__builtin_infq", ftype,
23349                                IX86_BUILTIN_INFQ, BUILT_IN_MD,
23350                                NULL, NULL_TREE);
23351   ix86_builtins[(int) IX86_BUILTIN_INFQ] = decl;
23352
23353   /* We will expand them to normal call if SSE2 isn't available since
23354      they are used by libgcc. */
23355   ftype = build_function_type_list (float128_type_node,
23356                                     float128_type_node,
23357                                     NULL_TREE);
23358   decl = add_builtin_function ("__builtin_fabsq", ftype,
23359                                IX86_BUILTIN_FABSQ, BUILT_IN_MD,
23360                                "__fabstf2", NULL_TREE);
23361   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = decl;
23362   TREE_READONLY (decl) = 1;
23363
23364   ftype = build_function_type_list (float128_type_node,
23365                                     float128_type_node,
23366                                     float128_type_node,
23367                                     NULL_TREE);
23368   decl = add_builtin_function ("__builtin_copysignq", ftype,
23369                                IX86_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
23370                                "__copysigntf3", NULL_TREE);
23371   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = decl;
23372   TREE_READONLY (decl) = 1;
23373
23374   ix86_init_mmx_sse_builtins ();
23375   if (TARGET_64BIT)
23376     ix86_init_builtins_va_builtins_abi ();
23377 }
23378
23379 /* Errors in the source file can cause expand_expr to return const0_rtx
23380    where we expect a vector.  To avoid crashing, use one of the vector
23381    clear instructions.  */
23382 static rtx
23383 safe_vector_operand (rtx x, enum machine_mode mode)
23384 {
23385   if (x == const0_rtx)
23386     x = CONST0_RTX (mode);
23387   return x;
23388 }
23389
23390 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
23391
23392 static rtx
23393 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
23394 {
23395   rtx pat;
23396   tree arg0 = CALL_EXPR_ARG (exp, 0);
23397   tree arg1 = CALL_EXPR_ARG (exp, 1);
23398   rtx op0 = expand_normal (arg0);
23399   rtx op1 = expand_normal (arg1);
23400   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23401   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
23402   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
23403
23404   if (VECTOR_MODE_P (mode0))
23405     op0 = safe_vector_operand (op0, mode0);
23406   if (VECTOR_MODE_P (mode1))
23407     op1 = safe_vector_operand (op1, mode1);
23408
23409   if (optimize || !target
23410       || GET_MODE (target) != tmode
23411       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23412     target = gen_reg_rtx (tmode);
23413
23414   if (GET_MODE (op1) == SImode && mode1 == TImode)
23415     {
23416       rtx x = gen_reg_rtx (V4SImode);
23417       emit_insn (gen_sse2_loadd (x, op1));
23418       op1 = gen_lowpart (TImode, x);
23419     }
23420
23421   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
23422     op0 = copy_to_mode_reg (mode0, op0);
23423   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
23424     op1 = copy_to_mode_reg (mode1, op1);
23425
23426   pat = GEN_FCN (icode) (target, op0, op1);
23427   if (! pat)
23428     return 0;
23429
23430   emit_insn (pat);
23431
23432   return target;
23433 }
23434
23435 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
23436
23437 static rtx
23438 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
23439                                enum multi_arg_type m_type,
23440                                enum insn_code sub_code)
23441 {
23442   rtx pat;
23443   int i;
23444   int nargs;
23445   bool comparison_p = false;
23446   bool tf_p = false;
23447   bool last_arg_constant = false;
23448   int num_memory = 0;
23449   struct {
23450     rtx op;
23451     enum machine_mode mode;
23452   } args[4];
23453
23454   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23455
23456   switch (m_type)
23457     {
23458     case MULTI_ARG_3_SF:
23459     case MULTI_ARG_3_DF:
23460     case MULTI_ARG_3_DI:
23461     case MULTI_ARG_3_SI:
23462     case MULTI_ARG_3_SI_DI:
23463     case MULTI_ARG_3_HI:
23464     case MULTI_ARG_3_HI_SI:
23465     case MULTI_ARG_3_QI:
23466     case MULTI_ARG_3_PERMPS:
23467     case MULTI_ARG_3_PERMPD:
23468       nargs = 3;
23469       break;
23470
23471     case MULTI_ARG_2_SF:
23472     case MULTI_ARG_2_DF:
23473     case MULTI_ARG_2_DI:
23474     case MULTI_ARG_2_SI:
23475     case MULTI_ARG_2_HI:
23476     case MULTI_ARG_2_QI:
23477       nargs = 2;
23478       break;
23479
23480     case MULTI_ARG_2_DI_IMM:
23481     case MULTI_ARG_2_SI_IMM:
23482     case MULTI_ARG_2_HI_IMM:
23483     case MULTI_ARG_2_QI_IMM:
23484       nargs = 2;
23485       last_arg_constant = true;
23486       break;
23487
23488     case MULTI_ARG_1_SF:
23489     case MULTI_ARG_1_DF:
23490     case MULTI_ARG_1_DI:
23491     case MULTI_ARG_1_SI:
23492     case MULTI_ARG_1_HI:
23493     case MULTI_ARG_1_QI:
23494     case MULTI_ARG_1_SI_DI:
23495     case MULTI_ARG_1_HI_DI:
23496     case MULTI_ARG_1_HI_SI:
23497     case MULTI_ARG_1_QI_DI:
23498     case MULTI_ARG_1_QI_SI:
23499     case MULTI_ARG_1_QI_HI:
23500     case MULTI_ARG_1_PH2PS:
23501     case MULTI_ARG_1_PS2PH:
23502       nargs = 1;
23503       break;
23504
23505     case MULTI_ARG_2_SF_CMP:
23506     case MULTI_ARG_2_DF_CMP:
23507     case MULTI_ARG_2_DI_CMP:
23508     case MULTI_ARG_2_SI_CMP:
23509     case MULTI_ARG_2_HI_CMP:
23510     case MULTI_ARG_2_QI_CMP:
23511       nargs = 2;
23512       comparison_p = true;
23513       break;
23514
23515     case MULTI_ARG_2_SF_TF:
23516     case MULTI_ARG_2_DF_TF:
23517     case MULTI_ARG_2_DI_TF:
23518     case MULTI_ARG_2_SI_TF:
23519     case MULTI_ARG_2_HI_TF:
23520     case MULTI_ARG_2_QI_TF:
23521       nargs = 2;
23522       tf_p = true;
23523       break;
23524
23525     case MULTI_ARG_UNKNOWN:
23526     default:
23527       gcc_unreachable ();
23528     }
23529
23530   if (optimize || !target
23531       || GET_MODE (target) != tmode
23532       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23533     target = gen_reg_rtx (tmode);
23534
23535   gcc_assert (nargs <= 4);
23536
23537   for (i = 0; i < nargs; i++)
23538     {
23539       tree arg = CALL_EXPR_ARG (exp, i);
23540       rtx op = expand_normal (arg);
23541       int adjust = (comparison_p) ? 1 : 0;
23542       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
23543
23544       if (last_arg_constant && i == nargs-1)
23545         {
23546           if (GET_CODE (op) != CONST_INT)
23547             {
23548               error ("last argument must be an immediate");
23549               return gen_reg_rtx (tmode);
23550             }
23551         }
23552       else
23553         {
23554           if (VECTOR_MODE_P (mode))
23555             op = safe_vector_operand (op, mode);
23556
23557           /* If we aren't optimizing, only allow one memory operand to be
23558              generated.  */
23559           if (memory_operand (op, mode))
23560             num_memory++;
23561
23562           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
23563
23564           if (optimize
23565               || ! (*insn_data[icode].operand[i+adjust+1].predicate) (op, mode)
23566               || num_memory > 1)
23567             op = force_reg (mode, op);
23568         }
23569
23570       args[i].op = op;
23571       args[i].mode = mode;
23572     }
23573
23574   switch (nargs)
23575     {
23576     case 1:
23577       pat = GEN_FCN (icode) (target, args[0].op);
23578       break;
23579
23580     case 2:
23581       if (tf_p)
23582         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
23583                                GEN_INT ((int)sub_code));
23584       else if (! comparison_p)
23585         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
23586       else
23587         {
23588           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
23589                                        args[0].op,
23590                                        args[1].op);
23591
23592           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
23593         }
23594       break;
23595
23596     case 3:
23597       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
23598       break;
23599
23600     default:
23601       gcc_unreachable ();
23602     }
23603
23604   if (! pat)
23605     return 0;
23606
23607   emit_insn (pat);
23608   return target;
23609 }
23610
23611 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
23612    insns with vec_merge.  */
23613
23614 static rtx
23615 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
23616                                     rtx target)
23617 {
23618   rtx pat;
23619   tree arg0 = CALL_EXPR_ARG (exp, 0);
23620   rtx op1, op0 = expand_normal (arg0);
23621   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23622   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
23623
23624   if (optimize || !target
23625       || GET_MODE (target) != tmode
23626       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23627     target = gen_reg_rtx (tmode);
23628
23629   if (VECTOR_MODE_P (mode0))
23630     op0 = safe_vector_operand (op0, mode0);
23631
23632   if ((optimize && !register_operand (op0, mode0))
23633       || ! (*insn_data[icode].operand[1].predicate) (op0, mode0))
23634     op0 = copy_to_mode_reg (mode0, op0);
23635
23636   op1 = op0;
23637   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
23638     op1 = copy_to_mode_reg (mode0, op1);
23639
23640   pat = GEN_FCN (icode) (target, op0, op1);
23641   if (! pat)
23642     return 0;
23643   emit_insn (pat);
23644   return target;
23645 }
23646
23647 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
23648
23649 static rtx
23650 ix86_expand_sse_compare (const struct builtin_description *d,
23651                          tree exp, rtx target, bool swap)
23652 {
23653   rtx pat;
23654   tree arg0 = CALL_EXPR_ARG (exp, 0);
23655   tree arg1 = CALL_EXPR_ARG (exp, 1);
23656   rtx op0 = expand_normal (arg0);
23657   rtx op1 = expand_normal (arg1);
23658   rtx op2;
23659   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
23660   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
23661   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
23662   enum rtx_code comparison = d->comparison;
23663
23664   if (VECTOR_MODE_P (mode0))
23665     op0 = safe_vector_operand (op0, mode0);
23666   if (VECTOR_MODE_P (mode1))
23667     op1 = safe_vector_operand (op1, mode1);
23668
23669   /* Swap operands if we have a comparison that isn't available in
23670      hardware.  */
23671   if (swap)
23672     {
23673       rtx tmp = gen_reg_rtx (mode1);
23674       emit_move_insn (tmp, op1);
23675       op1 = op0;
23676       op0 = tmp;
23677     }
23678
23679   if (optimize || !target
23680       || GET_MODE (target) != tmode
23681       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
23682     target = gen_reg_rtx (tmode);
23683
23684   if ((optimize && !register_operand (op0, mode0))
23685       || ! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
23686     op0 = copy_to_mode_reg (mode0, op0);
23687   if ((optimize && !register_operand (op1, mode1))
23688       || ! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
23689     op1 = copy_to_mode_reg (mode1, op1);
23690
23691   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
23692   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
23693   if (! pat)
23694     return 0;
23695   emit_insn (pat);
23696   return target;
23697 }
23698
23699 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
23700
23701 static rtx
23702 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
23703                       rtx target)
23704 {
23705   rtx pat;
23706   tree arg0 = CALL_EXPR_ARG (exp, 0);
23707   tree arg1 = CALL_EXPR_ARG (exp, 1);
23708   rtx op0 = expand_normal (arg0);
23709   rtx op1 = expand_normal (arg1);
23710   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23711   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23712   enum rtx_code comparison = d->comparison;
23713
23714   if (VECTOR_MODE_P (mode0))
23715     op0 = safe_vector_operand (op0, mode0);
23716   if (VECTOR_MODE_P (mode1))
23717     op1 = safe_vector_operand (op1, mode1);
23718
23719   /* Swap operands if we have a comparison that isn't available in
23720      hardware.  */
23721   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
23722     {
23723       rtx tmp = op1;
23724       op1 = op0;
23725       op0 = tmp;
23726     }
23727
23728   target = gen_reg_rtx (SImode);
23729   emit_move_insn (target, const0_rtx);
23730   target = gen_rtx_SUBREG (QImode, target, 0);
23731
23732   if ((optimize && !register_operand (op0, mode0))
23733       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
23734     op0 = copy_to_mode_reg (mode0, op0);
23735   if ((optimize && !register_operand (op1, mode1))
23736       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
23737     op1 = copy_to_mode_reg (mode1, op1);
23738
23739   pat = GEN_FCN (d->icode) (op0, op1);
23740   if (! pat)
23741     return 0;
23742   emit_insn (pat);
23743   emit_insn (gen_rtx_SET (VOIDmode,
23744                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23745                           gen_rtx_fmt_ee (comparison, QImode,
23746                                           SET_DEST (pat),
23747                                           const0_rtx)));
23748
23749   return SUBREG_REG (target);
23750 }
23751
23752 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
23753
23754 static rtx
23755 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
23756                        rtx target)
23757 {
23758   rtx pat;
23759   tree arg0 = CALL_EXPR_ARG (exp, 0);
23760   tree arg1 = CALL_EXPR_ARG (exp, 1);
23761   rtx op0 = expand_normal (arg0);
23762   rtx op1 = expand_normal (arg1);
23763   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23764   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23765   enum rtx_code comparison = d->comparison;
23766
23767   if (VECTOR_MODE_P (mode0))
23768     op0 = safe_vector_operand (op0, mode0);
23769   if (VECTOR_MODE_P (mode1))
23770     op1 = safe_vector_operand (op1, mode1);
23771
23772   target = gen_reg_rtx (SImode);
23773   emit_move_insn (target, const0_rtx);
23774   target = gen_rtx_SUBREG (QImode, target, 0);
23775
23776   if ((optimize && !register_operand (op0, mode0))
23777       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
23778     op0 = copy_to_mode_reg (mode0, op0);
23779   if ((optimize && !register_operand (op1, mode1))
23780       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
23781     op1 = copy_to_mode_reg (mode1, op1);
23782
23783   pat = GEN_FCN (d->icode) (op0, op1);
23784   if (! pat)
23785     return 0;
23786   emit_insn (pat);
23787   emit_insn (gen_rtx_SET (VOIDmode,
23788                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23789                           gen_rtx_fmt_ee (comparison, QImode,
23790                                           SET_DEST (pat),
23791                                           const0_rtx)));
23792
23793   return SUBREG_REG (target);
23794 }
23795
23796 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
23797
23798 static rtx
23799 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
23800                           tree exp, rtx target)
23801 {
23802   rtx pat;
23803   tree arg0 = CALL_EXPR_ARG (exp, 0);
23804   tree arg1 = CALL_EXPR_ARG (exp, 1);
23805   tree arg2 = CALL_EXPR_ARG (exp, 2);
23806   tree arg3 = CALL_EXPR_ARG (exp, 3);
23807   tree arg4 = CALL_EXPR_ARG (exp, 4);
23808   rtx scratch0, scratch1;
23809   rtx op0 = expand_normal (arg0);
23810   rtx op1 = expand_normal (arg1);
23811   rtx op2 = expand_normal (arg2);
23812   rtx op3 = expand_normal (arg3);
23813   rtx op4 = expand_normal (arg4);
23814   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
23815
23816   tmode0 = insn_data[d->icode].operand[0].mode;
23817   tmode1 = insn_data[d->icode].operand[1].mode;
23818   modev2 = insn_data[d->icode].operand[2].mode;
23819   modei3 = insn_data[d->icode].operand[3].mode;
23820   modev4 = insn_data[d->icode].operand[4].mode;
23821   modei5 = insn_data[d->icode].operand[5].mode;
23822   modeimm = insn_data[d->icode].operand[6].mode;
23823
23824   if (VECTOR_MODE_P (modev2))
23825     op0 = safe_vector_operand (op0, modev2);
23826   if (VECTOR_MODE_P (modev4))
23827     op2 = safe_vector_operand (op2, modev4);
23828
23829   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
23830     op0 = copy_to_mode_reg (modev2, op0);
23831   if (! (*insn_data[d->icode].operand[3].predicate) (op1, modei3))
23832     op1 = copy_to_mode_reg (modei3, op1);
23833   if ((optimize && !register_operand (op2, modev4))
23834       || !(*insn_data[d->icode].operand[4].predicate) (op2, modev4))
23835     op2 = copy_to_mode_reg (modev4, op2);
23836   if (! (*insn_data[d->icode].operand[5].predicate) (op3, modei5))
23837     op3 = copy_to_mode_reg (modei5, op3);
23838
23839   if (! (*insn_data[d->icode].operand[6].predicate) (op4, modeimm))
23840     {
23841       error ("the fifth argument must be a 8-bit immediate");
23842       return const0_rtx;
23843     }
23844
23845   if (d->code == IX86_BUILTIN_PCMPESTRI128)
23846     {
23847       if (optimize || !target
23848           || GET_MODE (target) != tmode0
23849           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
23850         target = gen_reg_rtx (tmode0);
23851
23852       scratch1 = gen_reg_rtx (tmode1);
23853
23854       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
23855     }
23856   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
23857     {
23858       if (optimize || !target
23859           || GET_MODE (target) != tmode1
23860           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
23861         target = gen_reg_rtx (tmode1);
23862
23863       scratch0 = gen_reg_rtx (tmode0);
23864
23865       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
23866     }
23867   else
23868     {
23869       gcc_assert (d->flag);
23870
23871       scratch0 = gen_reg_rtx (tmode0);
23872       scratch1 = gen_reg_rtx (tmode1);
23873
23874       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
23875     }
23876
23877   if (! pat)
23878     return 0;
23879
23880   emit_insn (pat);
23881
23882   if (d->flag)
23883     {
23884       target = gen_reg_rtx (SImode);
23885       emit_move_insn (target, const0_rtx);
23886       target = gen_rtx_SUBREG (QImode, target, 0);
23887
23888       emit_insn
23889         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23890                       gen_rtx_fmt_ee (EQ, QImode,
23891                                       gen_rtx_REG ((enum machine_mode) d->flag,
23892                                                    FLAGS_REG),
23893                                       const0_rtx)));
23894       return SUBREG_REG (target);
23895     }
23896   else
23897     return target;
23898 }
23899
23900
23901 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
23902
23903 static rtx
23904 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
23905                           tree exp, rtx target)
23906 {
23907   rtx pat;
23908   tree arg0 = CALL_EXPR_ARG (exp, 0);
23909   tree arg1 = CALL_EXPR_ARG (exp, 1);
23910   tree arg2 = CALL_EXPR_ARG (exp, 2);
23911   rtx scratch0, scratch1;
23912   rtx op0 = expand_normal (arg0);
23913   rtx op1 = expand_normal (arg1);
23914   rtx op2 = expand_normal (arg2);
23915   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
23916
23917   tmode0 = insn_data[d->icode].operand[0].mode;
23918   tmode1 = insn_data[d->icode].operand[1].mode;
23919   modev2 = insn_data[d->icode].operand[2].mode;
23920   modev3 = insn_data[d->icode].operand[3].mode;
23921   modeimm = insn_data[d->icode].operand[4].mode;
23922
23923   if (VECTOR_MODE_P (modev2))
23924     op0 = safe_vector_operand (op0, modev2);
23925   if (VECTOR_MODE_P (modev3))
23926     op1 = safe_vector_operand (op1, modev3);
23927
23928   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
23929     op0 = copy_to_mode_reg (modev2, op0);
23930   if ((optimize && !register_operand (op1, modev3))
23931       || !(*insn_data[d->icode].operand[3].predicate) (op1, modev3))
23932     op1 = copy_to_mode_reg (modev3, op1);
23933
23934   if (! (*insn_data[d->icode].operand[4].predicate) (op2, modeimm))
23935     {
23936       error ("the third argument must be a 8-bit immediate");
23937       return const0_rtx;
23938     }
23939
23940   if (d->code == IX86_BUILTIN_PCMPISTRI128)
23941     {
23942       if (optimize || !target
23943           || GET_MODE (target) != tmode0
23944           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
23945         target = gen_reg_rtx (tmode0);
23946
23947       scratch1 = gen_reg_rtx (tmode1);
23948
23949       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
23950     }
23951   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
23952     {
23953       if (optimize || !target
23954           || GET_MODE (target) != tmode1
23955           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
23956         target = gen_reg_rtx (tmode1);
23957
23958       scratch0 = gen_reg_rtx (tmode0);
23959
23960       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
23961     }
23962   else
23963     {
23964       gcc_assert (d->flag);
23965
23966       scratch0 = gen_reg_rtx (tmode0);
23967       scratch1 = gen_reg_rtx (tmode1);
23968
23969       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
23970     }
23971
23972   if (! pat)
23973     return 0;
23974
23975   emit_insn (pat);
23976
23977   if (d->flag)
23978     {
23979       target = gen_reg_rtx (SImode);
23980       emit_move_insn (target, const0_rtx);
23981       target = gen_rtx_SUBREG (QImode, target, 0);
23982
23983       emit_insn
23984         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23985                       gen_rtx_fmt_ee (EQ, QImode,
23986                                       gen_rtx_REG ((enum machine_mode) d->flag,
23987                                                    FLAGS_REG),
23988                                       const0_rtx)));
23989       return SUBREG_REG (target);
23990     }
23991   else
23992     return target;
23993 }
23994
23995 /* Subroutine of ix86_expand_builtin to take care of insns with
23996    variable number of operands.  */
23997
23998 static rtx
23999 ix86_expand_args_builtin (const struct builtin_description *d,
24000                           tree exp, rtx target)
24001 {
24002   rtx pat, real_target;
24003   unsigned int i, nargs;
24004   unsigned int nargs_constant = 0;
24005   int num_memory = 0;
24006   struct
24007     {
24008       rtx op;
24009       enum machine_mode mode;
24010     } args[4];
24011   bool last_arg_count = false;
24012   enum insn_code icode = d->icode;
24013   const struct insn_data *insn_p = &insn_data[icode];
24014   enum machine_mode tmode = insn_p->operand[0].mode;
24015   enum machine_mode rmode = VOIDmode;
24016   bool swap = false;
24017   enum rtx_code comparison = d->comparison;
24018
24019   switch ((enum ix86_builtin_type) d->flag)
24020     {
24021     case INT_FTYPE_V8SF_V8SF_PTEST:
24022     case INT_FTYPE_V4DI_V4DI_PTEST:
24023     case INT_FTYPE_V4DF_V4DF_PTEST:
24024     case INT_FTYPE_V4SF_V4SF_PTEST:
24025     case INT_FTYPE_V2DI_V2DI_PTEST:
24026     case INT_FTYPE_V2DF_V2DF_PTEST:
24027       return ix86_expand_sse_ptest (d, exp, target);
24028     case FLOAT128_FTYPE_FLOAT128:
24029     case FLOAT_FTYPE_FLOAT:
24030     case INT64_FTYPE_V4SF:
24031     case INT64_FTYPE_V2DF:
24032     case INT_FTYPE_V16QI:
24033     case INT_FTYPE_V8QI:
24034     case INT_FTYPE_V8SF:
24035     case INT_FTYPE_V4DF:
24036     case INT_FTYPE_V4SF:
24037     case INT_FTYPE_V2DF:
24038     case V16QI_FTYPE_V16QI:
24039     case V8SI_FTYPE_V8SF:
24040     case V8SI_FTYPE_V4SI:
24041     case V8HI_FTYPE_V8HI:
24042     case V8HI_FTYPE_V16QI:
24043     case V8QI_FTYPE_V8QI:
24044     case V8SF_FTYPE_V8SF:
24045     case V8SF_FTYPE_V8SI:
24046     case V8SF_FTYPE_V4SF:
24047     case V4SI_FTYPE_V4SI:
24048     case V4SI_FTYPE_V16QI:
24049     case V4SI_FTYPE_V4SF:
24050     case V4SI_FTYPE_V8SI:
24051     case V4SI_FTYPE_V8HI:
24052     case V4SI_FTYPE_V4DF:
24053     case V4SI_FTYPE_V2DF:
24054     case V4HI_FTYPE_V4HI:
24055     case V4DF_FTYPE_V4DF:
24056     case V4DF_FTYPE_V4SI:
24057     case V4DF_FTYPE_V4SF:
24058     case V4DF_FTYPE_V2DF:
24059     case V4SF_FTYPE_V4SF:
24060     case V4SF_FTYPE_V4SI:
24061     case V4SF_FTYPE_V8SF:
24062     case V4SF_FTYPE_V4DF:
24063     case V4SF_FTYPE_V2DF:
24064     case V2DI_FTYPE_V2DI:
24065     case V2DI_FTYPE_V16QI:
24066     case V2DI_FTYPE_V8HI:
24067     case V2DI_FTYPE_V4SI:
24068     case V2DF_FTYPE_V2DF:
24069     case V2DF_FTYPE_V4SI:
24070     case V2DF_FTYPE_V4DF:
24071     case V2DF_FTYPE_V4SF:
24072     case V2DF_FTYPE_V2SI:
24073     case V2SI_FTYPE_V2SI:
24074     case V2SI_FTYPE_V4SF:
24075     case V2SI_FTYPE_V2SF:
24076     case V2SI_FTYPE_V2DF:
24077     case V2SF_FTYPE_V2SF:
24078     case V2SF_FTYPE_V2SI:
24079       nargs = 1;
24080       break;
24081     case V4SF_FTYPE_V4SF_VEC_MERGE:
24082     case V2DF_FTYPE_V2DF_VEC_MERGE:
24083       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
24084     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
24085     case V16QI_FTYPE_V16QI_V16QI:
24086     case V16QI_FTYPE_V8HI_V8HI:
24087     case V8QI_FTYPE_V8QI_V8QI:
24088     case V8QI_FTYPE_V4HI_V4HI:
24089     case V8HI_FTYPE_V8HI_V8HI:
24090     case V8HI_FTYPE_V16QI_V16QI:
24091     case V8HI_FTYPE_V4SI_V4SI:
24092     case V8SF_FTYPE_V8SF_V8SF:
24093     case V8SF_FTYPE_V8SF_V8SI:
24094     case V4SI_FTYPE_V4SI_V4SI:
24095     case V4SI_FTYPE_V8HI_V8HI:
24096     case V4SI_FTYPE_V4SF_V4SF:
24097     case V4SI_FTYPE_V2DF_V2DF:
24098     case V4HI_FTYPE_V4HI_V4HI:
24099     case V4HI_FTYPE_V8QI_V8QI:
24100     case V4HI_FTYPE_V2SI_V2SI:
24101     case V4DF_FTYPE_V4DF_V4DF:
24102     case V4DF_FTYPE_V4DF_V4DI:
24103     case V4SF_FTYPE_V4SF_V4SF:
24104     case V4SF_FTYPE_V4SF_V4SI:
24105     case V4SF_FTYPE_V4SF_V2SI:
24106     case V4SF_FTYPE_V4SF_V2DF:
24107     case V4SF_FTYPE_V4SF_DI:
24108     case V4SF_FTYPE_V4SF_SI:
24109     case V2DI_FTYPE_V2DI_V2DI:
24110     case V2DI_FTYPE_V16QI_V16QI:
24111     case V2DI_FTYPE_V4SI_V4SI:
24112     case V2DI_FTYPE_V2DI_V16QI:
24113     case V2DI_FTYPE_V2DF_V2DF:
24114     case V2SI_FTYPE_V2SI_V2SI:
24115     case V2SI_FTYPE_V4HI_V4HI:
24116     case V2SI_FTYPE_V2SF_V2SF:
24117     case V2DF_FTYPE_V2DF_V2DF:
24118     case V2DF_FTYPE_V2DF_V4SF:
24119     case V2DF_FTYPE_V2DF_V2DI:
24120     case V2DF_FTYPE_V2DF_DI:
24121     case V2DF_FTYPE_V2DF_SI:
24122     case V2SF_FTYPE_V2SF_V2SF:
24123     case V1DI_FTYPE_V1DI_V1DI:
24124     case V1DI_FTYPE_V8QI_V8QI:
24125     case V1DI_FTYPE_V2SI_V2SI:
24126       if (comparison == UNKNOWN)
24127         return ix86_expand_binop_builtin (icode, exp, target);
24128       nargs = 2;
24129       break;
24130     case V4SF_FTYPE_V4SF_V4SF_SWAP:
24131     case V2DF_FTYPE_V2DF_V2DF_SWAP:
24132       gcc_assert (comparison != UNKNOWN);
24133       nargs = 2;
24134       swap = true;
24135       break;
24136     case V8HI_FTYPE_V8HI_V8HI_COUNT:
24137     case V8HI_FTYPE_V8HI_SI_COUNT:
24138     case V4SI_FTYPE_V4SI_V4SI_COUNT:
24139     case V4SI_FTYPE_V4SI_SI_COUNT:
24140     case V4HI_FTYPE_V4HI_V4HI_COUNT:
24141     case V4HI_FTYPE_V4HI_SI_COUNT:
24142     case V2DI_FTYPE_V2DI_V2DI_COUNT:
24143     case V2DI_FTYPE_V2DI_SI_COUNT:
24144     case V2SI_FTYPE_V2SI_V2SI_COUNT:
24145     case V2SI_FTYPE_V2SI_SI_COUNT:
24146     case V1DI_FTYPE_V1DI_V1DI_COUNT:
24147     case V1DI_FTYPE_V1DI_SI_COUNT:
24148       nargs = 2;
24149       last_arg_count = true;
24150       break;
24151     case UINT64_FTYPE_UINT64_UINT64:
24152     case UINT_FTYPE_UINT_UINT:
24153     case UINT_FTYPE_UINT_USHORT:
24154     case UINT_FTYPE_UINT_UCHAR:
24155       nargs = 2;
24156       break;
24157     case V2DI2TI_FTYPE_V2DI_INT:
24158       nargs = 2;
24159       rmode = V2DImode;
24160       nargs_constant = 1;
24161       break;
24162     case V8HI_FTYPE_V8HI_INT:
24163     case V8SF_FTYPE_V8SF_INT:
24164     case V4SI_FTYPE_V4SI_INT:
24165     case V4SI_FTYPE_V8SI_INT:
24166     case V4HI_FTYPE_V4HI_INT:
24167     case V4DF_FTYPE_V4DF_INT:
24168     case V4SF_FTYPE_V4SF_INT:
24169     case V4SF_FTYPE_V8SF_INT:
24170     case V2DI_FTYPE_V2DI_INT:
24171     case V2DF_FTYPE_V2DF_INT:
24172     case V2DF_FTYPE_V4DF_INT:
24173       nargs = 2;
24174       nargs_constant = 1;
24175       break;
24176     case V16QI_FTYPE_V16QI_V16QI_V16QI:
24177     case V8SF_FTYPE_V8SF_V8SF_V8SF:
24178     case V4DF_FTYPE_V4DF_V4DF_V4DF:
24179     case V4SF_FTYPE_V4SF_V4SF_V4SF:
24180     case V2DF_FTYPE_V2DF_V2DF_V2DF:
24181       nargs = 3;
24182       break;
24183     case V16QI_FTYPE_V16QI_V16QI_INT:
24184     case V8HI_FTYPE_V8HI_V8HI_INT:
24185     case V8SI_FTYPE_V8SI_V8SI_INT:
24186     case V8SI_FTYPE_V8SI_V4SI_INT:
24187     case V8SF_FTYPE_V8SF_V8SF_INT: 
24188     case V8SF_FTYPE_V8SF_V4SF_INT: 
24189     case V4SI_FTYPE_V4SI_V4SI_INT:
24190     case V4DF_FTYPE_V4DF_V4DF_INT:
24191     case V4DF_FTYPE_V4DF_V2DF_INT:
24192     case V4SF_FTYPE_V4SF_V4SF_INT:
24193     case V2DI_FTYPE_V2DI_V2DI_INT:
24194     case V2DF_FTYPE_V2DF_V2DF_INT:
24195       nargs = 3;
24196       nargs_constant = 1;
24197       break;
24198     case V2DI2TI_FTYPE_V2DI_V2DI_INT:
24199       nargs = 3;
24200       rmode = V2DImode;
24201       nargs_constant = 1;
24202       break;
24203     case V1DI2DI_FTYPE_V1DI_V1DI_INT:
24204       nargs = 3;
24205       rmode = DImode;
24206       nargs_constant = 1;
24207       break;
24208     case V2DI_FTYPE_V2DI_UINT_UINT:
24209       nargs = 3;
24210       nargs_constant = 2;
24211       break;
24212     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
24213       nargs = 4;
24214       nargs_constant = 2;
24215       break;
24216     default:
24217       gcc_unreachable ();
24218     }
24219
24220   gcc_assert (nargs <= ARRAY_SIZE (args));
24221
24222   if (comparison != UNKNOWN)
24223     {
24224       gcc_assert (nargs == 2);
24225       return ix86_expand_sse_compare (d, exp, target, swap);
24226     }
24227
24228   if (rmode == VOIDmode || rmode == tmode)
24229     {
24230       if (optimize
24231           || target == 0
24232           || GET_MODE (target) != tmode
24233           || ! (*insn_p->operand[0].predicate) (target, tmode))
24234         target = gen_reg_rtx (tmode);
24235       real_target = target;
24236     }
24237   else
24238     {
24239       target = gen_reg_rtx (rmode);
24240       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
24241     }
24242
24243   for (i = 0; i < nargs; i++)
24244     {
24245       tree arg = CALL_EXPR_ARG (exp, i);
24246       rtx op = expand_normal (arg);
24247       enum machine_mode mode = insn_p->operand[i + 1].mode;
24248       bool match = (*insn_p->operand[i + 1].predicate) (op, mode);
24249
24250       if (last_arg_count && (i + 1) == nargs)
24251         {
24252           /* SIMD shift insns take either an 8-bit immediate or
24253              register as count.  But builtin functions take int as
24254              count.  If count doesn't match, we put it in register.  */
24255           if (!match)
24256             {
24257               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
24258               if (!(*insn_p->operand[i + 1].predicate) (op, mode))
24259                 op = copy_to_reg (op);
24260             }
24261         }
24262       else if ((nargs - i) <= nargs_constant)
24263         {
24264           if (!match)
24265             switch (icode)
24266               {
24267               case CODE_FOR_sse4_1_roundpd:
24268               case CODE_FOR_sse4_1_roundps:
24269               case CODE_FOR_sse4_1_roundsd:
24270               case CODE_FOR_sse4_1_roundss:
24271               case CODE_FOR_sse4_1_blendps:
24272               case CODE_FOR_avx_blendpd256:
24273               case CODE_FOR_avx_vpermilv4df:
24274               case CODE_FOR_avx_roundpd256:
24275               case CODE_FOR_avx_roundps256:
24276                 error ("the last argument must be a 4-bit immediate");
24277                 return const0_rtx;
24278
24279               case CODE_FOR_sse4_1_blendpd:
24280               case CODE_FOR_avx_vpermilv2df:
24281                 error ("the last argument must be a 2-bit immediate");
24282                 return const0_rtx;
24283
24284               case CODE_FOR_avx_vextractf128v4df:
24285               case CODE_FOR_avx_vextractf128v8sf:
24286               case CODE_FOR_avx_vextractf128v8si:
24287               case CODE_FOR_avx_vinsertf128v4df:
24288               case CODE_FOR_avx_vinsertf128v8sf:
24289               case CODE_FOR_avx_vinsertf128v8si:
24290                 error ("the last argument must be a 1-bit immediate");
24291                 return const0_rtx;
24292
24293               case CODE_FOR_avx_cmpsdv2df3:
24294               case CODE_FOR_avx_cmpssv4sf3:
24295               case CODE_FOR_avx_cmppdv2df3:
24296               case CODE_FOR_avx_cmppsv4sf3:
24297               case CODE_FOR_avx_cmppdv4df3:
24298               case CODE_FOR_avx_cmppsv8sf3:
24299                 error ("the last argument must be a 5-bit immediate");
24300                 return const0_rtx;
24301
24302              default:
24303                 switch (nargs_constant)
24304                   {
24305                   case 2:
24306                     if ((nargs - i) == nargs_constant)
24307                       {
24308                         error ("the next to last argument must be an 8-bit immediate");
24309                         break;
24310                       }
24311                   case 1:
24312                     error ("the last argument must be an 8-bit immediate");
24313                     break;
24314                   default:
24315                     gcc_unreachable ();
24316                   }
24317                 return const0_rtx;
24318               }
24319         }
24320       else
24321         {
24322           if (VECTOR_MODE_P (mode))
24323             op = safe_vector_operand (op, mode);
24324
24325           /* If we aren't optimizing, only allow one memory operand to
24326              be generated.  */
24327           if (memory_operand (op, mode))
24328             num_memory++;
24329
24330           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
24331             {
24332               if (optimize || !match || num_memory > 1)
24333                 op = copy_to_mode_reg (mode, op);
24334             }
24335           else
24336             {
24337               op = copy_to_reg (op);
24338               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
24339             }
24340         }
24341
24342       args[i].op = op;
24343       args[i].mode = mode;
24344     }
24345
24346   switch (nargs)
24347     {
24348     case 1:
24349       pat = GEN_FCN (icode) (real_target, args[0].op);
24350       break;
24351     case 2:
24352       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
24353       break;
24354     case 3:
24355       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24356                              args[2].op);
24357       break;
24358     case 4:
24359       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24360                              args[2].op, args[3].op);
24361       break;
24362     default:
24363       gcc_unreachable ();
24364     }
24365
24366   if (! pat)
24367     return 0;
24368
24369   emit_insn (pat);
24370   return target;
24371 }
24372
24373 /* Subroutine of ix86_expand_builtin to take care of special insns
24374    with variable number of operands.  */
24375
24376 static rtx
24377 ix86_expand_special_args_builtin (const struct builtin_description *d,
24378                                     tree exp, rtx target)
24379 {
24380   tree arg;
24381   rtx pat, op;
24382   unsigned int i, nargs, arg_adjust, memory;
24383   struct
24384     {
24385       rtx op;
24386       enum machine_mode mode;
24387     } args[2];
24388   enum insn_code icode = d->icode;
24389   bool last_arg_constant = false;
24390   const struct insn_data *insn_p = &insn_data[icode];
24391   enum machine_mode tmode = insn_p->operand[0].mode;
24392   enum { load, store } klass;
24393
24394   switch ((enum ix86_special_builtin_type) d->flag)
24395     {
24396     case VOID_FTYPE_VOID:
24397       emit_insn (GEN_FCN (icode) (target));
24398       return 0;
24399     case V2DI_FTYPE_PV2DI:
24400     case V32QI_FTYPE_PCCHAR:
24401     case V16QI_FTYPE_PCCHAR:
24402     case V8SF_FTYPE_PCV4SF:
24403     case V8SF_FTYPE_PCFLOAT:
24404     case V4SF_FTYPE_PCFLOAT:
24405     case V4DF_FTYPE_PCV2DF:
24406     case V4DF_FTYPE_PCDOUBLE:
24407     case V2DF_FTYPE_PCDOUBLE:
24408       nargs = 1;
24409       klass = load;
24410       memory = 0;
24411       break;
24412     case VOID_FTYPE_PV2SF_V4SF:
24413     case VOID_FTYPE_PV4DI_V4DI:
24414     case VOID_FTYPE_PV2DI_V2DI:
24415     case VOID_FTYPE_PCHAR_V32QI:
24416     case VOID_FTYPE_PCHAR_V16QI:
24417     case VOID_FTYPE_PFLOAT_V8SF:
24418     case VOID_FTYPE_PFLOAT_V4SF:
24419     case VOID_FTYPE_PDOUBLE_V4DF:
24420     case VOID_FTYPE_PDOUBLE_V2DF:
24421     case VOID_FTYPE_PDI_DI:
24422     case VOID_FTYPE_PINT_INT:
24423       nargs = 1;
24424       klass = store;
24425       /* Reserve memory operand for target.  */
24426       memory = ARRAY_SIZE (args);
24427       break;
24428     case V4SF_FTYPE_V4SF_PCV2SF:
24429     case V2DF_FTYPE_V2DF_PCDOUBLE:
24430       nargs = 2;
24431       klass = load;
24432       memory = 1;
24433       break;
24434     case V8SF_FTYPE_PCV8SF_V8SF:
24435     case V4DF_FTYPE_PCV4DF_V4DF:
24436     case V4SF_FTYPE_PCV4SF_V4SF:
24437     case V2DF_FTYPE_PCV2DF_V2DF:
24438       nargs = 2;
24439       klass = load;
24440       memory = 0;
24441       break;
24442     case VOID_FTYPE_PV8SF_V8SF_V8SF:
24443     case VOID_FTYPE_PV4DF_V4DF_V4DF:
24444     case VOID_FTYPE_PV4SF_V4SF_V4SF:
24445     case VOID_FTYPE_PV2DF_V2DF_V2DF:
24446       nargs = 2;
24447       klass = store;
24448       /* Reserve memory operand for target.  */
24449       memory = ARRAY_SIZE (args);
24450       break;
24451     default:
24452       gcc_unreachable ();
24453     }
24454
24455   gcc_assert (nargs <= ARRAY_SIZE (args));
24456
24457   if (klass == store)
24458     {
24459       arg = CALL_EXPR_ARG (exp, 0);
24460       op = expand_normal (arg);
24461       gcc_assert (target == 0);
24462       target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
24463       arg_adjust = 1;
24464     }
24465   else
24466     {
24467       arg_adjust = 0;
24468       if (optimize
24469           || target == 0
24470           || GET_MODE (target) != tmode
24471           || ! (*insn_p->operand[0].predicate) (target, tmode))
24472         target = gen_reg_rtx (tmode);
24473     }
24474
24475   for (i = 0; i < nargs; i++)
24476     {
24477       enum machine_mode mode = insn_p->operand[i + 1].mode;
24478       bool match;
24479
24480       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
24481       op = expand_normal (arg);
24482       match = (*insn_p->operand[i + 1].predicate) (op, mode);
24483
24484       if (last_arg_constant && (i + 1) == nargs)
24485         {
24486           if (!match)
24487             switch (icode)
24488               {
24489              default:
24490                 error ("the last argument must be an 8-bit immediate");
24491                 return const0_rtx;
24492               }
24493         }
24494       else
24495         {
24496           if (i == memory)
24497             {
24498               /* This must be the memory operand.  */
24499               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
24500               gcc_assert (GET_MODE (op) == mode
24501                           || GET_MODE (op) == VOIDmode);
24502             }
24503           else
24504             {
24505               /* This must be register.  */
24506               if (VECTOR_MODE_P (mode))
24507                 op = safe_vector_operand (op, mode);
24508
24509               gcc_assert (GET_MODE (op) == mode
24510                           || GET_MODE (op) == VOIDmode);
24511               op = copy_to_mode_reg (mode, op);
24512             }
24513         }
24514
24515       args[i].op = op;
24516       args[i].mode = mode;
24517     }
24518
24519   switch (nargs)
24520     {
24521     case 1:
24522       pat = GEN_FCN (icode) (target, args[0].op);
24523       break;
24524     case 2:
24525       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
24526       break;
24527     default:
24528       gcc_unreachable ();
24529     }
24530
24531   if (! pat)
24532     return 0;
24533   emit_insn (pat);
24534   return klass == store ? 0 : target;
24535 }
24536
24537 /* Return the integer constant in ARG.  Constrain it to be in the range
24538    of the subparts of VEC_TYPE; issue an error if not.  */
24539
24540 static int
24541 get_element_number (tree vec_type, tree arg)
24542 {
24543   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
24544
24545   if (!host_integerp (arg, 1)
24546       || (elt = tree_low_cst (arg, 1), elt > max))
24547     {
24548       error ("selector must be an integer constant in the range 0..%wi", max);
24549       return 0;
24550     }
24551
24552   return elt;
24553 }
24554
24555 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24556    ix86_expand_vector_init.  We DO have language-level syntax for this, in
24557    the form of  (type){ init-list }.  Except that since we can't place emms
24558    instructions from inside the compiler, we can't allow the use of MMX
24559    registers unless the user explicitly asks for it.  So we do *not* define
24560    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
24561    we have builtins invoked by mmintrin.h that gives us license to emit
24562    these sorts of instructions.  */
24563
24564 static rtx
24565 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
24566 {
24567   enum machine_mode tmode = TYPE_MODE (type);
24568   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
24569   int i, n_elt = GET_MODE_NUNITS (tmode);
24570   rtvec v = rtvec_alloc (n_elt);
24571
24572   gcc_assert (VECTOR_MODE_P (tmode));
24573   gcc_assert (call_expr_nargs (exp) == n_elt);
24574
24575   for (i = 0; i < n_elt; ++i)
24576     {
24577       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
24578       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
24579     }
24580
24581   if (!target || !register_operand (target, tmode))
24582     target = gen_reg_rtx (tmode);
24583
24584   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
24585   return target;
24586 }
24587
24588 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24589    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
24590    had a language-level syntax for referencing vector elements.  */
24591
24592 static rtx
24593 ix86_expand_vec_ext_builtin (tree exp, rtx target)
24594 {
24595   enum machine_mode tmode, mode0;
24596   tree arg0, arg1;
24597   int elt;
24598   rtx op0;
24599
24600   arg0 = CALL_EXPR_ARG (exp, 0);
24601   arg1 = CALL_EXPR_ARG (exp, 1);
24602
24603   op0 = expand_normal (arg0);
24604   elt = get_element_number (TREE_TYPE (arg0), arg1);
24605
24606   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
24607   mode0 = TYPE_MODE (TREE_TYPE (arg0));
24608   gcc_assert (VECTOR_MODE_P (mode0));
24609
24610   op0 = force_reg (mode0, op0);
24611
24612   if (optimize || !target || !register_operand (target, tmode))
24613     target = gen_reg_rtx (tmode);
24614
24615   ix86_expand_vector_extract (true, target, op0, elt);
24616
24617   return target;
24618 }
24619
24620 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24621    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
24622    a language-level syntax for referencing vector elements.  */
24623
24624 static rtx
24625 ix86_expand_vec_set_builtin (tree exp)
24626 {
24627   enum machine_mode tmode, mode1;
24628   tree arg0, arg1, arg2;
24629   int elt;
24630   rtx op0, op1, target;
24631
24632   arg0 = CALL_EXPR_ARG (exp, 0);
24633   arg1 = CALL_EXPR_ARG (exp, 1);
24634   arg2 = CALL_EXPR_ARG (exp, 2);
24635
24636   tmode = TYPE_MODE (TREE_TYPE (arg0));
24637   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
24638   gcc_assert (VECTOR_MODE_P (tmode));
24639
24640   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
24641   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
24642   elt = get_element_number (TREE_TYPE (arg0), arg2);
24643
24644   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
24645     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
24646
24647   op0 = force_reg (tmode, op0);
24648   op1 = force_reg (mode1, op1);
24649
24650   /* OP0 is the source of these builtin functions and shouldn't be
24651      modified.  Create a copy, use it and return it as target.  */
24652   target = gen_reg_rtx (tmode);
24653   emit_move_insn (target, op0);
24654   ix86_expand_vector_set (true, target, op1, elt);
24655
24656   return target;
24657 }
24658
24659 /* Expand an expression EXP that calls a built-in function,
24660    with result going to TARGET if that's convenient
24661    (and in mode MODE if that's convenient).
24662    SUBTARGET may be used as the target for computing one of EXP's operands.
24663    IGNORE is nonzero if the value is to be ignored.  */
24664
24665 static rtx
24666 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
24667                      enum machine_mode mode ATTRIBUTE_UNUSED,
24668                      int ignore ATTRIBUTE_UNUSED)
24669 {
24670   const struct builtin_description *d;
24671   size_t i;
24672   enum insn_code icode;
24673   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
24674   tree arg0, arg1, arg2;
24675   rtx op0, op1, op2, pat;
24676   enum machine_mode mode0, mode1, mode2;
24677   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
24678
24679   /* Determine whether the builtin function is available under the current ISA.
24680      Originally the builtin was not created if it wasn't applicable to the
24681      current ISA based on the command line switches.  With function specific
24682      options, we need to check in the context of the function making the call
24683      whether it is supported.  */
24684   if (ix86_builtins_isa[fcode].isa
24685       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
24686     {
24687       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
24688                                        NULL, NULL, false);
24689
24690       if (!opts)
24691         error ("%qE needs unknown isa option", fndecl);
24692       else
24693         {
24694           gcc_assert (opts != NULL);
24695           error ("%qE needs isa option %s", fndecl, opts);
24696           free (opts);
24697         }
24698       return const0_rtx;
24699     }
24700
24701   switch (fcode)
24702     {
24703     case IX86_BUILTIN_MASKMOVQ:
24704     case IX86_BUILTIN_MASKMOVDQU:
24705       icode = (fcode == IX86_BUILTIN_MASKMOVQ
24706                ? CODE_FOR_mmx_maskmovq
24707                : CODE_FOR_sse2_maskmovdqu);
24708       /* Note the arg order is different from the operand order.  */
24709       arg1 = CALL_EXPR_ARG (exp, 0);
24710       arg2 = CALL_EXPR_ARG (exp, 1);
24711       arg0 = CALL_EXPR_ARG (exp, 2);
24712       op0 = expand_normal (arg0);
24713       op1 = expand_normal (arg1);
24714       op2 = expand_normal (arg2);
24715       mode0 = insn_data[icode].operand[0].mode;
24716       mode1 = insn_data[icode].operand[1].mode;
24717       mode2 = insn_data[icode].operand[2].mode;
24718
24719       op0 = force_reg (Pmode, op0);
24720       op0 = gen_rtx_MEM (mode1, op0);
24721
24722       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
24723         op0 = copy_to_mode_reg (mode0, op0);
24724       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
24725         op1 = copy_to_mode_reg (mode1, op1);
24726       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
24727         op2 = copy_to_mode_reg (mode2, op2);
24728       pat = GEN_FCN (icode) (op0, op1, op2);
24729       if (! pat)
24730         return 0;
24731       emit_insn (pat);
24732       return 0;
24733
24734     case IX86_BUILTIN_LDMXCSR:
24735       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
24736       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24737       emit_move_insn (target, op0);
24738       emit_insn (gen_sse_ldmxcsr (target));
24739       return 0;
24740
24741     case IX86_BUILTIN_STMXCSR:
24742       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24743       emit_insn (gen_sse_stmxcsr (target));
24744       return copy_to_mode_reg (SImode, target);
24745
24746     case IX86_BUILTIN_CLFLUSH:
24747         arg0 = CALL_EXPR_ARG (exp, 0);
24748         op0 = expand_normal (arg0);
24749         icode = CODE_FOR_sse2_clflush;
24750         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
24751             op0 = copy_to_mode_reg (Pmode, op0);
24752
24753         emit_insn (gen_sse2_clflush (op0));
24754         return 0;
24755
24756     case IX86_BUILTIN_MONITOR:
24757       arg0 = CALL_EXPR_ARG (exp, 0);
24758       arg1 = CALL_EXPR_ARG (exp, 1);
24759       arg2 = CALL_EXPR_ARG (exp, 2);
24760       op0 = expand_normal (arg0);
24761       op1 = expand_normal (arg1);
24762       op2 = expand_normal (arg2);
24763       if (!REG_P (op0))
24764         op0 = copy_to_mode_reg (Pmode, op0);
24765       if (!REG_P (op1))
24766         op1 = copy_to_mode_reg (SImode, op1);
24767       if (!REG_P (op2))
24768         op2 = copy_to_mode_reg (SImode, op2);
24769       emit_insn ((*ix86_gen_monitor) (op0, op1, op2));
24770       return 0;
24771
24772     case IX86_BUILTIN_MWAIT:
24773       arg0 = CALL_EXPR_ARG (exp, 0);
24774       arg1 = CALL_EXPR_ARG (exp, 1);
24775       op0 = expand_normal (arg0);
24776       op1 = expand_normal (arg1);
24777       if (!REG_P (op0))
24778         op0 = copy_to_mode_reg (SImode, op0);
24779       if (!REG_P (op1))
24780         op1 = copy_to_mode_reg (SImode, op1);
24781       emit_insn (gen_sse3_mwait (op0, op1));
24782       return 0;
24783
24784     case IX86_BUILTIN_VEC_INIT_V2SI:
24785     case IX86_BUILTIN_VEC_INIT_V4HI:
24786     case IX86_BUILTIN_VEC_INIT_V8QI:
24787       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
24788
24789     case IX86_BUILTIN_VEC_EXT_V2DF:
24790     case IX86_BUILTIN_VEC_EXT_V2DI:
24791     case IX86_BUILTIN_VEC_EXT_V4SF:
24792     case IX86_BUILTIN_VEC_EXT_V4SI:
24793     case IX86_BUILTIN_VEC_EXT_V8HI:
24794     case IX86_BUILTIN_VEC_EXT_V2SI:
24795     case IX86_BUILTIN_VEC_EXT_V4HI:
24796     case IX86_BUILTIN_VEC_EXT_V16QI:
24797       return ix86_expand_vec_ext_builtin (exp, target);
24798
24799     case IX86_BUILTIN_VEC_SET_V2DI:
24800     case IX86_BUILTIN_VEC_SET_V4SF:
24801     case IX86_BUILTIN_VEC_SET_V4SI:
24802     case IX86_BUILTIN_VEC_SET_V8HI:
24803     case IX86_BUILTIN_VEC_SET_V4HI:
24804     case IX86_BUILTIN_VEC_SET_V16QI:
24805       return ix86_expand_vec_set_builtin (exp);
24806
24807     case IX86_BUILTIN_INFQ:
24808       {
24809         REAL_VALUE_TYPE inf;
24810         rtx tmp;
24811
24812         real_inf (&inf);
24813         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
24814
24815         tmp = validize_mem (force_const_mem (mode, tmp));
24816
24817         if (target == 0)
24818           target = gen_reg_rtx (mode);
24819
24820         emit_move_insn (target, tmp);
24821         return target;
24822       }
24823
24824     default:
24825       break;
24826     }
24827
24828   for (i = 0, d = bdesc_special_args;
24829        i < ARRAY_SIZE (bdesc_special_args);
24830        i++, d++)
24831     if (d->code == fcode)
24832       return ix86_expand_special_args_builtin (d, exp, target);
24833
24834   for (i = 0, d = bdesc_args;
24835        i < ARRAY_SIZE (bdesc_args);
24836        i++, d++)
24837     if (d->code == fcode)
24838       switch (fcode)
24839         {
24840         case IX86_BUILTIN_FABSQ:
24841         case IX86_BUILTIN_COPYSIGNQ:
24842           if (!TARGET_SSE2)
24843             /* Emit a normal call if SSE2 isn't available.  */
24844             return expand_call (exp, target, ignore);
24845         default:
24846           return ix86_expand_args_builtin (d, exp, target);
24847         }
24848
24849   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
24850     if (d->code == fcode)
24851       return ix86_expand_sse_comi (d, exp, target);
24852
24853   for (i = 0, d = bdesc_pcmpestr;
24854        i < ARRAY_SIZE (bdesc_pcmpestr);
24855        i++, d++)
24856     if (d->code == fcode)
24857       return ix86_expand_sse_pcmpestr (d, exp, target);
24858
24859   for (i = 0, d = bdesc_pcmpistr;
24860        i < ARRAY_SIZE (bdesc_pcmpistr);
24861        i++, d++)
24862     if (d->code == fcode)
24863       return ix86_expand_sse_pcmpistr (d, exp, target);
24864
24865   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
24866     if (d->code == fcode)
24867       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
24868                                             (enum multi_arg_type)d->flag,
24869                                             d->comparison);
24870
24871   gcc_unreachable ();
24872 }
24873
24874 /* Returns a function decl for a vectorized version of the builtin function
24875    with builtin function code FN and the result vector type TYPE, or NULL_TREE
24876    if it is not available.  */
24877
24878 static tree
24879 ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
24880                                   tree type_in)
24881 {
24882   enum machine_mode in_mode, out_mode;
24883   int in_n, out_n;
24884
24885   if (TREE_CODE (type_out) != VECTOR_TYPE
24886       || TREE_CODE (type_in) != VECTOR_TYPE)
24887     return NULL_TREE;
24888
24889   out_mode = TYPE_MODE (TREE_TYPE (type_out));
24890   out_n = TYPE_VECTOR_SUBPARTS (type_out);
24891   in_mode = TYPE_MODE (TREE_TYPE (type_in));
24892   in_n = TYPE_VECTOR_SUBPARTS (type_in);
24893
24894   switch (fn)
24895     {
24896     case BUILT_IN_SQRT:
24897       if (out_mode == DFmode && out_n == 2
24898           && in_mode == DFmode && in_n == 2)
24899         return ix86_builtins[IX86_BUILTIN_SQRTPD];
24900       break;
24901
24902     case BUILT_IN_SQRTF:
24903       if (out_mode == SFmode && out_n == 4
24904           && in_mode == SFmode && in_n == 4)
24905         return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
24906       break;
24907
24908     case BUILT_IN_LRINT:
24909       if (out_mode == SImode && out_n == 4
24910           && in_mode == DFmode && in_n == 2)
24911         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
24912       break;
24913
24914     case BUILT_IN_LRINTF:
24915       if (out_mode == SImode && out_n == 4
24916           && in_mode == SFmode && in_n == 4)
24917         return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
24918       break;
24919
24920     default:
24921       ;
24922     }
24923
24924   /* Dispatch to a handler for a vectorization library.  */
24925   if (ix86_veclib_handler)
24926     return (*ix86_veclib_handler)(fn, type_out, type_in);
24927
24928   return NULL_TREE;
24929 }
24930
24931 /* Handler for an SVML-style interface to
24932    a library with vectorized intrinsics.  */
24933
24934 static tree
24935 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
24936 {
24937   char name[20];
24938   tree fntype, new_fndecl, args;
24939   unsigned arity;
24940   const char *bname;
24941   enum machine_mode el_mode, in_mode;
24942   int n, in_n;
24943
24944   /* The SVML is suitable for unsafe math only.  */
24945   if (!flag_unsafe_math_optimizations)
24946     return NULL_TREE;
24947
24948   el_mode = TYPE_MODE (TREE_TYPE (type_out));
24949   n = TYPE_VECTOR_SUBPARTS (type_out);
24950   in_mode = TYPE_MODE (TREE_TYPE (type_in));
24951   in_n = TYPE_VECTOR_SUBPARTS (type_in);
24952   if (el_mode != in_mode
24953       || n != in_n)
24954     return NULL_TREE;
24955
24956   switch (fn)
24957     {
24958     case BUILT_IN_EXP:
24959     case BUILT_IN_LOG:
24960     case BUILT_IN_LOG10:
24961     case BUILT_IN_POW:
24962     case BUILT_IN_TANH:
24963     case BUILT_IN_TAN:
24964     case BUILT_IN_ATAN:
24965     case BUILT_IN_ATAN2:
24966     case BUILT_IN_ATANH:
24967     case BUILT_IN_CBRT:
24968     case BUILT_IN_SINH:
24969     case BUILT_IN_SIN:
24970     case BUILT_IN_ASINH:
24971     case BUILT_IN_ASIN:
24972     case BUILT_IN_COSH:
24973     case BUILT_IN_COS:
24974     case BUILT_IN_ACOSH:
24975     case BUILT_IN_ACOS:
24976       if (el_mode != DFmode || n != 2)
24977         return NULL_TREE;
24978       break;
24979
24980     case BUILT_IN_EXPF:
24981     case BUILT_IN_LOGF:
24982     case BUILT_IN_LOG10F:
24983     case BUILT_IN_POWF:
24984     case BUILT_IN_TANHF:
24985     case BUILT_IN_TANF:
24986     case BUILT_IN_ATANF:
24987     case BUILT_IN_ATAN2F:
24988     case BUILT_IN_ATANHF:
24989     case BUILT_IN_CBRTF:
24990     case BUILT_IN_SINHF:
24991     case BUILT_IN_SINF:
24992     case BUILT_IN_ASINHF:
24993     case BUILT_IN_ASINF:
24994     case BUILT_IN_COSHF:
24995     case BUILT_IN_COSF:
24996     case BUILT_IN_ACOSHF:
24997     case BUILT_IN_ACOSF:
24998       if (el_mode != SFmode || n != 4)
24999         return NULL_TREE;
25000       break;
25001
25002     default:
25003       return NULL_TREE;
25004     }
25005
25006   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25007
25008   if (fn == BUILT_IN_LOGF)
25009     strcpy (name, "vmlsLn4");
25010   else if (fn == BUILT_IN_LOG)
25011     strcpy (name, "vmldLn2");
25012   else if (n == 4)
25013     {
25014       sprintf (name, "vmls%s", bname+10);
25015       name[strlen (name)-1] = '4';
25016     }
25017   else
25018     sprintf (name, "vmld%s2", bname+10);
25019
25020   /* Convert to uppercase. */
25021   name[4] &= ~0x20;
25022
25023   arity = 0;
25024   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25025        args = TREE_CHAIN (args))
25026     arity++;
25027
25028   if (arity == 1)
25029     fntype = build_function_type_list (type_out, type_in, NULL);
25030   else
25031     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25032
25033   /* Build a function declaration for the vectorized function.  */
25034   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25035   TREE_PUBLIC (new_fndecl) = 1;
25036   DECL_EXTERNAL (new_fndecl) = 1;
25037   DECL_IS_NOVOPS (new_fndecl) = 1;
25038   TREE_READONLY (new_fndecl) = 1;
25039
25040   return new_fndecl;
25041 }
25042
25043 /* Handler for an ACML-style interface to
25044    a library with vectorized intrinsics.  */
25045
25046 static tree
25047 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
25048 {
25049   char name[20] = "__vr.._";
25050   tree fntype, new_fndecl, args;
25051   unsigned arity;
25052   const char *bname;
25053   enum machine_mode el_mode, in_mode;
25054   int n, in_n;
25055
25056   /* The ACML is 64bits only and suitable for unsafe math only as
25057      it does not correctly support parts of IEEE with the required
25058      precision such as denormals.  */
25059   if (!TARGET_64BIT
25060       || !flag_unsafe_math_optimizations)
25061     return NULL_TREE;
25062
25063   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25064   n = TYPE_VECTOR_SUBPARTS (type_out);
25065   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25066   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25067   if (el_mode != in_mode
25068       || n != in_n)
25069     return NULL_TREE;
25070
25071   switch (fn)
25072     {
25073     case BUILT_IN_SIN:
25074     case BUILT_IN_COS:
25075     case BUILT_IN_EXP:
25076     case BUILT_IN_LOG:
25077     case BUILT_IN_LOG2:
25078     case BUILT_IN_LOG10:
25079       name[4] = 'd';
25080       name[5] = '2';
25081       if (el_mode != DFmode
25082           || n != 2)
25083         return NULL_TREE;
25084       break;
25085
25086     case BUILT_IN_SINF:
25087     case BUILT_IN_COSF:
25088     case BUILT_IN_EXPF:
25089     case BUILT_IN_POWF:
25090     case BUILT_IN_LOGF:
25091     case BUILT_IN_LOG2F:
25092     case BUILT_IN_LOG10F:
25093       name[4] = 's';
25094       name[5] = '4';
25095       if (el_mode != SFmode
25096           || n != 4)
25097         return NULL_TREE;
25098       break;
25099
25100     default:
25101       return NULL_TREE;
25102     }
25103
25104   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25105   sprintf (name + 7, "%s", bname+10);
25106
25107   arity = 0;
25108   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25109        args = TREE_CHAIN (args))
25110     arity++;
25111
25112   if (arity == 1)
25113     fntype = build_function_type_list (type_out, type_in, NULL);
25114   else
25115     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25116
25117   /* Build a function declaration for the vectorized function.  */
25118   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25119   TREE_PUBLIC (new_fndecl) = 1;
25120   DECL_EXTERNAL (new_fndecl) = 1;
25121   DECL_IS_NOVOPS (new_fndecl) = 1;
25122   TREE_READONLY (new_fndecl) = 1;
25123
25124   return new_fndecl;
25125 }
25126
25127
25128 /* Returns a decl of a function that implements conversion of an integer vector
25129    into a floating-point vector, or vice-versa. TYPE is the type of the integer
25130    side of the conversion.
25131    Return NULL_TREE if it is not available.  */
25132
25133 static tree
25134 ix86_vectorize_builtin_conversion (unsigned int code, tree type)
25135 {
25136   if (TREE_CODE (type) != VECTOR_TYPE)
25137     return NULL_TREE;
25138
25139   switch (code)
25140     {
25141     case FLOAT_EXPR:
25142       switch (TYPE_MODE (type))
25143         {
25144         case V4SImode:
25145           return ix86_builtins[IX86_BUILTIN_CVTDQ2PS];
25146         default:
25147           return NULL_TREE;
25148         }
25149
25150     case FIX_TRUNC_EXPR:
25151       switch (TYPE_MODE (type))
25152         {
25153         case V4SImode:
25154           return ix86_builtins[IX86_BUILTIN_CVTTPS2DQ];
25155         default:
25156           return NULL_TREE;
25157         }
25158     default:
25159       return NULL_TREE;
25160
25161     }
25162 }
25163
25164 /* Returns a code for a target-specific builtin that implements
25165    reciprocal of the function, or NULL_TREE if not available.  */
25166
25167 static tree
25168 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
25169                          bool sqrt ATTRIBUTE_UNUSED)
25170 {
25171   if (! (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
25172          && flag_finite_math_only && !flag_trapping_math
25173          && flag_unsafe_math_optimizations))
25174     return NULL_TREE;
25175
25176   if (md_fn)
25177     /* Machine dependent builtins.  */
25178     switch (fn)
25179       {
25180         /* Vectorized version of sqrt to rsqrt conversion.  */
25181       case IX86_BUILTIN_SQRTPS_NR:
25182         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
25183
25184       default:
25185         return NULL_TREE;
25186       }
25187   else
25188     /* Normal builtins.  */
25189     switch (fn)
25190       {
25191         /* Sqrt to rsqrt conversion.  */
25192       case BUILT_IN_SQRTF:
25193         return ix86_builtins[IX86_BUILTIN_RSQRTF];
25194
25195       default:
25196         return NULL_TREE;
25197       }
25198 }
25199
25200 /* Store OPERAND to the memory after reload is completed.  This means
25201    that we can't easily use assign_stack_local.  */
25202 rtx
25203 ix86_force_to_memory (enum machine_mode mode, rtx operand)
25204 {
25205   rtx result;
25206
25207   gcc_assert (reload_completed);
25208   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE)
25209     {
25210       result = gen_rtx_MEM (mode,
25211                             gen_rtx_PLUS (Pmode,
25212                                           stack_pointer_rtx,
25213                                           GEN_INT (-RED_ZONE_SIZE)));
25214       emit_move_insn (result, operand);
25215     }
25216   else if ((TARGET_64BIT_MS_ABI || !TARGET_RED_ZONE) && TARGET_64BIT)
25217     {
25218       switch (mode)
25219         {
25220         case HImode:
25221         case SImode:
25222           operand = gen_lowpart (DImode, operand);
25223           /* FALLTHRU */
25224         case DImode:
25225           emit_insn (
25226                       gen_rtx_SET (VOIDmode,
25227                                    gen_rtx_MEM (DImode,
25228                                                 gen_rtx_PRE_DEC (DImode,
25229                                                         stack_pointer_rtx)),
25230                                    operand));
25231           break;
25232         default:
25233           gcc_unreachable ();
25234         }
25235       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25236     }
25237   else
25238     {
25239       switch (mode)
25240         {
25241         case DImode:
25242           {
25243             rtx operands[2];
25244             split_di (&operand, 1, operands, operands + 1);
25245             emit_insn (
25246                         gen_rtx_SET (VOIDmode,
25247                                      gen_rtx_MEM (SImode,
25248                                                   gen_rtx_PRE_DEC (Pmode,
25249                                                         stack_pointer_rtx)),
25250                                      operands[1]));
25251             emit_insn (
25252                         gen_rtx_SET (VOIDmode,
25253                                      gen_rtx_MEM (SImode,
25254                                                   gen_rtx_PRE_DEC (Pmode,
25255                                                         stack_pointer_rtx)),
25256                                      operands[0]));
25257           }
25258           break;
25259         case HImode:
25260           /* Store HImodes as SImodes.  */
25261           operand = gen_lowpart (SImode, operand);
25262           /* FALLTHRU */
25263         case SImode:
25264           emit_insn (
25265                       gen_rtx_SET (VOIDmode,
25266                                    gen_rtx_MEM (GET_MODE (operand),
25267                                                 gen_rtx_PRE_DEC (SImode,
25268                                                         stack_pointer_rtx)),
25269                                    operand));
25270           break;
25271         default:
25272           gcc_unreachable ();
25273         }
25274       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25275     }
25276   return result;
25277 }
25278
25279 /* Free operand from the memory.  */
25280 void
25281 ix86_free_from_memory (enum machine_mode mode)
25282 {
25283   if (!TARGET_RED_ZONE || TARGET_64BIT_MS_ABI)
25284     {
25285       int size;
25286
25287       if (mode == DImode || TARGET_64BIT)
25288         size = 8;
25289       else
25290         size = 4;
25291       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
25292          to pop or add instruction if registers are available.  */
25293       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
25294                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
25295                                             GEN_INT (size))));
25296     }
25297 }
25298
25299 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
25300    QImode must go into class Q_REGS.
25301    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
25302    movdf to do mem-to-mem moves through integer regs.  */
25303 enum reg_class
25304 ix86_preferred_reload_class (rtx x, enum reg_class regclass)
25305 {
25306   enum machine_mode mode = GET_MODE (x);
25307
25308   /* We're only allowed to return a subclass of CLASS.  Many of the
25309      following checks fail for NO_REGS, so eliminate that early.  */
25310   if (regclass == NO_REGS)
25311     return NO_REGS;
25312
25313   /* All classes can load zeros.  */
25314   if (x == CONST0_RTX (mode))
25315     return regclass;
25316
25317   /* Force constants into memory if we are loading a (nonzero) constant into
25318      an MMX or SSE register.  This is because there are no MMX/SSE instructions
25319      to load from a constant.  */
25320   if (CONSTANT_P (x)
25321       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
25322     return NO_REGS;
25323
25324   /* Prefer SSE regs only, if we can use them for math.  */
25325   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
25326     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
25327
25328   /* Floating-point constants need more complex checks.  */
25329   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
25330     {
25331       /* General regs can load everything.  */
25332       if (reg_class_subset_p (regclass, GENERAL_REGS))
25333         return regclass;
25334
25335       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
25336          zero above.  We only want to wind up preferring 80387 registers if
25337          we plan on doing computation with them.  */
25338       if (TARGET_80387
25339           && standard_80387_constant_p (x))
25340         {
25341           /* Limit class to non-sse.  */
25342           if (regclass == FLOAT_SSE_REGS)
25343             return FLOAT_REGS;
25344           if (regclass == FP_TOP_SSE_REGS)
25345             return FP_TOP_REG;
25346           if (regclass == FP_SECOND_SSE_REGS)
25347             return FP_SECOND_REG;
25348           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
25349             return regclass;
25350         }
25351
25352       return NO_REGS;
25353     }
25354
25355   /* Generally when we see PLUS here, it's the function invariant
25356      (plus soft-fp const_int).  Which can only be computed into general
25357      regs.  */
25358   if (GET_CODE (x) == PLUS)
25359     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
25360
25361   /* QImode constants are easy to load, but non-constant QImode data
25362      must go into Q_REGS.  */
25363   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
25364     {
25365       if (reg_class_subset_p (regclass, Q_REGS))
25366         return regclass;
25367       if (reg_class_subset_p (Q_REGS, regclass))
25368         return Q_REGS;
25369       return NO_REGS;
25370     }
25371
25372   return regclass;
25373 }
25374
25375 /* Discourage putting floating-point values in SSE registers unless
25376    SSE math is being used, and likewise for the 387 registers.  */
25377 enum reg_class
25378 ix86_preferred_output_reload_class (rtx x, enum reg_class regclass)
25379 {
25380   enum machine_mode mode = GET_MODE (x);
25381
25382   /* Restrict the output reload class to the register bank that we are doing
25383      math on.  If we would like not to return a subset of CLASS, reject this
25384      alternative: if reload cannot do this, it will still use its choice.  */
25385   mode = GET_MODE (x);
25386   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
25387     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
25388
25389   if (X87_FLOAT_MODE_P (mode))
25390     {
25391       if (regclass == FP_TOP_SSE_REGS)
25392         return FP_TOP_REG;
25393       else if (regclass == FP_SECOND_SSE_REGS)
25394         return FP_SECOND_REG;
25395       else
25396         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
25397     }
25398
25399   return regclass;
25400 }
25401
25402 static enum reg_class
25403 ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
25404                        enum machine_mode mode,
25405                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
25406 {
25407   /* QImode spills from non-QI registers require
25408      intermediate register on 32bit targets.  */
25409   if (!in_p && mode == QImode && !TARGET_64BIT
25410       && (rclass == GENERAL_REGS
25411           || rclass == LEGACY_REGS
25412           || rclass == INDEX_REGS))
25413     {
25414       int regno;
25415
25416       if (REG_P (x))
25417         regno = REGNO (x);
25418       else
25419         regno = -1;
25420
25421       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
25422         regno = true_regnum (x);
25423
25424       /* Return Q_REGS if the operand is in memory.  */
25425       if (regno == -1)
25426         return Q_REGS;
25427     }
25428
25429   return NO_REGS;
25430 }
25431
25432 /* If we are copying between general and FP registers, we need a memory
25433    location. The same is true for SSE and MMX registers.
25434
25435    To optimize register_move_cost performance, allow inline variant.
25436
25437    The macro can't work reliably when one of the CLASSES is class containing
25438    registers from multiple units (SSE, MMX, integer).  We avoid this by never
25439    combining those units in single alternative in the machine description.
25440    Ensure that this constraint holds to avoid unexpected surprises.
25441
25442    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
25443    enforce these sanity checks.  */
25444
25445 static inline int
25446 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25447                               enum machine_mode mode, int strict)
25448 {
25449   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
25450       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
25451       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
25452       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
25453       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
25454       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
25455     {
25456       gcc_assert (!strict);
25457       return true;
25458     }
25459
25460   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
25461     return true;
25462
25463   /* ??? This is a lie.  We do have moves between mmx/general, and for
25464      mmx/sse2.  But by saying we need secondary memory we discourage the
25465      register allocator from using the mmx registers unless needed.  */
25466   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
25467     return true;
25468
25469   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25470     {
25471       /* SSE1 doesn't have any direct moves from other classes.  */
25472       if (!TARGET_SSE2)
25473         return true;
25474
25475       /* If the target says that inter-unit moves are more expensive
25476          than moving through memory, then don't generate them.  */
25477       if (!TARGET_INTER_UNIT_MOVES)
25478         return true;
25479
25480       /* Between SSE and general, we have moves no larger than word size.  */
25481       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
25482         return true;
25483     }
25484
25485   return false;
25486 }
25487
25488 int
25489 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25490                               enum machine_mode mode, int strict)
25491 {
25492   return inline_secondary_memory_needed (class1, class2, mode, strict);
25493 }
25494
25495 /* Return true if the registers in CLASS cannot represent the change from
25496    modes FROM to TO.  */
25497
25498 bool
25499 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
25500                                enum reg_class regclass)
25501 {
25502   if (from == to)
25503     return false;
25504
25505   /* x87 registers can't do subreg at all, as all values are reformatted
25506      to extended precision.  */
25507   if (MAYBE_FLOAT_CLASS_P (regclass))
25508     return true;
25509
25510   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
25511     {
25512       /* Vector registers do not support QI or HImode loads.  If we don't
25513          disallow a change to these modes, reload will assume it's ok to
25514          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
25515          the vec_dupv4hi pattern.  */
25516       if (GET_MODE_SIZE (from) < 4)
25517         return true;
25518
25519       /* Vector registers do not support subreg with nonzero offsets, which
25520          are otherwise valid for integer registers.  Since we can't see
25521          whether we have a nonzero offset from here, prohibit all
25522          nonparadoxical subregs changing size.  */
25523       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
25524         return true;
25525     }
25526
25527   return false;
25528 }
25529
25530 /* Return the cost of moving data of mode M between a
25531    register and memory.  A value of 2 is the default; this cost is
25532    relative to those in `REGISTER_MOVE_COST'.
25533
25534    This function is used extensively by register_move_cost that is used to
25535    build tables at startup.  Make it inline in this case.
25536    When IN is 2, return maximum of in and out move cost.
25537
25538    If moving between registers and memory is more expensive than
25539    between two registers, you should define this macro to express the
25540    relative cost.
25541
25542    Model also increased moving costs of QImode registers in non
25543    Q_REGS classes.
25544  */
25545 static inline int
25546 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
25547                          int in)
25548 {
25549   int cost;
25550   if (FLOAT_CLASS_P (regclass))
25551     {
25552       int index;
25553       switch (mode)
25554         {
25555           case SFmode:
25556             index = 0;
25557             break;
25558           case DFmode:
25559             index = 1;
25560             break;
25561           case XFmode:
25562             index = 2;
25563             break;
25564           default:
25565             return 100;
25566         }
25567       if (in == 2)
25568         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
25569       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
25570     }
25571   if (SSE_CLASS_P (regclass))
25572     {
25573       int index;
25574       switch (GET_MODE_SIZE (mode))
25575         {
25576           case 4:
25577             index = 0;
25578             break;
25579           case 8:
25580             index = 1;
25581             break;
25582           case 16:
25583             index = 2;
25584             break;
25585           default:
25586             return 100;
25587         }
25588       if (in == 2)
25589         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
25590       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
25591     }
25592   if (MMX_CLASS_P (regclass))
25593     {
25594       int index;
25595       switch (GET_MODE_SIZE (mode))
25596         {
25597           case 4:
25598             index = 0;
25599             break;
25600           case 8:
25601             index = 1;
25602             break;
25603           default:
25604             return 100;
25605         }
25606       if (in)
25607         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
25608       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
25609     }
25610   switch (GET_MODE_SIZE (mode))
25611     {
25612       case 1:
25613         if (Q_CLASS_P (regclass) || TARGET_64BIT)
25614           {
25615             if (!in)
25616               return ix86_cost->int_store[0];
25617             if (TARGET_PARTIAL_REG_DEPENDENCY
25618                 && optimize_function_for_speed_p (cfun))
25619               cost = ix86_cost->movzbl_load;
25620             else
25621               cost = ix86_cost->int_load[0];
25622             if (in == 2)
25623               return MAX (cost, ix86_cost->int_store[0]);
25624             return cost;
25625           }
25626         else
25627           {
25628            if (in == 2)
25629              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
25630            if (in)
25631              return ix86_cost->movzbl_load;
25632            else
25633              return ix86_cost->int_store[0] + 4;
25634           }
25635         break;
25636       case 2:
25637         if (in == 2)
25638           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
25639         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
25640       default:
25641         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
25642         if (mode == TFmode)
25643           mode = XFmode;
25644         if (in == 2)
25645           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
25646         else if (in)
25647           cost = ix86_cost->int_load[2];
25648         else
25649           cost = ix86_cost->int_store[2];
25650         return (cost * (((int) GET_MODE_SIZE (mode)
25651                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
25652     }
25653 }
25654
25655 int
25656 ix86_memory_move_cost (enum machine_mode mode, enum reg_class regclass, int in)
25657 {
25658   return inline_memory_move_cost (mode, regclass, in);
25659 }
25660
25661
25662 /* Return the cost of moving data from a register in class CLASS1 to
25663    one in class CLASS2.
25664
25665    It is not required that the cost always equal 2 when FROM is the same as TO;
25666    on some machines it is expensive to move between registers if they are not
25667    general registers.  */
25668
25669 int
25670 ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
25671                          enum reg_class class2)
25672 {
25673   /* In case we require secondary memory, compute cost of the store followed
25674      by load.  In order to avoid bad register allocation choices, we need
25675      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
25676
25677   if (inline_secondary_memory_needed (class1, class2, mode, 0))
25678     {
25679       int cost = 1;
25680
25681       cost += inline_memory_move_cost (mode, class1, 2);
25682       cost += inline_memory_move_cost (mode, class2, 2);
25683
25684       /* In case of copying from general_purpose_register we may emit multiple
25685          stores followed by single load causing memory size mismatch stall.
25686          Count this as arbitrarily high cost of 20.  */
25687       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
25688         cost += 20;
25689
25690       /* In the case of FP/MMX moves, the registers actually overlap, and we
25691          have to switch modes in order to treat them differently.  */
25692       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
25693           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
25694         cost += 20;
25695
25696       return cost;
25697     }
25698
25699   /* Moves between SSE/MMX and integer unit are expensive.  */
25700   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
25701       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25702
25703     /* ??? By keeping returned value relatively high, we limit the number
25704        of moves between integer and MMX/SSE registers for all targets.
25705        Additionally, high value prevents problem with x86_modes_tieable_p(),
25706        where integer modes in MMX/SSE registers are not tieable
25707        because of missing QImode and HImode moves to, from or between
25708        MMX/SSE registers.  */
25709     return MAX (8, ix86_cost->mmxsse_to_integer);
25710
25711   if (MAYBE_FLOAT_CLASS_P (class1))
25712     return ix86_cost->fp_move;
25713   if (MAYBE_SSE_CLASS_P (class1))
25714     return ix86_cost->sse_move;
25715   if (MAYBE_MMX_CLASS_P (class1))
25716     return ix86_cost->mmx_move;
25717   return 2;
25718 }
25719
25720 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
25721
25722 bool
25723 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
25724 {
25725   /* Flags and only flags can only hold CCmode values.  */
25726   if (CC_REGNO_P (regno))
25727     return GET_MODE_CLASS (mode) == MODE_CC;
25728   if (GET_MODE_CLASS (mode) == MODE_CC
25729       || GET_MODE_CLASS (mode) == MODE_RANDOM
25730       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
25731     return 0;
25732   if (FP_REGNO_P (regno))
25733     return VALID_FP_MODE_P (mode);
25734   if (SSE_REGNO_P (regno))
25735     {
25736       /* We implement the move patterns for all vector modes into and
25737          out of SSE registers, even when no operation instructions
25738          are available.  OImode move is available only when AVX is
25739          enabled.  */
25740       return ((TARGET_AVX && mode == OImode)
25741               || VALID_AVX256_REG_MODE (mode)
25742               || VALID_SSE_REG_MODE (mode)
25743               || VALID_SSE2_REG_MODE (mode)
25744               || VALID_MMX_REG_MODE (mode)
25745               || VALID_MMX_REG_MODE_3DNOW (mode));
25746     }
25747   if (MMX_REGNO_P (regno))
25748     {
25749       /* We implement the move patterns for 3DNOW modes even in MMX mode,
25750          so if the register is available at all, then we can move data of
25751          the given mode into or out of it.  */
25752       return (VALID_MMX_REG_MODE (mode)
25753               || VALID_MMX_REG_MODE_3DNOW (mode));
25754     }
25755
25756   if (mode == QImode)
25757     {
25758       /* Take care for QImode values - they can be in non-QI regs,
25759          but then they do cause partial register stalls.  */
25760       if (regno < 4 || TARGET_64BIT)
25761         return 1;
25762       if (!TARGET_PARTIAL_REG_STALL)
25763         return 1;
25764       return reload_in_progress || reload_completed;
25765     }
25766   /* We handle both integer and floats in the general purpose registers.  */
25767   else if (VALID_INT_MODE_P (mode))
25768     return 1;
25769   else if (VALID_FP_MODE_P (mode))
25770     return 1;
25771   else if (VALID_DFP_MODE_P (mode))
25772     return 1;
25773   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
25774      on to use that value in smaller contexts, this can easily force a
25775      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
25776      supporting DImode, allow it.  */
25777   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
25778     return 1;
25779
25780   return 0;
25781 }
25782
25783 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
25784    tieable integer mode.  */
25785
25786 static bool
25787 ix86_tieable_integer_mode_p (enum machine_mode mode)
25788 {
25789   switch (mode)
25790     {
25791     case HImode:
25792     case SImode:
25793       return true;
25794
25795     case QImode:
25796       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
25797
25798     case DImode:
25799       return TARGET_64BIT;
25800
25801     default:
25802       return false;
25803     }
25804 }
25805
25806 /* Return true if MODE1 is accessible in a register that can hold MODE2
25807    without copying.  That is, all register classes that can hold MODE2
25808    can also hold MODE1.  */
25809
25810 bool
25811 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
25812 {
25813   if (mode1 == mode2)
25814     return true;
25815
25816   if (ix86_tieable_integer_mode_p (mode1)
25817       && ix86_tieable_integer_mode_p (mode2))
25818     return true;
25819
25820   /* MODE2 being XFmode implies fp stack or general regs, which means we
25821      can tie any smaller floating point modes to it.  Note that we do not
25822      tie this with TFmode.  */
25823   if (mode2 == XFmode)
25824     return mode1 == SFmode || mode1 == DFmode;
25825
25826   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
25827      that we can tie it with SFmode.  */
25828   if (mode2 == DFmode)
25829     return mode1 == SFmode;
25830
25831   /* If MODE2 is only appropriate for an SSE register, then tie with
25832      any other mode acceptable to SSE registers.  */
25833   if (GET_MODE_SIZE (mode2) == 16
25834       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
25835     return (GET_MODE_SIZE (mode1) == 16
25836             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
25837
25838   /* If MODE2 is appropriate for an MMX register, then tie
25839      with any other mode acceptable to MMX registers.  */
25840   if (GET_MODE_SIZE (mode2) == 8
25841       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
25842     return (GET_MODE_SIZE (mode1) == 8
25843             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
25844
25845   return false;
25846 }
25847
25848 /* Compute a (partial) cost for rtx X.  Return true if the complete
25849    cost has been computed, and false if subexpressions should be
25850    scanned.  In either case, *TOTAL contains the cost result.  */
25851
25852 static bool
25853 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
25854 {
25855   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
25856   enum machine_mode mode = GET_MODE (x);
25857   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
25858
25859   switch (code)
25860     {
25861     case CONST_INT:
25862     case CONST:
25863     case LABEL_REF:
25864     case SYMBOL_REF:
25865       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
25866         *total = 3;
25867       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
25868         *total = 2;
25869       else if (flag_pic && SYMBOLIC_CONST (x)
25870                && (!TARGET_64BIT
25871                    || (!GET_CODE (x) != LABEL_REF
25872                        && (GET_CODE (x) != SYMBOL_REF
25873                            || !SYMBOL_REF_LOCAL_P (x)))))
25874         *total = 1;
25875       else
25876         *total = 0;
25877       return true;
25878
25879     case CONST_DOUBLE:
25880       if (mode == VOIDmode)
25881         *total = 0;
25882       else
25883         switch (standard_80387_constant_p (x))
25884           {
25885           case 1: /* 0.0 */
25886             *total = 1;
25887             break;
25888           default: /* Other constants */
25889             *total = 2;
25890             break;
25891           case 0:
25892           case -1:
25893             /* Start with (MEM (SYMBOL_REF)), since that's where
25894                it'll probably end up.  Add a penalty for size.  */
25895             *total = (COSTS_N_INSNS (1)
25896                       + (flag_pic != 0 && !TARGET_64BIT)
25897                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
25898             break;
25899           }
25900       return true;
25901
25902     case ZERO_EXTEND:
25903       /* The zero extensions is often completely free on x86_64, so make
25904          it as cheap as possible.  */
25905       if (TARGET_64BIT && mode == DImode
25906           && GET_MODE (XEXP (x, 0)) == SImode)
25907         *total = 1;
25908       else if (TARGET_ZERO_EXTEND_WITH_AND)
25909         *total = cost->add;
25910       else
25911         *total = cost->movzx;
25912       return false;
25913
25914     case SIGN_EXTEND:
25915       *total = cost->movsx;
25916       return false;
25917
25918     case ASHIFT:
25919       if (CONST_INT_P (XEXP (x, 1))
25920           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
25921         {
25922           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
25923           if (value == 1)
25924             {
25925               *total = cost->add;
25926               return false;
25927             }
25928           if ((value == 2 || value == 3)
25929               && cost->lea <= cost->shift_const)
25930             {
25931               *total = cost->lea;
25932               return false;
25933             }
25934         }
25935       /* FALLTHRU */
25936
25937     case ROTATE:
25938     case ASHIFTRT:
25939     case LSHIFTRT:
25940     case ROTATERT:
25941       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
25942         {
25943           if (CONST_INT_P (XEXP (x, 1)))
25944             {
25945               if (INTVAL (XEXP (x, 1)) > 32)
25946                 *total = cost->shift_const + COSTS_N_INSNS (2);
25947               else
25948                 *total = cost->shift_const * 2;
25949             }
25950           else
25951             {
25952               if (GET_CODE (XEXP (x, 1)) == AND)
25953                 *total = cost->shift_var * 2;
25954               else
25955                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
25956             }
25957         }
25958       else
25959         {
25960           if (CONST_INT_P (XEXP (x, 1)))
25961             *total = cost->shift_const;
25962           else
25963             *total = cost->shift_var;
25964         }
25965       return false;
25966
25967     case MULT:
25968       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25969         {
25970           /* ??? SSE scalar cost should be used here.  */
25971           *total = cost->fmul;
25972           return false;
25973         }
25974       else if (X87_FLOAT_MODE_P (mode))
25975         {
25976           *total = cost->fmul;
25977           return false;
25978         }
25979       else if (FLOAT_MODE_P (mode))
25980         {
25981           /* ??? SSE vector cost should be used here.  */
25982           *total = cost->fmul;
25983           return false;
25984         }
25985       else
25986         {
25987           rtx op0 = XEXP (x, 0);
25988           rtx op1 = XEXP (x, 1);
25989           int nbits;
25990           if (CONST_INT_P (XEXP (x, 1)))
25991             {
25992               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
25993               for (nbits = 0; value != 0; value &= value - 1)
25994                 nbits++;
25995             }
25996           else
25997             /* This is arbitrary.  */
25998             nbits = 7;
25999
26000           /* Compute costs correctly for widening multiplication.  */
26001           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
26002               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
26003                  == GET_MODE_SIZE (mode))
26004             {
26005               int is_mulwiden = 0;
26006               enum machine_mode inner_mode = GET_MODE (op0);
26007
26008               if (GET_CODE (op0) == GET_CODE (op1))
26009                 is_mulwiden = 1, op1 = XEXP (op1, 0);
26010               else if (CONST_INT_P (op1))
26011                 {
26012                   if (GET_CODE (op0) == SIGN_EXTEND)
26013                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
26014                                   == INTVAL (op1);
26015                   else
26016                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
26017                 }
26018
26019               if (is_mulwiden)
26020                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
26021             }
26022
26023           *total = (cost->mult_init[MODE_INDEX (mode)]
26024                     + nbits * cost->mult_bit
26025                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
26026
26027           return true;
26028         }
26029
26030     case DIV:
26031     case UDIV:
26032     case MOD:
26033     case UMOD:
26034       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26035         /* ??? SSE cost should be used here.  */
26036         *total = cost->fdiv;
26037       else if (X87_FLOAT_MODE_P (mode))
26038         *total = cost->fdiv;
26039       else if (FLOAT_MODE_P (mode))
26040         /* ??? SSE vector cost should be used here.  */
26041         *total = cost->fdiv;
26042       else
26043         *total = cost->divide[MODE_INDEX (mode)];
26044       return false;
26045
26046     case PLUS:
26047       if (GET_MODE_CLASS (mode) == MODE_INT
26048                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
26049         {
26050           if (GET_CODE (XEXP (x, 0)) == PLUS
26051               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
26052               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
26053               && CONSTANT_P (XEXP (x, 1)))
26054             {
26055               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
26056               if (val == 2 || val == 4 || val == 8)
26057                 {
26058                   *total = cost->lea;
26059                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26060                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
26061                                       outer_code, speed);
26062                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26063                   return true;
26064                 }
26065             }
26066           else if (GET_CODE (XEXP (x, 0)) == MULT
26067                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
26068             {
26069               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
26070               if (val == 2 || val == 4 || val == 8)
26071                 {
26072                   *total = cost->lea;
26073                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26074                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26075                   return true;
26076                 }
26077             }
26078           else if (GET_CODE (XEXP (x, 0)) == PLUS)
26079             {
26080               *total = cost->lea;
26081               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26082               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26083               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26084               return true;
26085             }
26086         }
26087       /* FALLTHRU */
26088
26089     case MINUS:
26090       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26091         {
26092           /* ??? SSE cost should be used here.  */
26093           *total = cost->fadd;
26094           return false;
26095         }
26096       else if (X87_FLOAT_MODE_P (mode))
26097         {
26098           *total = cost->fadd;
26099           return false;
26100         }
26101       else if (FLOAT_MODE_P (mode))
26102         {
26103           /* ??? SSE vector cost should be used here.  */
26104           *total = cost->fadd;
26105           return false;
26106         }
26107       /* FALLTHRU */
26108
26109     case AND:
26110     case IOR:
26111     case XOR:
26112       if (!TARGET_64BIT && mode == DImode)
26113         {
26114           *total = (cost->add * 2
26115                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
26116                        << (GET_MODE (XEXP (x, 0)) != DImode))
26117                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
26118                        << (GET_MODE (XEXP (x, 1)) != DImode)));
26119           return true;
26120         }
26121       /* FALLTHRU */
26122
26123     case NEG:
26124       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26125         {
26126           /* ??? SSE cost should be used here.  */
26127           *total = cost->fchs;
26128           return false;
26129         }
26130       else if (X87_FLOAT_MODE_P (mode))
26131         {
26132           *total = cost->fchs;
26133           return false;
26134         }
26135       else if (FLOAT_MODE_P (mode))
26136         {
26137           /* ??? SSE vector cost should be used here.  */
26138           *total = cost->fchs;
26139           return false;
26140         }
26141       /* FALLTHRU */
26142
26143     case NOT:
26144       if (!TARGET_64BIT && mode == DImode)
26145         *total = cost->add * 2;
26146       else
26147         *total = cost->add;
26148       return false;
26149
26150     case COMPARE:
26151       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
26152           && XEXP (XEXP (x, 0), 1) == const1_rtx
26153           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
26154           && XEXP (x, 1) == const0_rtx)
26155         {
26156           /* This kind of construct is implemented using test[bwl].
26157              Treat it as if we had an AND.  */
26158           *total = (cost->add
26159                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
26160                     + rtx_cost (const1_rtx, outer_code, speed));
26161           return true;
26162         }
26163       return false;
26164
26165     case FLOAT_EXTEND:
26166       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
26167         *total = 0;
26168       return false;
26169
26170     case ABS:
26171       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26172         /* ??? SSE cost should be used here.  */
26173         *total = cost->fabs;
26174       else if (X87_FLOAT_MODE_P (mode))
26175         *total = cost->fabs;
26176       else if (FLOAT_MODE_P (mode))
26177         /* ??? SSE vector cost should be used here.  */
26178         *total = cost->fabs;
26179       return false;
26180
26181     case SQRT:
26182       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26183         /* ??? SSE cost should be used here.  */
26184         *total = cost->fsqrt;
26185       else if (X87_FLOAT_MODE_P (mode))
26186         *total = cost->fsqrt;
26187       else if (FLOAT_MODE_P (mode))
26188         /* ??? SSE vector cost should be used here.  */
26189         *total = cost->fsqrt;
26190       return false;
26191
26192     case UNSPEC:
26193       if (XINT (x, 1) == UNSPEC_TP)
26194         *total = 0;
26195       return false;
26196
26197     default:
26198       return false;
26199     }
26200 }
26201
26202 #if TARGET_MACHO
26203
26204 static int current_machopic_label_num;
26205
26206 /* Given a symbol name and its associated stub, write out the
26207    definition of the stub.  */
26208
26209 void
26210 machopic_output_stub (FILE *file, const char *symb, const char *stub)
26211 {
26212   unsigned int length;
26213   char *binder_name, *symbol_name, lazy_ptr_name[32];
26214   int label = ++current_machopic_label_num;
26215
26216   /* For 64-bit we shouldn't get here.  */
26217   gcc_assert (!TARGET_64BIT);
26218
26219   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
26220   symb = (*targetm.strip_name_encoding) (symb);
26221
26222   length = strlen (stub);
26223   binder_name = XALLOCAVEC (char, length + 32);
26224   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
26225
26226   length = strlen (symb);
26227   symbol_name = XALLOCAVEC (char, length + 32);
26228   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
26229
26230   sprintf (lazy_ptr_name, "L%d$lz", label);
26231
26232   if (MACHOPIC_PURE)
26233     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
26234   else
26235     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
26236
26237   fprintf (file, "%s:\n", stub);
26238   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26239
26240   if (MACHOPIC_PURE)
26241     {
26242       fprintf (file, "\tcall\tLPC$%d\nLPC$%d:\tpopl\t%%eax\n", label, label);
26243       fprintf (file, "\tmovl\t%s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
26244       fprintf (file, "\tjmp\t*%%edx\n");
26245     }
26246   else
26247     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
26248
26249   fprintf (file, "%s:\n", binder_name);
26250
26251   if (MACHOPIC_PURE)
26252     {
26253       fprintf (file, "\tlea\t%s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
26254       fprintf (file, "\tpushl\t%%eax\n");
26255     }
26256   else
26257     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
26258
26259   fprintf (file, "\tjmp\tdyld_stub_binding_helper\n");
26260
26261   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
26262   fprintf (file, "%s:\n", lazy_ptr_name);
26263   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26264   fprintf (file, "\t.long %s\n", binder_name);
26265 }
26266
26267 void
26268 darwin_x86_file_end (void)
26269 {
26270   darwin_file_end ();
26271   ix86_file_end ();
26272 }
26273 #endif /* TARGET_MACHO */
26274
26275 /* Order the registers for register allocator.  */
26276
26277 void
26278 x86_order_regs_for_local_alloc (void)
26279 {
26280    int pos = 0;
26281    int i;
26282
26283    /* First allocate the local general purpose registers.  */
26284    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26285      if (GENERAL_REGNO_P (i) && call_used_regs[i])
26286         reg_alloc_order [pos++] = i;
26287
26288    /* Global general purpose registers.  */
26289    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26290      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
26291         reg_alloc_order [pos++] = i;
26292
26293    /* x87 registers come first in case we are doing FP math
26294       using them.  */
26295    if (!TARGET_SSE_MATH)
26296      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26297        reg_alloc_order [pos++] = i;
26298
26299    /* SSE registers.  */
26300    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
26301      reg_alloc_order [pos++] = i;
26302    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
26303      reg_alloc_order [pos++] = i;
26304
26305    /* x87 registers.  */
26306    if (TARGET_SSE_MATH)
26307      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26308        reg_alloc_order [pos++] = i;
26309
26310    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
26311      reg_alloc_order [pos++] = i;
26312
26313    /* Initialize the rest of array as we do not allocate some registers
26314       at all.  */
26315    while (pos < FIRST_PSEUDO_REGISTER)
26316      reg_alloc_order [pos++] = 0;
26317 }
26318
26319 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
26320    struct attribute_spec.handler.  */
26321 static tree
26322 ix86_handle_abi_attribute (tree *node, tree name,
26323                               tree args ATTRIBUTE_UNUSED,
26324                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26325 {
26326   if (TREE_CODE (*node) != FUNCTION_TYPE
26327       && TREE_CODE (*node) != METHOD_TYPE
26328       && TREE_CODE (*node) != FIELD_DECL
26329       && TREE_CODE (*node) != TYPE_DECL)
26330     {
26331       warning (OPT_Wattributes, "%qs attribute only applies to functions",
26332                IDENTIFIER_POINTER (name));
26333       *no_add_attrs = true;
26334       return NULL_TREE;
26335     }
26336   if (!TARGET_64BIT)
26337     {
26338       warning (OPT_Wattributes, "%qs attribute only available for 64-bit",
26339                IDENTIFIER_POINTER (name));
26340       *no_add_attrs = true;
26341       return NULL_TREE;
26342     }
26343
26344   /* Can combine regparm with all attributes but fastcall.  */
26345   if (is_attribute_p ("ms_abi", name))
26346     {
26347       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
26348         {
26349           error ("ms_abi and sysv_abi attributes are not compatible");
26350         }
26351
26352       return NULL_TREE;
26353     }
26354   else if (is_attribute_p ("sysv_abi", name))
26355     {
26356       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
26357         {
26358           error ("ms_abi and sysv_abi attributes are not compatible");
26359         }
26360
26361       return NULL_TREE;
26362     }
26363
26364   return NULL_TREE;
26365 }
26366
26367 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
26368    struct attribute_spec.handler.  */
26369 static tree
26370 ix86_handle_struct_attribute (tree *node, tree name,
26371                               tree args ATTRIBUTE_UNUSED,
26372                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26373 {
26374   tree *type = NULL;
26375   if (DECL_P (*node))
26376     {
26377       if (TREE_CODE (*node) == TYPE_DECL)
26378         type = &TREE_TYPE (*node);
26379     }
26380   else
26381     type = node;
26382
26383   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
26384                  || TREE_CODE (*type) == UNION_TYPE)))
26385     {
26386       warning (OPT_Wattributes, "%qs attribute ignored",
26387                IDENTIFIER_POINTER (name));
26388       *no_add_attrs = true;
26389     }
26390
26391   else if ((is_attribute_p ("ms_struct", name)
26392             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
26393            || ((is_attribute_p ("gcc_struct", name)
26394                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
26395     {
26396       warning (OPT_Wattributes, "%qs incompatible attribute ignored",
26397                IDENTIFIER_POINTER (name));
26398       *no_add_attrs = true;
26399     }
26400
26401   return NULL_TREE;
26402 }
26403
26404 static bool
26405 ix86_ms_bitfield_layout_p (const_tree record_type)
26406 {
26407   return (TARGET_MS_BITFIELD_LAYOUT &&
26408           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
26409     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
26410 }
26411
26412 /* Returns an expression indicating where the this parameter is
26413    located on entry to the FUNCTION.  */
26414
26415 static rtx
26416 x86_this_parameter (tree function)
26417 {
26418   tree type = TREE_TYPE (function);
26419   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
26420   int nregs;
26421
26422   if (TARGET_64BIT)
26423     {
26424       const int *parm_regs;
26425
26426       if (ix86_function_type_abi (type) == MS_ABI)
26427         parm_regs = x86_64_ms_abi_int_parameter_registers;
26428       else
26429         parm_regs = x86_64_int_parameter_registers;
26430       return gen_rtx_REG (DImode, parm_regs[aggr]);
26431     }
26432
26433   nregs = ix86_function_regparm (type, function);
26434
26435   if (nregs > 0 && !stdarg_p (type))
26436     {
26437       int regno;
26438
26439       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
26440         regno = aggr ? DX_REG : CX_REG;
26441       else
26442         {
26443           regno = AX_REG;
26444           if (aggr)
26445             {
26446               regno = DX_REG;
26447               if (nregs == 1)
26448                 return gen_rtx_MEM (SImode,
26449                                     plus_constant (stack_pointer_rtx, 4));
26450             }
26451         }
26452       return gen_rtx_REG (SImode, regno);
26453     }
26454
26455   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
26456 }
26457
26458 /* Determine whether x86_output_mi_thunk can succeed.  */
26459
26460 static bool
26461 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
26462                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
26463                          HOST_WIDE_INT vcall_offset, const_tree function)
26464 {
26465   /* 64-bit can handle anything.  */
26466   if (TARGET_64BIT)
26467     return true;
26468
26469   /* For 32-bit, everything's fine if we have one free register.  */
26470   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
26471     return true;
26472
26473   /* Need a free register for vcall_offset.  */
26474   if (vcall_offset)
26475     return false;
26476
26477   /* Need a free register for GOT references.  */
26478   if (flag_pic && !(*targetm.binds_local_p) (function))
26479     return false;
26480
26481   /* Otherwise ok.  */
26482   return true;
26483 }
26484
26485 /* Output the assembler code for a thunk function.  THUNK_DECL is the
26486    declaration for the thunk function itself, FUNCTION is the decl for
26487    the target function.  DELTA is an immediate constant offset to be
26488    added to THIS.  If VCALL_OFFSET is nonzero, the word at
26489    *(*this + vcall_offset) should be added to THIS.  */
26490
26491 static void
26492 x86_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
26493                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
26494                      HOST_WIDE_INT vcall_offset, tree function)
26495 {
26496   rtx xops[3];
26497   rtx this_param = x86_this_parameter (function);
26498   rtx this_reg, tmp;
26499
26500   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
26501      pull it in now and let DELTA benefit.  */
26502   if (REG_P (this_param))
26503     this_reg = this_param;
26504   else if (vcall_offset)
26505     {
26506       /* Put the this parameter into %eax.  */
26507       xops[0] = this_param;
26508       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
26509       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26510     }
26511   else
26512     this_reg = NULL_RTX;
26513
26514   /* Adjust the this parameter by a fixed constant.  */
26515   if (delta)
26516     {
26517       xops[0] = GEN_INT (delta);
26518       xops[1] = this_reg ? this_reg : this_param;
26519       if (TARGET_64BIT)
26520         {
26521           if (!x86_64_general_operand (xops[0], DImode))
26522             {
26523               tmp = gen_rtx_REG (DImode, R10_REG);
26524               xops[1] = tmp;
26525               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
26526               xops[0] = tmp;
26527               xops[1] = this_param;
26528             }
26529           output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
26530         }
26531       else
26532         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
26533     }
26534
26535   /* Adjust the this parameter by a value stored in the vtable.  */
26536   if (vcall_offset)
26537     {
26538       if (TARGET_64BIT)
26539         tmp = gen_rtx_REG (DImode, R10_REG);
26540       else
26541         {
26542           int tmp_regno = CX_REG;
26543           if (lookup_attribute ("fastcall",
26544                                 TYPE_ATTRIBUTES (TREE_TYPE (function))))
26545             tmp_regno = AX_REG;
26546           tmp = gen_rtx_REG (SImode, tmp_regno);
26547         }
26548
26549       xops[0] = gen_rtx_MEM (Pmode, this_reg);
26550       xops[1] = tmp;
26551       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26552
26553       /* Adjust the this parameter.  */
26554       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
26555       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
26556         {
26557           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
26558           xops[0] = GEN_INT (vcall_offset);
26559           xops[1] = tmp2;
26560           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
26561           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
26562         }
26563       xops[1] = this_reg;
26564       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
26565     }
26566
26567   /* If necessary, drop THIS back to its stack slot.  */
26568   if (this_reg && this_reg != this_param)
26569     {
26570       xops[0] = this_reg;
26571       xops[1] = this_param;
26572       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26573     }
26574
26575   xops[0] = XEXP (DECL_RTL (function), 0);
26576   if (TARGET_64BIT)
26577     {
26578       if (!flag_pic || (*targetm.binds_local_p) (function))
26579         output_asm_insn ("jmp\t%P0", xops);
26580       /* All thunks should be in the same object as their target,
26581          and thus binds_local_p should be true.  */
26582       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
26583         gcc_unreachable ();
26584       else
26585         {
26586           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
26587           tmp = gen_rtx_CONST (Pmode, tmp);
26588           tmp = gen_rtx_MEM (QImode, tmp);
26589           xops[0] = tmp;
26590           output_asm_insn ("jmp\t%A0", xops);
26591         }
26592     }
26593   else
26594     {
26595       if (!flag_pic || (*targetm.binds_local_p) (function))
26596         output_asm_insn ("jmp\t%P0", xops);
26597       else
26598 #if TARGET_MACHO
26599         if (TARGET_MACHO)
26600           {
26601             rtx sym_ref = XEXP (DECL_RTL (function), 0);
26602             tmp = (gen_rtx_SYMBOL_REF
26603                    (Pmode,
26604                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
26605             tmp = gen_rtx_MEM (QImode, tmp);
26606             xops[0] = tmp;
26607             output_asm_insn ("jmp\t%0", xops);
26608           }
26609         else
26610 #endif /* TARGET_MACHO */
26611         {
26612           tmp = gen_rtx_REG (SImode, CX_REG);
26613           output_set_got (tmp, NULL_RTX);
26614
26615           xops[1] = tmp;
26616           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
26617           output_asm_insn ("jmp\t{*}%1", xops);
26618         }
26619     }
26620 }
26621
26622 static void
26623 x86_file_start (void)
26624 {
26625   default_file_start ();
26626 #if TARGET_MACHO
26627   darwin_file_start ();
26628 #endif
26629   if (X86_FILE_START_VERSION_DIRECTIVE)
26630     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
26631   if (X86_FILE_START_FLTUSED)
26632     fputs ("\t.global\t__fltused\n", asm_out_file);
26633   if (ix86_asm_dialect == ASM_INTEL)
26634     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
26635 }
26636
26637 int
26638 x86_field_alignment (tree field, int computed)
26639 {
26640   enum machine_mode mode;
26641   tree type = TREE_TYPE (field);
26642
26643   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
26644     return computed;
26645   mode = TYPE_MODE (strip_array_types (type));
26646   if (mode == DFmode || mode == DCmode
26647       || GET_MODE_CLASS (mode) == MODE_INT
26648       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
26649     return MIN (32, computed);
26650   return computed;
26651 }
26652
26653 /* Output assembler code to FILE to increment profiler label # LABELNO
26654    for profiling a function entry.  */
26655 void
26656 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
26657 {
26658   if (TARGET_64BIT)
26659     {
26660 #ifndef NO_PROFILE_COUNTERS
26661       fprintf (file, "\tleaq\t%sP%d@(%%rip),%%r11\n", LPREFIX, labelno);
26662 #endif
26663
26664       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
26665         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", MCOUNT_NAME);
26666       else
26667         fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
26668     }
26669   else if (flag_pic)
26670     {
26671 #ifndef NO_PROFILE_COUNTERS
26672       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%%s\n",
26673                LPREFIX, labelno, PROFILE_COUNT_REGISTER);
26674 #endif
26675       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", MCOUNT_NAME);
26676     }
26677   else
26678     {
26679 #ifndef NO_PROFILE_COUNTERS
26680       fprintf (file, "\tmovl\t$%sP%d,%%%s\n", LPREFIX, labelno,
26681                PROFILE_COUNT_REGISTER);
26682 #endif
26683       fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
26684     }
26685 }
26686
26687 /* We don't have exact information about the insn sizes, but we may assume
26688    quite safely that we are informed about all 1 byte insns and memory
26689    address sizes.  This is enough to eliminate unnecessary padding in
26690    99% of cases.  */
26691
26692 static int
26693 min_insn_size (rtx insn)
26694 {
26695   int l = 0;
26696
26697   if (!INSN_P (insn) || !active_insn_p (insn))
26698     return 0;
26699
26700   /* Discard alignments we've emit and jump instructions.  */
26701   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
26702       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
26703     return 0;
26704   if (JUMP_P (insn)
26705       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
26706           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
26707     return 0;
26708
26709   /* Important case - calls are always 5 bytes.
26710      It is common to have many calls in the row.  */
26711   if (CALL_P (insn)
26712       && symbolic_reference_mentioned_p (PATTERN (insn))
26713       && !SIBLING_CALL_P (insn))
26714     return 5;
26715   if (get_attr_length (insn) <= 1)
26716     return 1;
26717
26718   /* For normal instructions we may rely on the sizes of addresses
26719      and the presence of symbol to require 4 bytes of encoding.
26720      This is not the case for jumps where references are PC relative.  */
26721   if (!JUMP_P (insn))
26722     {
26723       l = get_attr_length_address (insn);
26724       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
26725         l = 4;
26726     }
26727   if (l)
26728     return 1+l;
26729   else
26730     return 2;
26731 }
26732
26733 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
26734    window.  */
26735
26736 static void
26737 ix86_avoid_jump_misspredicts (void)
26738 {
26739   rtx insn, start = get_insns ();
26740   int nbytes = 0, njumps = 0;
26741   int isjump = 0;
26742
26743   /* Look for all minimal intervals of instructions containing 4 jumps.
26744      The intervals are bounded by START and INSN.  NBYTES is the total
26745      size of instructions in the interval including INSN and not including
26746      START.  When the NBYTES is smaller than 16 bytes, it is possible
26747      that the end of START and INSN ends up in the same 16byte page.
26748
26749      The smallest offset in the page INSN can start is the case where START
26750      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
26751      We add p2align to 16byte window with maxskip 17 - NBYTES + sizeof (INSN).
26752      */
26753   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
26754     {
26755
26756       nbytes += min_insn_size (insn);
26757       if (dump_file)
26758         fprintf(dump_file, "Insn %i estimated to %i bytes\n",
26759                 INSN_UID (insn), min_insn_size (insn));
26760       if ((JUMP_P (insn)
26761            && GET_CODE (PATTERN (insn)) != ADDR_VEC
26762            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
26763           || CALL_P (insn))
26764         njumps++;
26765       else
26766         continue;
26767
26768       while (njumps > 3)
26769         {
26770           start = NEXT_INSN (start);
26771           if ((JUMP_P (start)
26772                && GET_CODE (PATTERN (start)) != ADDR_VEC
26773                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
26774               || CALL_P (start))
26775             njumps--, isjump = 1;
26776           else
26777             isjump = 0;
26778           nbytes -= min_insn_size (start);
26779         }
26780       gcc_assert (njumps >= 0);
26781       if (dump_file)
26782         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
26783                 INSN_UID (start), INSN_UID (insn), nbytes);
26784
26785       if (njumps == 3 && isjump && nbytes < 16)
26786         {
26787           int padsize = 15 - nbytes + min_insn_size (insn);
26788
26789           if (dump_file)
26790             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
26791                      INSN_UID (insn), padsize);
26792           emit_insn_before (gen_align (GEN_INT (padsize)), insn);
26793         }
26794     }
26795 }
26796
26797 /* AMD Athlon works faster
26798    when RET is not destination of conditional jump or directly preceded
26799    by other jump instruction.  We avoid the penalty by inserting NOP just
26800    before the RET instructions in such cases.  */
26801 static void
26802 ix86_pad_returns (void)
26803 {
26804   edge e;
26805   edge_iterator ei;
26806
26807   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
26808     {
26809       basic_block bb = e->src;
26810       rtx ret = BB_END (bb);
26811       rtx prev;
26812       bool replace = false;
26813
26814       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
26815           || optimize_bb_for_size_p (bb))
26816         continue;
26817       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
26818         if (active_insn_p (prev) || LABEL_P (prev))
26819           break;
26820       if (prev && LABEL_P (prev))
26821         {
26822           edge e;
26823           edge_iterator ei;
26824
26825           FOR_EACH_EDGE (e, ei, bb->preds)
26826             if (EDGE_FREQUENCY (e) && e->src->index >= 0
26827                 && !(e->flags & EDGE_FALLTHRU))
26828               replace = true;
26829         }
26830       if (!replace)
26831         {
26832           prev = prev_active_insn (ret);
26833           if (prev
26834               && ((JUMP_P (prev) && any_condjump_p (prev))
26835                   || CALL_P (prev)))
26836             replace = true;
26837           /* Empty functions get branch mispredict even when the jump destination
26838              is not visible to us.  */
26839           if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
26840             replace = true;
26841         }
26842       if (replace)
26843         {
26844           emit_insn_before (gen_return_internal_long (), ret);
26845           delete_insn (ret);
26846         }
26847     }
26848 }
26849
26850 /* Implement machine specific optimizations.  We implement padding of returns
26851    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
26852 static void
26853 ix86_reorg (void)
26854 {
26855   if (TARGET_PAD_RETURNS && optimize
26856       && optimize_function_for_speed_p (cfun))
26857     ix86_pad_returns ();
26858   if (TARGET_FOUR_JUMP_LIMIT && optimize
26859       && optimize_function_for_speed_p (cfun))
26860     ix86_avoid_jump_misspredicts ();
26861 }
26862
26863 /* Return nonzero when QImode register that must be represented via REX prefix
26864    is used.  */
26865 bool
26866 x86_extended_QIreg_mentioned_p (rtx insn)
26867 {
26868   int i;
26869   extract_insn_cached (insn);
26870   for (i = 0; i < recog_data.n_operands; i++)
26871     if (REG_P (recog_data.operand[i])
26872         && REGNO (recog_data.operand[i]) >= 4)
26873        return true;
26874   return false;
26875 }
26876
26877 /* Return nonzero when P points to register encoded via REX prefix.
26878    Called via for_each_rtx.  */
26879 static int
26880 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
26881 {
26882    unsigned int regno;
26883    if (!REG_P (*p))
26884      return 0;
26885    regno = REGNO (*p);
26886    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
26887 }
26888
26889 /* Return true when INSN mentions register that must be encoded using REX
26890    prefix.  */
26891 bool
26892 x86_extended_reg_mentioned_p (rtx insn)
26893 {
26894   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
26895                        extended_reg_mentioned_1, NULL);
26896 }
26897
26898 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
26899    optabs would emit if we didn't have TFmode patterns.  */
26900
26901 void
26902 x86_emit_floatuns (rtx operands[2])
26903 {
26904   rtx neglab, donelab, i0, i1, f0, in, out;
26905   enum machine_mode mode, inmode;
26906
26907   inmode = GET_MODE (operands[1]);
26908   gcc_assert (inmode == SImode || inmode == DImode);
26909
26910   out = operands[0];
26911   in = force_reg (inmode, operands[1]);
26912   mode = GET_MODE (out);
26913   neglab = gen_label_rtx ();
26914   donelab = gen_label_rtx ();
26915   f0 = gen_reg_rtx (mode);
26916
26917   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
26918
26919   expand_float (out, in, 0);
26920
26921   emit_jump_insn (gen_jump (donelab));
26922   emit_barrier ();
26923
26924   emit_label (neglab);
26925
26926   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
26927                             1, OPTAB_DIRECT);
26928   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
26929                             1, OPTAB_DIRECT);
26930   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
26931
26932   expand_float (f0, i0, 0);
26933
26934   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
26935
26936   emit_label (donelab);
26937 }
26938 \f
26939 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
26940    with all elements equal to VAR.  Return true if successful.  */
26941
26942 static bool
26943 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
26944                                    rtx target, rtx val)
26945 {
26946   enum machine_mode hmode, smode, wsmode, wvmode;
26947   rtx x;
26948
26949   switch (mode)
26950     {
26951     case V2SImode:
26952     case V2SFmode:
26953       if (!mmx_ok)
26954         return false;
26955       /* FALLTHRU */
26956
26957     case V2DFmode:
26958     case V2DImode:
26959     case V4SFmode:
26960     case V4SImode:
26961       val = force_reg (GET_MODE_INNER (mode), val);
26962       x = gen_rtx_VEC_DUPLICATE (mode, val);
26963       emit_insn (gen_rtx_SET (VOIDmode, target, x));
26964       return true;
26965
26966     case V4HImode:
26967       if (!mmx_ok)
26968         return false;
26969       if (TARGET_SSE || TARGET_3DNOW_A)
26970         {
26971           val = gen_lowpart (SImode, val);
26972           x = gen_rtx_TRUNCATE (HImode, val);
26973           x = gen_rtx_VEC_DUPLICATE (mode, x);
26974           emit_insn (gen_rtx_SET (VOIDmode, target, x));
26975           return true;
26976         }
26977       else
26978         {
26979           smode = HImode;
26980           wsmode = SImode;
26981           wvmode = V2SImode;
26982           goto widen;
26983         }
26984
26985     case V8QImode:
26986       if (!mmx_ok)
26987         return false;
26988       smode = QImode;
26989       wsmode = HImode;
26990       wvmode = V4HImode;
26991       goto widen;
26992     case V8HImode:
26993       if (TARGET_SSE2)
26994         {
26995           rtx tmp1, tmp2;
26996           /* Extend HImode to SImode using a paradoxical SUBREG.  */
26997           tmp1 = gen_reg_rtx (SImode);
26998           emit_move_insn (tmp1, gen_lowpart (SImode, val));
26999           /* Insert the SImode value as low element of V4SImode vector. */
27000           tmp2 = gen_reg_rtx (V4SImode);
27001           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27002                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27003                                     CONST0_RTX (V4SImode),
27004                                     const1_rtx);
27005           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27006           /* Cast the V4SImode vector back to a V8HImode vector.  */
27007           tmp1 = gen_reg_rtx (V8HImode);
27008           emit_move_insn (tmp1, gen_lowpart (V8HImode, tmp2));
27009           /* Duplicate the low short through the whole low SImode word.  */
27010           emit_insn (gen_sse2_punpcklwd (tmp1, tmp1, tmp1));
27011           /* Cast the V8HImode vector back to a V4SImode vector.  */
27012           tmp2 = gen_reg_rtx (V4SImode);
27013           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27014           /* Replicate the low element of the V4SImode vector.  */
27015           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27016           /* Cast the V2SImode back to V8HImode, and store in target.  */
27017           emit_move_insn (target, gen_lowpart (V8HImode, tmp2));
27018           return true;
27019         }
27020       smode = HImode;
27021       wsmode = SImode;
27022       wvmode = V4SImode;
27023       goto widen;
27024     case V16QImode:
27025       if (TARGET_SSE2)
27026         {
27027           rtx tmp1, tmp2;
27028           /* Extend QImode to SImode using a paradoxical SUBREG.  */
27029           tmp1 = gen_reg_rtx (SImode);
27030           emit_move_insn (tmp1, gen_lowpart (SImode, val));
27031           /* Insert the SImode value as low element of V4SImode vector. */
27032           tmp2 = gen_reg_rtx (V4SImode);
27033           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27034                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27035                                     CONST0_RTX (V4SImode),
27036                                     const1_rtx);
27037           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27038           /* Cast the V4SImode vector back to a V16QImode vector.  */
27039           tmp1 = gen_reg_rtx (V16QImode);
27040           emit_move_insn (tmp1, gen_lowpart (V16QImode, tmp2));
27041           /* Duplicate the low byte through the whole low SImode word.  */
27042           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27043           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27044           /* Cast the V16QImode vector back to a V4SImode vector.  */
27045           tmp2 = gen_reg_rtx (V4SImode);
27046           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27047           /* Replicate the low element of the V4SImode vector.  */
27048           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27049           /* Cast the V2SImode back to V16QImode, and store in target.  */
27050           emit_move_insn (target, gen_lowpart (V16QImode, tmp2));
27051           return true;
27052         }
27053       smode = QImode;
27054       wsmode = HImode;
27055       wvmode = V8HImode;
27056       goto widen;
27057     widen:
27058       /* Replicate the value once into the next wider mode and recurse.  */
27059       val = convert_modes (wsmode, smode, val, true);
27060       x = expand_simple_binop (wsmode, ASHIFT, val,
27061                                GEN_INT (GET_MODE_BITSIZE (smode)),
27062                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
27063       val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
27064
27065       x = gen_reg_rtx (wvmode);
27066       if (!ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val))
27067         gcc_unreachable ();
27068       emit_move_insn (target, gen_lowpart (mode, x));
27069       return true;
27070
27071     case V4DFmode:
27072       hmode = V2DFmode;
27073       goto half;
27074     case V4DImode:
27075       hmode = V2DImode;
27076       goto half;
27077     case V8SFmode:
27078       hmode = V4SFmode;
27079       goto half;
27080     case V8SImode:
27081       hmode = V4SImode;
27082       goto half;
27083     case V16HImode:
27084       hmode = V8HImode;
27085       goto half;
27086     case V32QImode:
27087       hmode = V16QImode;
27088       goto half;
27089 half:
27090       {
27091         rtx tmp = gen_reg_rtx (hmode);
27092         ix86_expand_vector_init_duplicate (mmx_ok, hmode, tmp, val);
27093         emit_insn (gen_rtx_SET (VOIDmode, target,
27094                                 gen_rtx_VEC_CONCAT (mode, tmp, tmp)));
27095       }
27096       return true;
27097
27098     default:
27099       return false;
27100     }
27101 }
27102
27103 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27104    whose ONE_VAR element is VAR, and other elements are zero.  Return true
27105    if successful.  */
27106
27107 static bool
27108 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
27109                                      rtx target, rtx var, int one_var)
27110 {
27111   enum machine_mode vsimode;
27112   rtx new_target;
27113   rtx x, tmp;
27114   bool use_vector_set = false;
27115
27116   switch (mode)
27117     {
27118     case V2DImode:
27119       /* For SSE4.1, we normally use vector set.  But if the second
27120          element is zero and inter-unit moves are OK, we use movq
27121          instead.  */
27122       use_vector_set = (TARGET_64BIT
27123                         && TARGET_SSE4_1
27124                         && !(TARGET_INTER_UNIT_MOVES
27125                              && one_var == 0));
27126       break;
27127     case V16QImode:
27128     case V4SImode:
27129     case V4SFmode:
27130       use_vector_set = TARGET_SSE4_1;
27131       break;
27132     case V8HImode:
27133       use_vector_set = TARGET_SSE2;
27134       break;
27135     case V4HImode:
27136       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
27137       break;
27138     case V32QImode:
27139     case V16HImode:
27140     case V8SImode:
27141     case V8SFmode:
27142     case V4DFmode:
27143       use_vector_set = TARGET_AVX;
27144       break;
27145     case V4DImode:
27146       /* Use ix86_expand_vector_set in 64bit mode only.  */
27147       use_vector_set = TARGET_AVX && TARGET_64BIT;
27148       break;
27149     default:
27150       break;
27151     }
27152
27153   if (use_vector_set)
27154     {
27155       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
27156       var = force_reg (GET_MODE_INNER (mode), var);
27157       ix86_expand_vector_set (mmx_ok, target, var, one_var);
27158       return true; 
27159     }
27160
27161   switch (mode)
27162     {
27163     case V2SFmode:
27164     case V2SImode:
27165       if (!mmx_ok)
27166         return false;
27167       /* FALLTHRU */
27168
27169     case V2DFmode:
27170     case V2DImode:
27171       if (one_var != 0)
27172         return false;
27173       var = force_reg (GET_MODE_INNER (mode), var);
27174       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
27175       emit_insn (gen_rtx_SET (VOIDmode, target, x));
27176       return true;
27177
27178     case V4SFmode:
27179     case V4SImode:
27180       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
27181         new_target = gen_reg_rtx (mode);
27182       else
27183         new_target = target;
27184       var = force_reg (GET_MODE_INNER (mode), var);
27185       x = gen_rtx_VEC_DUPLICATE (mode, var);
27186       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
27187       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
27188       if (one_var != 0)
27189         {
27190           /* We need to shuffle the value to the correct position, so
27191              create a new pseudo to store the intermediate result.  */
27192
27193           /* With SSE2, we can use the integer shuffle insns.  */
27194           if (mode != V4SFmode && TARGET_SSE2)
27195             {
27196               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
27197                                             GEN_INT (1),
27198                                             GEN_INT (one_var == 1 ? 0 : 1),
27199                                             GEN_INT (one_var == 2 ? 0 : 1),
27200                                             GEN_INT (one_var == 3 ? 0 : 1)));
27201               if (target != new_target)
27202                 emit_move_insn (target, new_target);
27203               return true;
27204             }
27205
27206           /* Otherwise convert the intermediate result to V4SFmode and
27207              use the SSE1 shuffle instructions.  */
27208           if (mode != V4SFmode)
27209             {
27210               tmp = gen_reg_rtx (V4SFmode);
27211               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
27212             }
27213           else
27214             tmp = new_target;
27215
27216           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
27217                                        GEN_INT (1),
27218                                        GEN_INT (one_var == 1 ? 0 : 1),
27219                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
27220                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
27221
27222           if (mode != V4SFmode)
27223             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
27224           else if (tmp != target)
27225             emit_move_insn (target, tmp);
27226         }
27227       else if (target != new_target)
27228         emit_move_insn (target, new_target);
27229       return true;
27230
27231     case V8HImode:
27232     case V16QImode:
27233       vsimode = V4SImode;
27234       goto widen;
27235     case V4HImode:
27236     case V8QImode:
27237       if (!mmx_ok)
27238         return false;
27239       vsimode = V2SImode;
27240       goto widen;
27241     widen:
27242       if (one_var != 0)
27243         return false;
27244
27245       /* Zero extend the variable element to SImode and recurse.  */
27246       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
27247
27248       x = gen_reg_rtx (vsimode);
27249       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
27250                                                 var, one_var))
27251         gcc_unreachable ();
27252
27253       emit_move_insn (target, gen_lowpart (mode, x));
27254       return true;
27255
27256     default:
27257       return false;
27258     }
27259 }
27260
27261 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27262    consisting of the values in VALS.  It is known that all elements
27263    except ONE_VAR are constants.  Return true if successful.  */
27264
27265 static bool
27266 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
27267                                  rtx target, rtx vals, int one_var)
27268 {
27269   rtx var = XVECEXP (vals, 0, one_var);
27270   enum machine_mode wmode;
27271   rtx const_vec, x;
27272
27273   const_vec = copy_rtx (vals);
27274   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
27275   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
27276
27277   switch (mode)
27278     {
27279     case V2DFmode:
27280     case V2DImode:
27281     case V2SFmode:
27282     case V2SImode:
27283       /* For the two element vectors, it's just as easy to use
27284          the general case.  */
27285       return false;
27286
27287     case V4DImode:
27288       /* Use ix86_expand_vector_set in 64bit mode only.  */
27289       if (!TARGET_64BIT)
27290         return false;
27291     case V4DFmode:
27292     case V8SFmode:
27293     case V8SImode:
27294     case V16HImode:
27295     case V32QImode:
27296     case V4SFmode:
27297     case V4SImode:
27298     case V8HImode:
27299     case V4HImode:
27300       break;
27301
27302     case V16QImode:
27303       if (TARGET_SSE4_1)
27304         break;
27305       wmode = V8HImode;
27306       goto widen;
27307     case V8QImode:
27308       wmode = V4HImode;
27309       goto widen;
27310     widen:
27311       /* There's no way to set one QImode entry easily.  Combine
27312          the variable value with its adjacent constant value, and
27313          promote to an HImode set.  */
27314       x = XVECEXP (vals, 0, one_var ^ 1);
27315       if (one_var & 1)
27316         {
27317           var = convert_modes (HImode, QImode, var, true);
27318           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
27319                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
27320           x = GEN_INT (INTVAL (x) & 0xff);
27321         }
27322       else
27323         {
27324           var = convert_modes (HImode, QImode, var, true);
27325           x = gen_int_mode (INTVAL (x) << 8, HImode);
27326         }
27327       if (x != const0_rtx)
27328         var = expand_simple_binop (HImode, IOR, var, x, var,
27329                                    1, OPTAB_LIB_WIDEN);
27330
27331       x = gen_reg_rtx (wmode);
27332       emit_move_insn (x, gen_lowpart (wmode, const_vec));
27333       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
27334
27335       emit_move_insn (target, gen_lowpart (mode, x));
27336       return true;
27337
27338     default:
27339       return false;
27340     }
27341
27342   emit_move_insn (target, const_vec);
27343   ix86_expand_vector_set (mmx_ok, target, var, one_var);
27344   return true;
27345 }
27346
27347 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27348    concatenate to handle the most general case: all values variable,
27349    and none identical.  */
27350
27351 static void
27352 ix86_expand_vector_init_concat (enum machine_mode mode,
27353                                 rtx target, rtx *ops, int n)
27354 {
27355   enum machine_mode cmode, hmode = VOIDmode;
27356   rtx first[8], second[4];
27357   rtvec v;
27358   int i, j;
27359
27360   switch (n)
27361     {
27362     case 2:
27363       switch (mode)
27364         {
27365         case V8SImode:
27366           cmode = V4SImode;
27367           break;
27368         case V8SFmode:
27369           cmode = V4SFmode;
27370           break;
27371         case V4DImode:
27372           cmode = V2DImode;
27373           break;
27374         case V4DFmode:
27375           cmode = V2DFmode;
27376           break;
27377         case V4SImode:
27378           cmode = V2SImode;
27379           break;
27380         case V4SFmode:
27381           cmode = V2SFmode;
27382           break;
27383         case V2DImode:
27384           cmode = DImode;
27385           break;
27386         case V2SImode:
27387           cmode = SImode;
27388           break;
27389         case V2DFmode:
27390           cmode = DFmode;
27391           break;
27392         case V2SFmode:
27393           cmode = SFmode;
27394           break;
27395         default:
27396           gcc_unreachable ();
27397         }
27398
27399       if (!register_operand (ops[1], cmode))
27400         ops[1] = force_reg (cmode, ops[1]);
27401       if (!register_operand (ops[0], cmode))
27402         ops[0] = force_reg (cmode, ops[0]);
27403       emit_insn (gen_rtx_SET (VOIDmode, target,
27404                               gen_rtx_VEC_CONCAT (mode, ops[0],
27405                                                   ops[1])));
27406       break;
27407
27408     case 4:
27409       switch (mode)
27410         {
27411         case V4DImode:
27412           cmode = V2DImode;
27413           break;
27414         case V4DFmode:
27415           cmode = V2DFmode;
27416           break;
27417         case V4SImode:
27418           cmode = V2SImode;
27419           break;
27420         case V4SFmode:
27421           cmode = V2SFmode;
27422           break;
27423         default:
27424           gcc_unreachable ();
27425         }
27426       goto half;
27427
27428     case 8:
27429       switch (mode)
27430         {
27431         case V8SImode:
27432           cmode = V2SImode;
27433           hmode = V4SImode;
27434           break;
27435         case V8SFmode:
27436           cmode = V2SFmode;
27437           hmode = V4SFmode;
27438           break;
27439         default:
27440           gcc_unreachable ();
27441         }
27442       goto half;
27443
27444 half:
27445       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
27446       i = n - 1;
27447       j = (n >> 1) - 1;
27448       for (; i > 0; i -= 2, j--)
27449         {
27450           first[j] = gen_reg_rtx (cmode);
27451           v = gen_rtvec (2, ops[i - 1], ops[i]);
27452           ix86_expand_vector_init (false, first[j],
27453                                    gen_rtx_PARALLEL (cmode, v));
27454         }
27455
27456       n >>= 1;
27457       if (n > 2)
27458         {
27459           gcc_assert (hmode != VOIDmode);
27460           for (i = j = 0; i < n; i += 2, j++)
27461             {
27462               second[j] = gen_reg_rtx (hmode);
27463               ix86_expand_vector_init_concat (hmode, second [j],
27464                                               &first [i], 2);
27465             }
27466           n >>= 1;
27467           ix86_expand_vector_init_concat (mode, target, second, n);
27468         }
27469       else
27470         ix86_expand_vector_init_concat (mode, target, first, n);
27471       break;
27472
27473     default:
27474       gcc_unreachable ();
27475     }
27476 }
27477
27478 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27479    interleave to handle the most general case: all values variable,
27480    and none identical.  */
27481
27482 static void
27483 ix86_expand_vector_init_interleave (enum machine_mode mode,
27484                                     rtx target, rtx *ops, int n)
27485 {
27486   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
27487   int i, j;
27488   rtx op0, op1;
27489   rtx (*gen_load_even) (rtx, rtx, rtx);
27490   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
27491   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
27492   
27493   switch (mode)
27494     {
27495     case V8HImode:
27496       gen_load_even = gen_vec_setv8hi;
27497       gen_interleave_first_low = gen_vec_interleave_lowv4si;
27498       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27499       inner_mode = HImode;
27500       first_imode = V4SImode;
27501       second_imode = V2DImode;
27502       third_imode = VOIDmode;
27503       break;
27504     case V16QImode:
27505       gen_load_even = gen_vec_setv16qi;
27506       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
27507       gen_interleave_second_low = gen_vec_interleave_lowv4si;
27508       inner_mode = QImode;
27509       first_imode = V8HImode;
27510       second_imode = V4SImode;
27511       third_imode = V2DImode;
27512       break;
27513     default:
27514       gcc_unreachable ();
27515     }
27516      
27517   for (i = 0; i < n; i++)
27518     {
27519       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
27520       op0 = gen_reg_rtx (SImode);
27521       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
27522
27523       /* Insert the SImode value as low element of V4SImode vector. */
27524       op1 = gen_reg_rtx (V4SImode);
27525       op0 = gen_rtx_VEC_MERGE (V4SImode,
27526                                gen_rtx_VEC_DUPLICATE (V4SImode,
27527                                                       op0),
27528                                CONST0_RTX (V4SImode),
27529                                const1_rtx);
27530       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
27531
27532       /* Cast the V4SImode vector back to a vector in orignal mode.  */
27533       op0 = gen_reg_rtx (mode);
27534       emit_move_insn (op0, gen_lowpart (mode, op1));
27535       
27536       /* Load even elements into the second positon.  */
27537       emit_insn ((*gen_load_even) (op0,
27538                                    force_reg (inner_mode,
27539                                               ops [i + i + 1]),
27540                                    const1_rtx));
27541
27542       /* Cast vector to FIRST_IMODE vector.  */
27543       ops[i] = gen_reg_rtx (first_imode);
27544       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
27545     }
27546
27547   /* Interleave low FIRST_IMODE vectors.  */
27548   for (i = j = 0; i < n; i += 2, j++)
27549     {
27550       op0 = gen_reg_rtx (first_imode);
27551       emit_insn ((*gen_interleave_first_low) (op0, ops[i], ops[i + 1]));
27552
27553       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
27554       ops[j] = gen_reg_rtx (second_imode);
27555       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
27556     }
27557
27558   /* Interleave low SECOND_IMODE vectors.  */
27559   switch (second_imode)
27560     {
27561     case V4SImode:
27562       for (i = j = 0; i < n / 2; i += 2, j++)
27563         {
27564           op0 = gen_reg_rtx (second_imode);
27565           emit_insn ((*gen_interleave_second_low) (op0, ops[i],
27566                                                    ops[i + 1]));
27567
27568           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
27569              vector.  */
27570           ops[j] = gen_reg_rtx (third_imode);
27571           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
27572         }
27573       second_imode = V2DImode;
27574       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27575       /* FALLTHRU */
27576
27577     case V2DImode:
27578       op0 = gen_reg_rtx (second_imode);
27579       emit_insn ((*gen_interleave_second_low) (op0, ops[0],
27580                                                ops[1]));
27581
27582       /* Cast the SECOND_IMODE vector back to a vector on original
27583          mode.  */
27584       emit_insn (gen_rtx_SET (VOIDmode, target,
27585                               gen_lowpart (mode, op0)));
27586       break;
27587
27588     default:
27589       gcc_unreachable ();
27590     }
27591 }
27592
27593 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
27594    all values variable, and none identical.  */
27595
27596 static void
27597 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
27598                                  rtx target, rtx vals)
27599 {
27600   rtx ops[32], op0, op1;
27601   enum machine_mode half_mode = VOIDmode;
27602   int n, i;
27603
27604   switch (mode)
27605     {
27606     case V2SFmode:
27607     case V2SImode:
27608       if (!mmx_ok && !TARGET_SSE)
27609         break;
27610       /* FALLTHRU */
27611
27612     case V8SFmode:
27613     case V8SImode:
27614     case V4DFmode:
27615     case V4DImode:
27616     case V4SFmode:
27617     case V4SImode:
27618     case V2DFmode:
27619     case V2DImode:
27620       n = GET_MODE_NUNITS (mode);
27621       for (i = 0; i < n; i++)
27622         ops[i] = XVECEXP (vals, 0, i);
27623       ix86_expand_vector_init_concat (mode, target, ops, n);
27624       return;
27625
27626     case V32QImode:
27627       half_mode = V16QImode;
27628       goto half;
27629
27630     case V16HImode:
27631       half_mode = V8HImode;
27632       goto half;
27633
27634 half:
27635       n = GET_MODE_NUNITS (mode);
27636       for (i = 0; i < n; i++)
27637         ops[i] = XVECEXP (vals, 0, i);
27638       op0 = gen_reg_rtx (half_mode);
27639       op1 = gen_reg_rtx (half_mode);
27640       ix86_expand_vector_init_interleave (half_mode, op0, ops,
27641                                           n >> 2);
27642       ix86_expand_vector_init_interleave (half_mode, op1,
27643                                           &ops [n >> 1], n >> 2);
27644       emit_insn (gen_rtx_SET (VOIDmode, target,
27645                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
27646       return;
27647
27648     case V16QImode:
27649       if (!TARGET_SSE4_1)
27650         break;
27651       /* FALLTHRU */
27652
27653     case V8HImode:
27654       if (!TARGET_SSE2)
27655         break;
27656
27657       /* Don't use ix86_expand_vector_init_interleave if we can't
27658          move from GPR to SSE register directly.  */ 
27659       if (!TARGET_INTER_UNIT_MOVES)
27660         break;
27661
27662       n = GET_MODE_NUNITS (mode);
27663       for (i = 0; i < n; i++)
27664         ops[i] = XVECEXP (vals, 0, i);
27665       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
27666       return;
27667
27668     case V4HImode:
27669     case V8QImode:
27670       break;
27671
27672     default:
27673       gcc_unreachable ();
27674     }
27675
27676     {
27677       int i, j, n_elts, n_words, n_elt_per_word;
27678       enum machine_mode inner_mode;
27679       rtx words[4], shift;
27680
27681       inner_mode = GET_MODE_INNER (mode);
27682       n_elts = GET_MODE_NUNITS (mode);
27683       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
27684       n_elt_per_word = n_elts / n_words;
27685       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
27686
27687       for (i = 0; i < n_words; ++i)
27688         {
27689           rtx word = NULL_RTX;
27690
27691           for (j = 0; j < n_elt_per_word; ++j)
27692             {
27693               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
27694               elt = convert_modes (word_mode, inner_mode, elt, true);
27695
27696               if (j == 0)
27697                 word = elt;
27698               else
27699                 {
27700                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
27701                                               word, 1, OPTAB_LIB_WIDEN);
27702                   word = expand_simple_binop (word_mode, IOR, word, elt,
27703                                               word, 1, OPTAB_LIB_WIDEN);
27704                 }
27705             }
27706
27707           words[i] = word;
27708         }
27709
27710       if (n_words == 1)
27711         emit_move_insn (target, gen_lowpart (mode, words[0]));
27712       else if (n_words == 2)
27713         {
27714           rtx tmp = gen_reg_rtx (mode);
27715           emit_clobber (tmp);
27716           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
27717           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
27718           emit_move_insn (target, tmp);
27719         }
27720       else if (n_words == 4)
27721         {
27722           rtx tmp = gen_reg_rtx (V4SImode);
27723           gcc_assert (word_mode == SImode);
27724           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
27725           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
27726           emit_move_insn (target, gen_lowpart (mode, tmp));
27727         }
27728       else
27729         gcc_unreachable ();
27730     }
27731 }
27732
27733 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
27734    instructions unless MMX_OK is true.  */
27735
27736 void
27737 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
27738 {
27739   enum machine_mode mode = GET_MODE (target);
27740   enum machine_mode inner_mode = GET_MODE_INNER (mode);
27741   int n_elts = GET_MODE_NUNITS (mode);
27742   int n_var = 0, one_var = -1;
27743   bool all_same = true, all_const_zero = true;
27744   int i;
27745   rtx x;
27746
27747   for (i = 0; i < n_elts; ++i)
27748     {
27749       x = XVECEXP (vals, 0, i);
27750       if (!(CONST_INT_P (x)
27751             || GET_CODE (x) == CONST_DOUBLE
27752             || GET_CODE (x) == CONST_FIXED))
27753         n_var++, one_var = i;
27754       else if (x != CONST0_RTX (inner_mode))
27755         all_const_zero = false;
27756       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
27757         all_same = false;
27758     }
27759
27760   /* Constants are best loaded from the constant pool.  */
27761   if (n_var == 0)
27762     {
27763       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
27764       return;
27765     }
27766
27767   /* If all values are identical, broadcast the value.  */
27768   if (all_same
27769       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
27770                                             XVECEXP (vals, 0, 0)))
27771     return;
27772
27773   /* Values where only one field is non-constant are best loaded from
27774      the pool and overwritten via move later.  */
27775   if (n_var == 1)
27776     {
27777       if (all_const_zero
27778           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
27779                                                   XVECEXP (vals, 0, one_var),
27780                                                   one_var))
27781         return;
27782
27783       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
27784         return;
27785     }
27786
27787   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
27788 }
27789
27790 void
27791 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
27792 {
27793   enum machine_mode mode = GET_MODE (target);
27794   enum machine_mode inner_mode = GET_MODE_INNER (mode);
27795   enum machine_mode half_mode;
27796   bool use_vec_merge = false;
27797   rtx tmp;
27798   static rtx (*gen_extract[6][2]) (rtx, rtx)
27799     = {
27800         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
27801         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
27802         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
27803         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
27804         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
27805         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
27806       };
27807   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
27808     = {
27809         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
27810         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
27811         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
27812         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
27813         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
27814         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
27815       };
27816   int i, j, n;
27817
27818   switch (mode)
27819     {
27820     case V2SFmode:
27821     case V2SImode:
27822       if (mmx_ok)
27823         {
27824           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
27825           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
27826           if (elt == 0)
27827             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
27828           else
27829             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
27830           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27831           return;
27832         }
27833       break;
27834
27835     case V2DImode:
27836       use_vec_merge = TARGET_SSE4_1;
27837       if (use_vec_merge)
27838         break;
27839
27840     case V2DFmode:
27841       {
27842         rtx op0, op1;
27843
27844         /* For the two element vectors, we implement a VEC_CONCAT with
27845            the extraction of the other element.  */
27846
27847         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
27848         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
27849
27850         if (elt == 0)
27851           op0 = val, op1 = tmp;
27852         else
27853           op0 = tmp, op1 = val;
27854
27855         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
27856         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27857       }
27858       return;
27859
27860     case V4SFmode:
27861       use_vec_merge = TARGET_SSE4_1;
27862       if (use_vec_merge)
27863         break;
27864
27865       switch (elt)
27866         {
27867         case 0:
27868           use_vec_merge = true;
27869           break;
27870
27871         case 1:
27872           /* tmp = target = A B C D */
27873           tmp = copy_to_reg (target);
27874           /* target = A A B B */
27875           emit_insn (gen_sse_unpcklps (target, target, target));
27876           /* target = X A B B */
27877           ix86_expand_vector_set (false, target, val, 0);
27878           /* target = A X C D  */
27879           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27880                                        GEN_INT (1), GEN_INT (0),
27881                                        GEN_INT (2+4), GEN_INT (3+4)));
27882           return;
27883
27884         case 2:
27885           /* tmp = target = A B C D */
27886           tmp = copy_to_reg (target);
27887           /* tmp = X B C D */
27888           ix86_expand_vector_set (false, tmp, val, 0);
27889           /* target = A B X D */
27890           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27891                                        GEN_INT (0), GEN_INT (1),
27892                                        GEN_INT (0+4), GEN_INT (3+4)));
27893           return;
27894
27895         case 3:
27896           /* tmp = target = A B C D */
27897           tmp = copy_to_reg (target);
27898           /* tmp = X B C D */
27899           ix86_expand_vector_set (false, tmp, val, 0);
27900           /* target = A B X D */
27901           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27902                                        GEN_INT (0), GEN_INT (1),
27903                                        GEN_INT (2+4), GEN_INT (0+4)));
27904           return;
27905
27906         default:
27907           gcc_unreachable ();
27908         }
27909       break;
27910
27911     case V4SImode:
27912       use_vec_merge = TARGET_SSE4_1;
27913       if (use_vec_merge)
27914         break;
27915
27916       /* Element 0 handled by vec_merge below.  */
27917       if (elt == 0)
27918         {
27919           use_vec_merge = true;
27920           break;
27921         }
27922
27923       if (TARGET_SSE2)
27924         {
27925           /* With SSE2, use integer shuffles to swap element 0 and ELT,
27926              store into element 0, then shuffle them back.  */
27927
27928           rtx order[4];
27929
27930           order[0] = GEN_INT (elt);
27931           order[1] = const1_rtx;
27932           order[2] = const2_rtx;
27933           order[3] = GEN_INT (3);
27934           order[elt] = const0_rtx;
27935
27936           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
27937                                         order[1], order[2], order[3]));
27938
27939           ix86_expand_vector_set (false, target, val, 0);
27940
27941           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
27942                                         order[1], order[2], order[3]));
27943         }
27944       else
27945         {
27946           /* For SSE1, we have to reuse the V4SF code.  */
27947           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
27948                                   gen_lowpart (SFmode, val), elt);
27949         }
27950       return;
27951
27952     case V8HImode:
27953       use_vec_merge = TARGET_SSE2;
27954       break;
27955     case V4HImode:
27956       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
27957       break;
27958
27959     case V16QImode:
27960       use_vec_merge = TARGET_SSE4_1;
27961       break;
27962
27963     case V8QImode:
27964       break;
27965
27966     case V32QImode:
27967       half_mode = V16QImode;
27968       j = 0;
27969       n = 16;
27970       goto half;
27971
27972     case V16HImode:
27973       half_mode = V8HImode;
27974       j = 1;
27975       n = 8;
27976       goto half;
27977
27978     case V8SImode:
27979       half_mode = V4SImode;
27980       j = 2;
27981       n = 4;
27982       goto half;
27983
27984     case V4DImode:
27985       half_mode = V2DImode;
27986       j = 3;
27987       n = 2;
27988       goto half;
27989
27990     case V8SFmode:
27991       half_mode = V4SFmode;
27992       j = 4;
27993       n = 4;
27994       goto half;
27995
27996     case V4DFmode:
27997       half_mode = V2DFmode;
27998       j = 5;
27999       n = 2;
28000       goto half;
28001
28002 half:
28003       /* Compute offset.  */
28004       i = elt / n;
28005       elt %= n;
28006
28007       gcc_assert (i <= 1);
28008
28009       /* Extract the half.  */
28010       tmp = gen_reg_rtx (half_mode);
28011       emit_insn ((*gen_extract[j][i]) (tmp, target));
28012
28013       /* Put val in tmp at elt.  */
28014       ix86_expand_vector_set (false, tmp, val, elt);
28015
28016       /* Put it back.  */
28017       emit_insn ((*gen_insert[j][i]) (target, target, tmp));
28018       return;
28019
28020     default:
28021       break;
28022     }
28023
28024   if (use_vec_merge)
28025     {
28026       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
28027       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
28028       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28029     }
28030   else
28031     {
28032       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28033
28034       emit_move_insn (mem, target);
28035
28036       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28037       emit_move_insn (tmp, val);
28038
28039       emit_move_insn (target, mem);
28040     }
28041 }
28042
28043 void
28044 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
28045 {
28046   enum machine_mode mode = GET_MODE (vec);
28047   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28048   bool use_vec_extr = false;
28049   rtx tmp;
28050
28051   switch (mode)
28052     {
28053     case V2SImode:
28054     case V2SFmode:
28055       if (!mmx_ok)
28056         break;
28057       /* FALLTHRU */
28058
28059     case V2DFmode:
28060     case V2DImode:
28061       use_vec_extr = true;
28062       break;
28063
28064     case V4SFmode:
28065       use_vec_extr = TARGET_SSE4_1;
28066       if (use_vec_extr)
28067         break;
28068
28069       switch (elt)
28070         {
28071         case 0:
28072           tmp = vec;
28073           break;
28074
28075         case 1:
28076         case 3:
28077           tmp = gen_reg_rtx (mode);
28078           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
28079                                        GEN_INT (elt), GEN_INT (elt),
28080                                        GEN_INT (elt+4), GEN_INT (elt+4)));
28081           break;
28082
28083         case 2:
28084           tmp = gen_reg_rtx (mode);
28085           emit_insn (gen_sse_unpckhps (tmp, vec, vec));
28086           break;
28087
28088         default:
28089           gcc_unreachable ();
28090         }
28091       vec = tmp;
28092       use_vec_extr = true;
28093       elt = 0;
28094       break;
28095
28096     case V4SImode:
28097       use_vec_extr = TARGET_SSE4_1;
28098       if (use_vec_extr)
28099         break;
28100
28101       if (TARGET_SSE2)
28102         {
28103           switch (elt)
28104             {
28105             case 0:
28106               tmp = vec;
28107               break;
28108
28109             case 1:
28110             case 3:
28111               tmp = gen_reg_rtx (mode);
28112               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
28113                                             GEN_INT (elt), GEN_INT (elt),
28114                                             GEN_INT (elt), GEN_INT (elt)));
28115               break;
28116
28117             case 2:
28118               tmp = gen_reg_rtx (mode);
28119               emit_insn (gen_sse2_punpckhdq (tmp, vec, vec));
28120               break;
28121
28122             default:
28123               gcc_unreachable ();
28124             }
28125           vec = tmp;
28126           use_vec_extr = true;
28127           elt = 0;
28128         }
28129       else
28130         {
28131           /* For SSE1, we have to reuse the V4SF code.  */
28132           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
28133                                       gen_lowpart (V4SFmode, vec), elt);
28134           return;
28135         }
28136       break;
28137
28138     case V8HImode:
28139       use_vec_extr = TARGET_SSE2;
28140       break;
28141     case V4HImode:
28142       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
28143       break;
28144
28145     case V16QImode:
28146       use_vec_extr = TARGET_SSE4_1;
28147       break;
28148
28149     case V8QImode:
28150       /* ??? Could extract the appropriate HImode element and shift.  */
28151     default:
28152       break;
28153     }
28154
28155   if (use_vec_extr)
28156     {
28157       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
28158       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
28159
28160       /* Let the rtl optimizers know about the zero extension performed.  */
28161       if (inner_mode == QImode || inner_mode == HImode)
28162         {
28163           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
28164           target = gen_lowpart (SImode, target);
28165         }
28166
28167       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28168     }
28169   else
28170     {
28171       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28172
28173       emit_move_insn (mem, vec);
28174
28175       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28176       emit_move_insn (target, tmp);
28177     }
28178 }
28179
28180 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
28181    pattern to reduce; DEST is the destination; IN is the input vector.  */
28182
28183 void
28184 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
28185 {
28186   rtx tmp1, tmp2, tmp3;
28187
28188   tmp1 = gen_reg_rtx (V4SFmode);
28189   tmp2 = gen_reg_rtx (V4SFmode);
28190   tmp3 = gen_reg_rtx (V4SFmode);
28191
28192   emit_insn (gen_sse_movhlps (tmp1, in, in));
28193   emit_insn (fn (tmp2, tmp1, in));
28194
28195   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
28196                                GEN_INT (1), GEN_INT (1),
28197                                GEN_INT (1+4), GEN_INT (1+4)));
28198   emit_insn (fn (dest, tmp2, tmp3));
28199 }
28200 \f
28201 /* Target hook for scalar_mode_supported_p.  */
28202 static bool
28203 ix86_scalar_mode_supported_p (enum machine_mode mode)
28204 {
28205   if (DECIMAL_FLOAT_MODE_P (mode))
28206     return true;
28207   else if (mode == TFmode)
28208     return true;
28209   else
28210     return default_scalar_mode_supported_p (mode);
28211 }
28212
28213 /* Implements target hook vector_mode_supported_p.  */
28214 static bool
28215 ix86_vector_mode_supported_p (enum machine_mode mode)
28216 {
28217   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
28218     return true;
28219   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
28220     return true;
28221   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
28222     return true;
28223   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
28224     return true;
28225   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
28226     return true;
28227   return false;
28228 }
28229
28230 /* Target hook for c_mode_for_suffix.  */
28231 static enum machine_mode
28232 ix86_c_mode_for_suffix (char suffix)
28233 {
28234   if (suffix == 'q')
28235     return TFmode;
28236   if (suffix == 'w')
28237     return XFmode;
28238
28239   return VOIDmode;
28240 }
28241
28242 /* Worker function for TARGET_MD_ASM_CLOBBERS.
28243
28244    We do this in the new i386 backend to maintain source compatibility
28245    with the old cc0-based compiler.  */
28246
28247 static tree
28248 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
28249                       tree inputs ATTRIBUTE_UNUSED,
28250                       tree clobbers)
28251 {
28252   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
28253                         clobbers);
28254   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
28255                         clobbers);
28256   return clobbers;
28257 }
28258
28259 /* Implements target vector targetm.asm.encode_section_info.  This
28260    is not used by netware.  */
28261
28262 static void ATTRIBUTE_UNUSED
28263 ix86_encode_section_info (tree decl, rtx rtl, int first)
28264 {
28265   default_encode_section_info (decl, rtl, first);
28266
28267   if (TREE_CODE (decl) == VAR_DECL
28268       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
28269       && ix86_in_large_data_p (decl))
28270     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
28271 }
28272
28273 /* Worker function for REVERSE_CONDITION.  */
28274
28275 enum rtx_code
28276 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
28277 {
28278   return (mode != CCFPmode && mode != CCFPUmode
28279           ? reverse_condition (code)
28280           : reverse_condition_maybe_unordered (code));
28281 }
28282
28283 /* Output code to perform an x87 FP register move, from OPERANDS[1]
28284    to OPERANDS[0].  */
28285
28286 const char *
28287 output_387_reg_move (rtx insn, rtx *operands)
28288 {
28289   if (REG_P (operands[0]))
28290     {
28291       if (REG_P (operands[1])
28292           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28293         {
28294           if (REGNO (operands[0]) == FIRST_STACK_REG)
28295             return output_387_ffreep (operands, 0);
28296           return "fstp\t%y0";
28297         }
28298       if (STACK_TOP_P (operands[0]))
28299         return "fld%z1\t%y1";
28300       return "fst\t%y0";
28301     }
28302   else if (MEM_P (operands[0]))
28303     {
28304       gcc_assert (REG_P (operands[1]));
28305       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28306         return "fstp%z0\t%y0";
28307       else
28308         {
28309           /* There is no non-popping store to memory for XFmode.
28310              So if we need one, follow the store with a load.  */
28311           if (GET_MODE (operands[0]) == XFmode)
28312             return "fstp%z0\t%y0\n\tfld%z0\t%y0";
28313           else
28314             return "fst%z0\t%y0";
28315         }
28316     }
28317   else
28318     gcc_unreachable();
28319 }
28320
28321 /* Output code to perform a conditional jump to LABEL, if C2 flag in
28322    FP status register is set.  */
28323
28324 void
28325 ix86_emit_fp_unordered_jump (rtx label)
28326 {
28327   rtx reg = gen_reg_rtx (HImode);
28328   rtx temp;
28329
28330   emit_insn (gen_x86_fnstsw_1 (reg));
28331
28332   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
28333     {
28334       emit_insn (gen_x86_sahf_1 (reg));
28335
28336       temp = gen_rtx_REG (CCmode, FLAGS_REG);
28337       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
28338     }
28339   else
28340     {
28341       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
28342
28343       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
28344       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
28345     }
28346
28347   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
28348                               gen_rtx_LABEL_REF (VOIDmode, label),
28349                               pc_rtx);
28350   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
28351
28352   emit_jump_insn (temp);
28353   predict_jump (REG_BR_PROB_BASE * 10 / 100);
28354 }
28355
28356 /* Output code to perform a log1p XFmode calculation.  */
28357
28358 void ix86_emit_i387_log1p (rtx op0, rtx op1)
28359 {
28360   rtx label1 = gen_label_rtx ();
28361   rtx label2 = gen_label_rtx ();
28362
28363   rtx tmp = gen_reg_rtx (XFmode);
28364   rtx tmp2 = gen_reg_rtx (XFmode);
28365
28366   emit_insn (gen_absxf2 (tmp, op1));
28367   emit_insn (gen_cmpxf (tmp,
28368     CONST_DOUBLE_FROM_REAL_VALUE (
28369        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
28370        XFmode)));
28371   emit_jump_insn (gen_bge (label1));
28372
28373   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28374   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
28375   emit_jump (label2);
28376
28377   emit_label (label1);
28378   emit_move_insn (tmp, CONST1_RTX (XFmode));
28379   emit_insn (gen_addxf3 (tmp, op1, tmp));
28380   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28381   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
28382
28383   emit_label (label2);
28384 }
28385
28386 /* Output code to perform a Newton-Rhapson approximation of a single precision
28387    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
28388
28389 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
28390 {
28391   rtx x0, x1, e0, e1, two;
28392
28393   x0 = gen_reg_rtx (mode);
28394   e0 = gen_reg_rtx (mode);
28395   e1 = gen_reg_rtx (mode);
28396   x1 = gen_reg_rtx (mode);
28397
28398   two = CONST_DOUBLE_FROM_REAL_VALUE (dconst2, SFmode);
28399
28400   if (VECTOR_MODE_P (mode))
28401     two = ix86_build_const_vector (SFmode, true, two);
28402
28403   two = force_reg (mode, two);
28404
28405   /* a / b = a * rcp(b) * (2.0 - b * rcp(b)) */
28406
28407   /* x0 = rcp(b) estimate */
28408   emit_insn (gen_rtx_SET (VOIDmode, x0,
28409                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
28410                                           UNSPEC_RCP)));
28411   /* e0 = x0 * b */
28412   emit_insn (gen_rtx_SET (VOIDmode, e0,
28413                           gen_rtx_MULT (mode, x0, b)));
28414   /* e1 = 2. - e0 */
28415   emit_insn (gen_rtx_SET (VOIDmode, e1,
28416                           gen_rtx_MINUS (mode, two, e0)));
28417   /* x1 = x0 * e1 */
28418   emit_insn (gen_rtx_SET (VOIDmode, x1,
28419                           gen_rtx_MULT (mode, x0, e1)));
28420   /* res = a * x1 */
28421   emit_insn (gen_rtx_SET (VOIDmode, res,
28422                           gen_rtx_MULT (mode, a, x1)));
28423 }
28424
28425 /* Output code to perform a Newton-Rhapson approximation of a
28426    single precision floating point [reciprocal] square root.  */
28427
28428 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
28429                          bool recip)
28430 {
28431   rtx x0, e0, e1, e2, e3, mthree, mhalf;
28432   REAL_VALUE_TYPE r;
28433
28434   x0 = gen_reg_rtx (mode);
28435   e0 = gen_reg_rtx (mode);
28436   e1 = gen_reg_rtx (mode);
28437   e2 = gen_reg_rtx (mode);
28438   e3 = gen_reg_rtx (mode);
28439
28440   real_from_integer (&r, VOIDmode, -3, -1, 0);
28441   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28442
28443   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
28444   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28445
28446   if (VECTOR_MODE_P (mode))
28447     {
28448       mthree = ix86_build_const_vector (SFmode, true, mthree);
28449       mhalf = ix86_build_const_vector (SFmode, true, mhalf);
28450     }
28451
28452   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
28453      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
28454
28455   /* x0 = rsqrt(a) estimate */
28456   emit_insn (gen_rtx_SET (VOIDmode, x0,
28457                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
28458                                           UNSPEC_RSQRT)));
28459
28460   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
28461   if (!recip)
28462     {
28463       rtx zero, mask;
28464
28465       zero = gen_reg_rtx (mode);
28466       mask = gen_reg_rtx (mode);
28467
28468       zero = force_reg (mode, CONST0_RTX(mode));
28469       emit_insn (gen_rtx_SET (VOIDmode, mask,
28470                               gen_rtx_NE (mode, zero, a)));
28471
28472       emit_insn (gen_rtx_SET (VOIDmode, x0,
28473                               gen_rtx_AND (mode, x0, mask)));
28474     }
28475
28476   /* e0 = x0 * a */
28477   emit_insn (gen_rtx_SET (VOIDmode, e0,
28478                           gen_rtx_MULT (mode, x0, a)));
28479   /* e1 = e0 * x0 */
28480   emit_insn (gen_rtx_SET (VOIDmode, e1,
28481                           gen_rtx_MULT (mode, e0, x0)));
28482
28483   /* e2 = e1 - 3. */
28484   mthree = force_reg (mode, mthree);
28485   emit_insn (gen_rtx_SET (VOIDmode, e2,
28486                           gen_rtx_PLUS (mode, e1, mthree)));
28487
28488   mhalf = force_reg (mode, mhalf);
28489   if (recip)
28490     /* e3 = -.5 * x0 */
28491     emit_insn (gen_rtx_SET (VOIDmode, e3,
28492                             gen_rtx_MULT (mode, x0, mhalf)));
28493   else
28494     /* e3 = -.5 * e0 */
28495     emit_insn (gen_rtx_SET (VOIDmode, e3,
28496                             gen_rtx_MULT (mode, e0, mhalf)));
28497   /* ret = e2 * e3 */
28498   emit_insn (gen_rtx_SET (VOIDmode, res,
28499                           gen_rtx_MULT (mode, e2, e3)));
28500 }
28501
28502 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
28503
28504 static void ATTRIBUTE_UNUSED
28505 i386_solaris_elf_named_section (const char *name, unsigned int flags,
28506                                 tree decl)
28507 {
28508   /* With Binutils 2.15, the "@unwind" marker must be specified on
28509      every occurrence of the ".eh_frame" section, not just the first
28510      one.  */
28511   if (TARGET_64BIT
28512       && strcmp (name, ".eh_frame") == 0)
28513     {
28514       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
28515                flags & SECTION_WRITE ? "aw" : "a");
28516       return;
28517     }
28518   default_elf_asm_named_section (name, flags, decl);
28519 }
28520
28521 /* Return the mangling of TYPE if it is an extended fundamental type.  */
28522
28523 static const char *
28524 ix86_mangle_type (const_tree type)
28525 {
28526   type = TYPE_MAIN_VARIANT (type);
28527
28528   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
28529       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
28530     return NULL;
28531
28532   switch (TYPE_MODE (type))
28533     {
28534     case TFmode:
28535       /* __float128 is "g".  */
28536       return "g";
28537     case XFmode:
28538       /* "long double" or __float80 is "e".  */
28539       return "e";
28540     default:
28541       return NULL;
28542     }
28543 }
28544
28545 /* For 32-bit code we can save PIC register setup by using
28546    __stack_chk_fail_local hidden function instead of calling
28547    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
28548    register, so it is better to call __stack_chk_fail directly.  */
28549
28550 static tree
28551 ix86_stack_protect_fail (void)
28552 {
28553   return TARGET_64BIT
28554          ? default_external_stack_protect_fail ()
28555          : default_hidden_stack_protect_fail ();
28556 }
28557
28558 /* Select a format to encode pointers in exception handling data.  CODE
28559    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
28560    true if the symbol may be affected by dynamic relocations.
28561
28562    ??? All x86 object file formats are capable of representing this.
28563    After all, the relocation needed is the same as for the call insn.
28564    Whether or not a particular assembler allows us to enter such, I
28565    guess we'll have to see.  */
28566 int
28567 asm_preferred_eh_data_format (int code, int global)
28568 {
28569   if (flag_pic)
28570     {
28571       int type = DW_EH_PE_sdata8;
28572       if (!TARGET_64BIT
28573           || ix86_cmodel == CM_SMALL_PIC
28574           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
28575         type = DW_EH_PE_sdata4;
28576       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
28577     }
28578   if (ix86_cmodel == CM_SMALL
28579       || (ix86_cmodel == CM_MEDIUM && code))
28580     return DW_EH_PE_udata4;
28581   return DW_EH_PE_absptr;
28582 }
28583 \f
28584 /* Expand copysign from SIGN to the positive value ABS_VALUE
28585    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
28586    the sign-bit.  */
28587 static void
28588 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
28589 {
28590   enum machine_mode mode = GET_MODE (sign);
28591   rtx sgn = gen_reg_rtx (mode);
28592   if (mask == NULL_RTX)
28593     {
28594       mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), false);
28595       if (!VECTOR_MODE_P (mode))
28596         {
28597           /* We need to generate a scalar mode mask in this case.  */
28598           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28599           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28600           mask = gen_reg_rtx (mode);
28601           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28602         }
28603     }
28604   else
28605     mask = gen_rtx_NOT (mode, mask);
28606   emit_insn (gen_rtx_SET (VOIDmode, sgn,
28607                           gen_rtx_AND (mode, mask, sign)));
28608   emit_insn (gen_rtx_SET (VOIDmode, result,
28609                           gen_rtx_IOR (mode, abs_value, sgn)));
28610 }
28611
28612 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
28613    mask for masking out the sign-bit is stored in *SMASK, if that is
28614    non-null.  */
28615 static rtx
28616 ix86_expand_sse_fabs (rtx op0, rtx *smask)
28617 {
28618   enum machine_mode mode = GET_MODE (op0);
28619   rtx xa, mask;
28620
28621   xa = gen_reg_rtx (mode);
28622   mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), true);
28623   if (!VECTOR_MODE_P (mode))
28624     {
28625       /* We need to generate a scalar mode mask in this case.  */
28626       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28627       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28628       mask = gen_reg_rtx (mode);
28629       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28630     }
28631   emit_insn (gen_rtx_SET (VOIDmode, xa,
28632                           gen_rtx_AND (mode, op0, mask)));
28633
28634   if (smask)
28635     *smask = mask;
28636
28637   return xa;
28638 }
28639
28640 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
28641    swapping the operands if SWAP_OPERANDS is true.  The expanded
28642    code is a forward jump to a newly created label in case the
28643    comparison is true.  The generated label rtx is returned.  */
28644 static rtx
28645 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
28646                                   bool swap_operands)
28647 {
28648   rtx label, tmp;
28649
28650   if (swap_operands)
28651     {
28652       tmp = op0;
28653       op0 = op1;
28654       op1 = tmp;
28655     }
28656
28657   label = gen_label_rtx ();
28658   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
28659   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28660                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
28661   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
28662   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
28663                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
28664   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
28665   JUMP_LABEL (tmp) = label;
28666
28667   return label;
28668 }
28669
28670 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
28671    using comparison code CODE.  Operands are swapped for the comparison if
28672    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
28673 static rtx
28674 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
28675                               bool swap_operands)
28676 {
28677   enum machine_mode mode = GET_MODE (op0);
28678   rtx mask = gen_reg_rtx (mode);
28679
28680   if (swap_operands)
28681     {
28682       rtx tmp = op0;
28683       op0 = op1;
28684       op1 = tmp;
28685     }
28686
28687   if (mode == DFmode)
28688     emit_insn (gen_sse2_maskcmpdf3 (mask, op0, op1,
28689                                     gen_rtx_fmt_ee (code, mode, op0, op1)));
28690   else
28691     emit_insn (gen_sse_maskcmpsf3 (mask, op0, op1,
28692                                    gen_rtx_fmt_ee (code, mode, op0, op1)));
28693
28694   return mask;
28695 }
28696
28697 /* Generate and return a rtx of mode MODE for 2**n where n is the number
28698    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
28699 static rtx
28700 ix86_gen_TWO52 (enum machine_mode mode)
28701 {
28702   REAL_VALUE_TYPE TWO52r;
28703   rtx TWO52;
28704
28705   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
28706   TWO52 = const_double_from_real_value (TWO52r, mode);
28707   TWO52 = force_reg (mode, TWO52);
28708
28709   return TWO52;
28710 }
28711
28712 /* Expand SSE sequence for computing lround from OP1 storing
28713    into OP0.  */
28714 void
28715 ix86_expand_lround (rtx op0, rtx op1)
28716 {
28717   /* C code for the stuff we're doing below:
28718        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
28719        return (long)tmp;
28720    */
28721   enum machine_mode mode = GET_MODE (op1);
28722   const struct real_format *fmt;
28723   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
28724   rtx adj;
28725
28726   /* load nextafter (0.5, 0.0) */
28727   fmt = REAL_MODE_FORMAT (mode);
28728   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
28729   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
28730
28731   /* adj = copysign (0.5, op1) */
28732   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
28733   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
28734
28735   /* adj = op1 + adj */
28736   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
28737
28738   /* op0 = (imode)adj */
28739   expand_fix (op0, adj, 0);
28740 }
28741
28742 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
28743    into OPERAND0.  */
28744 void
28745 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
28746 {
28747   /* C code for the stuff we're doing below (for do_floor):
28748         xi = (long)op1;
28749         xi -= (double)xi > op1 ? 1 : 0;
28750         return xi;
28751    */
28752   enum machine_mode fmode = GET_MODE (op1);
28753   enum machine_mode imode = GET_MODE (op0);
28754   rtx ireg, freg, label, tmp;
28755
28756   /* reg = (long)op1 */
28757   ireg = gen_reg_rtx (imode);
28758   expand_fix (ireg, op1, 0);
28759
28760   /* freg = (double)reg */
28761   freg = gen_reg_rtx (fmode);
28762   expand_float (freg, ireg, 0);
28763
28764   /* ireg = (freg > op1) ? ireg - 1 : ireg */
28765   label = ix86_expand_sse_compare_and_jump (UNLE,
28766                                             freg, op1, !do_floor);
28767   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
28768                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
28769   emit_move_insn (ireg, tmp);
28770
28771   emit_label (label);
28772   LABEL_NUSES (label) = 1;
28773
28774   emit_move_insn (op0, ireg);
28775 }
28776
28777 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
28778    result in OPERAND0.  */
28779 void
28780 ix86_expand_rint (rtx operand0, rtx operand1)
28781 {
28782   /* C code for the stuff we're doing below:
28783         xa = fabs (operand1);
28784         if (!isless (xa, 2**52))
28785           return operand1;
28786         xa = xa + 2**52 - 2**52;
28787         return copysign (xa, operand1);
28788    */
28789   enum machine_mode mode = GET_MODE (operand0);
28790   rtx res, xa, label, TWO52, mask;
28791
28792   res = gen_reg_rtx (mode);
28793   emit_move_insn (res, operand1);
28794
28795   /* xa = abs (operand1) */
28796   xa = ix86_expand_sse_fabs (res, &mask);
28797
28798   /* if (!isless (xa, TWO52)) goto label; */
28799   TWO52 = ix86_gen_TWO52 (mode);
28800   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28801
28802   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28803   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
28804
28805   ix86_sse_copysign_to_positive (res, xa, res, mask);
28806
28807   emit_label (label);
28808   LABEL_NUSES (label) = 1;
28809
28810   emit_move_insn (operand0, res);
28811 }
28812
28813 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
28814    into OPERAND0.  */
28815 void
28816 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
28817 {
28818   /* C code for the stuff we expand below.
28819         double xa = fabs (x), x2;
28820         if (!isless (xa, TWO52))
28821           return x;
28822         xa = xa + TWO52 - TWO52;
28823         x2 = copysign (xa, x);
28824      Compensate.  Floor:
28825         if (x2 > x)
28826           x2 -= 1;
28827      Compensate.  Ceil:
28828         if (x2 < x)
28829           x2 -= -1;
28830         return x2;
28831    */
28832   enum machine_mode mode = GET_MODE (operand0);
28833   rtx xa, TWO52, tmp, label, one, res, mask;
28834
28835   TWO52 = ix86_gen_TWO52 (mode);
28836
28837   /* Temporary for holding the result, initialized to the input
28838      operand to ease control flow.  */
28839   res = gen_reg_rtx (mode);
28840   emit_move_insn (res, operand1);
28841
28842   /* xa = abs (operand1) */
28843   xa = ix86_expand_sse_fabs (res, &mask);
28844
28845   /* if (!isless (xa, TWO52)) goto label; */
28846   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28847
28848   /* xa = xa + TWO52 - TWO52; */
28849   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28850   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
28851
28852   /* xa = copysign (xa, operand1) */
28853   ix86_sse_copysign_to_positive (xa, xa, res, mask);
28854
28855   /* generate 1.0 or -1.0 */
28856   one = force_reg (mode,
28857                    const_double_from_real_value (do_floor
28858                                                  ? dconst1 : dconstm1, mode));
28859
28860   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
28861   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
28862   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28863                           gen_rtx_AND (mode, one, tmp)));
28864   /* We always need to subtract here to preserve signed zero.  */
28865   tmp = expand_simple_binop (mode, MINUS,
28866                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28867   emit_move_insn (res, tmp);
28868
28869   emit_label (label);
28870   LABEL_NUSES (label) = 1;
28871
28872   emit_move_insn (operand0, res);
28873 }
28874
28875 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
28876    into OPERAND0.  */
28877 void
28878 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
28879 {
28880   /* C code for the stuff we expand below.
28881         double xa = fabs (x), x2;
28882         if (!isless (xa, TWO52))
28883           return x;
28884         x2 = (double)(long)x;
28885      Compensate.  Floor:
28886         if (x2 > x)
28887           x2 -= 1;
28888      Compensate.  Ceil:
28889         if (x2 < x)
28890           x2 += 1;
28891         if (HONOR_SIGNED_ZEROS (mode))
28892           return copysign (x2, x);
28893         return x2;
28894    */
28895   enum machine_mode mode = GET_MODE (operand0);
28896   rtx xa, xi, TWO52, tmp, label, one, res, mask;
28897
28898   TWO52 = ix86_gen_TWO52 (mode);
28899
28900   /* Temporary for holding the result, initialized to the input
28901      operand to ease control flow.  */
28902   res = gen_reg_rtx (mode);
28903   emit_move_insn (res, operand1);
28904
28905   /* xa = abs (operand1) */
28906   xa = ix86_expand_sse_fabs (res, &mask);
28907
28908   /* if (!isless (xa, TWO52)) goto label; */
28909   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28910
28911   /* xa = (double)(long)x */
28912   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
28913   expand_fix (xi, res, 0);
28914   expand_float (xa, xi, 0);
28915
28916   /* generate 1.0 */
28917   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
28918
28919   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
28920   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
28921   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28922                           gen_rtx_AND (mode, one, tmp)));
28923   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
28924                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28925   emit_move_insn (res, tmp);
28926
28927   if (HONOR_SIGNED_ZEROS (mode))
28928     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
28929
28930   emit_label (label);
28931   LABEL_NUSES (label) = 1;
28932
28933   emit_move_insn (operand0, res);
28934 }
28935
28936 /* Expand SSE sequence for computing round from OPERAND1 storing
28937    into OPERAND0.  Sequence that works without relying on DImode truncation
28938    via cvttsd2siq that is only available on 64bit targets.  */
28939 void
28940 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
28941 {
28942   /* C code for the stuff we expand below.
28943         double xa = fabs (x), xa2, x2;
28944         if (!isless (xa, TWO52))
28945           return x;
28946      Using the absolute value and copying back sign makes
28947      -0.0 -> -0.0 correct.
28948         xa2 = xa + TWO52 - TWO52;
28949      Compensate.
28950         dxa = xa2 - xa;
28951         if (dxa <= -0.5)
28952           xa2 += 1;
28953         else if (dxa > 0.5)
28954           xa2 -= 1;
28955         x2 = copysign (xa2, x);
28956         return x2;
28957    */
28958   enum machine_mode mode = GET_MODE (operand0);
28959   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
28960
28961   TWO52 = ix86_gen_TWO52 (mode);
28962
28963   /* Temporary for holding the result, initialized to the input
28964      operand to ease control flow.  */
28965   res = gen_reg_rtx (mode);
28966   emit_move_insn (res, operand1);
28967
28968   /* xa = abs (operand1) */
28969   xa = ix86_expand_sse_fabs (res, &mask);
28970
28971   /* if (!isless (xa, TWO52)) goto label; */
28972   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28973
28974   /* xa2 = xa + TWO52 - TWO52; */
28975   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28976   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
28977
28978   /* dxa = xa2 - xa; */
28979   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
28980
28981   /* generate 0.5, 1.0 and -0.5 */
28982   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
28983   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
28984   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
28985                                0, OPTAB_DIRECT);
28986
28987   /* Compensate.  */
28988   tmp = gen_reg_rtx (mode);
28989   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
28990   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
28991   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28992                           gen_rtx_AND (mode, one, tmp)));
28993   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28994   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
28995   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
28996   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28997                           gen_rtx_AND (mode, one, tmp)));
28998   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28999
29000   /* res = copysign (xa2, operand1) */
29001   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
29002
29003   emit_label (label);
29004   LABEL_NUSES (label) = 1;
29005
29006   emit_move_insn (operand0, res);
29007 }
29008
29009 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29010    into OPERAND0.  */
29011 void
29012 ix86_expand_trunc (rtx operand0, rtx operand1)
29013 {
29014   /* C code for SSE variant we expand below.
29015         double xa = fabs (x), x2;
29016         if (!isless (xa, TWO52))
29017           return x;
29018         x2 = (double)(long)x;
29019         if (HONOR_SIGNED_ZEROS (mode))
29020           return copysign (x2, x);
29021         return x2;
29022    */
29023   enum machine_mode mode = GET_MODE (operand0);
29024   rtx xa, xi, TWO52, label, res, mask;
29025
29026   TWO52 = ix86_gen_TWO52 (mode);
29027
29028   /* Temporary for holding the result, initialized to the input
29029      operand to ease control flow.  */
29030   res = gen_reg_rtx (mode);
29031   emit_move_insn (res, operand1);
29032
29033   /* xa = abs (operand1) */
29034   xa = ix86_expand_sse_fabs (res, &mask);
29035
29036   /* if (!isless (xa, TWO52)) goto label; */
29037   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29038
29039   /* x = (double)(long)x */
29040   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29041   expand_fix (xi, res, 0);
29042   expand_float (res, xi, 0);
29043
29044   if (HONOR_SIGNED_ZEROS (mode))
29045     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
29046
29047   emit_label (label);
29048   LABEL_NUSES (label) = 1;
29049
29050   emit_move_insn (operand0, res);
29051 }
29052
29053 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29054    into OPERAND0.  */
29055 void
29056 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
29057 {
29058   enum machine_mode mode = GET_MODE (operand0);
29059   rtx xa, mask, TWO52, label, one, res, smask, tmp;
29060
29061   /* C code for SSE variant we expand below.
29062         double xa = fabs (x), x2;
29063         if (!isless (xa, TWO52))
29064           return x;
29065         xa2 = xa + TWO52 - TWO52;
29066      Compensate:
29067         if (xa2 > xa)
29068           xa2 -= 1.0;
29069         x2 = copysign (xa2, x);
29070         return x2;
29071    */
29072
29073   TWO52 = ix86_gen_TWO52 (mode);
29074
29075   /* Temporary for holding the result, initialized to the input
29076      operand to ease control flow.  */
29077   res = gen_reg_rtx (mode);
29078   emit_move_insn (res, operand1);
29079
29080   /* xa = abs (operand1) */
29081   xa = ix86_expand_sse_fabs (res, &smask);
29082
29083   /* if (!isless (xa, TWO52)) goto label; */
29084   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29085
29086   /* res = xa + TWO52 - TWO52; */
29087   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29088   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
29089   emit_move_insn (res, tmp);
29090
29091   /* generate 1.0 */
29092   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
29093
29094   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
29095   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
29096   emit_insn (gen_rtx_SET (VOIDmode, mask,
29097                           gen_rtx_AND (mode, mask, one)));
29098   tmp = expand_simple_binop (mode, MINUS,
29099                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
29100   emit_move_insn (res, tmp);
29101
29102   /* res = copysign (res, operand1) */
29103   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
29104
29105   emit_label (label);
29106   LABEL_NUSES (label) = 1;
29107
29108   emit_move_insn (operand0, res);
29109 }
29110
29111 /* Expand SSE sequence for computing round from OPERAND1 storing
29112    into OPERAND0.  */
29113 void
29114 ix86_expand_round (rtx operand0, rtx operand1)
29115 {
29116   /* C code for the stuff we're doing below:
29117         double xa = fabs (x);
29118         if (!isless (xa, TWO52))
29119           return x;
29120         xa = (double)(long)(xa + nextafter (0.5, 0.0));
29121         return copysign (xa, x);
29122    */
29123   enum machine_mode mode = GET_MODE (operand0);
29124   rtx res, TWO52, xa, label, xi, half, mask;
29125   const struct real_format *fmt;
29126   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
29127
29128   /* Temporary for holding the result, initialized to the input
29129      operand to ease control flow.  */
29130   res = gen_reg_rtx (mode);
29131   emit_move_insn (res, operand1);
29132
29133   TWO52 = ix86_gen_TWO52 (mode);
29134   xa = ix86_expand_sse_fabs (res, &mask);
29135   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29136
29137   /* load nextafter (0.5, 0.0) */
29138   fmt = REAL_MODE_FORMAT (mode);
29139   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
29140   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
29141
29142   /* xa = xa + 0.5 */
29143   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
29144   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
29145
29146   /* xa = (double)(int64_t)xa */
29147   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29148   expand_fix (xi, xa, 0);
29149   expand_float (xa, xi, 0);
29150
29151   /* res = copysign (xa, operand1) */
29152   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
29153
29154   emit_label (label);
29155   LABEL_NUSES (label) = 1;
29156
29157   emit_move_insn (operand0, res);
29158 }
29159
29160 \f
29161 /* Validate whether a SSE5 instruction is valid or not.
29162    OPERANDS is the array of operands.
29163    NUM is the number of operands.
29164    USES_OC0 is true if the instruction uses OC0 and provides 4 variants.
29165    NUM_MEMORY is the maximum number of memory operands to accept.  
29166    when COMMUTATIVE is set, operand 1 and 2 can be swapped.  */
29167
29168 bool
29169 ix86_sse5_valid_op_p (rtx operands[], rtx insn ATTRIBUTE_UNUSED, int num,
29170                       bool uses_oc0, int num_memory, bool commutative)
29171 {
29172   int mem_mask;
29173   int mem_count;
29174   int i;
29175
29176   /* Count the number of memory arguments */
29177   mem_mask = 0;
29178   mem_count = 0;
29179   for (i = 0; i < num; i++)
29180     {
29181       enum machine_mode mode = GET_MODE (operands[i]);
29182       if (register_operand (operands[i], mode))
29183         ;
29184
29185       else if (memory_operand (operands[i], mode))
29186         {
29187           mem_mask |= (1 << i);
29188           mem_count++;
29189         }
29190
29191       else
29192         {
29193           rtx pattern = PATTERN (insn);
29194
29195           /* allow 0 for pcmov */
29196           if (GET_CODE (pattern) != SET
29197               || GET_CODE (SET_SRC (pattern)) != IF_THEN_ELSE
29198               || i < 2
29199               || operands[i] != CONST0_RTX (mode))
29200             return false;
29201         }
29202     }
29203
29204   /* Special case pmacsdq{l,h} where we allow the 3rd argument to be
29205      a memory operation.  */
29206   if (num_memory < 0)
29207     {
29208       num_memory = -num_memory;
29209       if ((mem_mask & (1 << (num-1))) != 0)
29210         {
29211           mem_mask &= ~(1 << (num-1));
29212           mem_count--;
29213         }
29214     }
29215
29216   /* If there were no memory operations, allow the insn */
29217   if (mem_mask == 0)
29218     return true;
29219
29220   /* Do not allow the destination register to be a memory operand.  */
29221   else if (mem_mask & (1 << 0))
29222     return false;
29223
29224   /* If there are too many memory operations, disallow the instruction.  While
29225      the hardware only allows 1 memory reference, before register allocation
29226      for some insns, we allow two memory operations sometimes in order to allow
29227      code like the following to be optimized:
29228
29229         float fmadd (float *a, float *b, float *c) { return (*a * *b) + *c; }
29230
29231     or similar cases that are vectorized into using the fmaddss
29232     instruction.  */
29233   else if (mem_count > num_memory)
29234     return false;
29235
29236   /* Don't allow more than one memory operation if not optimizing.  */
29237   else if (mem_count > 1 && !optimize)
29238     return false;
29239
29240   else if (num == 4 && mem_count == 1)
29241     {
29242       /* formats (destination is the first argument), example fmaddss:
29243          xmm1, xmm1, xmm2, xmm3/mem
29244          xmm1, xmm1, xmm2/mem, xmm3
29245          xmm1, xmm2, xmm3/mem, xmm1
29246          xmm1, xmm2/mem, xmm3, xmm1 */
29247       if (uses_oc0)
29248         return ((mem_mask == (1 << 1))
29249                 || (mem_mask == (1 << 2))
29250                 || (mem_mask == (1 << 3)));
29251
29252       /* format, example pmacsdd:
29253          xmm1, xmm2, xmm3/mem, xmm1 */
29254       if (commutative)
29255         return (mem_mask == (1 << 2) || mem_mask == (1 << 1));
29256       else
29257         return (mem_mask == (1 << 2));
29258     }
29259
29260   else if (num == 4 && num_memory == 2)
29261     {
29262       /* If there are two memory operations, we can load one of the memory ops
29263          into the destination register.  This is for optimizing the
29264          multiply/add ops, which the combiner has optimized both the multiply
29265          and the add insns to have a memory operation.  We have to be careful
29266          that the destination doesn't overlap with the inputs.  */
29267       rtx op0 = operands[0];
29268
29269       if (reg_mentioned_p (op0, operands[1])
29270           || reg_mentioned_p (op0, operands[2])
29271           || reg_mentioned_p (op0, operands[3]))
29272         return false;
29273
29274       /* formats (destination is the first argument), example fmaddss:
29275          xmm1, xmm1, xmm2, xmm3/mem
29276          xmm1, xmm1, xmm2/mem, xmm3
29277          xmm1, xmm2, xmm3/mem, xmm1
29278          xmm1, xmm2/mem, xmm3, xmm1
29279
29280          For the oc0 case, we will load either operands[1] or operands[3] into
29281          operands[0], so any combination of 2 memory operands is ok.  */
29282       if (uses_oc0)
29283         return true;
29284
29285       /* format, example pmacsdd:
29286          xmm1, xmm2, xmm3/mem, xmm1
29287
29288          For the integer multiply/add instructions be more restrictive and
29289          require operands[2] and operands[3] to be the memory operands.  */
29290       if (commutative)
29291         return (mem_mask == ((1 << 1) | (1 << 3)) || ((1 << 2) | (1 << 3)));
29292       else
29293         return (mem_mask == ((1 << 2) | (1 << 3)));
29294     }
29295
29296   else if (num == 3 && num_memory == 1)
29297     {
29298       /* formats, example protb:
29299          xmm1, xmm2, xmm3/mem
29300          xmm1, xmm2/mem, xmm3 */
29301       if (uses_oc0)
29302         return ((mem_mask == (1 << 1)) || (mem_mask == (1 << 2)));
29303
29304       /* format, example comeq:
29305          xmm1, xmm2, xmm3/mem */
29306       else
29307         return (mem_mask == (1 << 2));
29308     }
29309
29310   else
29311     gcc_unreachable ();
29312
29313   return false;
29314 }
29315
29316 \f
29317 /* Fixup an SSE5 instruction that has 2 memory input references into a form the
29318    hardware will allow by using the destination register to load one of the
29319    memory operations.  Presently this is used by the multiply/add routines to
29320    allow 2 memory references.  */
29321
29322 void
29323 ix86_expand_sse5_multiple_memory (rtx operands[],
29324                                   int num,
29325                                   enum machine_mode mode)
29326 {
29327   rtx op0 = operands[0];
29328   if (num != 4
29329       || memory_operand (op0, mode)
29330       || reg_mentioned_p (op0, operands[1])
29331       || reg_mentioned_p (op0, operands[2])
29332       || reg_mentioned_p (op0, operands[3]))
29333     gcc_unreachable ();
29334
29335   /* For 2 memory operands, pick either operands[1] or operands[3] to move into
29336      the destination register.  */
29337   if (memory_operand (operands[1], mode))
29338     {
29339       emit_move_insn (op0, operands[1]);
29340       operands[1] = op0;
29341     }
29342   else if (memory_operand (operands[3], mode))
29343     {
29344       emit_move_insn (op0, operands[3]);
29345       operands[3] = op0;
29346     }
29347   else
29348     gcc_unreachable ();
29349
29350   return;
29351 }
29352
29353 \f
29354 /* Table of valid machine attributes.  */
29355 static const struct attribute_spec ix86_attribute_table[] =
29356 {
29357   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
29358   /* Stdcall attribute says callee is responsible for popping arguments
29359      if they are not variable.  */
29360   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29361   /* Fastcall attribute says callee is responsible for popping arguments
29362      if they are not variable.  */
29363   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29364   /* Cdecl attribute says the callee is a normal C declaration */
29365   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29366   /* Regparm attribute specifies how many integer arguments are to be
29367      passed in registers.  */
29368   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute },
29369   /* Sseregparm attribute says we are using x86_64 calling conventions
29370      for FP arguments.  */
29371   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute },
29372   /* force_align_arg_pointer says this function realigns the stack at entry.  */
29373   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
29374     false, true,  true, ix86_handle_cconv_attribute },
29375 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29376   { "dllimport", 0, 0, false, false, false, handle_dll_attribute },
29377   { "dllexport", 0, 0, false, false, false, handle_dll_attribute },
29378   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
29379 #endif
29380   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29381   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29382 #ifdef SUBTARGET_ATTRIBUTE_TABLE
29383   SUBTARGET_ATTRIBUTE_TABLE,
29384 #endif
29385   /* ms_abi and sysv_abi calling convention function attributes.  */
29386   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29387   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29388   /* End element.  */
29389   { NULL,        0, 0, false, false, false, NULL }
29390 };
29391
29392 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
29393 static int
29394 x86_builtin_vectorization_cost (bool runtime_test)
29395 {
29396   /* If the branch of the runtime test is taken - i.e. - the vectorized
29397      version is skipped - this incurs a misprediction cost (because the
29398      vectorized version is expected to be the fall-through).  So we subtract
29399      the latency of a mispredicted branch from the costs that are incured
29400      when the vectorized version is executed.
29401
29402      TODO: The values in individual target tables have to be tuned or new
29403      fields may be needed. For eg. on K8, the default branch path is the
29404      not-taken path. If the taken path is predicted correctly, the minimum
29405      penalty of going down the taken-path is 1 cycle. If the taken-path is
29406      not predicted correctly, then the minimum penalty is 10 cycles.  */
29407
29408   if (runtime_test)
29409     {
29410       return (-(ix86_cost->cond_taken_branch_cost));
29411     }
29412   else
29413     return 0;
29414 }
29415
29416 /* This function returns the calling abi specific va_list type node.
29417    It returns  the FNDECL specific va_list type.  */
29418
29419 tree
29420 ix86_fn_abi_va_list (tree fndecl)
29421 {
29422   int abi;
29423
29424   if (!TARGET_64BIT)
29425     return va_list_type_node;
29426   gcc_assert (fndecl != NULL_TREE);
29427   abi = ix86_function_abi ((const_tree) fndecl);
29428
29429   if (abi == MS_ABI)
29430     return ms_va_list_type_node;
29431   else
29432     return sysv_va_list_type_node;
29433 }
29434
29435 /* Returns the canonical va_list type specified by TYPE. If there
29436    is no valid TYPE provided, it return NULL_TREE.  */
29437
29438 tree
29439 ix86_canonical_va_list_type (tree type)
29440 {
29441   tree wtype, htype;
29442
29443   /* Resolve references and pointers to va_list type.  */
29444   if (INDIRECT_REF_P (type))
29445     type = TREE_TYPE (type);
29446   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
29447     type = TREE_TYPE (type);
29448
29449   if (TARGET_64BIT)
29450     {
29451       wtype = va_list_type_node;
29452           gcc_assert (wtype != NULL_TREE);
29453       htype = type;
29454       if (TREE_CODE (wtype) == ARRAY_TYPE)
29455         {
29456           /* If va_list is an array type, the argument may have decayed
29457              to a pointer type, e.g. by being passed to another function.
29458              In that case, unwrap both types so that we can compare the
29459              underlying records.  */
29460           if (TREE_CODE (htype) == ARRAY_TYPE
29461               || POINTER_TYPE_P (htype))
29462             {
29463               wtype = TREE_TYPE (wtype);
29464               htype = TREE_TYPE (htype);
29465             }
29466         }
29467       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29468         return va_list_type_node;
29469       wtype = sysv_va_list_type_node;
29470           gcc_assert (wtype != NULL_TREE);
29471       htype = type;
29472       if (TREE_CODE (wtype) == ARRAY_TYPE)
29473         {
29474           /* If va_list is an array type, the argument may have decayed
29475              to a pointer type, e.g. by being passed to another function.
29476              In that case, unwrap both types so that we can compare the
29477              underlying records.  */
29478           if (TREE_CODE (htype) == ARRAY_TYPE
29479               || POINTER_TYPE_P (htype))
29480             {
29481               wtype = TREE_TYPE (wtype);
29482               htype = TREE_TYPE (htype);
29483             }
29484         }
29485       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29486         return sysv_va_list_type_node;
29487       wtype = ms_va_list_type_node;
29488           gcc_assert (wtype != NULL_TREE);
29489       htype = type;
29490       if (TREE_CODE (wtype) == ARRAY_TYPE)
29491         {
29492           /* If va_list is an array type, the argument may have decayed
29493              to a pointer type, e.g. by being passed to another function.
29494              In that case, unwrap both types so that we can compare the
29495              underlying records.  */
29496           if (TREE_CODE (htype) == ARRAY_TYPE
29497               || POINTER_TYPE_P (htype))
29498             {
29499               wtype = TREE_TYPE (wtype);
29500               htype = TREE_TYPE (htype);
29501             }
29502         }
29503       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29504         return ms_va_list_type_node;
29505       return NULL_TREE;
29506     }
29507   return std_canonical_va_list_type (type);
29508 }
29509
29510 /* Iterate through the target-specific builtin types for va_list.
29511     IDX denotes the iterator, *PTREE is set to the result type of
29512     the va_list builtin, and *PNAME to its internal type.
29513     Returns zero if there is no element for this index, otherwise
29514     IDX should be increased upon the next call.
29515     Note, do not iterate a base builtin's name like __builtin_va_list.
29516     Used from c_common_nodes_and_builtins.  */
29517
29518 int
29519 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
29520 {
29521   if (!TARGET_64BIT)
29522     return 0;
29523   switch (idx) {
29524   case 0:
29525     *ptree = ms_va_list_type_node;
29526     *pname = "__builtin_ms_va_list";
29527     break;
29528   case 1:
29529     *ptree = sysv_va_list_type_node;
29530     *pname = "__builtin_sysv_va_list";
29531     break;
29532   default:
29533     return 0;
29534   }
29535   return 1;
29536 }
29537
29538 /* Initialize the GCC target structure.  */
29539 #undef TARGET_RETURN_IN_MEMORY
29540 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
29541
29542 #undef TARGET_ATTRIBUTE_TABLE
29543 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
29544 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29545 #  undef TARGET_MERGE_DECL_ATTRIBUTES
29546 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
29547 #endif
29548
29549 #undef TARGET_COMP_TYPE_ATTRIBUTES
29550 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
29551
29552 #undef TARGET_INIT_BUILTINS
29553 #define TARGET_INIT_BUILTINS ix86_init_builtins
29554 #undef TARGET_EXPAND_BUILTIN
29555 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
29556
29557 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
29558 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
29559   ix86_builtin_vectorized_function
29560
29561 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
29562 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
29563
29564 #undef TARGET_BUILTIN_RECIPROCAL
29565 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
29566
29567 #undef TARGET_ASM_FUNCTION_EPILOGUE
29568 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
29569
29570 #undef TARGET_ENCODE_SECTION_INFO
29571 #ifndef SUBTARGET_ENCODE_SECTION_INFO
29572 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
29573 #else
29574 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
29575 #endif
29576
29577 #undef TARGET_ASM_OPEN_PAREN
29578 #define TARGET_ASM_OPEN_PAREN ""
29579 #undef TARGET_ASM_CLOSE_PAREN
29580 #define TARGET_ASM_CLOSE_PAREN ""
29581
29582 #undef TARGET_ASM_ALIGNED_HI_OP
29583 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
29584 #undef TARGET_ASM_ALIGNED_SI_OP
29585 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
29586 #ifdef ASM_QUAD
29587 #undef TARGET_ASM_ALIGNED_DI_OP
29588 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
29589 #endif
29590
29591 #undef TARGET_ASM_UNALIGNED_HI_OP
29592 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
29593 #undef TARGET_ASM_UNALIGNED_SI_OP
29594 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
29595 #undef TARGET_ASM_UNALIGNED_DI_OP
29596 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
29597
29598 #undef TARGET_SCHED_ADJUST_COST
29599 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
29600 #undef TARGET_SCHED_ISSUE_RATE
29601 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
29602 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
29603 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
29604   ia32_multipass_dfa_lookahead
29605
29606 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
29607 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
29608
29609 #ifdef HAVE_AS_TLS
29610 #undef TARGET_HAVE_TLS
29611 #define TARGET_HAVE_TLS true
29612 #endif
29613 #undef TARGET_CANNOT_FORCE_CONST_MEM
29614 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
29615 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
29616 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
29617
29618 #undef TARGET_DELEGITIMIZE_ADDRESS
29619 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
29620
29621 #undef TARGET_MS_BITFIELD_LAYOUT_P
29622 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
29623
29624 #if TARGET_MACHO
29625 #undef TARGET_BINDS_LOCAL_P
29626 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
29627 #endif
29628 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29629 #undef TARGET_BINDS_LOCAL_P
29630 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
29631 #endif
29632
29633 #undef TARGET_ASM_OUTPUT_MI_THUNK
29634 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
29635 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
29636 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
29637
29638 #undef TARGET_ASM_FILE_START
29639 #define TARGET_ASM_FILE_START x86_file_start
29640
29641 #undef TARGET_DEFAULT_TARGET_FLAGS
29642 #define TARGET_DEFAULT_TARGET_FLAGS     \
29643   (TARGET_DEFAULT                       \
29644    | TARGET_SUBTARGET_DEFAULT           \
29645    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
29646
29647 #undef TARGET_HANDLE_OPTION
29648 #define TARGET_HANDLE_OPTION ix86_handle_option
29649
29650 #undef TARGET_RTX_COSTS
29651 #define TARGET_RTX_COSTS ix86_rtx_costs
29652 #undef TARGET_ADDRESS_COST
29653 #define TARGET_ADDRESS_COST ix86_address_cost
29654
29655 #undef TARGET_FIXED_CONDITION_CODE_REGS
29656 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
29657 #undef TARGET_CC_MODES_COMPATIBLE
29658 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
29659
29660 #undef TARGET_MACHINE_DEPENDENT_REORG
29661 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
29662
29663 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
29664 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
29665
29666 #undef TARGET_BUILD_BUILTIN_VA_LIST
29667 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
29668
29669 #undef TARGET_FN_ABI_VA_LIST
29670 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
29671
29672 #undef TARGET_CANONICAL_VA_LIST_TYPE
29673 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
29674
29675 #undef TARGET_EXPAND_BUILTIN_VA_START
29676 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
29677
29678 #undef TARGET_MD_ASM_CLOBBERS
29679 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
29680
29681 #undef TARGET_PROMOTE_PROTOTYPES
29682 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
29683 #undef TARGET_STRUCT_VALUE_RTX
29684 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
29685 #undef TARGET_SETUP_INCOMING_VARARGS
29686 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
29687 #undef TARGET_MUST_PASS_IN_STACK
29688 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
29689 #undef TARGET_PASS_BY_REFERENCE
29690 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
29691 #undef TARGET_INTERNAL_ARG_POINTER
29692 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
29693 #undef TARGET_UPDATE_STACK_BOUNDARY
29694 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
29695 #undef TARGET_GET_DRAP_RTX
29696 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
29697 #undef TARGET_DWARF_HANDLE_FRAME_UNSPEC
29698 #define TARGET_DWARF_HANDLE_FRAME_UNSPEC ix86_dwarf_handle_frame_unspec
29699 #undef TARGET_STRICT_ARGUMENT_NAMING
29700 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
29701
29702 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
29703 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
29704
29705 #undef TARGET_SCALAR_MODE_SUPPORTED_P
29706 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
29707
29708 #undef TARGET_VECTOR_MODE_SUPPORTED_P
29709 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
29710
29711 #undef TARGET_C_MODE_FOR_SUFFIX
29712 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
29713
29714 #ifdef HAVE_AS_TLS
29715 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
29716 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
29717 #endif
29718
29719 #ifdef SUBTARGET_INSERT_ATTRIBUTES
29720 #undef TARGET_INSERT_ATTRIBUTES
29721 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
29722 #endif
29723
29724 #undef TARGET_MANGLE_TYPE
29725 #define TARGET_MANGLE_TYPE ix86_mangle_type
29726
29727 #undef TARGET_STACK_PROTECT_FAIL
29728 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
29729
29730 #undef TARGET_FUNCTION_VALUE
29731 #define TARGET_FUNCTION_VALUE ix86_function_value
29732
29733 #undef TARGET_SECONDARY_RELOAD
29734 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
29735
29736 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
29737 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST x86_builtin_vectorization_cost
29738
29739 #undef TARGET_SET_CURRENT_FUNCTION
29740 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
29741
29742 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
29743 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
29744
29745 #undef TARGET_OPTION_SAVE
29746 #define TARGET_OPTION_SAVE ix86_function_specific_save
29747
29748 #undef TARGET_OPTION_RESTORE
29749 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
29750
29751 #undef TARGET_OPTION_PRINT
29752 #define TARGET_OPTION_PRINT ix86_function_specific_print
29753
29754 #undef TARGET_OPTION_CAN_INLINE_P
29755 #define TARGET_OPTION_CAN_INLINE_P ix86_can_inline_p
29756
29757 #undef TARGET_EXPAND_TO_RTL_HOOK
29758 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
29759
29760 struct gcc_target targetm = TARGET_INITIALIZER;
29761 \f
29762 #include "gt-i386.h"