Upgrade GCC from 4.4.7 snapshot 2011-10-25 to 4.4.7-RELEASE
[dragonfly.git] / contrib / gcc-4.4 / 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, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "tm_p.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "real.h"
32 #include "insn-config.h"
33 #include "conditions.h"
34 #include "output.h"
35 #include "insn-codes.h"
36 #include "insn-attr.h"
37 #include "flags.h"
38 #include "c-common.h"
39 #include "except.h"
40 #include "function.h"
41 #include "recog.h"
42 #include "expr.h"
43 #include "optabs.h"
44 #include "toplev.h"
45 #include "basic-block.h"
46 #include "ggc.h"
47 #include "target.h"
48 #include "target-def.h"
49 #include "langhooks.h"
50 #include "cgraph.h"
51 #include "gimple.h"
52 #include "dwarf2.h"
53 #include "df.h"
54 #include "tm-constrs.h"
55 #include "params.h"
56 #include "cselib.h"
57
58 static int x86_builtin_vectorization_cost (bool);
59 static rtx legitimize_dllimport_symbol (rtx, bool);
60
61 #ifndef CHECK_STACK_LIMIT
62 #define CHECK_STACK_LIMIT (-1)
63 #endif
64
65 /* Return index of given mode in mult and division cost tables.  */
66 #define MODE_INDEX(mode)                                        \
67   ((mode) == QImode ? 0                                         \
68    : (mode) == HImode ? 1                                       \
69    : (mode) == SImode ? 2                                       \
70    : (mode) == DImode ? 3                                       \
71    : 4)
72
73 /* Processor costs (relative to an add) */
74 /* We assume COSTS_N_INSNS is defined as (N)*4 and an addition is 2 bytes.  */
75 #define COSTS_N_BYTES(N) ((N) * 2)
76
77 #define DUMMY_STRINGOP_ALGS {libcall, {{-1, libcall}}}
78
79 const
80 struct processor_costs ix86_size_cost = {/* costs for tuning for size */
81   COSTS_N_BYTES (2),                    /* cost of an add instruction */
82   COSTS_N_BYTES (3),                    /* cost of a lea instruction */
83   COSTS_N_BYTES (2),                    /* variable shift costs */
84   COSTS_N_BYTES (3),                    /* constant shift costs */
85   {COSTS_N_BYTES (3),                   /* cost of starting multiply for QI */
86    COSTS_N_BYTES (3),                   /*                               HI */
87    COSTS_N_BYTES (3),                   /*                               SI */
88    COSTS_N_BYTES (3),                   /*                               DI */
89    COSTS_N_BYTES (5)},                  /*                            other */
90   0,                                    /* cost of multiply per each bit set */
91   {COSTS_N_BYTES (3),                   /* cost of a divide/mod for QI */
92    COSTS_N_BYTES (3),                   /*                          HI */
93    COSTS_N_BYTES (3),                   /*                          SI */
94    COSTS_N_BYTES (3),                   /*                          DI */
95    COSTS_N_BYTES (5)},                  /*                       other */
96   COSTS_N_BYTES (3),                    /* cost of movsx */
97   COSTS_N_BYTES (3),                    /* cost of movzx */
98   0,                                    /* "large" insn */
99   2,                                    /* MOVE_RATIO */
100   2,                                    /* cost for loading QImode using movzbl */
101   {2, 2, 2},                            /* cost of loading integer registers
102                                            in QImode, HImode and SImode.
103                                            Relative to reg-reg move (2).  */
104   {2, 2, 2},                            /* cost of storing integer registers */
105   2,                                    /* cost of reg,reg fld/fst */
106   {2, 2, 2},                            /* cost of loading fp registers
107                                            in SFmode, DFmode and XFmode */
108   {2, 2, 2},                            /* cost of storing fp registers
109                                            in SFmode, DFmode and XFmode */
110   3,                                    /* cost of moving MMX register */
111   {3, 3},                               /* cost of loading MMX registers
112                                            in SImode and DImode */
113   {3, 3},                               /* cost of storing MMX registers
114                                            in SImode and DImode */
115   3,                                    /* cost of moving SSE register */
116   {3, 3, 3},                            /* cost of loading SSE registers
117                                            in SImode, DImode and TImode */
118   {3, 3, 3},                            /* cost of storing SSE registers
119                                            in SImode, DImode and TImode */
120   3,                                    /* MMX or SSE register to integer */
121   0,                                    /* size of l1 cache  */
122   0,                                    /* size of l2 cache  */
123   0,                                    /* size of prefetch block */
124   0,                                    /* number of parallel prefetches */
125   2,                                    /* Branch cost */
126   COSTS_N_BYTES (2),                    /* cost of FADD and FSUB insns.  */
127   COSTS_N_BYTES (2),                    /* cost of FMUL instruction.  */
128   COSTS_N_BYTES (2),                    /* cost of FDIV instruction.  */
129   COSTS_N_BYTES (2),                    /* cost of FABS instruction.  */
130   COSTS_N_BYTES (2),                    /* cost of FCHS instruction.  */
131   COSTS_N_BYTES (2),                    /* cost of FSQRT instruction.  */
132   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
133    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
134   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
135    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
136   1,                                    /* scalar_stmt_cost.  */
137   1,                                    /* scalar load_cost.  */
138   1,                                    /* scalar_store_cost.  */
139   1,                                    /* vec_stmt_cost.  */
140   1,                                    /* vec_to_scalar_cost.  */
141   1,                                    /* scalar_to_vec_cost.  */
142   1,                                    /* vec_align_load_cost.  */
143   1,                                    /* vec_unalign_load_cost.  */
144   1,                                    /* vec_store_cost.  */
145   1,                                    /* cond_taken_branch_cost.  */
146   1,                                    /* cond_not_taken_branch_cost.  */
147 };
148
149 /* Processor costs (relative to an add) */
150 static const
151 struct processor_costs i386_cost = {    /* 386 specific costs */
152   COSTS_N_INSNS (1),                    /* cost of an add instruction */
153   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
154   COSTS_N_INSNS (3),                    /* variable shift costs */
155   COSTS_N_INSNS (2),                    /* constant shift costs */
156   {COSTS_N_INSNS (6),                   /* cost of starting multiply for QI */
157    COSTS_N_INSNS (6),                   /*                               HI */
158    COSTS_N_INSNS (6),                   /*                               SI */
159    COSTS_N_INSNS (6),                   /*                               DI */
160    COSTS_N_INSNS (6)},                  /*                               other */
161   COSTS_N_INSNS (1),                    /* cost of multiply per each bit set */
162   {COSTS_N_INSNS (23),                  /* cost of a divide/mod for QI */
163    COSTS_N_INSNS (23),                  /*                          HI */
164    COSTS_N_INSNS (23),                  /*                          SI */
165    COSTS_N_INSNS (23),                  /*                          DI */
166    COSTS_N_INSNS (23)},                 /*                          other */
167   COSTS_N_INSNS (3),                    /* cost of movsx */
168   COSTS_N_INSNS (2),                    /* cost of movzx */
169   15,                                   /* "large" insn */
170   3,                                    /* MOVE_RATIO */
171   4,                                    /* cost for loading QImode using movzbl */
172   {2, 4, 2},                            /* cost of loading integer registers
173                                            in QImode, HImode and SImode.
174                                            Relative to reg-reg move (2).  */
175   {2, 4, 2},                            /* cost of storing integer registers */
176   2,                                    /* cost of reg,reg fld/fst */
177   {8, 8, 8},                            /* cost of loading fp registers
178                                            in SFmode, DFmode and XFmode */
179   {8, 8, 8},                            /* cost of storing fp registers
180                                            in SFmode, DFmode and XFmode */
181   2,                                    /* cost of moving MMX register */
182   {4, 8},                               /* cost of loading MMX registers
183                                            in SImode and DImode */
184   {4, 8},                               /* cost of storing MMX registers
185                                            in SImode and DImode */
186   2,                                    /* cost of moving SSE register */
187   {4, 8, 16},                           /* cost of loading SSE registers
188                                            in SImode, DImode and TImode */
189   {4, 8, 16},                           /* cost of storing SSE registers
190                                            in SImode, DImode and TImode */
191   3,                                    /* MMX or SSE register to integer */
192   0,                                    /* size of l1 cache  */
193   0,                                    /* size of l2 cache  */
194   0,                                    /* size of prefetch block */
195   0,                                    /* number of parallel prefetches */
196   1,                                    /* Branch cost */
197   COSTS_N_INSNS (23),                   /* cost of FADD and FSUB insns.  */
198   COSTS_N_INSNS (27),                   /* cost of FMUL instruction.  */
199   COSTS_N_INSNS (88),                   /* cost of FDIV instruction.  */
200   COSTS_N_INSNS (22),                   /* cost of FABS instruction.  */
201   COSTS_N_INSNS (24),                   /* cost of FCHS instruction.  */
202   COSTS_N_INSNS (122),                  /* cost of FSQRT instruction.  */
203   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
204    DUMMY_STRINGOP_ALGS},
205   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
206    DUMMY_STRINGOP_ALGS},
207   1,                                    /* scalar_stmt_cost.  */
208   1,                                    /* scalar load_cost.  */
209   1,                                    /* scalar_store_cost.  */
210   1,                                    /* vec_stmt_cost.  */
211   1,                                    /* vec_to_scalar_cost.  */
212   1,                                    /* scalar_to_vec_cost.  */
213   1,                                    /* vec_align_load_cost.  */
214   2,                                    /* vec_unalign_load_cost.  */
215   1,                                    /* vec_store_cost.  */
216   3,                                    /* cond_taken_branch_cost.  */
217   1,                                    /* cond_not_taken_branch_cost.  */
218 };
219
220 static const
221 struct processor_costs i486_cost = {    /* 486 specific costs */
222   COSTS_N_INSNS (1),                    /* cost of an add instruction */
223   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
224   COSTS_N_INSNS (3),                    /* variable shift costs */
225   COSTS_N_INSNS (2),                    /* constant shift costs */
226   {COSTS_N_INSNS (12),                  /* cost of starting multiply for QI */
227    COSTS_N_INSNS (12),                  /*                               HI */
228    COSTS_N_INSNS (12),                  /*                               SI */
229    COSTS_N_INSNS (12),                  /*                               DI */
230    COSTS_N_INSNS (12)},                 /*                               other */
231   1,                                    /* cost of multiply per each bit set */
232   {COSTS_N_INSNS (40),                  /* cost of a divide/mod for QI */
233    COSTS_N_INSNS (40),                  /*                          HI */
234    COSTS_N_INSNS (40),                  /*                          SI */
235    COSTS_N_INSNS (40),                  /*                          DI */
236    COSTS_N_INSNS (40)},                 /*                          other */
237   COSTS_N_INSNS (3),                    /* cost of movsx */
238   COSTS_N_INSNS (2),                    /* cost of movzx */
239   15,                                   /* "large" insn */
240   3,                                    /* MOVE_RATIO */
241   4,                                    /* cost for loading QImode using movzbl */
242   {2, 4, 2},                            /* cost of loading integer registers
243                                            in QImode, HImode and SImode.
244                                            Relative to reg-reg move (2).  */
245   {2, 4, 2},                            /* cost of storing integer registers */
246   2,                                    /* cost of reg,reg fld/fst */
247   {8, 8, 8},                            /* cost of loading fp registers
248                                            in SFmode, DFmode and XFmode */
249   {8, 8, 8},                            /* cost of storing fp registers
250                                            in SFmode, DFmode and XFmode */
251   2,                                    /* cost of moving MMX register */
252   {4, 8},                               /* cost of loading MMX registers
253                                            in SImode and DImode */
254   {4, 8},                               /* cost of storing MMX registers
255                                            in SImode and DImode */
256   2,                                    /* cost of moving SSE register */
257   {4, 8, 16},                           /* cost of loading SSE registers
258                                            in SImode, DImode and TImode */
259   {4, 8, 16},                           /* cost of storing SSE registers
260                                            in SImode, DImode and TImode */
261   3,                                    /* MMX or SSE register to integer */
262   4,                                    /* size of l1 cache.  486 has 8kB cache
263                                            shared for code and data, so 4kB is
264                                            not really precise.  */
265   4,                                    /* size of l2 cache  */
266   0,                                    /* size of prefetch block */
267   0,                                    /* number of parallel prefetches */
268   1,                                    /* Branch cost */
269   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
270   COSTS_N_INSNS (16),                   /* cost of FMUL instruction.  */
271   COSTS_N_INSNS (73),                   /* cost of FDIV instruction.  */
272   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
273   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
274   COSTS_N_INSNS (83),                   /* cost of FSQRT instruction.  */
275   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
276    DUMMY_STRINGOP_ALGS},
277   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
278    DUMMY_STRINGOP_ALGS},
279   1,                                    /* scalar_stmt_cost.  */
280   1,                                    /* scalar load_cost.  */
281   1,                                    /* scalar_store_cost.  */
282   1,                                    /* vec_stmt_cost.  */
283   1,                                    /* vec_to_scalar_cost.  */
284   1,                                    /* scalar_to_vec_cost.  */
285   1,                                    /* vec_align_load_cost.  */
286   2,                                    /* vec_unalign_load_cost.  */
287   1,                                    /* vec_store_cost.  */
288   3,                                    /* cond_taken_branch_cost.  */
289   1,                                    /* cond_not_taken_branch_cost.  */
290 };
291
292 static const
293 struct processor_costs pentium_cost = {
294   COSTS_N_INSNS (1),                    /* cost of an add instruction */
295   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
296   COSTS_N_INSNS (4),                    /* variable shift costs */
297   COSTS_N_INSNS (1),                    /* constant shift costs */
298   {COSTS_N_INSNS (11),                  /* cost of starting multiply for QI */
299    COSTS_N_INSNS (11),                  /*                               HI */
300    COSTS_N_INSNS (11),                  /*                               SI */
301    COSTS_N_INSNS (11),                  /*                               DI */
302    COSTS_N_INSNS (11)},                 /*                               other */
303   0,                                    /* cost of multiply per each bit set */
304   {COSTS_N_INSNS (25),                  /* cost of a divide/mod for QI */
305    COSTS_N_INSNS (25),                  /*                          HI */
306    COSTS_N_INSNS (25),                  /*                          SI */
307    COSTS_N_INSNS (25),                  /*                          DI */
308    COSTS_N_INSNS (25)},                 /*                          other */
309   COSTS_N_INSNS (3),                    /* cost of movsx */
310   COSTS_N_INSNS (2),                    /* cost of movzx */
311   8,                                    /* "large" insn */
312   6,                                    /* MOVE_RATIO */
313   6,                                    /* cost for loading QImode using movzbl */
314   {2, 4, 2},                            /* cost of loading integer registers
315                                            in QImode, HImode and SImode.
316                                            Relative to reg-reg move (2).  */
317   {2, 4, 2},                            /* cost of storing integer registers */
318   2,                                    /* cost of reg,reg fld/fst */
319   {2, 2, 6},                            /* cost of loading fp registers
320                                            in SFmode, DFmode and XFmode */
321   {4, 4, 6},                            /* cost of storing fp registers
322                                            in SFmode, DFmode and XFmode */
323   8,                                    /* cost of moving MMX register */
324   {8, 8},                               /* cost of loading MMX registers
325                                            in SImode and DImode */
326   {8, 8},                               /* cost of storing MMX registers
327                                            in SImode and DImode */
328   2,                                    /* cost of moving SSE register */
329   {4, 8, 16},                           /* cost of loading SSE registers
330                                            in SImode, DImode and TImode */
331   {4, 8, 16},                           /* cost of storing SSE registers
332                                            in SImode, DImode and TImode */
333   3,                                    /* MMX or SSE register to integer */
334   8,                                    /* size of l1 cache.  */
335   8,                                    /* size of l2 cache  */
336   0,                                    /* size of prefetch block */
337   0,                                    /* number of parallel prefetches */
338   2,                                    /* Branch cost */
339   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
340   COSTS_N_INSNS (3),                    /* cost of FMUL instruction.  */
341   COSTS_N_INSNS (39),                   /* cost of FDIV instruction.  */
342   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
343   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
344   COSTS_N_INSNS (70),                   /* cost of FSQRT instruction.  */
345   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
346    DUMMY_STRINGOP_ALGS},
347   {{libcall, {{-1, rep_prefix_4_byte}}},
348    DUMMY_STRINGOP_ALGS},
349   1,                                    /* scalar_stmt_cost.  */
350   1,                                    /* scalar load_cost.  */
351   1,                                    /* scalar_store_cost.  */
352   1,                                    /* vec_stmt_cost.  */
353   1,                                    /* vec_to_scalar_cost.  */
354   1,                                    /* scalar_to_vec_cost.  */
355   1,                                    /* vec_align_load_cost.  */
356   2,                                    /* vec_unalign_load_cost.  */
357   1,                                    /* vec_store_cost.  */
358   3,                                    /* cond_taken_branch_cost.  */
359   1,                                    /* cond_not_taken_branch_cost.  */
360 };
361
362 static const
363 struct processor_costs pentiumpro_cost = {
364   COSTS_N_INSNS (1),                    /* cost of an add instruction */
365   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
366   COSTS_N_INSNS (1),                    /* variable shift costs */
367   COSTS_N_INSNS (1),                    /* constant shift costs */
368   {COSTS_N_INSNS (4),                   /* cost of starting multiply for QI */
369    COSTS_N_INSNS (4),                   /*                               HI */
370    COSTS_N_INSNS (4),                   /*                               SI */
371    COSTS_N_INSNS (4),                   /*                               DI */
372    COSTS_N_INSNS (4)},                  /*                               other */
373   0,                                    /* cost of multiply per each bit set */
374   {COSTS_N_INSNS (17),                  /* cost of a divide/mod for QI */
375    COSTS_N_INSNS (17),                  /*                          HI */
376    COSTS_N_INSNS (17),                  /*                          SI */
377    COSTS_N_INSNS (17),                  /*                          DI */
378    COSTS_N_INSNS (17)},                 /*                          other */
379   COSTS_N_INSNS (1),                    /* cost of movsx */
380   COSTS_N_INSNS (1),                    /* cost of movzx */
381   8,                                    /* "large" insn */
382   6,                                    /* MOVE_RATIO */
383   2,                                    /* cost for loading QImode using movzbl */
384   {4, 4, 4},                            /* cost of loading integer registers
385                                            in QImode, HImode and SImode.
386                                            Relative to reg-reg move (2).  */
387   {2, 2, 2},                            /* cost of storing integer registers */
388   2,                                    /* cost of reg,reg fld/fst */
389   {2, 2, 6},                            /* cost of loading fp registers
390                                            in SFmode, DFmode and XFmode */
391   {4, 4, 6},                            /* cost of storing fp registers
392                                            in SFmode, DFmode and XFmode */
393   2,                                    /* cost of moving MMX register */
394   {2, 2},                               /* cost of loading MMX registers
395                                            in SImode and DImode */
396   {2, 2},                               /* cost of storing MMX registers
397                                            in SImode and DImode */
398   2,                                    /* cost of moving SSE register */
399   {2, 2, 8},                            /* cost of loading SSE registers
400                                            in SImode, DImode and TImode */
401   {2, 2, 8},                            /* cost of storing SSE registers
402                                            in SImode, DImode and TImode */
403   3,                                    /* MMX or SSE register to integer */
404   8,                                    /* size of l1 cache.  */
405   256,                                  /* size of l2 cache  */
406   32,                                   /* size of prefetch block */
407   6,                                    /* number of parallel prefetches */
408   2,                                    /* Branch cost */
409   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
410   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
411   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
412   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
413   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
414   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
415   /* PentiumPro has optimized rep instructions for blocks aligned by 8 bytes (we ensure
416      the alignment).  For small blocks inline loop is still a noticeable win, for bigger
417      blocks either rep movsl or rep movsb is way to go.  Rep movsb has apparently
418      more expensive startup time in CPU, but after 4K the difference is down in the noise.
419    */
420   {{rep_prefix_4_byte, {{128, loop}, {1024, unrolled_loop},
421                         {8192, rep_prefix_4_byte}, {-1, rep_prefix_1_byte}}},
422    DUMMY_STRINGOP_ALGS},
423   {{rep_prefix_4_byte, {{1024, unrolled_loop},
424                         {8192, rep_prefix_4_byte}, {-1, libcall}}},
425    DUMMY_STRINGOP_ALGS},
426   1,                                    /* scalar_stmt_cost.  */
427   1,                                    /* scalar load_cost.  */
428   1,                                    /* scalar_store_cost.  */
429   1,                                    /* vec_stmt_cost.  */
430   1,                                    /* vec_to_scalar_cost.  */
431   1,                                    /* scalar_to_vec_cost.  */
432   1,                                    /* vec_align_load_cost.  */
433   2,                                    /* vec_unalign_load_cost.  */
434   1,                                    /* vec_store_cost.  */
435   3,                                    /* cond_taken_branch_cost.  */
436   1,                                    /* cond_not_taken_branch_cost.  */
437 };
438
439 static const
440 struct processor_costs geode_cost = {
441   COSTS_N_INSNS (1),                    /* cost of an add instruction */
442   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
443   COSTS_N_INSNS (2),                    /* variable shift costs */
444   COSTS_N_INSNS (1),                    /* constant shift costs */
445   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
446    COSTS_N_INSNS (4),                   /*                               HI */
447    COSTS_N_INSNS (7),                   /*                               SI */
448    COSTS_N_INSNS (7),                   /*                               DI */
449    COSTS_N_INSNS (7)},                  /*                               other */
450   0,                                    /* cost of multiply per each bit set */
451   {COSTS_N_INSNS (15),                  /* cost of a divide/mod for QI */
452    COSTS_N_INSNS (23),                  /*                          HI */
453    COSTS_N_INSNS (39),                  /*                          SI */
454    COSTS_N_INSNS (39),                  /*                          DI */
455    COSTS_N_INSNS (39)},                 /*                          other */
456   COSTS_N_INSNS (1),                    /* cost of movsx */
457   COSTS_N_INSNS (1),                    /* cost of movzx */
458   8,                                    /* "large" insn */
459   4,                                    /* MOVE_RATIO */
460   1,                                    /* cost for loading QImode using movzbl */
461   {1, 1, 1},                            /* cost of loading integer registers
462                                            in QImode, HImode and SImode.
463                                            Relative to reg-reg move (2).  */
464   {1, 1, 1},                            /* cost of storing integer registers */
465   1,                                    /* cost of reg,reg fld/fst */
466   {1, 1, 1},                            /* cost of loading fp registers
467                                            in SFmode, DFmode and XFmode */
468   {4, 6, 6},                            /* cost of storing fp registers
469                                            in SFmode, DFmode and XFmode */
470
471   1,                                    /* cost of moving MMX register */
472   {1, 1},                               /* cost of loading MMX registers
473                                            in SImode and DImode */
474   {1, 1},                               /* cost of storing MMX registers
475                                            in SImode and DImode */
476   1,                                    /* cost of moving SSE register */
477   {1, 1, 1},                            /* cost of loading SSE registers
478                                            in SImode, DImode and TImode */
479   {1, 1, 1},                            /* cost of storing SSE registers
480                                            in SImode, DImode and TImode */
481   1,                                    /* MMX or SSE register to integer */
482   64,                                   /* size of l1 cache.  */
483   128,                                  /* size of l2 cache.  */
484   32,                                   /* size of prefetch block */
485   1,                                    /* number of parallel prefetches */
486   1,                                    /* Branch cost */
487   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
488   COSTS_N_INSNS (11),                   /* cost of FMUL instruction.  */
489   COSTS_N_INSNS (47),                   /* cost of FDIV instruction.  */
490   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
491   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
492   COSTS_N_INSNS (54),                   /* cost of FSQRT instruction.  */
493   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
494    DUMMY_STRINGOP_ALGS},
495   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
496    DUMMY_STRINGOP_ALGS},
497   1,                                    /* scalar_stmt_cost.  */
498   1,                                    /* scalar load_cost.  */
499   1,                                    /* scalar_store_cost.  */
500   1,                                    /* vec_stmt_cost.  */
501   1,                                    /* vec_to_scalar_cost.  */
502   1,                                    /* scalar_to_vec_cost.  */
503   1,                                    /* vec_align_load_cost.  */
504   2,                                    /* vec_unalign_load_cost.  */
505   1,                                    /* vec_store_cost.  */
506   3,                                    /* cond_taken_branch_cost.  */
507   1,                                    /* cond_not_taken_branch_cost.  */
508 };
509
510 static const
511 struct processor_costs k6_cost = {
512   COSTS_N_INSNS (1),                    /* cost of an add instruction */
513   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
514   COSTS_N_INSNS (1),                    /* variable shift costs */
515   COSTS_N_INSNS (1),                    /* constant shift costs */
516   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
517    COSTS_N_INSNS (3),                   /*                               HI */
518    COSTS_N_INSNS (3),                   /*                               SI */
519    COSTS_N_INSNS (3),                   /*                               DI */
520    COSTS_N_INSNS (3)},                  /*                               other */
521   0,                                    /* cost of multiply per each bit set */
522   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
523    COSTS_N_INSNS (18),                  /*                          HI */
524    COSTS_N_INSNS (18),                  /*                          SI */
525    COSTS_N_INSNS (18),                  /*                          DI */
526    COSTS_N_INSNS (18)},                 /*                          other */
527   COSTS_N_INSNS (2),                    /* cost of movsx */
528   COSTS_N_INSNS (2),                    /* cost of movzx */
529   8,                                    /* "large" insn */
530   4,                                    /* MOVE_RATIO */
531   3,                                    /* cost for loading QImode using movzbl */
532   {4, 5, 4},                            /* cost of loading integer registers
533                                            in QImode, HImode and SImode.
534                                            Relative to reg-reg move (2).  */
535   {2, 3, 2},                            /* cost of storing integer registers */
536   4,                                    /* cost of reg,reg fld/fst */
537   {6, 6, 6},                            /* cost of loading fp registers
538                                            in SFmode, DFmode and XFmode */
539   {4, 4, 4},                            /* cost of storing fp registers
540                                            in SFmode, DFmode and XFmode */
541   2,                                    /* cost of moving MMX register */
542   {2, 2},                               /* cost of loading MMX registers
543                                            in SImode and DImode */
544   {2, 2},                               /* cost of storing MMX registers
545                                            in SImode and DImode */
546   2,                                    /* cost of moving SSE register */
547   {2, 2, 8},                            /* cost of loading SSE registers
548                                            in SImode, DImode and TImode */
549   {2, 2, 8},                            /* cost of storing SSE registers
550                                            in SImode, DImode and TImode */
551   6,                                    /* MMX or SSE register to integer */
552   32,                                   /* size of l1 cache.  */
553   32,                                   /* size of l2 cache.  Some models
554                                            have integrated l2 cache, but
555                                            optimizing for k6 is not important
556                                            enough to worry about that.  */
557   32,                                   /* size of prefetch block */
558   1,                                    /* number of parallel prefetches */
559   1,                                    /* Branch cost */
560   COSTS_N_INSNS (2),                    /* cost of FADD and FSUB insns.  */
561   COSTS_N_INSNS (2),                    /* cost of FMUL instruction.  */
562   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
563   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
564   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
565   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
566   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
567    DUMMY_STRINGOP_ALGS},
568   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
569    DUMMY_STRINGOP_ALGS},
570   1,                                    /* scalar_stmt_cost.  */
571   1,                                    /* scalar load_cost.  */
572   1,                                    /* scalar_store_cost.  */
573   1,                                    /* vec_stmt_cost.  */
574   1,                                    /* vec_to_scalar_cost.  */
575   1,                                    /* scalar_to_vec_cost.  */
576   1,                                    /* vec_align_load_cost.  */
577   2,                                    /* vec_unalign_load_cost.  */
578   1,                                    /* vec_store_cost.  */
579   3,                                    /* cond_taken_branch_cost.  */
580   1,                                    /* cond_not_taken_branch_cost.  */
581 };
582
583 static const
584 struct processor_costs athlon_cost = {
585   COSTS_N_INSNS (1),                    /* cost of an add instruction */
586   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
587   COSTS_N_INSNS (1),                    /* variable shift costs */
588   COSTS_N_INSNS (1),                    /* constant shift costs */
589   {COSTS_N_INSNS (5),                   /* cost of starting multiply for QI */
590    COSTS_N_INSNS (5),                   /*                               HI */
591    COSTS_N_INSNS (5),                   /*                               SI */
592    COSTS_N_INSNS (5),                   /*                               DI */
593    COSTS_N_INSNS (5)},                  /*                               other */
594   0,                                    /* cost of multiply per each bit set */
595   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
596    COSTS_N_INSNS (26),                  /*                          HI */
597    COSTS_N_INSNS (42),                  /*                          SI */
598    COSTS_N_INSNS (74),                  /*                          DI */
599    COSTS_N_INSNS (74)},                 /*                          other */
600   COSTS_N_INSNS (1),                    /* cost of movsx */
601   COSTS_N_INSNS (1),                    /* cost of movzx */
602   8,                                    /* "large" insn */
603   9,                                    /* MOVE_RATIO */
604   4,                                    /* cost for loading QImode using movzbl */
605   {3, 4, 3},                            /* cost of loading integer registers
606                                            in QImode, HImode and SImode.
607                                            Relative to reg-reg move (2).  */
608   {3, 4, 3},                            /* cost of storing integer registers */
609   4,                                    /* cost of reg,reg fld/fst */
610   {4, 4, 12},                           /* cost of loading fp registers
611                                            in SFmode, DFmode and XFmode */
612   {6, 6, 8},                            /* cost of storing fp registers
613                                            in SFmode, DFmode and XFmode */
614   2,                                    /* cost of moving MMX register */
615   {4, 4},                               /* cost of loading MMX registers
616                                            in SImode and DImode */
617   {4, 4},                               /* cost of storing MMX registers
618                                            in SImode and DImode */
619   2,                                    /* cost of moving SSE register */
620   {4, 4, 6},                            /* cost of loading SSE registers
621                                            in SImode, DImode and TImode */
622   {4, 4, 5},                            /* cost of storing SSE registers
623                                            in SImode, DImode and TImode */
624   5,                                    /* MMX or SSE register to integer */
625   64,                                   /* size of l1 cache.  */
626   256,                                  /* size of l2 cache.  */
627   64,                                   /* size of prefetch block */
628   6,                                    /* number of parallel prefetches */
629   5,                                    /* Branch cost */
630   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
631   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
632   COSTS_N_INSNS (24),                   /* cost of FDIV instruction.  */
633   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
634   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
635   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
636   /* For some reason, Athlon deals better with REP prefix (relative to loops)
637      compared to K8. Alignment becomes important after 8 bytes for memcpy and
638      128 bytes for memset.  */
639   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
640    DUMMY_STRINGOP_ALGS},
641   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
642    DUMMY_STRINGOP_ALGS},
643   1,                                    /* scalar_stmt_cost.  */
644   1,                                    /* scalar load_cost.  */
645   1,                                    /* scalar_store_cost.  */
646   1,                                    /* vec_stmt_cost.  */
647   1,                                    /* vec_to_scalar_cost.  */
648   1,                                    /* scalar_to_vec_cost.  */
649   1,                                    /* vec_align_load_cost.  */
650   2,                                    /* vec_unalign_load_cost.  */
651   1,                                    /* vec_store_cost.  */
652   3,                                    /* cond_taken_branch_cost.  */
653   1,                                    /* cond_not_taken_branch_cost.  */
654 };
655
656 static const
657 struct processor_costs k8_cost = {
658   COSTS_N_INSNS (1),                    /* cost of an add instruction */
659   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
660   COSTS_N_INSNS (1),                    /* variable shift costs */
661   COSTS_N_INSNS (1),                    /* constant shift costs */
662   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
663    COSTS_N_INSNS (4),                   /*                               HI */
664    COSTS_N_INSNS (3),                   /*                               SI */
665    COSTS_N_INSNS (4),                   /*                               DI */
666    COSTS_N_INSNS (5)},                  /*                               other */
667   0,                                    /* cost of multiply per each bit set */
668   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
669    COSTS_N_INSNS (26),                  /*                          HI */
670    COSTS_N_INSNS (42),                  /*                          SI */
671    COSTS_N_INSNS (74),                  /*                          DI */
672    COSTS_N_INSNS (74)},                 /*                          other */
673   COSTS_N_INSNS (1),                    /* cost of movsx */
674   COSTS_N_INSNS (1),                    /* cost of movzx */
675   8,                                    /* "large" insn */
676   9,                                    /* MOVE_RATIO */
677   4,                                    /* cost for loading QImode using movzbl */
678   {3, 4, 3},                            /* cost of loading integer registers
679                                            in QImode, HImode and SImode.
680                                            Relative to reg-reg move (2).  */
681   {3, 4, 3},                            /* cost of storing integer registers */
682   4,                                    /* cost of reg,reg fld/fst */
683   {4, 4, 12},                           /* cost of loading fp registers
684                                            in SFmode, DFmode and XFmode */
685   {6, 6, 8},                            /* cost of storing fp registers
686                                            in SFmode, DFmode and XFmode */
687   2,                                    /* cost of moving MMX register */
688   {3, 3},                               /* cost of loading MMX registers
689                                            in SImode and DImode */
690   {4, 4},                               /* cost of storing MMX registers
691                                            in SImode and DImode */
692   2,                                    /* cost of moving SSE register */
693   {4, 3, 6},                            /* cost of loading SSE registers
694                                            in SImode, DImode and TImode */
695   {4, 4, 5},                            /* cost of storing SSE registers
696                                            in SImode, DImode and TImode */
697   5,                                    /* MMX or SSE register to integer */
698   64,                                   /* size of l1 cache.  */
699   512,                                  /* size of l2 cache.  */
700   64,                                   /* size of prefetch block */
701   /* New AMD processors never drop prefetches; if they cannot be performed
702      immediately, they are queued.  We set number of simultaneous prefetches
703      to a large constant to reflect this (it probably is not a good idea not
704      to limit number of prefetches at all, as their execution also takes some
705      time).  */
706   100,                                  /* number of parallel prefetches */
707   3,                                    /* Branch cost */
708   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
709   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
710   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
711   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
712   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
713   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
714   /* K8 has optimized REP instruction for medium sized blocks, but for very small
715      blocks it is better to use loop. For large blocks, libcall can do
716      nontemporary accesses and beat inline considerably.  */
717   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
718    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
719   {{libcall, {{8, loop}, {24, unrolled_loop},
720               {2048, rep_prefix_4_byte}, {-1, libcall}}},
721    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
722   4,                                    /* scalar_stmt_cost.  */
723   2,                                    /* scalar load_cost.  */
724   2,                                    /* scalar_store_cost.  */
725   5,                                    /* vec_stmt_cost.  */
726   0,                                    /* vec_to_scalar_cost.  */
727   2,                                    /* scalar_to_vec_cost.  */
728   2,                                    /* vec_align_load_cost.  */
729   3,                                    /* vec_unalign_load_cost.  */
730   3,                                    /* vec_store_cost.  */
731   3,                                    /* cond_taken_branch_cost.  */
732   2,                                    /* cond_not_taken_branch_cost.  */
733 };
734
735 struct processor_costs amdfam10_cost = {
736   COSTS_N_INSNS (1),                    /* cost of an add instruction */
737   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
738   COSTS_N_INSNS (1),                    /* variable shift costs */
739   COSTS_N_INSNS (1),                    /* constant shift costs */
740   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
741    COSTS_N_INSNS (4),                   /*                               HI */
742    COSTS_N_INSNS (3),                   /*                               SI */
743    COSTS_N_INSNS (4),                   /*                               DI */
744    COSTS_N_INSNS (5)},                  /*                               other */
745   0,                                    /* cost of multiply per each bit set */
746   {COSTS_N_INSNS (19),                  /* cost of a divide/mod for QI */
747    COSTS_N_INSNS (35),                  /*                          HI */
748    COSTS_N_INSNS (51),                  /*                          SI */
749    COSTS_N_INSNS (83),                  /*                          DI */
750    COSTS_N_INSNS (83)},                 /*                          other */
751   COSTS_N_INSNS (1),                    /* cost of movsx */
752   COSTS_N_INSNS (1),                    /* cost of movzx */
753   8,                                    /* "large" insn */
754   9,                                    /* MOVE_RATIO */
755   4,                                    /* cost for loading QImode using movzbl */
756   {3, 4, 3},                            /* cost of loading integer registers
757                                            in QImode, HImode and SImode.
758                                            Relative to reg-reg move (2).  */
759   {3, 4, 3},                            /* cost of storing integer registers */
760   4,                                    /* cost of reg,reg fld/fst */
761   {4, 4, 12},                           /* cost of loading fp registers
762                                            in SFmode, DFmode and XFmode */
763   {6, 6, 8},                            /* cost of storing fp registers
764                                            in SFmode, DFmode and XFmode */
765   2,                                    /* cost of moving MMX register */
766   {3, 3},                               /* cost of loading MMX registers
767                                            in SImode and DImode */
768   {4, 4},                               /* cost of storing MMX registers
769                                            in SImode and DImode */
770   2,                                    /* cost of moving SSE register */
771   {4, 4, 3},                            /* cost of loading SSE registers
772                                            in SImode, DImode and TImode */
773   {4, 4, 5},                            /* cost of storing SSE registers
774                                            in SImode, DImode and TImode */
775   3,                                    /* MMX or SSE register to integer */
776                                         /* On K8
777                                             MOVD reg64, xmmreg  Double  FSTORE 4
778                                             MOVD reg32, xmmreg  Double  FSTORE 4
779                                            On AMDFAM10
780                                             MOVD reg64, xmmreg  Double  FADD 3
781                                                                 1/1  1/1
782                                             MOVD reg32, xmmreg  Double  FADD 3
783                                                                 1/1  1/1 */
784   64,                                   /* size of l1 cache.  */
785   512,                                  /* size of l2 cache.  */
786   64,                                   /* size of prefetch block */
787   /* New AMD processors never drop prefetches; if they cannot be performed
788      immediately, they are queued.  We set number of simultaneous prefetches
789      to a large constant to reflect this (it probably is not a good idea not
790      to limit number of prefetches at all, as their execution also takes some
791      time).  */
792   100,                                  /* number of parallel prefetches */
793   2,                                    /* Branch cost */
794   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
795   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
796   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
797   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
798   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
799   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
800
801   /* AMDFAM10 has optimized REP instruction for medium sized blocks, but for
802      very small blocks it is better to use loop. For large blocks, libcall can
803      do nontemporary accesses and beat inline considerably.  */
804   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
805    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
806   {{libcall, {{8, loop}, {24, unrolled_loop},
807               {2048, rep_prefix_4_byte}, {-1, libcall}}},
808    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
809   4,                                    /* scalar_stmt_cost.  */
810   2,                                    /* scalar load_cost.  */
811   2,                                    /* scalar_store_cost.  */
812   6,                                    /* vec_stmt_cost.  */
813   0,                                    /* vec_to_scalar_cost.  */
814   2,                                    /* scalar_to_vec_cost.  */
815   2,                                    /* vec_align_load_cost.  */
816   2,                                    /* vec_unalign_load_cost.  */
817   2,                                    /* vec_store_cost.  */
818   2,                                    /* cond_taken_branch_cost.  */
819   1,                                    /* cond_not_taken_branch_cost.  */
820 };
821
822 static const
823 struct processor_costs pentium4_cost = {
824   COSTS_N_INSNS (1),                    /* cost of an add instruction */
825   COSTS_N_INSNS (3),                    /* cost of a lea instruction */
826   COSTS_N_INSNS (4),                    /* variable shift costs */
827   COSTS_N_INSNS (4),                    /* constant shift costs */
828   {COSTS_N_INSNS (15),                  /* cost of starting multiply for QI */
829    COSTS_N_INSNS (15),                  /*                               HI */
830    COSTS_N_INSNS (15),                  /*                               SI */
831    COSTS_N_INSNS (15),                  /*                               DI */
832    COSTS_N_INSNS (15)},                 /*                               other */
833   0,                                    /* cost of multiply per each bit set */
834   {COSTS_N_INSNS (56),                  /* cost of a divide/mod for QI */
835    COSTS_N_INSNS (56),                  /*                          HI */
836    COSTS_N_INSNS (56),                  /*                          SI */
837    COSTS_N_INSNS (56),                  /*                          DI */
838    COSTS_N_INSNS (56)},                 /*                          other */
839   COSTS_N_INSNS (1),                    /* cost of movsx */
840   COSTS_N_INSNS (1),                    /* cost of movzx */
841   16,                                   /* "large" insn */
842   6,                                    /* MOVE_RATIO */
843   2,                                    /* cost for loading QImode using movzbl */
844   {4, 5, 4},                            /* cost of loading integer registers
845                                            in QImode, HImode and SImode.
846                                            Relative to reg-reg move (2).  */
847   {2, 3, 2},                            /* cost of storing integer registers */
848   2,                                    /* cost of reg,reg fld/fst */
849   {2, 2, 6},                            /* cost of loading fp registers
850                                            in SFmode, DFmode and XFmode */
851   {4, 4, 6},                            /* cost of storing fp registers
852                                            in SFmode, DFmode and XFmode */
853   2,                                    /* cost of moving MMX register */
854   {2, 2},                               /* cost of loading MMX registers
855                                            in SImode and DImode */
856   {2, 2},                               /* cost of storing MMX registers
857                                            in SImode and DImode */
858   12,                                   /* cost of moving SSE register */
859   {12, 12, 12},                         /* cost of loading SSE registers
860                                            in SImode, DImode and TImode */
861   {2, 2, 8},                            /* cost of storing SSE registers
862                                            in SImode, DImode and TImode */
863   10,                                   /* MMX or SSE register to integer */
864   8,                                    /* size of l1 cache.  */
865   256,                                  /* size of l2 cache.  */
866   64,                                   /* size of prefetch block */
867   6,                                    /* number of parallel prefetches */
868   2,                                    /* Branch cost */
869   COSTS_N_INSNS (5),                    /* cost of FADD and FSUB insns.  */
870   COSTS_N_INSNS (7),                    /* cost of FMUL instruction.  */
871   COSTS_N_INSNS (43),                   /* cost of FDIV instruction.  */
872   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
873   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
874   COSTS_N_INSNS (43),                   /* cost of FSQRT instruction.  */
875   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
876    DUMMY_STRINGOP_ALGS},
877   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
878    {-1, libcall}}},
879    DUMMY_STRINGOP_ALGS},
880   1,                                    /* scalar_stmt_cost.  */
881   1,                                    /* scalar load_cost.  */
882   1,                                    /* scalar_store_cost.  */
883   1,                                    /* vec_stmt_cost.  */
884   1,                                    /* vec_to_scalar_cost.  */
885   1,                                    /* scalar_to_vec_cost.  */
886   1,                                    /* vec_align_load_cost.  */
887   2,                                    /* vec_unalign_load_cost.  */
888   1,                                    /* vec_store_cost.  */
889   3,                                    /* cond_taken_branch_cost.  */
890   1,                                    /* cond_not_taken_branch_cost.  */
891 };
892
893 static const
894 struct processor_costs nocona_cost = {
895   COSTS_N_INSNS (1),                    /* cost of an add instruction */
896   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
897   COSTS_N_INSNS (1),                    /* variable shift costs */
898   COSTS_N_INSNS (1),                    /* constant shift costs */
899   {COSTS_N_INSNS (10),                  /* cost of starting multiply for QI */
900    COSTS_N_INSNS (10),                  /*                               HI */
901    COSTS_N_INSNS (10),                  /*                               SI */
902    COSTS_N_INSNS (10),                  /*                               DI */
903    COSTS_N_INSNS (10)},                 /*                               other */
904   0,                                    /* cost of multiply per each bit set */
905   {COSTS_N_INSNS (66),                  /* cost of a divide/mod for QI */
906    COSTS_N_INSNS (66),                  /*                          HI */
907    COSTS_N_INSNS (66),                  /*                          SI */
908    COSTS_N_INSNS (66),                  /*                          DI */
909    COSTS_N_INSNS (66)},                 /*                          other */
910   COSTS_N_INSNS (1),                    /* cost of movsx */
911   COSTS_N_INSNS (1),                    /* cost of movzx */
912   16,                                   /* "large" insn */
913   17,                                   /* MOVE_RATIO */
914   4,                                    /* cost for loading QImode using movzbl */
915   {4, 4, 4},                            /* cost of loading integer registers
916                                            in QImode, HImode and SImode.
917                                            Relative to reg-reg move (2).  */
918   {4, 4, 4},                            /* cost of storing integer registers */
919   3,                                    /* cost of reg,reg fld/fst */
920   {12, 12, 12},                         /* cost of loading fp registers
921                                            in SFmode, DFmode and XFmode */
922   {4, 4, 4},                            /* cost of storing fp registers
923                                            in SFmode, DFmode and XFmode */
924   6,                                    /* cost of moving MMX register */
925   {12, 12},                             /* cost of loading MMX registers
926                                            in SImode and DImode */
927   {12, 12},                             /* cost of storing MMX registers
928                                            in SImode and DImode */
929   6,                                    /* cost of moving SSE register */
930   {12, 12, 12},                         /* cost of loading SSE registers
931                                            in SImode, DImode and TImode */
932   {12, 12, 12},                         /* cost of storing SSE registers
933                                            in SImode, DImode and TImode */
934   8,                                    /* MMX or SSE register to integer */
935   8,                                    /* size of l1 cache.  */
936   1024,                                 /* size of l2 cache.  */
937   128,                                  /* size of prefetch block */
938   8,                                    /* number of parallel prefetches */
939   1,                                    /* Branch cost */
940   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
941   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
942   COSTS_N_INSNS (40),                   /* cost of FDIV instruction.  */
943   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
944   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
945   COSTS_N_INSNS (44),                   /* cost of FSQRT instruction.  */
946   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
947    {libcall, {{32, loop}, {20000, rep_prefix_8_byte},
948               {100000, unrolled_loop}, {-1, libcall}}}},
949   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
950    {-1, libcall}}},
951    {libcall, {{24, loop}, {64, unrolled_loop},
952               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
953   1,                                    /* scalar_stmt_cost.  */
954   1,                                    /* scalar load_cost.  */
955   1,                                    /* scalar_store_cost.  */
956   1,                                    /* vec_stmt_cost.  */
957   1,                                    /* vec_to_scalar_cost.  */
958   1,                                    /* scalar_to_vec_cost.  */
959   1,                                    /* vec_align_load_cost.  */
960   2,                                    /* vec_unalign_load_cost.  */
961   1,                                    /* vec_store_cost.  */
962   3,                                    /* cond_taken_branch_cost.  */
963   1,                                    /* cond_not_taken_branch_cost.  */
964 };
965
966 static const
967 struct processor_costs core2_cost = {
968   COSTS_N_INSNS (1),                    /* cost of an add instruction */
969   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
970   COSTS_N_INSNS (1),                    /* variable shift costs */
971   COSTS_N_INSNS (1),                    /* constant shift costs */
972   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
973    COSTS_N_INSNS (3),                   /*                               HI */
974    COSTS_N_INSNS (3),                   /*                               SI */
975    COSTS_N_INSNS (3),                   /*                               DI */
976    COSTS_N_INSNS (3)},                  /*                               other */
977   0,                                    /* cost of multiply per each bit set */
978   {COSTS_N_INSNS (22),                  /* cost of a divide/mod for QI */
979    COSTS_N_INSNS (22),                  /*                          HI */
980    COSTS_N_INSNS (22),                  /*                          SI */
981    COSTS_N_INSNS (22),                  /*                          DI */
982    COSTS_N_INSNS (22)},                 /*                          other */
983   COSTS_N_INSNS (1),                    /* cost of movsx */
984   COSTS_N_INSNS (1),                    /* cost of movzx */
985   8,                                    /* "large" insn */
986   16,                                   /* MOVE_RATIO */
987   2,                                    /* cost for loading QImode using movzbl */
988   {6, 6, 6},                            /* cost of loading integer registers
989                                            in QImode, HImode and SImode.
990                                            Relative to reg-reg move (2).  */
991   {4, 4, 4},                            /* cost of storing integer registers */
992   2,                                    /* cost of reg,reg fld/fst */
993   {6, 6, 6},                            /* cost of loading fp registers
994                                            in SFmode, DFmode and XFmode */
995   {4, 4, 4},                            /* cost of storing fp registers
996                                            in SFmode, DFmode and XFmode */
997   2,                                    /* cost of moving MMX register */
998   {6, 6},                               /* cost of loading MMX registers
999                                            in SImode and DImode */
1000   {4, 4},                               /* cost of storing MMX registers
1001                                            in SImode and DImode */
1002   2,                                    /* cost of moving SSE register */
1003   {6, 6, 6},                            /* cost of loading SSE registers
1004                                            in SImode, DImode and TImode */
1005   {4, 4, 4},                            /* cost of storing SSE registers
1006                                            in SImode, DImode and TImode */
1007   2,                                    /* MMX or SSE register to integer */
1008   32,                                   /* size of l1 cache.  */
1009   2048,                                 /* size of l2 cache.  */
1010   128,                                  /* size of prefetch block */
1011   8,                                    /* number of parallel prefetches */
1012   3,                                    /* Branch cost */
1013   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
1014   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
1015   COSTS_N_INSNS (32),                   /* cost of FDIV instruction.  */
1016   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
1017   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
1018   COSTS_N_INSNS (58),                   /* cost of FSQRT instruction.  */
1019   {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
1020    {libcall, {{32, loop}, {64, rep_prefix_4_byte},
1021               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1022   {{libcall, {{8, loop}, {15, unrolled_loop},
1023               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1024    {libcall, {{24, loop}, {32, unrolled_loop},
1025               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1026   1,                                    /* scalar_stmt_cost.  */
1027   1,                                    /* scalar load_cost.  */
1028   1,                                    /* scalar_store_cost.  */
1029   1,                                    /* vec_stmt_cost.  */
1030   1,                                    /* vec_to_scalar_cost.  */
1031   1,                                    /* scalar_to_vec_cost.  */
1032   1,                                    /* vec_align_load_cost.  */
1033   2,                                    /* vec_unalign_load_cost.  */
1034   1,                                    /* vec_store_cost.  */
1035   3,                                    /* cond_taken_branch_cost.  */
1036   1,                                    /* cond_not_taken_branch_cost.  */
1037 };
1038
1039 /* Generic64 should produce code tuned for Nocona and K8.  */
1040 static const
1041 struct processor_costs generic64_cost = {
1042   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1043   /* On all chips taken into consideration lea is 2 cycles and more.  With
1044      this cost however our current implementation of synth_mult results in
1045      use of unnecessary temporary registers causing regression on several
1046      SPECfp benchmarks.  */
1047   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1048   COSTS_N_INSNS (1),                    /* variable shift costs */
1049   COSTS_N_INSNS (1),                    /* constant shift costs */
1050   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1051    COSTS_N_INSNS (4),                   /*                               HI */
1052    COSTS_N_INSNS (3),                   /*                               SI */
1053    COSTS_N_INSNS (4),                   /*                               DI */
1054    COSTS_N_INSNS (2)},                  /*                               other */
1055   0,                                    /* cost of multiply per each bit set */
1056   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1057    COSTS_N_INSNS (26),                  /*                          HI */
1058    COSTS_N_INSNS (42),                  /*                          SI */
1059    COSTS_N_INSNS (74),                  /*                          DI */
1060    COSTS_N_INSNS (74)},                 /*                          other */
1061   COSTS_N_INSNS (1),                    /* cost of movsx */
1062   COSTS_N_INSNS (1),                    /* cost of movzx */
1063   8,                                    /* "large" insn */
1064   17,                                   /* MOVE_RATIO */
1065   4,                                    /* cost for loading QImode using movzbl */
1066   {4, 4, 4},                            /* cost of loading integer registers
1067                                            in QImode, HImode and SImode.
1068                                            Relative to reg-reg move (2).  */
1069   {4, 4, 4},                            /* cost of storing integer registers */
1070   4,                                    /* cost of reg,reg fld/fst */
1071   {12, 12, 12},                         /* cost of loading fp registers
1072                                            in SFmode, DFmode and XFmode */
1073   {6, 6, 8},                            /* cost of storing fp registers
1074                                            in SFmode, DFmode and XFmode */
1075   2,                                    /* cost of moving MMX register */
1076   {8, 8},                               /* cost of loading MMX registers
1077                                            in SImode and DImode */
1078   {8, 8},                               /* cost of storing MMX registers
1079                                            in SImode and DImode */
1080   2,                                    /* cost of moving SSE register */
1081   {8, 8, 8},                            /* cost of loading SSE registers
1082                                            in SImode, DImode and TImode */
1083   {8, 8, 8},                            /* cost of storing SSE registers
1084                                            in SImode, DImode and TImode */
1085   5,                                    /* MMX or SSE register to integer */
1086   32,                                   /* size of l1 cache.  */
1087   512,                                  /* size of l2 cache.  */
1088   64,                                   /* size of prefetch block */
1089   6,                                    /* number of parallel prefetches */
1090   /* Benchmarks shows large regressions on K8 sixtrack benchmark when this value
1091      is increased to perhaps more appropriate value of 5.  */
1092   3,                                    /* Branch cost */
1093   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1094   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1095   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1096   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1097   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1098   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1099   {DUMMY_STRINGOP_ALGS,
1100    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1101   {DUMMY_STRINGOP_ALGS,
1102    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1103   1,                                    /* scalar_stmt_cost.  */
1104   1,                                    /* scalar load_cost.  */
1105   1,                                    /* scalar_store_cost.  */
1106   1,                                    /* vec_stmt_cost.  */
1107   1,                                    /* vec_to_scalar_cost.  */
1108   1,                                    /* scalar_to_vec_cost.  */
1109   1,                                    /* vec_align_load_cost.  */
1110   2,                                    /* vec_unalign_load_cost.  */
1111   1,                                    /* vec_store_cost.  */
1112   3,                                    /* cond_taken_branch_cost.  */
1113   1,                                    /* cond_not_taken_branch_cost.  */
1114 };
1115
1116 /* Generic32 should produce code tuned for Athlon, PPro, Pentium4, Nocona and K8.  */
1117 static const
1118 struct processor_costs generic32_cost = {
1119   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1120   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1121   COSTS_N_INSNS (1),                    /* variable shift costs */
1122   COSTS_N_INSNS (1),                    /* constant shift costs */
1123   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1124    COSTS_N_INSNS (4),                   /*                               HI */
1125    COSTS_N_INSNS (3),                   /*                               SI */
1126    COSTS_N_INSNS (4),                   /*                               DI */
1127    COSTS_N_INSNS (2)},                  /*                               other */
1128   0,                                    /* cost of multiply per each bit set */
1129   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1130    COSTS_N_INSNS (26),                  /*                          HI */
1131    COSTS_N_INSNS (42),                  /*                          SI */
1132    COSTS_N_INSNS (74),                  /*                          DI */
1133    COSTS_N_INSNS (74)},                 /*                          other */
1134   COSTS_N_INSNS (1),                    /* cost of movsx */
1135   COSTS_N_INSNS (1),                    /* cost of movzx */
1136   8,                                    /* "large" insn */
1137   17,                                   /* MOVE_RATIO */
1138   4,                                    /* cost for loading QImode using movzbl */
1139   {4, 4, 4},                            /* cost of loading integer registers
1140                                            in QImode, HImode and SImode.
1141                                            Relative to reg-reg move (2).  */
1142   {4, 4, 4},                            /* cost of storing integer registers */
1143   4,                                    /* cost of reg,reg fld/fst */
1144   {12, 12, 12},                         /* cost of loading fp registers
1145                                            in SFmode, DFmode and XFmode */
1146   {6, 6, 8},                            /* cost of storing fp registers
1147                                            in SFmode, DFmode and XFmode */
1148   2,                                    /* cost of moving MMX register */
1149   {8, 8},                               /* cost of loading MMX registers
1150                                            in SImode and DImode */
1151   {8, 8},                               /* cost of storing MMX registers
1152                                            in SImode and DImode */
1153   2,                                    /* cost of moving SSE register */
1154   {8, 8, 8},                            /* cost of loading SSE registers
1155                                            in SImode, DImode and TImode */
1156   {8, 8, 8},                            /* cost of storing SSE registers
1157                                            in SImode, DImode and TImode */
1158   5,                                    /* MMX or SSE register to integer */
1159   32,                                   /* size of l1 cache.  */
1160   256,                                  /* size of l2 cache.  */
1161   64,                                   /* size of prefetch block */
1162   6,                                    /* number of parallel prefetches */
1163   3,                                    /* Branch cost */
1164   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1165   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1166   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1167   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1168   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1169   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1170   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1171    DUMMY_STRINGOP_ALGS},
1172   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1173    DUMMY_STRINGOP_ALGS},
1174   1,                                    /* scalar_stmt_cost.  */
1175   1,                                    /* scalar load_cost.  */
1176   1,                                    /* scalar_store_cost.  */
1177   1,                                    /* vec_stmt_cost.  */
1178   1,                                    /* vec_to_scalar_cost.  */
1179   1,                                    /* scalar_to_vec_cost.  */
1180   1,                                    /* vec_align_load_cost.  */
1181   2,                                    /* vec_unalign_load_cost.  */
1182   1,                                    /* vec_store_cost.  */
1183   3,                                    /* cond_taken_branch_cost.  */
1184   1,                                    /* cond_not_taken_branch_cost.  */
1185 };
1186
1187 const struct processor_costs *ix86_cost = &pentium_cost;
1188
1189 /* Processor feature/optimization bitmasks.  */
1190 #define m_386 (1<<PROCESSOR_I386)
1191 #define m_486 (1<<PROCESSOR_I486)
1192 #define m_PENT (1<<PROCESSOR_PENTIUM)
1193 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
1194 #define m_PENT4  (1<<PROCESSOR_PENTIUM4)
1195 #define m_NOCONA  (1<<PROCESSOR_NOCONA)
1196 #define m_CORE2  (1<<PROCESSOR_CORE2)
1197
1198 #define m_GEODE  (1<<PROCESSOR_GEODE)
1199 #define m_K6  (1<<PROCESSOR_K6)
1200 #define m_K6_GEODE  (m_K6 | m_GEODE)
1201 #define m_K8  (1<<PROCESSOR_K8)
1202 #define m_ATHLON  (1<<PROCESSOR_ATHLON)
1203 #define m_ATHLON_K8  (m_K8 | m_ATHLON)
1204 #define m_AMDFAM10  (1<<PROCESSOR_AMDFAM10)
1205 #define m_AMD_MULTIPLE  (m_K8 | m_ATHLON | m_AMDFAM10)
1206
1207 #define m_GENERIC32 (1<<PROCESSOR_GENERIC32)
1208 #define m_GENERIC64 (1<<PROCESSOR_GENERIC64)
1209
1210 /* Generic instruction choice should be common subset of supported CPUs
1211    (PPro/PENT4/NOCONA/CORE2/Athlon/K8).  */
1212 #define m_GENERIC (m_GENERIC32 | m_GENERIC64)
1213
1214 /* Feature tests against the various tunings.  */
1215 unsigned char ix86_tune_features[X86_TUNE_LAST];
1216
1217 /* Feature tests against the various tunings used to create ix86_tune_features
1218    based on the processor mask.  */
1219 static unsigned int initial_ix86_tune_features[X86_TUNE_LAST] = {
1220   /* X86_TUNE_USE_LEAVE: Leave does not affect Nocona SPEC2000 results
1221      negatively, so enabling for Generic64 seems like good code size
1222      tradeoff.  We can't enable it for 32bit generic because it does not
1223      work well with PPro base chips.  */
1224   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_CORE2 | m_GENERIC64,
1225
1226   /* X86_TUNE_PUSH_MEMORY */
1227   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4
1228   | m_NOCONA | m_CORE2 | m_GENERIC,
1229
1230   /* X86_TUNE_ZERO_EXTEND_WITH_AND */
1231   m_486 | m_PENT,
1232
1233   /* X86_TUNE_UNROLL_STRLEN */
1234   m_486 | m_PENT | m_PPRO | m_AMD_MULTIPLE | m_K6 | m_CORE2 | m_GENERIC,
1235
1236   /* X86_TUNE_DEEP_BRANCH_PREDICTION */
1237   m_PPRO | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4 | m_GENERIC,
1238
1239   /* X86_TUNE_BRANCH_PREDICTION_HINTS: Branch hints were put in P4 based
1240      on simulation result. But after P4 was made, no performance benefit
1241      was observed with branch hints.  It also increases the code size.
1242      As a result, icc never generates branch hints.  */
1243   0,
1244
1245   /* X86_TUNE_DOUBLE_WITH_ADD */
1246   ~m_386,
1247
1248   /* X86_TUNE_USE_SAHF */
1249   m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
1250   | m_NOCONA | m_CORE2 | m_GENERIC,
1251
1252   /* X86_TUNE_MOVX: Enable to zero extend integer registers to avoid
1253      partial dependencies.  */
1254   m_AMD_MULTIPLE | m_PPRO | m_PENT4 | m_NOCONA
1255   | m_CORE2 | m_GENERIC | m_GEODE /* m_386 | m_K6 */,
1256
1257   /* X86_TUNE_PARTIAL_REG_STALL: We probably ought to watch for partial
1258      register stalls on Generic32 compilation setting as well.  However
1259      in current implementation the partial register stalls are not eliminated
1260      very well - they can be introduced via subregs synthesized by combine
1261      and can happen in caller/callee saving sequences.  Because this option
1262      pays back little on PPro based chips and is in conflict with partial reg
1263      dependencies used by Athlon/P4 based chips, it is better to leave it off
1264      for generic32 for now.  */
1265   m_PPRO,
1266
1267   /* X86_TUNE_PARTIAL_FLAG_REG_STALL */
1268   m_CORE2 | m_GENERIC,
1269
1270   /* X86_TUNE_USE_HIMODE_FIOP */
1271   m_386 | m_486 | m_K6_GEODE,
1272
1273   /* X86_TUNE_USE_SIMODE_FIOP */
1274   ~(m_PPRO | m_AMD_MULTIPLE | m_PENT | m_CORE2 | m_GENERIC),
1275
1276   /* X86_TUNE_USE_MOV0 */
1277   m_K6,
1278
1279   /* X86_TUNE_USE_CLTD */
1280   ~(m_PENT | m_K6 | m_CORE2 | m_GENERIC),
1281
1282   /* X86_TUNE_USE_XCHGB: Use xchgb %rh,%rl instead of rolw/rorw $8,rx.  */
1283   m_PENT4,
1284
1285   /* X86_TUNE_SPLIT_LONG_MOVES */
1286   m_PPRO,
1287
1288   /* X86_TUNE_READ_MODIFY_WRITE */
1289   ~m_PENT,
1290
1291   /* X86_TUNE_READ_MODIFY */
1292   ~(m_PENT | m_PPRO),
1293
1294   /* X86_TUNE_PROMOTE_QIMODE */
1295   m_K6_GEODE | m_PENT | m_386 | m_486 | m_AMD_MULTIPLE | m_CORE2
1296   | m_GENERIC /* | m_PENT4 ? */,
1297
1298   /* X86_TUNE_FAST_PREFIX */
1299   ~(m_PENT | m_486 | m_386),
1300
1301   /* X86_TUNE_SINGLE_STRINGOP */
1302   m_386 | m_PENT4 | m_NOCONA,
1303
1304   /* X86_TUNE_QIMODE_MATH */
1305   ~0,
1306
1307   /* X86_TUNE_HIMODE_MATH: On PPro this flag is meant to avoid partial
1308      register stalls.  Just like X86_TUNE_PARTIAL_REG_STALL this option
1309      might be considered for Generic32 if our scheme for avoiding partial
1310      stalls was more effective.  */
1311   ~m_PPRO,
1312
1313   /* X86_TUNE_PROMOTE_QI_REGS */
1314   0,
1315
1316   /* X86_TUNE_PROMOTE_HI_REGS */
1317   m_PPRO,
1318
1319   /* X86_TUNE_ADD_ESP_4: Enable if add/sub is preferred over 1/2 push/pop.  */
1320   m_AMD_MULTIPLE | m_K6_GEODE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1321
1322   /* X86_TUNE_ADD_ESP_8 */
1323   m_AMD_MULTIPLE | m_PPRO | m_K6_GEODE | m_386
1324   | m_486 | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1325
1326   /* X86_TUNE_SUB_ESP_4 */
1327   m_AMD_MULTIPLE | m_PPRO | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1328
1329   /* X86_TUNE_SUB_ESP_8 */
1330   m_AMD_MULTIPLE | m_PPRO | m_386 | m_486
1331   | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1332
1333   /* X86_TUNE_INTEGER_DFMODE_MOVES: Enable if integer moves are preferred
1334      for DFmode copies */
1335   ~(m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
1336     | m_GENERIC | m_GEODE),
1337
1338   /* X86_TUNE_PARTIAL_REG_DEPENDENCY */
1339   m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1340
1341   /* X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY: In the Generic model we have a
1342      conflict here in between PPro/Pentium4 based chips that thread 128bit
1343      SSE registers as single units versus K8 based chips that divide SSE
1344      registers to two 64bit halves.  This knob promotes all store destinations
1345      to be 128bit to allow register renaming on 128bit SSE units, but usually
1346      results in one extra microop on 64bit SSE units.  Experimental results
1347      shows that disabling this option on P4 brings over 20% SPECfp regression,
1348      while enabling it on K8 brings roughly 2.4% regression that can be partly
1349      masked by careful scheduling of moves.  */
1350   m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC | m_AMDFAM10,
1351
1352   /* X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL */
1353   m_AMDFAM10,
1354
1355   /* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
1356      are resolved on SSE register parts instead of whole registers, so we may
1357      maintain just lower part of scalar values in proper format leaving the
1358      upper part undefined.  */
1359   m_ATHLON_K8,
1360
1361   /* X86_TUNE_SSE_TYPELESS_STORES */
1362   m_AMD_MULTIPLE,
1363
1364   /* X86_TUNE_SSE_LOAD0_BY_PXOR */
1365   m_PPRO | m_PENT4 | m_NOCONA,
1366
1367   /* X86_TUNE_MEMORY_MISMATCH_STALL */
1368   m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1369
1370   /* X86_TUNE_PROLOGUE_USING_MOVE */
1371   m_ATHLON_K8 | m_PPRO | m_CORE2 | m_GENERIC,
1372
1373   /* X86_TUNE_EPILOGUE_USING_MOVE */
1374   m_ATHLON_K8 | m_PPRO | m_CORE2 | m_GENERIC,
1375
1376   /* X86_TUNE_SHIFT1 */
1377   ~m_486,
1378
1379   /* X86_TUNE_USE_FFREEP */
1380   m_AMD_MULTIPLE,
1381
1382   /* X86_TUNE_INTER_UNIT_MOVES */
1383   ~(m_AMD_MULTIPLE | m_GENERIC),
1384
1385   /* X86_TUNE_INTER_UNIT_CONVERSIONS */
1386   ~(m_AMDFAM10),
1387
1388   /* X86_TUNE_FOUR_JUMP_LIMIT: Some CPU cores are not able to predict more
1389      than 4 branch instructions in the 16 byte window.  */
1390   m_PPRO | m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1391
1392   /* X86_TUNE_SCHEDULE */
1393   m_PPRO | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT | m_CORE2 | m_GENERIC,
1394
1395   /* X86_TUNE_USE_BT */
1396   m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
1397
1398   /* X86_TUNE_USE_INCDEC */
1399   ~(m_PENT4 | m_NOCONA | m_GENERIC),
1400
1401   /* X86_TUNE_PAD_RETURNS */
1402   m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
1403
1404   /* X86_TUNE_EXT_80387_CONSTANTS */
1405   m_K6_GEODE | m_ATHLON_K8 | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC,
1406
1407   /* X86_TUNE_SHORTEN_X87_SSE */
1408   ~m_K8,
1409
1410   /* X86_TUNE_AVOID_VECTOR_DECODE */
1411   m_K8 | m_GENERIC64,
1412
1413   /* X86_TUNE_PROMOTE_HIMODE_IMUL: Modern CPUs have same latency for HImode
1414      and SImode multiply, but 386 and 486 do HImode multiply faster.  */
1415   ~(m_386 | m_486),
1416
1417   /* X86_TUNE_SLOW_IMUL_IMM32_MEM: Imul of 32-bit constant and memory is
1418      vector path on AMD machines.  */
1419   m_K8 | m_GENERIC64 | m_AMDFAM10,
1420
1421   /* X86_TUNE_SLOW_IMUL_IMM8: Imul of 8-bit constant is vector path on AMD
1422      machines.  */
1423   m_K8 | m_GENERIC64 | m_AMDFAM10,
1424
1425   /* X86_TUNE_MOVE_M1_VIA_OR: On pentiums, it is faster to load -1 via OR
1426      than a MOV.  */
1427   m_PENT,
1428
1429   /* X86_TUNE_NOT_UNPAIRABLE: NOT is not pairable on Pentium, while XOR is,
1430      but one byte longer.  */
1431   m_PENT,
1432
1433   /* X86_TUNE_NOT_VECTORMODE: On AMD K6, NOT is vector decoded with memory
1434      operand that cannot be represented using a modRM byte.  The XOR
1435      replacement is long decoded, so this split helps here as well.  */
1436   m_K6,
1437
1438   /* X86_TUNE_USE_VECTOR_FP_CONVERTS: Prefer vector packed SSE conversion
1439      from FP to FP. */
1440   m_AMDFAM10 | m_GENERIC,
1441
1442   /* X86_TUNE_USE_VECTOR_CONVERTS: Prefer vector packed SSE conversion
1443      from integer to FP. */
1444   m_AMDFAM10,
1445
1446   /* X86_TUNE_FUSE_CMP_AND_BRANCH: Fuse a compare or test instruction
1447      with a subsequent conditional jump instruction into a single
1448      compare-and-branch uop.  */
1449   m_CORE2,
1450 };
1451
1452 /* Feature tests against the various architecture variations.  */
1453 unsigned char ix86_arch_features[X86_ARCH_LAST];
1454
1455 /* Feature tests against the various architecture variations, used to create
1456    ix86_arch_features based on the processor mask.  */
1457 static unsigned int initial_ix86_arch_features[X86_ARCH_LAST] = {
1458   /* X86_ARCH_CMOVE: Conditional move was added for pentiumpro.  */
1459   ~(m_386 | m_486 | m_PENT | m_K6),
1460
1461   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
1462   ~m_386,
1463
1464   /* X86_ARCH_CMPXCHG8B: Compare and exchange 8 bytes was added for pentium. */
1465   ~(m_386 | m_486),
1466
1467   /* X86_ARCH_XADD: Exchange and add was added for 80486.  */
1468   ~m_386,
1469
1470   /* X86_ARCH_BSWAP: Byteswap was added for 80486.  */
1471   ~m_386,
1472 };
1473
1474 static const unsigned int x86_accumulate_outgoing_args
1475   = m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC;
1476
1477 static const unsigned int x86_arch_always_fancy_math_387
1478   = m_PENT | m_PPRO | m_AMD_MULTIPLE | m_PENT4
1479     | m_NOCONA | m_CORE2 | m_GENERIC;
1480
1481 static enum stringop_alg stringop_alg = no_stringop;
1482
1483 /* In case the average insn count for single function invocation is
1484    lower than this constant, emit fast (but longer) prologue and
1485    epilogue code.  */
1486 #define FAST_PROLOGUE_INSN_COUNT 20
1487
1488 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
1489 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
1490 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
1491 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
1492
1493 /* Array of the smallest class containing reg number REGNO, indexed by
1494    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
1495
1496 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
1497 {
1498   /* ax, dx, cx, bx */
1499   AREG, DREG, CREG, BREG,
1500   /* si, di, bp, sp */
1501   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
1502   /* FP registers */
1503   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
1504   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
1505   /* arg pointer */
1506   NON_Q_REGS,
1507   /* flags, fpsr, fpcr, frame */
1508   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
1509   /* SSE registers */
1510   SSE_FIRST_REG, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1511   SSE_REGS, SSE_REGS,
1512   /* MMX registers */
1513   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
1514   MMX_REGS, MMX_REGS,
1515   /* REX registers */
1516   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1517   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1518   /* SSE REX registers */
1519   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1520   SSE_REGS, SSE_REGS,
1521 };
1522
1523 /* The "default" register map used in 32bit mode.  */
1524
1525 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
1526 {
1527   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
1528   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
1529   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1530   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
1531   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
1532   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1533   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1534 };
1535
1536 /* The "default" register map used in 64bit mode.  */
1537
1538 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
1539 {
1540   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
1541   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
1542   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1543   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
1544   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
1545   8,9,10,11,12,13,14,15,                /* extended integer registers */
1546   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
1547 };
1548
1549 /* Define the register numbers to be used in Dwarf debugging information.
1550    The SVR4 reference port C compiler uses the following register numbers
1551    in its Dwarf output code:
1552         0 for %eax (gcc regno = 0)
1553         1 for %ecx (gcc regno = 2)
1554         2 for %edx (gcc regno = 1)
1555         3 for %ebx (gcc regno = 3)
1556         4 for %esp (gcc regno = 7)
1557         5 for %ebp (gcc regno = 6)
1558         6 for %esi (gcc regno = 4)
1559         7 for %edi (gcc regno = 5)
1560    The following three DWARF register numbers are never generated by
1561    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
1562    believes these numbers have these meanings.
1563         8  for %eip    (no gcc equivalent)
1564         9  for %eflags (gcc regno = 17)
1565         10 for %trapno (no gcc equivalent)
1566    It is not at all clear how we should number the FP stack registers
1567    for the x86 architecture.  If the version of SDB on x86/svr4 were
1568    a bit less brain dead with respect to floating-point then we would
1569    have a precedent to follow with respect to DWARF register numbers
1570    for x86 FP registers, but the SDB on x86/svr4 is so completely
1571    broken with respect to FP registers that it is hardly worth thinking
1572    of it as something to strive for compatibility with.
1573    The version of x86/svr4 SDB I have at the moment does (partially)
1574    seem to believe that DWARF register number 11 is associated with
1575    the x86 register %st(0), but that's about all.  Higher DWARF
1576    register numbers don't seem to be associated with anything in
1577    particular, and even for DWARF regno 11, SDB only seems to under-
1578    stand that it should say that a variable lives in %st(0) (when
1579    asked via an `=' command) if we said it was in DWARF regno 11,
1580    but SDB still prints garbage when asked for the value of the
1581    variable in question (via a `/' command).
1582    (Also note that the labels SDB prints for various FP stack regs
1583    when doing an `x' command are all wrong.)
1584    Note that these problems generally don't affect the native SVR4
1585    C compiler because it doesn't allow the use of -O with -g and
1586    because when it is *not* optimizing, it allocates a memory
1587    location for each floating-point variable, and the memory
1588    location is what gets described in the DWARF AT_location
1589    attribute for the variable in question.
1590    Regardless of the severe mental illness of the x86/svr4 SDB, we
1591    do something sensible here and we use the following DWARF
1592    register numbers.  Note that these are all stack-top-relative
1593    numbers.
1594         11 for %st(0) (gcc regno = 8)
1595         12 for %st(1) (gcc regno = 9)
1596         13 for %st(2) (gcc regno = 10)
1597         14 for %st(3) (gcc regno = 11)
1598         15 for %st(4) (gcc regno = 12)
1599         16 for %st(5) (gcc regno = 13)
1600         17 for %st(6) (gcc regno = 14)
1601         18 for %st(7) (gcc regno = 15)
1602 */
1603 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
1604 {
1605   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
1606   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
1607   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
1608   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
1609   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
1610   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1611   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1612 };
1613
1614 /* Test and compare insns in i386.md store the information needed to
1615    generate branch and scc insns here.  */
1616
1617 rtx ix86_compare_op0 = NULL_RTX;
1618 rtx ix86_compare_op1 = NULL_RTX;
1619 rtx ix86_compare_emitted = NULL_RTX;
1620
1621 /* Define parameter passing and return registers.  */
1622
1623 static int const x86_64_int_parameter_registers[6] =
1624 {
1625   DI_REG, SI_REG, DX_REG, CX_REG, R8_REG, R9_REG
1626 };
1627
1628 static int const x86_64_ms_abi_int_parameter_registers[4] =
1629 {
1630   CX_REG, DX_REG, R8_REG, R9_REG
1631 };
1632
1633 static int const x86_64_int_return_registers[4] =
1634 {
1635   AX_REG, DX_REG, DI_REG, SI_REG
1636 };
1637
1638 /* Define the structure for the machine field in struct function.  */
1639
1640 struct stack_local_entry GTY(())
1641 {
1642   unsigned short mode;
1643   unsigned short n;
1644   rtx rtl;
1645   struct stack_local_entry *next;
1646 };
1647
1648 /* Structure describing stack frame layout.
1649    Stack grows downward:
1650
1651    [arguments]
1652                                               <- ARG_POINTER
1653    saved pc
1654
1655    saved frame pointer if frame_pointer_needed
1656                                               <- HARD_FRAME_POINTER
1657    [saved regs]
1658
1659    [padding0]
1660
1661    [saved SSE regs]
1662
1663    [padding1]          \
1664                         )
1665    [va_arg registers]  (
1666                         > to_allocate         <- FRAME_POINTER
1667    [frame]             (
1668                         )
1669    [padding2]          /
1670   */
1671 struct ix86_frame
1672 {
1673   int padding0;
1674   int nsseregs;
1675   int nregs;
1676   int padding1;
1677   int va_arg_size;
1678   HOST_WIDE_INT frame;
1679   int padding2;
1680   int outgoing_arguments_size;
1681   int red_zone_size;
1682
1683   HOST_WIDE_INT to_allocate;
1684   /* The offsets relative to ARG_POINTER.  */
1685   HOST_WIDE_INT frame_pointer_offset;
1686   HOST_WIDE_INT hard_frame_pointer_offset;
1687   HOST_WIDE_INT stack_pointer_offset;
1688
1689   /* When save_regs_using_mov is set, emit prologue using
1690      move instead of push instructions.  */
1691   bool save_regs_using_mov;
1692 };
1693
1694 /* Code model option.  */
1695 enum cmodel ix86_cmodel;
1696 /* Asm dialect.  */
1697 enum asm_dialect ix86_asm_dialect = ASM_ATT;
1698 /* TLS dialects.  */
1699 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
1700
1701 /* Which unit we are generating floating point math for.  */
1702 enum fpmath_unit ix86_fpmath;
1703
1704 /* Which cpu are we scheduling for.  */
1705 enum attr_cpu ix86_schedule;
1706
1707 /* Which cpu are we optimizing for.  */
1708 enum processor_type ix86_tune;
1709
1710 /* Which instruction set architecture to use.  */
1711 enum processor_type ix86_arch;
1712
1713 /* true if sse prefetch instruction is not NOOP.  */
1714 int x86_prefetch_sse;
1715
1716 /* ix86_regparm_string as a number */
1717 static int ix86_regparm;
1718
1719 /* -mstackrealign option */
1720 extern int ix86_force_align_arg_pointer;
1721 static const char ix86_force_align_arg_pointer_string[]
1722   = "force_align_arg_pointer";
1723
1724 static rtx (*ix86_gen_leave) (void);
1725 static rtx (*ix86_gen_pop1) (rtx);
1726 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
1727 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
1728 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx);
1729 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
1730 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
1731 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
1732
1733 /* Preferred alignment for stack boundary in bits.  */
1734 unsigned int ix86_preferred_stack_boundary;
1735
1736 /* Alignment for incoming stack boundary in bits specified at
1737    command line.  */
1738 static unsigned int ix86_user_incoming_stack_boundary;
1739
1740 /* Default alignment for incoming stack boundary in bits.  */
1741 static unsigned int ix86_default_incoming_stack_boundary;
1742
1743 /* Alignment for incoming stack boundary in bits.  */
1744 unsigned int ix86_incoming_stack_boundary;
1745
1746 /* Values 1-5: see jump.c */
1747 int ix86_branch_cost;
1748
1749 /* Calling abi specific va_list type nodes.  */
1750 static GTY(()) tree sysv_va_list_type_node;
1751 static GTY(()) tree ms_va_list_type_node;
1752
1753 /* Variables which are this size or smaller are put in the data/bss
1754    or ldata/lbss sections.  */
1755
1756 int ix86_section_threshold = 65536;
1757
1758 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
1759 char internal_label_prefix[16];
1760 int internal_label_prefix_len;
1761
1762 /* Fence to use after loop using movnt.  */
1763 tree x86_mfence;
1764
1765 /* Register class used for passing given 64bit part of the argument.
1766    These represent classes as documented by the PS ABI, with the exception
1767    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
1768    use SF or DFmode move instead of DImode to avoid reformatting penalties.
1769
1770    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
1771    whenever possible (upper half does contain padding).  */
1772 enum x86_64_reg_class
1773   {
1774     X86_64_NO_CLASS,
1775     X86_64_INTEGER_CLASS,
1776     X86_64_INTEGERSI_CLASS,
1777     X86_64_SSE_CLASS,
1778     X86_64_SSESF_CLASS,
1779     X86_64_SSEDF_CLASS,
1780     X86_64_SSEUP_CLASS,
1781     X86_64_X87_CLASS,
1782     X86_64_X87UP_CLASS,
1783     X86_64_COMPLEX_X87_CLASS,
1784     X86_64_MEMORY_CLASS
1785   };
1786
1787 #define MAX_CLASSES 4
1788
1789 /* Table of constants used by fldpi, fldln2, etc....  */
1790 static REAL_VALUE_TYPE ext_80387_constants_table [5];
1791 static bool ext_80387_constants_init = 0;
1792
1793 \f
1794 static struct machine_function * ix86_init_machine_status (void);
1795 static rtx ix86_function_value (const_tree, const_tree, bool);
1796 static int ix86_function_regparm (const_tree, const_tree);
1797 static void ix86_compute_frame_layout (struct ix86_frame *);
1798 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
1799                                                  rtx, rtx, int);
1800 static void ix86_add_new_builtins (int);
1801
1802 enum ix86_function_specific_strings
1803 {
1804   IX86_FUNCTION_SPECIFIC_ARCH,
1805   IX86_FUNCTION_SPECIFIC_TUNE,
1806   IX86_FUNCTION_SPECIFIC_FPMATH,
1807   IX86_FUNCTION_SPECIFIC_MAX
1808 };
1809
1810 static char *ix86_target_string (int, int, const char *, const char *,
1811                                  const char *, bool);
1812 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
1813 static void ix86_function_specific_save (struct cl_target_option *);
1814 static void ix86_function_specific_restore (struct cl_target_option *);
1815 static void ix86_function_specific_print (FILE *, int,
1816                                           struct cl_target_option *);
1817 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
1818 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
1819 static bool ix86_can_inline_p (tree, tree);
1820 static void ix86_set_current_function (tree);
1821
1822 \f
1823 /* The svr4 ABI for the i386 says that records and unions are returned
1824    in memory.  */
1825 #ifndef DEFAULT_PCC_STRUCT_RETURN
1826 #define DEFAULT_PCC_STRUCT_RETURN 1
1827 #endif
1828
1829 /* Whether -mtune= or -march= were specified */
1830 static int ix86_tune_defaulted;
1831 static int ix86_arch_specified;
1832
1833 /* Bit flags that specify the ISA we are compiling for.  */
1834 int ix86_isa_flags = TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_ISA_DEFAULT;
1835
1836 /* A mask of ix86_isa_flags that includes bit X if X
1837    was set or cleared on the command line.  */
1838 static int ix86_isa_flags_explicit;
1839
1840 /* Define a set of ISAs which are available when a given ISA is
1841    enabled.  MMX and SSE ISAs are handled separately.  */
1842
1843 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
1844 #define OPTION_MASK_ISA_3DNOW_SET \
1845   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
1846
1847 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
1848 #define OPTION_MASK_ISA_SSE2_SET \
1849   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
1850 #define OPTION_MASK_ISA_SSE3_SET \
1851   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
1852 #define OPTION_MASK_ISA_SSSE3_SET \
1853   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
1854 #define OPTION_MASK_ISA_SSE4_1_SET \
1855   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
1856 #define OPTION_MASK_ISA_SSE4_2_SET \
1857   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
1858 #define OPTION_MASK_ISA_AVX_SET \
1859   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
1860 #define OPTION_MASK_ISA_FMA_SET \
1861   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
1862
1863 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
1864    as -msse4.2.  */
1865 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
1866
1867 #define OPTION_MASK_ISA_SSE4A_SET \
1868   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
1869 #define OPTION_MASK_ISA_SSE5_SET \
1870   (OPTION_MASK_ISA_SSE5 | OPTION_MASK_ISA_SSE4A_SET)
1871
1872 /* AES and PCLMUL need SSE2 because they use xmm registers */
1873 #define OPTION_MASK_ISA_AES_SET \
1874   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
1875 #define OPTION_MASK_ISA_PCLMUL_SET \
1876   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
1877
1878 #define OPTION_MASK_ISA_ABM_SET \
1879   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
1880 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
1881 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
1882 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
1883
1884 /* Define a set of ISAs which aren't available when a given ISA is
1885    disabled.  MMX and SSE ISAs are handled separately.  */
1886
1887 #define OPTION_MASK_ISA_MMX_UNSET \
1888   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
1889 #define OPTION_MASK_ISA_3DNOW_UNSET \
1890   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
1891 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
1892
1893 #define OPTION_MASK_ISA_SSE_UNSET \
1894   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
1895 #define OPTION_MASK_ISA_SSE2_UNSET \
1896   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
1897 #define OPTION_MASK_ISA_SSE3_UNSET \
1898   (OPTION_MASK_ISA_SSE3 \
1899    | OPTION_MASK_ISA_SSSE3_UNSET \
1900    | OPTION_MASK_ISA_SSE4A_UNSET )
1901 #define OPTION_MASK_ISA_SSSE3_UNSET \
1902   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
1903 #define OPTION_MASK_ISA_SSE4_1_UNSET \
1904   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
1905 #define OPTION_MASK_ISA_SSE4_2_UNSET \
1906   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
1907 #define OPTION_MASK_ISA_AVX_UNSET \
1908   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET)
1909 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
1910
1911 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
1912    as -mno-sse4.1. */
1913 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
1914
1915 #define OPTION_MASK_ISA_SSE4A_UNSET \
1916   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE5_UNSET)
1917 #define OPTION_MASK_ISA_SSE5_UNSET OPTION_MASK_ISA_SSE5
1918 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
1919 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
1920 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
1921 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
1922 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
1923 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
1924
1925 /* Vectorization library interface and handlers.  */
1926 tree (*ix86_veclib_handler)(enum built_in_function, tree, tree) = NULL;
1927 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
1928 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
1929
1930 /* Processor target table, indexed by processor number */
1931 struct ptt
1932 {
1933   const struct processor_costs *cost;           /* Processor costs */
1934   const int align_loop;                         /* Default alignments.  */
1935   const int align_loop_max_skip;
1936   const int align_jump;
1937   const int align_jump_max_skip;
1938   const int align_func;
1939 };
1940
1941 static const struct ptt processor_target_table[PROCESSOR_max] =
1942 {
1943   {&i386_cost, 4, 3, 4, 3, 4},
1944   {&i486_cost, 16, 15, 16, 15, 16},
1945   {&pentium_cost, 16, 7, 16, 7, 16},
1946   {&pentiumpro_cost, 16, 15, 16, 10, 16},
1947   {&geode_cost, 0, 0, 0, 0, 0},
1948   {&k6_cost, 32, 7, 32, 7, 32},
1949   {&athlon_cost, 16, 7, 16, 7, 16},
1950   {&pentium4_cost, 0, 0, 0, 0, 0},
1951   {&k8_cost, 16, 7, 16, 7, 16},
1952   {&nocona_cost, 0, 0, 0, 0, 0},
1953   {&core2_cost, 16, 10, 16, 10, 16},
1954   {&generic32_cost, 16, 7, 16, 7, 16},
1955   {&generic64_cost, 16, 10, 16, 10, 16},
1956   {&amdfam10_cost, 32, 24, 32, 7, 32}
1957 };
1958
1959 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
1960 {
1961   "generic",
1962   "i386",
1963   "i486",
1964   "pentium",
1965   "pentium-mmx",
1966   "pentiumpro",
1967   "pentium2",
1968   "pentium3",
1969   "pentium4",
1970   "pentium-m",
1971   "prescott",
1972   "nocona",
1973   "core2",
1974   "geode",
1975   "k6",
1976   "k6-2",
1977   "k6-3",
1978   "athlon",
1979   "athlon-4",
1980   "k8",
1981   "amdfam10"
1982 };
1983 \f
1984 /* Implement TARGET_HANDLE_OPTION.  */
1985
1986 static bool
1987 ix86_handle_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
1988 {
1989   switch (code)
1990     {
1991     case OPT_mmmx:
1992       if (value)
1993         {
1994           ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
1995           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
1996         }
1997       else
1998         {
1999           ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
2000           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2001         }
2002       return true;
2003
2004     case OPT_m3dnow:
2005       if (value)
2006         {
2007           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2008           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2009         }
2010       else
2011         {
2012           ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2013           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2014         }
2015       return true;
2016
2017     case OPT_m3dnowa:
2018       return false;
2019
2020     case OPT_msse:
2021       if (value)
2022         {
2023           ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2024           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2025         }
2026       else
2027         {
2028           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2029           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2030         }
2031       return true;
2032
2033     case OPT_msse2:
2034       if (value)
2035         {
2036           ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2037           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2038         }
2039       else
2040         {
2041           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2042           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2043         }
2044       return true;
2045
2046     case OPT_msse3:
2047       if (value)
2048         {
2049           ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2050           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2051         }
2052       else
2053         {
2054           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2055           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2056         }
2057       return true;
2058
2059     case OPT_mssse3:
2060       if (value)
2061         {
2062           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2063           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2064         }
2065       else
2066         {
2067           ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2068           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2069         }
2070       return true;
2071
2072     case OPT_msse4_1:
2073       if (value)
2074         {
2075           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2076           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2077         }
2078       else
2079         {
2080           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2081           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2082         }
2083       return true;
2084
2085     case OPT_msse4_2:
2086       if (value)
2087         {
2088           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2089           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2090         }
2091       else
2092         {
2093           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2094           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2095         }
2096       return true;
2097
2098     case OPT_mavx:
2099       if (value)
2100         {
2101           ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2102           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2103         }
2104       else
2105         {
2106           ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2107           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2108         }
2109       return true;
2110
2111     case OPT_mfma:
2112       if (value)
2113         {
2114           ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2115           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2116         }
2117       else
2118         {
2119           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2120           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2121         }
2122       return true;
2123
2124     case OPT_msse4:
2125       ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2126       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2127       return true;
2128
2129     case OPT_mno_sse4:
2130       ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2131       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2132       return true;
2133
2134     case OPT_msse4a:
2135       if (value)
2136         {
2137           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2138           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2139         }
2140       else
2141         {
2142           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2143           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2144         }
2145       return true;
2146
2147     case OPT_msse5:
2148       if (value)
2149         {
2150           ix86_isa_flags |= OPTION_MASK_ISA_SSE5_SET;
2151           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_SET;
2152         }
2153       else
2154         {
2155           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE5_UNSET;
2156           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_UNSET;
2157         }
2158       return true;
2159
2160     case OPT_mabm:
2161       if (value)
2162         {
2163           ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2164           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2165         }
2166       else
2167         {
2168           ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2169           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2170         }
2171       return true;
2172
2173     case OPT_mpopcnt:
2174       if (value)
2175         {
2176           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2177           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2178         }
2179       else
2180         {
2181           ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2182           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2183         }
2184       return true;
2185
2186     case OPT_msahf:
2187       if (value)
2188         {
2189           ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2190           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2191         }
2192       else
2193         {
2194           ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2195           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2196         }
2197       return true;
2198
2199     case OPT_mcx16:
2200       if (value)
2201         {
2202           ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2203           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2204         }
2205       else
2206         {
2207           ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2208           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2209         }
2210       return true;
2211
2212     case OPT_maes:
2213       if (value)
2214         {
2215           ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2216           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2217         }
2218       else
2219         {
2220           ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
2221           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
2222         }
2223       return true;
2224
2225     case OPT_mpclmul:
2226       if (value)
2227         {
2228           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
2229           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
2230         }
2231       else
2232         {
2233           ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
2234           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
2235         }
2236       return true;
2237
2238     default:
2239       return true;
2240     }
2241 }
2242 \f
2243 /* Return a string the documents the current -m options.  The caller is
2244    responsible for freeing the string.  */
2245
2246 static char *
2247 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
2248                     const char *fpmath, bool add_nl_p)
2249 {
2250   struct ix86_target_opts
2251   {
2252     const char *option;         /* option string */
2253     int mask;                   /* isa mask options */
2254   };
2255
2256   /* This table is ordered so that options like -msse5 or -msse4.2 that imply
2257      preceding options while match those first.  */
2258   static struct ix86_target_opts isa_opts[] =
2259   {
2260     { "-m64",           OPTION_MASK_ISA_64BIT },
2261     { "-msse5",         OPTION_MASK_ISA_SSE5 },
2262     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
2263     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
2264     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
2265     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
2266     { "-msse3",         OPTION_MASK_ISA_SSE3 },
2267     { "-msse2",         OPTION_MASK_ISA_SSE2 },
2268     { "-msse",          OPTION_MASK_ISA_SSE },
2269     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
2270     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
2271     { "-mmmx",          OPTION_MASK_ISA_MMX },
2272     { "-mabm",          OPTION_MASK_ISA_ABM },
2273     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
2274     { "-maes",          OPTION_MASK_ISA_AES },
2275     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
2276   };
2277
2278   /* Flag options.  */
2279   static struct ix86_target_opts flag_opts[] =
2280   {
2281     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
2282     { "-m80387",                        MASK_80387 },
2283     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
2284     { "-malign-double",                 MASK_ALIGN_DOUBLE },
2285     { "-mcld",                          MASK_CLD },
2286     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
2287     { "-mieee-fp",                      MASK_IEEE_FP },
2288     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
2289     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
2290     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
2291     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
2292     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
2293     { "-mno-fused-madd",                MASK_NO_FUSED_MADD },
2294     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
2295     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
2296     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
2297     { "-mrecip",                        MASK_RECIP },
2298     { "-mrtd",                          MASK_RTD },
2299     { "-msseregparm",                   MASK_SSEREGPARM },
2300     { "-mstack-arg-probe",              MASK_STACK_PROBE },
2301     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
2302   };
2303
2304   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
2305
2306   char isa_other[40];
2307   char target_other[40];
2308   unsigned num = 0;
2309   unsigned i, j;
2310   char *ret;
2311   char *ptr;
2312   size_t len;
2313   size_t line_len;
2314   size_t sep_len;
2315
2316   memset (opts, '\0', sizeof (opts));
2317
2318   /* Add -march= option.  */
2319   if (arch)
2320     {
2321       opts[num][0] = "-march=";
2322       opts[num++][1] = arch;
2323     }
2324
2325   /* Add -mtune= option.  */
2326   if (tune)
2327     {
2328       opts[num][0] = "-mtune=";
2329       opts[num++][1] = tune;
2330     }
2331
2332   /* Pick out the options in isa options.  */
2333   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
2334     {
2335       if ((isa & isa_opts[i].mask) != 0)
2336         {
2337           opts[num++][0] = isa_opts[i].option;
2338           isa &= ~ isa_opts[i].mask;
2339         }
2340     }
2341
2342   if (isa && add_nl_p)
2343     {
2344       opts[num++][0] = isa_other;
2345       sprintf (isa_other, "(other isa: 0x%x)", isa);
2346     }
2347
2348   /* Add flag options.  */
2349   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
2350     {
2351       if ((flags & flag_opts[i].mask) != 0)
2352         {
2353           opts[num++][0] = flag_opts[i].option;
2354           flags &= ~ flag_opts[i].mask;
2355         }
2356     }
2357
2358   if (flags && add_nl_p)
2359     {
2360       opts[num++][0] = target_other;
2361       sprintf (target_other, "(other flags: 0x%x)", flags);
2362     }
2363
2364   /* Add -fpmath= option.  */
2365   if (fpmath)
2366     {
2367       opts[num][0] = "-mfpmath=";
2368       opts[num++][1] = fpmath;
2369     }
2370
2371   /* Any options?  */
2372   if (num == 0)
2373     return NULL;
2374
2375   gcc_assert (num < ARRAY_SIZE (opts));
2376
2377   /* Size the string.  */
2378   len = 0;
2379   sep_len = (add_nl_p) ? 3 : 1;
2380   for (i = 0; i < num; i++)
2381     {
2382       len += sep_len;
2383       for (j = 0; j < 2; j++)
2384         if (opts[i][j])
2385           len += strlen (opts[i][j]);
2386     }
2387
2388   /* Build the string.  */
2389   ret = ptr = (char *) xmalloc (len);
2390   line_len = 0;
2391
2392   for (i = 0; i < num; i++)
2393     {
2394       size_t len2[2];
2395
2396       for (j = 0; j < 2; j++)
2397         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
2398
2399       if (i != 0)
2400         {
2401           *ptr++ = ' ';
2402           line_len++;
2403
2404           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
2405             {
2406               *ptr++ = '\\';
2407               *ptr++ = '\n';
2408               line_len = 0;
2409             }
2410         }
2411
2412       for (j = 0; j < 2; j++)
2413         if (opts[i][j])
2414           {
2415             memcpy (ptr, opts[i][j], len2[j]);
2416             ptr += len2[j];
2417             line_len += len2[j];
2418           }
2419     }
2420
2421   *ptr = '\0';
2422   gcc_assert (ret + len >= ptr);
2423
2424   return ret;
2425 }
2426
2427 /* Function that is callable from the debugger to print the current
2428    options.  */
2429 void
2430 ix86_debug_options (void)
2431 {
2432   char *opts = ix86_target_string (ix86_isa_flags, target_flags,
2433                                    ix86_arch_string, ix86_tune_string,
2434                                    ix86_fpmath_string, true);
2435
2436   if (opts)
2437     {
2438       fprintf (stderr, "%s\n\n", opts);
2439       free (opts);
2440     }
2441   else
2442     fprintf (stderr, "<no options>\n\n");
2443
2444   return;
2445 }
2446 \f
2447 /* Sometimes certain combinations of command options do not make
2448    sense on a particular target machine.  You can define a macro
2449    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
2450    defined, is executed once just after all the command options have
2451    been parsed.
2452
2453    Don't use this macro to turn on various extra optimizations for
2454    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
2455
2456 void
2457 override_options (bool main_args_p)
2458 {
2459   int i;
2460   unsigned int ix86_arch_mask, ix86_tune_mask;
2461   const char *prefix;
2462   const char *suffix;
2463   const char *sw;
2464
2465   /* Comes from final.c -- no real reason to change it.  */
2466 #define MAX_CODE_ALIGN 16
2467
2468   enum pta_flags
2469     {
2470       PTA_SSE = 1 << 0,
2471       PTA_SSE2 = 1 << 1,
2472       PTA_SSE3 = 1 << 2,
2473       PTA_MMX = 1 << 3,
2474       PTA_PREFETCH_SSE = 1 << 4,
2475       PTA_3DNOW = 1 << 5,
2476       PTA_3DNOW_A = 1 << 6,
2477       PTA_64BIT = 1 << 7,
2478       PTA_SSSE3 = 1 << 8,
2479       PTA_CX16 = 1 << 9,
2480       PTA_POPCNT = 1 << 10,
2481       PTA_ABM = 1 << 11,
2482       PTA_SSE4A = 1 << 12,
2483       PTA_NO_SAHF = 1 << 13,
2484       PTA_SSE4_1 = 1 << 14,
2485       PTA_SSE4_2 = 1 << 15,
2486       PTA_SSE5 = 1 << 16,
2487       PTA_AES = 1 << 17,
2488       PTA_PCLMUL = 1 << 18,
2489       PTA_AVX = 1 << 19,
2490       PTA_FMA = 1 << 20 
2491     };
2492
2493   static struct pta
2494     {
2495       const char *const name;           /* processor name or nickname.  */
2496       const enum processor_type processor;
2497       const enum attr_cpu schedule;
2498       const unsigned /*enum pta_flags*/ flags;
2499     }
2500   const processor_alias_table[] =
2501     {
2502       {"i386", PROCESSOR_I386, CPU_NONE, 0},
2503       {"i486", PROCESSOR_I486, CPU_NONE, 0},
2504       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2505       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2506       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
2507       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
2508       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2509       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2510       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
2511       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2512       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2513       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
2514       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2515         PTA_MMX | PTA_SSE},
2516       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2517         PTA_MMX | PTA_SSE},
2518       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2519         PTA_MMX | PTA_SSE | PTA_SSE2},
2520       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
2521         PTA_MMX |PTA_SSE | PTA_SSE2},
2522       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
2523         PTA_MMX | PTA_SSE | PTA_SSE2},
2524       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
2525         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
2526       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
2527         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2528         | PTA_CX16 | PTA_NO_SAHF},
2529       {"core2", PROCESSOR_CORE2, CPU_CORE2,
2530         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2531         | PTA_SSSE3 | PTA_CX16},
2532       {"geode", PROCESSOR_GEODE, CPU_GEODE,
2533         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
2534       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
2535       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2536       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2537       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
2538         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2539       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
2540         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2541       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
2542         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2543       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
2544         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2545       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
2546         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2547       {"x86-64", PROCESSOR_K8, CPU_K8,
2548         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
2549       {"k8", PROCESSOR_K8, CPU_K8,
2550         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2551         | PTA_SSE2 | PTA_NO_SAHF},
2552       {"k8-sse3", PROCESSOR_K8, CPU_K8,
2553         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2554         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2555       {"opteron", PROCESSOR_K8, CPU_K8,
2556         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2557         | PTA_SSE2 | PTA_NO_SAHF},
2558       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
2559         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2560         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2561       {"athlon64", PROCESSOR_K8, CPU_K8,
2562         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2563         | PTA_SSE2 | PTA_NO_SAHF},
2564       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
2565         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2566         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2567       {"athlon-fx", PROCESSOR_K8, CPU_K8,
2568         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2569         | PTA_SSE2 | PTA_NO_SAHF},
2570       {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2571         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2572         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2573       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2574         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2575         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2576       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
2577         0 /* flags are only used for -march switch.  */ },
2578       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
2579         PTA_64BIT /* flags are only used for -march switch.  */ },
2580     };
2581
2582   int const pta_size = ARRAY_SIZE (processor_alias_table);
2583
2584   /* Set up prefix/suffix so the error messages refer to either the command
2585      line argument, or the attribute(target).  */
2586   if (main_args_p)
2587     {
2588       prefix = "-m";
2589       suffix = "";
2590       sw = "switch";
2591     }
2592   else
2593     {
2594       prefix = "option(\"";
2595       suffix = "\")";
2596       sw = "attribute";
2597     }
2598
2599 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2600   SUBTARGET_OVERRIDE_OPTIONS;
2601 #endif
2602
2603 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2604   SUBSUBTARGET_OVERRIDE_OPTIONS;
2605 #endif
2606
2607   /* -fPIC is the default for x86_64.  */
2608   if (TARGET_MACHO && TARGET_64BIT)
2609     flag_pic = 2;
2610
2611   /* Set the default values for switches whose default depends on TARGET_64BIT
2612      in case they weren't overwritten by command line options.  */
2613   if (TARGET_64BIT)
2614     {
2615       /* Mach-O doesn't support omitting the frame pointer for now.  */
2616       if (flag_omit_frame_pointer == 2)
2617         flag_omit_frame_pointer = (TARGET_MACHO ? 0 : 1);
2618       if (flag_asynchronous_unwind_tables == 2)
2619         flag_asynchronous_unwind_tables = 1;
2620       if (flag_pcc_struct_return == 2)
2621         flag_pcc_struct_return = 0;
2622     }
2623   else
2624     {
2625       if (flag_omit_frame_pointer == 2)
2626         flag_omit_frame_pointer = 0;
2627       if (flag_asynchronous_unwind_tables == 2)
2628         flag_asynchronous_unwind_tables = 0;
2629       if (flag_pcc_struct_return == 2)
2630         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
2631     }
2632
2633   /* Need to check -mtune=generic first.  */
2634   if (ix86_tune_string)
2635     {
2636       if (!strcmp (ix86_tune_string, "generic")
2637           || !strcmp (ix86_tune_string, "i686")
2638           /* As special support for cross compilers we read -mtune=native
2639              as -mtune=generic.  With native compilers we won't see the
2640              -mtune=native, as it was changed by the driver.  */
2641           || !strcmp (ix86_tune_string, "native"))
2642         {
2643           if (TARGET_64BIT)
2644             ix86_tune_string = "generic64";
2645           else
2646             ix86_tune_string = "generic32";
2647         }
2648       /* If this call is for setting the option attribute, allow the
2649          generic32/generic64 that was previously set.  */
2650       else if (!main_args_p
2651                && (!strcmp (ix86_tune_string, "generic32")
2652                    || !strcmp (ix86_tune_string, "generic64")))
2653         ;
2654       else if (!strncmp (ix86_tune_string, "generic", 7))
2655         error ("bad value (%s) for %stune=%s %s",
2656                ix86_tune_string, prefix, suffix, sw);
2657     }
2658   else
2659     {
2660       if (ix86_arch_string)
2661         ix86_tune_string = ix86_arch_string;
2662       if (!ix86_tune_string)
2663         {
2664           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
2665           ix86_tune_defaulted = 1;
2666         }
2667
2668       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
2669          need to use a sensible tune option.  */
2670       if (!strcmp (ix86_tune_string, "generic")
2671           || !strcmp (ix86_tune_string, "x86-64")
2672           || !strcmp (ix86_tune_string, "i686"))
2673         {
2674           if (TARGET_64BIT)
2675             ix86_tune_string = "generic64";
2676           else
2677             ix86_tune_string = "generic32";
2678         }
2679     }
2680   if (ix86_stringop_string)
2681     {
2682       if (!strcmp (ix86_stringop_string, "rep_byte"))
2683         stringop_alg = rep_prefix_1_byte;
2684       else if (!strcmp (ix86_stringop_string, "libcall"))
2685         stringop_alg = libcall;
2686       else if (!strcmp (ix86_stringop_string, "rep_4byte"))
2687         stringop_alg = rep_prefix_4_byte;
2688       else if (!strcmp (ix86_stringop_string, "rep_8byte")
2689                && TARGET_64BIT)
2690         /* rep; movq isn't available in 32-bit code.  */
2691         stringop_alg = rep_prefix_8_byte;
2692       else if (!strcmp (ix86_stringop_string, "byte_loop"))
2693         stringop_alg = loop_1_byte;
2694       else if (!strcmp (ix86_stringop_string, "loop"))
2695         stringop_alg = loop;
2696       else if (!strcmp (ix86_stringop_string, "unrolled_loop"))
2697         stringop_alg = unrolled_loop;
2698       else
2699         error ("bad value (%s) for %sstringop-strategy=%s %s",
2700                ix86_stringop_string, prefix, suffix, sw);
2701     }
2702   if (!strcmp (ix86_tune_string, "x86-64"))
2703     warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated.  Use "
2704              "%stune=k8%s or %stune=generic%s instead as appropriate.",
2705              prefix, suffix, prefix, suffix, prefix, suffix);
2706
2707   if (!ix86_arch_string)
2708     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386";
2709   else
2710     ix86_arch_specified = 1;
2711
2712   if (!strcmp (ix86_arch_string, "generic"))
2713     error ("generic CPU can be used only for %stune=%s %s",
2714            prefix, suffix, sw);
2715   if (!strncmp (ix86_arch_string, "generic", 7))
2716     error ("bad value (%s) for %sarch=%s %s",
2717            ix86_arch_string, prefix, suffix, sw);
2718
2719   if (ix86_cmodel_string != 0)
2720     {
2721       if (!strcmp (ix86_cmodel_string, "small"))
2722         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2723       else if (!strcmp (ix86_cmodel_string, "medium"))
2724         ix86_cmodel = flag_pic ? CM_MEDIUM_PIC : CM_MEDIUM;
2725       else if (!strcmp (ix86_cmodel_string, "large"))
2726         ix86_cmodel = flag_pic ? CM_LARGE_PIC : CM_LARGE;
2727       else if (flag_pic)
2728         error ("code model %s does not support PIC mode", ix86_cmodel_string);
2729       else if (!strcmp (ix86_cmodel_string, "32"))
2730         ix86_cmodel = CM_32;
2731       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
2732         ix86_cmodel = CM_KERNEL;
2733       else
2734         error ("bad value (%s) for %scmodel=%s %s",
2735                ix86_cmodel_string, prefix, suffix, sw);
2736     }
2737   else
2738     {
2739       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
2740          use of rip-relative addressing.  This eliminates fixups that
2741          would otherwise be needed if this object is to be placed in a
2742          DLL, and is essentially just as efficient as direct addressing.  */
2743       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
2744         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
2745       else if (TARGET_64BIT)
2746         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2747       else
2748         ix86_cmodel = CM_32;
2749     }
2750   if (ix86_asm_string != 0)
2751     {
2752       if (! TARGET_MACHO
2753           && !strcmp (ix86_asm_string, "intel"))
2754         ix86_asm_dialect = ASM_INTEL;
2755       else if (!strcmp (ix86_asm_string, "att"))
2756         ix86_asm_dialect = ASM_ATT;
2757       else
2758         error ("bad value (%s) for %sasm=%s %s",
2759                ix86_asm_string, prefix, suffix, sw);
2760     }
2761   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
2762     error ("code model %qs not supported in the %s bit mode",
2763            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
2764   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
2765     sorry ("%i-bit mode not compiled in",
2766            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
2767
2768   for (i = 0; i < pta_size; i++)
2769     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
2770       {
2771         ix86_schedule = processor_alias_table[i].schedule;
2772         ix86_arch = processor_alias_table[i].processor;
2773         /* Default cpu tuning to the architecture.  */
2774         ix86_tune = ix86_arch;
2775
2776         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2777           error ("CPU you selected does not support x86-64 "
2778                  "instruction set");
2779
2780         if (processor_alias_table[i].flags & PTA_MMX
2781             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
2782           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
2783         if (processor_alias_table[i].flags & PTA_3DNOW
2784             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
2785           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
2786         if (processor_alias_table[i].flags & PTA_3DNOW_A
2787             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
2788           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
2789         if (processor_alias_table[i].flags & PTA_SSE
2790             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
2791           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
2792         if (processor_alias_table[i].flags & PTA_SSE2
2793             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
2794           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
2795         if (processor_alias_table[i].flags & PTA_SSE3
2796             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
2797           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
2798         if (processor_alias_table[i].flags & PTA_SSSE3
2799             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
2800           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
2801         if (processor_alias_table[i].flags & PTA_SSE4_1
2802             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
2803           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
2804         if (processor_alias_table[i].flags & PTA_SSE4_2
2805             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
2806           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
2807         if (processor_alias_table[i].flags & PTA_AVX
2808             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
2809           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
2810         if (processor_alias_table[i].flags & PTA_FMA
2811             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
2812           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
2813         if (processor_alias_table[i].flags & PTA_SSE4A
2814             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
2815           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
2816         if (processor_alias_table[i].flags & PTA_SSE5
2817             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE5))
2818           ix86_isa_flags |= OPTION_MASK_ISA_SSE5;
2819         if (processor_alias_table[i].flags & PTA_ABM
2820             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
2821           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
2822         if (processor_alias_table[i].flags & PTA_CX16
2823             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
2824           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
2825         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
2826             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
2827           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
2828         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
2829             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
2830           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
2831         if (processor_alias_table[i].flags & PTA_AES
2832             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
2833           ix86_isa_flags |= OPTION_MASK_ISA_AES;
2834         if (processor_alias_table[i].flags & PTA_PCLMUL
2835             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
2836           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
2837         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
2838           x86_prefetch_sse = true;
2839
2840         break;
2841       }
2842
2843   if (i == pta_size)
2844     error ("bad value (%s) for %sarch=%s %s",
2845            ix86_arch_string, prefix, suffix, sw);
2846
2847   ix86_arch_mask = 1u << ix86_arch;
2848   for (i = 0; i < X86_ARCH_LAST; ++i)
2849     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
2850
2851   for (i = 0; i < pta_size; i++)
2852     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
2853       {
2854         ix86_schedule = processor_alias_table[i].schedule;
2855         ix86_tune = processor_alias_table[i].processor;
2856         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2857           {
2858             if (ix86_tune_defaulted)
2859               {
2860                 ix86_tune_string = "x86-64";
2861                 for (i = 0; i < pta_size; i++)
2862                   if (! strcmp (ix86_tune_string,
2863                                 processor_alias_table[i].name))
2864                     break;
2865                 ix86_schedule = processor_alias_table[i].schedule;
2866                 ix86_tune = processor_alias_table[i].processor;
2867               }
2868             else
2869               error ("CPU you selected does not support x86-64 "
2870                      "instruction set");
2871           }
2872         /* Intel CPUs have always interpreted SSE prefetch instructions as
2873            NOPs; so, we can enable SSE prefetch instructions even when
2874            -mtune (rather than -march) points us to a processor that has them.
2875            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
2876            higher processors.  */
2877         if (TARGET_CMOVE
2878             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
2879           x86_prefetch_sse = true;
2880         break;
2881       }
2882   if (i == pta_size)
2883     error ("bad value (%s) for %stune=%s %s",
2884            ix86_tune_string, prefix, suffix, sw);
2885
2886   ix86_tune_mask = 1u << ix86_tune;
2887   for (i = 0; i < X86_TUNE_LAST; ++i)
2888     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
2889
2890   if (optimize_size)
2891     ix86_cost = &ix86_size_cost;
2892   else
2893     ix86_cost = processor_target_table[ix86_tune].cost;
2894
2895   /* Arrange to set up i386_stack_locals for all functions.  */
2896   init_machine_status = ix86_init_machine_status;
2897
2898   /* Validate -mregparm= value.  */
2899   if (ix86_regparm_string)
2900     {
2901       if (TARGET_64BIT)
2902         warning (0, "%sregparm%s is ignored in 64-bit mode", prefix, suffix);
2903       i = atoi (ix86_regparm_string);
2904       if (i < 0 || i > REGPARM_MAX)
2905         error ("%sregparm=%d%s is not between 0 and %d",
2906                prefix, i, suffix, REGPARM_MAX);
2907       else
2908         ix86_regparm = i;
2909     }
2910   if (TARGET_64BIT)
2911     ix86_regparm = REGPARM_MAX;
2912
2913   /* If the user has provided any of the -malign-* options,
2914      warn and use that value only if -falign-* is not set.
2915      Remove this code in GCC 3.2 or later.  */
2916   if (ix86_align_loops_string)
2917     {
2918       warning (0, "%salign-loops%s is obsolete, use -falign-loops%s",
2919                prefix, suffix, suffix);
2920       if (align_loops == 0)
2921         {
2922           i = atoi (ix86_align_loops_string);
2923           if (i < 0 || i > MAX_CODE_ALIGN)
2924             error ("%salign-loops=%d%s is not between 0 and %d",
2925                    prefix, i, suffix, MAX_CODE_ALIGN);
2926           else
2927             align_loops = 1 << i;
2928         }
2929     }
2930
2931   if (ix86_align_jumps_string)
2932     {
2933       warning (0, "%salign-jumps%s is obsolete, use -falign-jumps%s",
2934                prefix, suffix, suffix);
2935       if (align_jumps == 0)
2936         {
2937           i = atoi (ix86_align_jumps_string);
2938           if (i < 0 || i > MAX_CODE_ALIGN)
2939             error ("%salign-loops=%d%s is not between 0 and %d",
2940                    prefix, i, suffix, MAX_CODE_ALIGN);
2941           else
2942             align_jumps = 1 << i;
2943         }
2944     }
2945
2946   if (ix86_align_funcs_string)
2947     {
2948       warning (0, "%salign-functions%s is obsolete, use -falign-functions%s",
2949                prefix, suffix, suffix);
2950       if (align_functions == 0)
2951         {
2952           i = atoi (ix86_align_funcs_string);
2953           if (i < 0 || i > MAX_CODE_ALIGN)
2954             error ("%salign-loops=%d%s is not between 0 and %d",
2955                    prefix, i, suffix, MAX_CODE_ALIGN);
2956           else
2957             align_functions = 1 << i;
2958         }
2959     }
2960
2961   /* Default align_* from the processor table.  */
2962   if (align_loops == 0)
2963     {
2964       align_loops = processor_target_table[ix86_tune].align_loop;
2965       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
2966     }
2967   if (align_jumps == 0)
2968     {
2969       align_jumps = processor_target_table[ix86_tune].align_jump;
2970       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
2971     }
2972   if (align_functions == 0)
2973     {
2974       align_functions = processor_target_table[ix86_tune].align_func;
2975     }
2976
2977   /* Validate -mbranch-cost= value, or provide default.  */
2978   ix86_branch_cost = ix86_cost->branch_cost;
2979   if (ix86_branch_cost_string)
2980     {
2981       i = atoi (ix86_branch_cost_string);
2982       if (i < 0 || i > 5)
2983         error ("%sbranch-cost=%d%s is not between 0 and 5", prefix, i, suffix);
2984       else
2985         ix86_branch_cost = i;
2986     }
2987   if (ix86_section_threshold_string)
2988     {
2989       i = atoi (ix86_section_threshold_string);
2990       if (i < 0)
2991         error ("%slarge-data-threshold=%d%s is negative", prefix, i, suffix);
2992       else
2993         ix86_section_threshold = i;
2994     }
2995
2996   if (ix86_tls_dialect_string)
2997     {
2998       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
2999         ix86_tls_dialect = TLS_DIALECT_GNU;
3000       else if (strcmp (ix86_tls_dialect_string, "gnu2") == 0)
3001         ix86_tls_dialect = TLS_DIALECT_GNU2;
3002       else
3003         error ("bad value (%s) for %stls-dialect=%s %s",
3004                ix86_tls_dialect_string, prefix, suffix, sw);
3005     }
3006
3007   if (ix87_precision_string)
3008     {
3009       i = atoi (ix87_precision_string);
3010       if (i != 32 && i != 64 && i != 80)
3011         error ("pc%d is not valid precision setting (32, 64 or 80)", i);
3012     }
3013
3014   if (TARGET_64BIT)
3015     {
3016       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3017
3018       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3019          explicitly disable any of these.  In particular, disabling SSE and
3020          MMX for kernel code is extremely useful.  */
3021       if (!ix86_arch_specified)
3022       ix86_isa_flags
3023         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3024              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3025
3026       if (TARGET_RTD)
3027         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3028     }
3029   else
3030     {
3031       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3032
3033       if (!ix86_arch_specified)
3034       ix86_isa_flags
3035         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3036
3037       /* i386 ABI does not specify red zone.  It still makes sense to use it
3038          when programmer takes care to stack from being destroyed.  */
3039       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3040         target_flags |= MASK_NO_RED_ZONE;
3041     }
3042
3043   /* Keep nonleaf frame pointers.  */
3044   if (flag_omit_frame_pointer)
3045     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
3046   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
3047     flag_omit_frame_pointer = 1;
3048
3049   /* If we're doing fast math, we don't care about comparison order
3050      wrt NaNs.  This lets us use a shorter comparison sequence.  */
3051   if (flag_finite_math_only)
3052     target_flags &= ~MASK_IEEE_FP;
3053
3054   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
3055      since the insns won't need emulation.  */
3056   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
3057     target_flags &= ~MASK_NO_FANCY_MATH_387;
3058
3059   /* Likewise, if the target doesn't have a 387, or we've specified
3060      software floating point, don't use 387 inline intrinsics.  */
3061   if (!TARGET_80387)
3062     target_flags |= MASK_NO_FANCY_MATH_387;
3063
3064   /* Turn on MMX builtins for -msse.  */
3065   if (TARGET_SSE)
3066     {
3067       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
3068       x86_prefetch_sse = true;
3069     }
3070
3071   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
3072   if (TARGET_SSE4_2 || TARGET_ABM)
3073     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
3074
3075   /* Validate -mpreferred-stack-boundary= value or default it to
3076      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
3077   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
3078   if (ix86_preferred_stack_boundary_string)
3079     {
3080       i = atoi (ix86_preferred_stack_boundary_string);
3081       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3082         error ("%spreferred-stack-boundary=%d%s is not between %d and 12",
3083                prefix, i, suffix, TARGET_64BIT ? 4 : 2);
3084       else
3085         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
3086     }
3087
3088   /* Set the default value for -mstackrealign.  */
3089   if (ix86_force_align_arg_pointer == -1)
3090     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
3091
3092   /* Validate -mincoming-stack-boundary= value or default it to
3093      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
3094   if (ix86_force_align_arg_pointer)
3095     ix86_default_incoming_stack_boundary = MIN_STACK_BOUNDARY;
3096   else
3097     ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
3098   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
3099   if (ix86_incoming_stack_boundary_string)
3100     {
3101       i = atoi (ix86_incoming_stack_boundary_string);
3102       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3103         error ("-mincoming-stack-boundary=%d is not between %d and 12",
3104                i, TARGET_64BIT ? 4 : 2);
3105       else
3106         {
3107           ix86_user_incoming_stack_boundary = (1 << i) * BITS_PER_UNIT;
3108           ix86_incoming_stack_boundary
3109             = ix86_user_incoming_stack_boundary;
3110         }
3111     }
3112
3113   /* Accept -msseregparm only if at least SSE support is enabled.  */
3114   if (TARGET_SSEREGPARM
3115       && ! TARGET_SSE)
3116     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
3117
3118   ix86_fpmath = TARGET_FPMATH_DEFAULT;
3119   if (ix86_fpmath_string != 0)
3120     {
3121       if (! strcmp (ix86_fpmath_string, "387"))
3122         ix86_fpmath = FPMATH_387;
3123       else if (! strcmp (ix86_fpmath_string, "sse"))
3124         {
3125           if (!TARGET_SSE)
3126             {
3127               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3128               ix86_fpmath = FPMATH_387;
3129             }
3130           else
3131             ix86_fpmath = FPMATH_SSE;
3132         }
3133       else if (! strcmp (ix86_fpmath_string, "387,sse")
3134                || ! strcmp (ix86_fpmath_string, "387+sse")
3135                || ! strcmp (ix86_fpmath_string, "sse,387")
3136                || ! strcmp (ix86_fpmath_string, "sse+387")
3137                || ! strcmp (ix86_fpmath_string, "both"))
3138         {
3139           if (!TARGET_SSE)
3140             {
3141               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3142               ix86_fpmath = FPMATH_387;
3143             }
3144           else if (!TARGET_80387)
3145             {
3146               warning (0, "387 instruction set disabled, using SSE arithmetics");
3147               ix86_fpmath = FPMATH_SSE;
3148             }
3149           else
3150             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
3151         }
3152       else
3153         error ("bad value (%s) for %sfpmath=%s %s",
3154                ix86_fpmath_string, prefix, suffix, sw);
3155     }
3156
3157   /* If the i387 is disabled, then do not return values in it. */
3158   if (!TARGET_80387)
3159     target_flags &= ~MASK_FLOAT_RETURNS;
3160
3161   /* Use external vectorized library in vectorizing intrinsics.  */
3162   if (ix86_veclibabi_string)
3163     {
3164       if (strcmp (ix86_veclibabi_string, "svml") == 0)
3165         ix86_veclib_handler = ix86_veclibabi_svml;
3166       else if (strcmp (ix86_veclibabi_string, "acml") == 0)
3167         ix86_veclib_handler = ix86_veclibabi_acml;
3168       else
3169         error ("unknown vectorization library ABI type (%s) for "
3170                "%sveclibabi=%s %s", ix86_veclibabi_string,
3171                prefix, suffix, sw);
3172     }
3173
3174   if ((x86_accumulate_outgoing_args & ix86_tune_mask)
3175       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3176       && !optimize_size)
3177     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3178
3179   /* ??? Unwind info is not correct around the CFG unless either a frame
3180      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
3181      unwind info generation to be aware of the CFG and propagating states
3182      around edges.  */
3183   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
3184        || flag_exceptions || flag_non_call_exceptions)
3185       && flag_omit_frame_pointer
3186       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3187     {
3188       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3189         warning (0, "unwind tables currently require either a frame pointer "
3190                  "or %saccumulate-outgoing-args%s for correctness",
3191                  prefix, suffix);
3192       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3193     }
3194
3195   /* If stack probes are required, the space used for large function
3196      arguments on the stack must also be probed, so enable
3197      -maccumulate-outgoing-args so this happens in the prologue.  */
3198   if (TARGET_STACK_PROBE
3199       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3200     {
3201       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3202         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
3203                  "for correctness", prefix, suffix);
3204       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3205     }
3206
3207   /* For sane SSE instruction set generation we need fcomi instruction.
3208      It is safe to enable all CMOVE instructions.  */
3209   if (TARGET_SSE)
3210     TARGET_CMOVE = 1;
3211
3212   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
3213   {
3214     char *p;
3215     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
3216     p = strchr (internal_label_prefix, 'X');
3217     internal_label_prefix_len = p - internal_label_prefix;
3218     *p = '\0';
3219   }
3220
3221   /* When scheduling description is not available, disable scheduler pass
3222      so it won't slow down the compilation and make x87 code slower.  */
3223   if (!TARGET_SCHEDULE)
3224     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
3225
3226   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
3227     set_param_value ("simultaneous-prefetches",
3228                      ix86_cost->simultaneous_prefetches);
3229   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
3230     set_param_value ("l1-cache-line-size", ix86_cost->prefetch_block);
3231   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
3232     set_param_value ("l1-cache-size", ix86_cost->l1_cache_size);
3233   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
3234     set_param_value ("l2-cache-size", ix86_cost->l2_cache_size);
3235
3236   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3237      can be optimized to ap = __builtin_next_arg (0).  */
3238   if (!TARGET_64BIT)
3239     targetm.expand_builtin_va_start = NULL;
3240
3241   if (TARGET_64BIT)
3242     {
3243       ix86_gen_leave = gen_leave_rex64;
3244       ix86_gen_pop1 = gen_popdi1;
3245       ix86_gen_add3 = gen_adddi3;
3246       ix86_gen_sub3 = gen_subdi3;
3247       ix86_gen_sub3_carry = gen_subdi3_carry_rex64;
3248       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
3249       ix86_gen_monitor = gen_sse3_monitor64;
3250       ix86_gen_andsp = gen_anddi3;
3251     }
3252   else
3253     {
3254       ix86_gen_leave = gen_leave;
3255       ix86_gen_pop1 = gen_popsi1;
3256       ix86_gen_add3 = gen_addsi3;
3257       ix86_gen_sub3 = gen_subsi3;
3258       ix86_gen_sub3_carry = gen_subsi3_carry;
3259       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
3260       ix86_gen_monitor = gen_sse3_monitor;
3261       ix86_gen_andsp = gen_andsi3;
3262     }
3263
3264 #ifdef USE_IX86_CLD
3265   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
3266   if (!TARGET_64BIT)
3267     target_flags |= MASK_CLD & ~target_flags_explicit;
3268 #endif
3269
3270   /* Save the initial options in case the user does function specific options */
3271   if (main_args_p)
3272     target_option_default_node = target_option_current_node
3273       = build_target_option_node ();
3274 }
3275
3276 /* Update register usage after having seen the compiler flags.  */
3277
3278 void
3279 ix86_conditional_register_usage (void)
3280 {
3281   int i;
3282   unsigned int j;
3283
3284   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3285     {
3286       if (fixed_regs[i] > 1)
3287         fixed_regs[i] = (fixed_regs[i] == (TARGET_64BIT ? 3 : 2));
3288       if (call_used_regs[i] > 1)
3289         call_used_regs[i] = (call_used_regs[i] == (TARGET_64BIT ? 3 : 2));
3290     }
3291
3292   /* The PIC register, if it exists, is fixed.  */
3293   j = PIC_OFFSET_TABLE_REGNUM;
3294   if (j != INVALID_REGNUM)
3295     fixed_regs[j] = call_used_regs[j] = 1;
3296
3297   /* The MS_ABI changes the set of call-used registers.  */
3298   if (TARGET_64BIT && ix86_cfun_abi () == MS_ABI)
3299     {
3300       call_used_regs[SI_REG] = 0;
3301       call_used_regs[DI_REG] = 0;
3302       call_used_regs[XMM6_REG] = 0;
3303       call_used_regs[XMM7_REG] = 0;
3304       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
3305         call_used_regs[i] = 0;
3306     }
3307
3308   /* The default setting of CLOBBERED_REGS is for 32-bit; add in the
3309      other call-clobbered regs for 64-bit.  */
3310   if (TARGET_64BIT)
3311     {
3312       CLEAR_HARD_REG_SET (reg_class_contents[(int)CLOBBERED_REGS]);
3313
3314       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3315         if (TEST_HARD_REG_BIT (reg_class_contents[(int)GENERAL_REGS], i)
3316             && call_used_regs[i])
3317           SET_HARD_REG_BIT (reg_class_contents[(int)CLOBBERED_REGS], i);
3318     }
3319
3320   /* If MMX is disabled, squash the registers.  */
3321   if (! TARGET_MMX)
3322     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3323       if (TEST_HARD_REG_BIT (reg_class_contents[(int)MMX_REGS], i))
3324         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3325
3326   /* If SSE is disabled, squash the registers.  */
3327   if (! TARGET_SSE)
3328     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3329       if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i))
3330         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3331
3332   /* If the FPU is disabled, squash the registers.  */
3333   if (! (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387))
3334     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3335       if (TEST_HARD_REG_BIT (reg_class_contents[(int)FLOAT_REGS], i))
3336         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3337
3338   /* If 32-bit, squash the 64-bit registers.  */
3339   if (! TARGET_64BIT)
3340     {
3341       for (i = FIRST_REX_INT_REG; i <= LAST_REX_INT_REG; i++)
3342         reg_names[i] = "";
3343       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
3344         reg_names[i] = "";
3345     }
3346 }
3347
3348 \f
3349 /* Save the current options */
3350
3351 static void
3352 ix86_function_specific_save (struct cl_target_option *ptr)
3353 {
3354   gcc_assert (IN_RANGE (ix86_arch, 0, 255));
3355   gcc_assert (IN_RANGE (ix86_schedule, 0, 255));
3356   gcc_assert (IN_RANGE (ix86_tune, 0, 255));
3357   gcc_assert (IN_RANGE (ix86_fpmath, 0, 255));
3358   gcc_assert (IN_RANGE (ix86_branch_cost, 0, 255));
3359
3360   ptr->arch = ix86_arch;
3361   ptr->schedule = ix86_schedule;
3362   ptr->tune = ix86_tune;
3363   ptr->fpmath = ix86_fpmath;
3364   ptr->branch_cost = ix86_branch_cost;
3365   ptr->tune_defaulted = ix86_tune_defaulted;
3366   ptr->arch_specified = ix86_arch_specified;
3367   ptr->ix86_isa_flags_explicit = ix86_isa_flags_explicit;
3368   ptr->target_flags_explicit = target_flags_explicit;
3369 }
3370
3371 /* Restore the current options */
3372
3373 static void
3374 ix86_function_specific_restore (struct cl_target_option *ptr)
3375 {
3376   enum processor_type old_tune = ix86_tune;
3377   enum processor_type old_arch = ix86_arch;
3378   unsigned int ix86_arch_mask, ix86_tune_mask;
3379   int i;
3380
3381   ix86_arch = ptr->arch;
3382   ix86_schedule = ptr->schedule;
3383   ix86_tune = ptr->tune;
3384   ix86_fpmath = ptr->fpmath;
3385   ix86_branch_cost = ptr->branch_cost;
3386   ix86_tune_defaulted = ptr->tune_defaulted;
3387   ix86_arch_specified = ptr->arch_specified;
3388   ix86_isa_flags_explicit = ptr->ix86_isa_flags_explicit;
3389   target_flags_explicit = ptr->target_flags_explicit;
3390
3391   /* Recreate the arch feature tests if the arch changed */
3392   if (old_arch != ix86_arch)
3393     {
3394       ix86_arch_mask = 1u << ix86_arch;
3395       for (i = 0; i < X86_ARCH_LAST; ++i)
3396         ix86_arch_features[i]
3397           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3398     }
3399
3400   /* Recreate the tune optimization tests */
3401   if (old_tune != ix86_tune)
3402     {
3403       ix86_tune_mask = 1u << ix86_tune;
3404       for (i = 0; i < X86_TUNE_LAST; ++i)
3405         ix86_tune_features[i]
3406           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3407     }
3408 }
3409
3410 /* Print the current options */
3411
3412 static void
3413 ix86_function_specific_print (FILE *file, int indent,
3414                               struct cl_target_option *ptr)
3415 {
3416   char *target_string
3417     = ix86_target_string (ptr->ix86_isa_flags, ptr->target_flags,
3418                           NULL, NULL, NULL, false);
3419
3420   fprintf (file, "%*sarch = %d (%s)\n",
3421            indent, "",
3422            ptr->arch,
3423            ((ptr->arch < TARGET_CPU_DEFAULT_max)
3424             ? cpu_names[ptr->arch]
3425             : "<unknown>"));
3426
3427   fprintf (file, "%*stune = %d (%s)\n",
3428            indent, "",
3429            ptr->tune,
3430            ((ptr->tune < TARGET_CPU_DEFAULT_max)
3431             ? cpu_names[ptr->tune]
3432             : "<unknown>"));
3433
3434   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
3435            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
3436            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
3437   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
3438
3439   if (target_string)
3440     {
3441       fprintf (file, "%*s%s\n", indent, "", target_string);
3442       free (target_string);
3443     }
3444 }
3445
3446 \f
3447 /* Inner function to process the attribute((target(...))), take an argument and
3448    set the current options from the argument. If we have a list, recursively go
3449    over the list.  */
3450
3451 static bool
3452 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
3453 {
3454   char *next_optstr;
3455   bool ret = true;
3456
3457 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
3458 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
3459 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
3460 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
3461
3462   enum ix86_opt_type
3463   {
3464     ix86_opt_unknown,
3465     ix86_opt_yes,
3466     ix86_opt_no,
3467     ix86_opt_str,
3468     ix86_opt_isa
3469   };
3470
3471   static const struct
3472   {
3473     const char *string;
3474     size_t len;
3475     enum ix86_opt_type type;
3476     int opt;
3477     int mask;
3478   } attrs[] = {
3479     /* isa options */
3480     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
3481     IX86_ATTR_ISA ("abm",       OPT_mabm),
3482     IX86_ATTR_ISA ("aes",       OPT_maes),
3483     IX86_ATTR_ISA ("avx",       OPT_mavx),
3484     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
3485     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
3486     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
3487     IX86_ATTR_ISA ("sse",       OPT_msse),
3488     IX86_ATTR_ISA ("sse2",      OPT_msse2),
3489     IX86_ATTR_ISA ("sse3",      OPT_msse3),
3490     IX86_ATTR_ISA ("sse4",      OPT_msse4),
3491     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
3492     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
3493     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
3494     IX86_ATTR_ISA ("sse5",      OPT_msse5),
3495     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
3496
3497     /* string options */
3498     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
3499     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
3500     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
3501
3502     /* flag options */
3503     IX86_ATTR_YES ("cld",
3504                    OPT_mcld,
3505                    MASK_CLD),
3506
3507     IX86_ATTR_NO ("fancy-math-387",
3508                   OPT_mfancy_math_387,
3509                   MASK_NO_FANCY_MATH_387),
3510
3511     IX86_ATTR_NO ("fused-madd",
3512                   OPT_mfused_madd,
3513                   MASK_NO_FUSED_MADD),
3514
3515     IX86_ATTR_YES ("ieee-fp",
3516                    OPT_mieee_fp,
3517                    MASK_IEEE_FP),
3518
3519     IX86_ATTR_YES ("inline-all-stringops",
3520                    OPT_minline_all_stringops,
3521                    MASK_INLINE_ALL_STRINGOPS),
3522
3523     IX86_ATTR_YES ("inline-stringops-dynamically",
3524                    OPT_minline_stringops_dynamically,
3525                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
3526
3527     IX86_ATTR_NO ("align-stringops",
3528                   OPT_mno_align_stringops,
3529                   MASK_NO_ALIGN_STRINGOPS),
3530
3531     IX86_ATTR_YES ("recip",
3532                    OPT_mrecip,
3533                    MASK_RECIP),
3534
3535   };
3536
3537   /* If this is a list, recurse to get the options.  */
3538   if (TREE_CODE (args) == TREE_LIST)
3539     {
3540       bool ret = true;
3541
3542       for (; args; args = TREE_CHAIN (args))
3543         if (TREE_VALUE (args)
3544             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
3545           ret = false;
3546
3547       return ret;
3548     }
3549
3550   else if (TREE_CODE (args) != STRING_CST)
3551     gcc_unreachable ();
3552
3553   /* Handle multiple arguments separated by commas.  */
3554   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
3555
3556   while (next_optstr && *next_optstr != '\0')
3557     {
3558       char *p = next_optstr;
3559       char *orig_p = p;
3560       char *comma = strchr (next_optstr, ',');
3561       const char *opt_string;
3562       size_t len, opt_len;
3563       int opt;
3564       bool opt_set_p;
3565       char ch;
3566       unsigned i;
3567       enum ix86_opt_type type = ix86_opt_unknown;
3568       int mask = 0;
3569
3570       if (comma)
3571         {
3572           *comma = '\0';
3573           len = comma - next_optstr;
3574           next_optstr = comma + 1;
3575         }
3576       else
3577         {
3578           len = strlen (p);
3579           next_optstr = NULL;
3580         }
3581
3582       /* Recognize no-xxx.  */
3583       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
3584         {
3585           opt_set_p = false;
3586           p += 3;
3587           len -= 3;
3588         }
3589       else
3590         opt_set_p = true;
3591
3592       /* Find the option.  */
3593       ch = *p;
3594       opt = N_OPTS;
3595       for (i = 0; i < ARRAY_SIZE (attrs); i++)
3596         {
3597           type = attrs[i].type;
3598           opt_len = attrs[i].len;
3599           if (ch == attrs[i].string[0]
3600               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
3601               && memcmp (p, attrs[i].string, opt_len) == 0)
3602             {
3603               opt = attrs[i].opt;
3604               mask = attrs[i].mask;
3605               opt_string = attrs[i].string;
3606               break;
3607             }
3608         }
3609
3610       /* Process the option.  */
3611       if (opt == N_OPTS)
3612         {
3613           error ("attribute(target(\"%s\")) is unknown", orig_p);
3614           ret = false;
3615         }
3616
3617       else if (type == ix86_opt_isa)
3618         ix86_handle_option (opt, p, opt_set_p);
3619
3620       else if (type == ix86_opt_yes || type == ix86_opt_no)
3621         {
3622           if (type == ix86_opt_no)
3623             opt_set_p = !opt_set_p;
3624
3625           if (opt_set_p)
3626             target_flags |= mask;
3627           else
3628             target_flags &= ~mask;
3629         }
3630
3631       else if (type == ix86_opt_str)
3632         {
3633           if (p_strings[opt])
3634             {
3635               error ("option(\"%s\") was already specified", opt_string);
3636               ret = false;
3637             }
3638           else
3639             p_strings[opt] = xstrdup (p + opt_len);
3640         }
3641
3642       else
3643         gcc_unreachable ();
3644     }
3645
3646   return ret;
3647 }
3648
3649 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
3650
3651 tree
3652 ix86_valid_target_attribute_tree (tree args)
3653 {
3654   const char *orig_arch_string = ix86_arch_string;
3655   const char *orig_tune_string = ix86_tune_string;
3656   const char *orig_fpmath_string = ix86_fpmath_string;
3657   int orig_tune_defaulted = ix86_tune_defaulted;
3658   int orig_arch_specified = ix86_arch_specified;
3659   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
3660   tree t = NULL_TREE;
3661   int i;
3662   struct cl_target_option *def
3663     = TREE_TARGET_OPTION (target_option_default_node);
3664
3665   /* Process each of the options on the chain.  */
3666   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
3667     return NULL_TREE;
3668
3669   /* If the changed options are different from the default, rerun override_options,
3670      and then save the options away.  The string options are are attribute options,
3671      and will be undone when we copy the save structure.  */
3672   if (ix86_isa_flags != def->ix86_isa_flags
3673       || target_flags != def->target_flags
3674       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
3675       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
3676       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3677     {
3678       /* If we are using the default tune= or arch=, undo the string assigned,
3679          and use the default.  */
3680       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
3681         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
3682       else if (!orig_arch_specified)
3683         ix86_arch_string = NULL;
3684
3685       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
3686         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
3687       else if (orig_tune_defaulted)
3688         ix86_tune_string = NULL;
3689
3690       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
3691       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3692         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
3693       else if (!TARGET_64BIT && TARGET_SSE)
3694         ix86_fpmath_string = "sse,387";
3695
3696       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
3697       override_options (false);
3698
3699       /* Add any builtin functions with the new isa if any.  */
3700       ix86_add_new_builtins (ix86_isa_flags);
3701
3702       /* Save the current options unless we are validating options for
3703          #pragma.  */
3704       t = build_target_option_node ();
3705
3706       ix86_arch_string = orig_arch_string;
3707       ix86_tune_string = orig_tune_string;
3708       ix86_fpmath_string = orig_fpmath_string;
3709
3710       /* Free up memory allocated to hold the strings */
3711       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
3712         if (option_strings[i])
3713           free (option_strings[i]);
3714     }
3715
3716   return t;
3717 }
3718
3719 /* Hook to validate attribute((target("string"))).  */
3720
3721 static bool
3722 ix86_valid_target_attribute_p (tree fndecl,
3723                                tree ARG_UNUSED (name),
3724                                tree args,
3725                                int ARG_UNUSED (flags))
3726 {
3727   struct cl_target_option cur_target;
3728   bool ret = true;
3729   tree old_optimize = build_optimization_node ();
3730   tree new_target, new_optimize;
3731   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
3732
3733   /* If the function changed the optimization levels as well as setting target
3734      options, start with the optimizations specified.  */
3735   if (func_optimize && func_optimize != old_optimize)
3736     cl_optimization_restore (TREE_OPTIMIZATION (func_optimize));
3737
3738   /* The target attributes may also change some optimization flags, so update
3739      the optimization options if necessary.  */
3740   cl_target_option_save (&cur_target);
3741   new_target = ix86_valid_target_attribute_tree (args);
3742   new_optimize = build_optimization_node ();
3743
3744   if (!new_target)
3745     ret = false;
3746
3747   else if (fndecl)
3748     {
3749       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
3750
3751       if (old_optimize != new_optimize)
3752         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
3753     }
3754
3755   cl_target_option_restore (&cur_target);
3756
3757   if (old_optimize != new_optimize)
3758     cl_optimization_restore (TREE_OPTIMIZATION (old_optimize));
3759
3760   return ret;
3761 }
3762
3763 \f
3764 /* Hook to determine if one function can safely inline another.  */
3765
3766 static bool
3767 ix86_can_inline_p (tree caller, tree callee)
3768 {
3769   bool ret = false;
3770   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
3771   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
3772
3773   /* If callee has no option attributes, then it is ok to inline.  */
3774   if (!callee_tree)
3775     ret = true;
3776
3777   /* If caller has no option attributes, but callee does then it is not ok to
3778      inline.  */
3779   else if (!caller_tree)
3780     ret = false;
3781
3782   else
3783     {
3784       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
3785       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
3786
3787       /* Callee's isa options should a subset of the caller's, i.e. a SSE5 function
3788          can inline a SSE2 function but a SSE2 function can't inline a SSE5
3789          function.  */
3790       if ((caller_opts->ix86_isa_flags & callee_opts->ix86_isa_flags)
3791           != callee_opts->ix86_isa_flags)
3792         ret = false;
3793
3794       /* See if we have the same non-isa options.  */
3795       else if (caller_opts->target_flags != callee_opts->target_flags)
3796         ret = false;
3797
3798       /* See if arch, tune, etc. are the same.  */
3799       else if (caller_opts->arch != callee_opts->arch)
3800         ret = false;
3801
3802       else if (caller_opts->tune != callee_opts->tune)
3803         ret = false;
3804
3805       else if (caller_opts->fpmath != callee_opts->fpmath)
3806         ret = false;
3807
3808       else if (caller_opts->branch_cost != callee_opts->branch_cost)
3809         ret = false;
3810
3811       else
3812         ret = true;
3813     }
3814
3815   return ret;
3816 }
3817
3818 \f
3819 /* Remember the last target of ix86_set_current_function.  */
3820 static GTY(()) tree ix86_previous_fndecl;
3821
3822 /* Establish appropriate back-end context for processing the function
3823    FNDECL.  The argument might be NULL to indicate processing at top
3824    level, outside of any function scope.  */
3825 static void
3826 ix86_set_current_function (tree fndecl)
3827 {
3828   /* Only change the context if the function changes.  This hook is called
3829      several times in the course of compiling a function, and we don't want to
3830      slow things down too much or call target_reinit when it isn't safe.  */
3831   if (fndecl && fndecl != ix86_previous_fndecl)
3832     {
3833       tree old_tree = (ix86_previous_fndecl
3834                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
3835                        : NULL_TREE);
3836
3837       tree new_tree = (fndecl
3838                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
3839                        : NULL_TREE);
3840
3841       ix86_previous_fndecl = fndecl;
3842       if (old_tree == new_tree)
3843         ;
3844
3845       else if (new_tree)
3846         {
3847           cl_target_option_restore (TREE_TARGET_OPTION (new_tree));
3848           target_reinit ();
3849         }
3850
3851       else if (old_tree)
3852         {
3853           struct cl_target_option *def
3854             = TREE_TARGET_OPTION (target_option_current_node);
3855
3856           cl_target_option_restore (def);
3857           target_reinit ();
3858         }
3859     }
3860 }
3861
3862 \f
3863 /* Return true if this goes in large data/bss.  */
3864
3865 static bool
3866 ix86_in_large_data_p (tree exp)
3867 {
3868   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
3869     return false;
3870
3871   /* Functions are never large data.  */
3872   if (TREE_CODE (exp) == FUNCTION_DECL)
3873     return false;
3874
3875   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
3876     {
3877       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
3878       if (strcmp (section, ".ldata") == 0
3879           || strcmp (section, ".lbss") == 0)
3880         return true;
3881       return false;
3882     }
3883   else
3884     {
3885       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
3886
3887       /* If this is an incomplete type with size 0, then we can't put it
3888          in data because it might be too big when completed.  */
3889       if (!size || size > ix86_section_threshold)
3890         return true;
3891     }
3892
3893   return false;
3894 }
3895
3896 /* Switch to the appropriate section for output of DECL.
3897    DECL is either a `VAR_DECL' node or a constant of some sort.
3898    RELOC indicates whether forming the initial value of DECL requires
3899    link-time relocations.  */
3900
3901 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
3902         ATTRIBUTE_UNUSED;
3903
3904 static section *
3905 x86_64_elf_select_section (tree decl, int reloc,
3906                            unsigned HOST_WIDE_INT align)
3907 {
3908   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3909       && ix86_in_large_data_p (decl))
3910     {
3911       const char *sname = NULL;
3912       unsigned int flags = SECTION_WRITE;
3913       switch (categorize_decl_for_section (decl, reloc))
3914         {
3915         case SECCAT_DATA:
3916           sname = ".ldata";
3917           break;
3918         case SECCAT_DATA_REL:
3919           sname = ".ldata.rel";
3920           break;
3921         case SECCAT_DATA_REL_LOCAL:
3922           sname = ".ldata.rel.local";
3923           break;
3924         case SECCAT_DATA_REL_RO:
3925           sname = ".ldata.rel.ro";
3926           break;
3927         case SECCAT_DATA_REL_RO_LOCAL:
3928           sname = ".ldata.rel.ro.local";
3929           break;
3930         case SECCAT_BSS:
3931           sname = ".lbss";
3932           flags |= SECTION_BSS;
3933           break;
3934         case SECCAT_RODATA:
3935         case SECCAT_RODATA_MERGE_STR:
3936         case SECCAT_RODATA_MERGE_STR_INIT:
3937         case SECCAT_RODATA_MERGE_CONST:
3938           sname = ".lrodata";
3939           flags = 0;
3940           break;
3941         case SECCAT_SRODATA:
3942         case SECCAT_SDATA:
3943         case SECCAT_SBSS:
3944           gcc_unreachable ();
3945         case SECCAT_TEXT:
3946         case SECCAT_TDATA:
3947         case SECCAT_TBSS:
3948           /* We don't split these for medium model.  Place them into
3949              default sections and hope for best.  */
3950           break;
3951         case SECCAT_EMUTLS_VAR:
3952         case SECCAT_EMUTLS_TMPL:
3953           gcc_unreachable ();
3954         }
3955       if (sname)
3956         {
3957           /* We might get called with string constants, but get_named_section
3958              doesn't like them as they are not DECLs.  Also, we need to set
3959              flags in that case.  */
3960           if (!DECL_P (decl))
3961             return get_section (sname, flags, NULL);
3962           return get_named_section (decl, sname, reloc);
3963         }
3964     }
3965   return default_elf_select_section (decl, reloc, align);
3966 }
3967
3968 /* Build up a unique section name, expressed as a
3969    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
3970    RELOC indicates whether the initial value of EXP requires
3971    link-time relocations.  */
3972
3973 static void ATTRIBUTE_UNUSED
3974 x86_64_elf_unique_section (tree decl, int reloc)
3975 {
3976   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3977       && ix86_in_large_data_p (decl))
3978     {
3979       const char *prefix = NULL;
3980       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
3981       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
3982
3983       switch (categorize_decl_for_section (decl, reloc))
3984         {
3985         case SECCAT_DATA:
3986         case SECCAT_DATA_REL:
3987         case SECCAT_DATA_REL_LOCAL:
3988         case SECCAT_DATA_REL_RO:
3989         case SECCAT_DATA_REL_RO_LOCAL:
3990           prefix = one_only ? ".ld" : ".ldata";
3991           break;
3992         case SECCAT_BSS:
3993           prefix = one_only ? ".lb" : ".lbss";
3994           break;
3995         case SECCAT_RODATA:
3996         case SECCAT_RODATA_MERGE_STR:
3997         case SECCAT_RODATA_MERGE_STR_INIT:
3998         case SECCAT_RODATA_MERGE_CONST:
3999           prefix = one_only ? ".lr" : ".lrodata";
4000           break;
4001         case SECCAT_SRODATA:
4002         case SECCAT_SDATA:
4003         case SECCAT_SBSS:
4004           gcc_unreachable ();
4005         case SECCAT_TEXT:
4006         case SECCAT_TDATA:
4007         case SECCAT_TBSS:
4008           /* We don't split these for medium model.  Place them into
4009              default sections and hope for best.  */
4010           break;
4011         case SECCAT_EMUTLS_VAR:
4012           prefix = targetm.emutls.var_section;
4013           break;
4014         case SECCAT_EMUTLS_TMPL:
4015           prefix = targetm.emutls.tmpl_section;
4016           break;
4017         }
4018       if (prefix)
4019         {
4020           const char *name, *linkonce;
4021           char *string;
4022
4023           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4024           name = targetm.strip_name_encoding (name);
4025           
4026           /* If we're using one_only, then there needs to be a .gnu.linkonce
4027              prefix to the section name.  */
4028           linkonce = one_only ? ".gnu.linkonce" : "";
4029   
4030           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
4031           
4032           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
4033           return;
4034         }
4035     }
4036   default_unique_section (decl, reloc);
4037 }
4038
4039 #ifdef COMMON_ASM_OP
4040 /* This says how to output assembler code to declare an
4041    uninitialized external linkage data object.
4042
4043    For medium model x86-64 we need to use .largecomm opcode for
4044    large objects.  */
4045 void
4046 x86_elf_aligned_common (FILE *file,
4047                         const char *name, unsigned HOST_WIDE_INT size,
4048                         int align)
4049 {
4050   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4051       && size > (unsigned int)ix86_section_threshold)
4052     fprintf (file, ".largecomm\t");
4053   else
4054     fprintf (file, "%s", COMMON_ASM_OP);
4055   assemble_name (file, name);
4056   fprintf (file, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
4057            size, align / BITS_PER_UNIT);
4058 }
4059 #endif
4060
4061 /* Utility function for targets to use in implementing
4062    ASM_OUTPUT_ALIGNED_BSS.  */
4063
4064 void
4065 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
4066                         const char *name, unsigned HOST_WIDE_INT size,
4067                         int align)
4068 {
4069   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4070       && size > (unsigned int)ix86_section_threshold)
4071     switch_to_section (get_named_section (decl, ".lbss", 0));
4072   else
4073     switch_to_section (bss_section);
4074   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
4075 #ifdef ASM_DECLARE_OBJECT_NAME
4076   last_assemble_variable_decl = decl;
4077   ASM_DECLARE_OBJECT_NAME (file, name, decl);
4078 #else
4079   /* Standard thing is just output label for the object.  */
4080   ASM_OUTPUT_LABEL (file, name);
4081 #endif /* ASM_DECLARE_OBJECT_NAME */
4082   ASM_OUTPUT_SKIP (file, size ? size : 1);
4083 }
4084 \f
4085 void
4086 optimization_options (int level, int size ATTRIBUTE_UNUSED)
4087 {
4088   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
4089      make the problem with not enough registers even worse.  */
4090 #ifdef INSN_SCHEDULING
4091   if (level > 1)
4092     flag_schedule_insns = 0;
4093 #endif
4094
4095   if (TARGET_MACHO)
4096     /* The Darwin libraries never set errno, so we might as well
4097        avoid calling them when that's the only reason we would.  */
4098     flag_errno_math = 0;
4099
4100   /* The default values of these switches depend on the TARGET_64BIT
4101      that is not known at this moment.  Mark these values with 2 and
4102      let user the to override these.  In case there is no command line option
4103      specifying them, we will set the defaults in override_options.  */
4104   if (optimize >= 1)
4105     flag_omit_frame_pointer = 2;
4106   flag_pcc_struct_return = 2;
4107   flag_asynchronous_unwind_tables = 2;
4108   flag_vect_cost_model = 1;
4109 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
4110   SUBTARGET_OPTIMIZATION_OPTIONS;
4111 #endif
4112 }
4113 \f
4114 /* Decide whether we can make a sibling call to a function.  DECL is the
4115    declaration of the function being targeted by the call and EXP is the
4116    CALL_EXPR representing the call.  */
4117
4118 static bool
4119 ix86_function_ok_for_sibcall (tree decl, tree exp)
4120 {
4121   tree type, decl_or_type;
4122   rtx a, b;
4123
4124   /* If we are generating position-independent code, we cannot sibcall
4125      optimize any indirect call, or a direct call to a global function,
4126      as the PLT requires %ebx be live.  */
4127   if (!TARGET_64BIT && flag_pic && (!decl || !targetm.binds_local_p (decl)))
4128     return false;
4129
4130   /* If we need to align the outgoing stack, then sibcalling would
4131      unalign the stack, which may break the called function.  */
4132   if (ix86_incoming_stack_boundary < PREFERRED_STACK_BOUNDARY)
4133     return false;
4134
4135   if (decl)
4136     {
4137       decl_or_type = decl;
4138       type = TREE_TYPE (decl);
4139     }
4140   else
4141     {
4142       /* We're looking at the CALL_EXPR, we need the type of the function.  */
4143       type = CALL_EXPR_FN (exp);                /* pointer expression */
4144       type = TREE_TYPE (type);                  /* pointer type */
4145       type = TREE_TYPE (type);                  /* function type */
4146       decl_or_type = type;
4147     }
4148
4149   /* Check that the return value locations are the same.  Like
4150      if we are returning floats on the 80387 register stack, we cannot
4151      make a sibcall from a function that doesn't return a float to a
4152      function that does or, conversely, from a function that does return
4153      a float to a function that doesn't; the necessary stack adjustment
4154      would not be executed.  This is also the place we notice
4155      differences in the return value ABI.  Note that it is ok for one
4156      of the functions to have void return type as long as the return
4157      value of the other is passed in a register.  */
4158   a = ix86_function_value (TREE_TYPE (exp), decl_or_type, false);
4159   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
4160                            cfun->decl, false);
4161   if (STACK_REG_P (a) || STACK_REG_P (b))
4162     {
4163       if (!rtx_equal_p (a, b))
4164         return false;
4165     }
4166   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
4167     ;
4168   else if (!rtx_equal_p (a, b))
4169     return false;
4170
4171   if (TARGET_64BIT)
4172     {
4173       /* The SYSV ABI has more call-clobbered registers;
4174          disallow sibcalls from MS to SYSV.  */
4175       if (cfun->machine->call_abi == MS_ABI
4176           && ix86_function_type_abi (type) == SYSV_ABI)
4177         return false;
4178     }
4179   else
4180     {
4181       /* If this call is indirect, we'll need to be able to use a
4182          call-clobbered register for the address of the target function.
4183          Make sure that all such registers are not used for passing
4184          parameters.  Note that DLLIMPORT functions are indirect.  */
4185       if (!decl
4186           || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl)))
4187         {
4188           if (ix86_function_regparm (type, NULL) >= 3)
4189             {
4190               /* ??? Need to count the actual number of registers to be used,
4191                  not the possible number of registers.  Fix later.  */
4192               return false;
4193             }
4194         }
4195     }
4196
4197   /* Otherwise okay.  That also includes certain types of indirect calls.  */
4198   return true;
4199 }
4200
4201 /* Handle "cdecl", "stdcall", "fastcall", "regparm" and "sseregparm"
4202    calling convention attributes;
4203    arguments as in struct attribute_spec.handler.  */
4204
4205 static tree
4206 ix86_handle_cconv_attribute (tree *node, tree name,
4207                                    tree args,
4208                                    int flags ATTRIBUTE_UNUSED,
4209                                    bool *no_add_attrs)
4210 {
4211   if (TREE_CODE (*node) != FUNCTION_TYPE
4212       && TREE_CODE (*node) != METHOD_TYPE
4213       && TREE_CODE (*node) != FIELD_DECL
4214       && TREE_CODE (*node) != TYPE_DECL)
4215     {
4216       warning (OPT_Wattributes, "%qs attribute only applies to functions",
4217                IDENTIFIER_POINTER (name));
4218       *no_add_attrs = true;
4219       return NULL_TREE;
4220     }
4221
4222   /* Can combine regparm with all attributes but fastcall.  */
4223   if (is_attribute_p ("regparm", name))
4224     {
4225       tree cst;
4226
4227       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4228         {
4229           error ("fastcall and regparm attributes are not compatible");
4230         }
4231
4232       cst = TREE_VALUE (args);
4233       if (TREE_CODE (cst) != INTEGER_CST)
4234         {
4235           warning (OPT_Wattributes,
4236                    "%qs attribute requires an integer constant argument",
4237                    IDENTIFIER_POINTER (name));
4238           *no_add_attrs = true;
4239         }
4240       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
4241         {
4242           warning (OPT_Wattributes, "argument to %qs attribute larger than %d",
4243                    IDENTIFIER_POINTER (name), REGPARM_MAX);
4244           *no_add_attrs = true;
4245         }
4246
4247       return NULL_TREE;
4248     }
4249
4250   if (TARGET_64BIT)
4251     {
4252       /* Do not warn when emulating the MS ABI.  */
4253       if (TREE_CODE (*node) != FUNCTION_TYPE || ix86_function_type_abi (*node)!=MS_ABI)
4254         warning (OPT_Wattributes, "%qs attribute ignored",
4255                  IDENTIFIER_POINTER (name));
4256       *no_add_attrs = true;
4257       return NULL_TREE;
4258     }
4259
4260   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
4261   if (is_attribute_p ("fastcall", name))
4262     {
4263       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4264         {
4265           error ("fastcall and cdecl attributes are not compatible");
4266         }
4267       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4268         {
4269           error ("fastcall and stdcall attributes are not compatible");
4270         }
4271       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
4272         {
4273           error ("fastcall and regparm attributes are not compatible");
4274         }
4275     }
4276
4277   /* Can combine stdcall with fastcall (redundant), regparm and
4278      sseregparm.  */
4279   else if (is_attribute_p ("stdcall", name))
4280     {
4281       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4282         {
4283           error ("stdcall and cdecl attributes are not compatible");
4284         }
4285       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4286         {
4287           error ("stdcall and fastcall attributes are not compatible");
4288         }
4289     }
4290
4291   /* Can combine cdecl with regparm and sseregparm.  */
4292   else if (is_attribute_p ("cdecl", name))
4293     {
4294       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4295         {
4296           error ("stdcall and cdecl attributes are not compatible");
4297         }
4298       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4299         {
4300           error ("fastcall and cdecl attributes are not compatible");
4301         }
4302     }
4303
4304   /* Can combine sseregparm with all attributes.  */
4305
4306   return NULL_TREE;
4307 }
4308
4309 /* Return 0 if the attributes for two types are incompatible, 1 if they
4310    are compatible, and 2 if they are nearly compatible (which causes a
4311    warning to be generated).  */
4312
4313 static int
4314 ix86_comp_type_attributes (const_tree type1, const_tree type2)
4315 {
4316   /* Check for mismatch of non-default calling convention.  */
4317   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
4318
4319   if (TREE_CODE (type1) != FUNCTION_TYPE
4320       && TREE_CODE (type1) != METHOD_TYPE)
4321     return 1;
4322
4323   /* Check for mismatched fastcall/regparm types.  */
4324   if ((!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
4325        != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
4326       || (ix86_function_regparm (type1, NULL)
4327           != ix86_function_regparm (type2, NULL)))
4328     return 0;
4329
4330   /* Check for mismatched sseregparm types.  */
4331   if (!lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type1))
4332       != !lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type2)))
4333     return 0;
4334
4335   /* Check for mismatched return types (cdecl vs stdcall).  */
4336   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
4337       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
4338     return 0;
4339
4340   return 1;
4341 }
4342 \f
4343 /* Return the regparm value for a function with the indicated TYPE and DECL.
4344    DECL may be NULL when calling function indirectly
4345    or considering a libcall.  */
4346
4347 static int
4348 ix86_function_regparm (const_tree type, const_tree decl)
4349 {
4350   tree attr;
4351   int regparm;
4352
4353   static bool error_issued;
4354
4355   if (TARGET_64BIT)
4356     return (ix86_function_type_abi (type) == SYSV_ABI
4357             ? X86_64_REGPARM_MAX : X64_REGPARM_MAX);
4358
4359   regparm = ix86_regparm;
4360   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
4361   if (attr)
4362     {
4363       regparm
4364         = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
4365
4366       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4367         {
4368           /* We can't use regparm(3) for nested functions because
4369              these pass static chain pointer in %ecx register.  */
4370           if (!error_issued && regparm == 3
4371               && decl_function_context (decl)
4372               && !DECL_NO_STATIC_CHAIN (decl))
4373             {
4374               error ("nested functions are limited to 2 register parameters");
4375               error_issued = true;
4376               return 0;
4377             }
4378         }
4379
4380       return regparm;
4381     }
4382
4383   if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
4384     return 2;
4385
4386   /* Use register calling convention for local functions when possible.  */
4387   if (decl
4388       && TREE_CODE (decl) == FUNCTION_DECL
4389       && optimize
4390       && !profile_flag)
4391     {
4392       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4393       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4394       if (i && i->local)
4395         {
4396           int local_regparm, globals = 0, regno;
4397           struct function *f;
4398
4399           /* Make sure no regparm register is taken by a
4400              fixed register variable.  */
4401           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
4402             if (fixed_regs[local_regparm])
4403               break;
4404
4405           /* We can't use regparm(3) for nested functions as these use
4406              static chain pointer in third argument.  */
4407           if (local_regparm == 3
4408               && decl_function_context (decl)
4409               && !DECL_NO_STATIC_CHAIN (decl))
4410             local_regparm = 2;
4411
4412           /* If the function realigns its stackpointer, the prologue will
4413              clobber %ecx.  If we've already generated code for the callee,
4414              the callee DECL_STRUCT_FUNCTION is gone, so we fall back to
4415              scanning the attributes for the self-realigning property.  */
4416           f = DECL_STRUCT_FUNCTION (decl);
4417           /* Since current internal arg pointer won't conflict with
4418              parameter passing regs, so no need to change stack
4419              realignment and adjust regparm number.
4420
4421              Each fixed register usage increases register pressure,
4422              so less registers should be used for argument passing.
4423              This functionality can be overriden by an explicit
4424              regparm value.  */
4425           for (regno = 0; regno <= DI_REG; regno++)
4426             if (fixed_regs[regno])
4427               globals++;
4428
4429           local_regparm
4430             = globals < local_regparm ? local_regparm - globals : 0;
4431
4432           if (local_regparm > regparm)
4433             regparm = local_regparm;
4434         }
4435     }
4436
4437   return regparm;
4438 }
4439
4440 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
4441    DFmode (2) arguments in SSE registers for a function with the
4442    indicated TYPE and DECL.  DECL may be NULL when calling function
4443    indirectly or considering a libcall.  Otherwise return 0.  */
4444
4445 static int
4446 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
4447 {
4448   gcc_assert (!TARGET_64BIT);
4449
4450   /* Use SSE registers to pass SFmode and DFmode arguments if requested
4451      by the sseregparm attribute.  */
4452   if (TARGET_SSEREGPARM
4453       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
4454     {
4455       if (!TARGET_SSE)
4456         {
4457           if (warn)
4458             {
4459               if (decl)
4460                 error ("Calling %qD with attribute sseregparm without "
4461                        "SSE/SSE2 enabled", decl);
4462               else
4463                 error ("Calling %qT with attribute sseregparm without "
4464                        "SSE/SSE2 enabled", type);
4465             }
4466           return 0;
4467         }
4468
4469       return 2;
4470     }
4471
4472   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
4473      (and DFmode for SSE2) arguments in SSE registers.  */
4474   if (decl && TARGET_SSE_MATH && optimize && !profile_flag)
4475     {
4476       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4477       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4478       if (i && i->local)
4479         return TARGET_SSE2 ? 2 : 1;
4480     }
4481
4482   return 0;
4483 }
4484
4485 /* Return true if EAX is live at the start of the function.  Used by
4486    ix86_expand_prologue to determine if we need special help before
4487    calling allocate_stack_worker.  */
4488
4489 static bool
4490 ix86_eax_live_at_start_p (void)
4491 {
4492   /* Cheat.  Don't bother working forward from ix86_function_regparm
4493      to the function type to whether an actual argument is located in
4494      eax.  Instead just look at cfg info, which is still close enough
4495      to correct at this point.  This gives false positives for broken
4496      functions that might use uninitialized data that happens to be
4497      allocated in eax, but who cares?  */
4498   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
4499 }
4500
4501 /* Value is the number of bytes of arguments automatically
4502    popped when returning from a subroutine call.
4503    FUNDECL is the declaration node of the function (as a tree),
4504    FUNTYPE is the data type of the function (as a tree),
4505    or for a library call it is an identifier node for the subroutine name.
4506    SIZE is the number of bytes of arguments passed on the stack.
4507
4508    On the 80386, the RTD insn may be used to pop them if the number
4509      of args is fixed, but if the number is variable then the caller
4510      must pop them all.  RTD can't be used for library calls now
4511      because the library is compiled with the Unix compiler.
4512    Use of RTD is a selectable option, since it is incompatible with
4513    standard Unix calling sequences.  If the option is not selected,
4514    the caller must always pop the args.
4515
4516    The attribute stdcall is equivalent to RTD on a per module basis.  */
4517
4518 int
4519 ix86_return_pops_args (tree fundecl, tree funtype, int size)
4520 {
4521   int rtd;
4522
4523   /* None of the 64-bit ABIs pop arguments.  */
4524   if (TARGET_64BIT)
4525     return 0;
4526
4527   rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
4528
4529   /* Cdecl functions override -mrtd, and never pop the stack.  */
4530   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype)))
4531     {
4532       /* Stdcall and fastcall functions will pop the stack if not
4533          variable args.  */
4534       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
4535           || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
4536         rtd = 1;
4537
4538       if (rtd && ! stdarg_p (funtype))
4539         return size;
4540     }
4541
4542   /* Lose any fake structure return argument if it is passed on the stack.  */
4543   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
4544       && !KEEP_AGGREGATE_RETURN_POINTER)
4545     {
4546       int nregs = ix86_function_regparm (funtype, fundecl);
4547       if (nregs == 0)
4548         return GET_MODE_SIZE (Pmode);
4549     }
4550
4551   return 0;
4552 }
4553 \f
4554 /* Argument support functions.  */
4555
4556 /* Return true when register may be used to pass function parameters.  */
4557 bool
4558 ix86_function_arg_regno_p (int regno)
4559 {
4560   int i;
4561   const int *parm_regs;
4562
4563   if (!TARGET_64BIT)
4564     {
4565       if (TARGET_MACHO)
4566         return (regno < REGPARM_MAX
4567                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
4568       else
4569         return (regno < REGPARM_MAX
4570                 || (TARGET_MMX && MMX_REGNO_P (regno)
4571                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
4572                 || (TARGET_SSE && SSE_REGNO_P (regno)
4573                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
4574     }
4575
4576   if (TARGET_MACHO)
4577     {
4578       if (SSE_REGNO_P (regno) && TARGET_SSE)
4579         return true;
4580     }
4581   else
4582     {
4583       if (TARGET_SSE && SSE_REGNO_P (regno)
4584           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
4585         return true;
4586     }
4587
4588   /* TODO: The function should depend on current function ABI but
4589      builtins.c would need updating then. Therefore we use the
4590      default ABI.  */
4591
4592   /* RAX is used as hidden argument to va_arg functions.  */
4593   if (DEFAULT_ABI == SYSV_ABI && regno == AX_REG)
4594     return true;
4595
4596   if (DEFAULT_ABI == MS_ABI)
4597     parm_regs = x86_64_ms_abi_int_parameter_registers;
4598   else
4599     parm_regs = x86_64_int_parameter_registers;
4600   for (i = 0; i < (DEFAULT_ABI == MS_ABI ? X64_REGPARM_MAX
4601                                          : X86_64_REGPARM_MAX); i++)
4602     if (regno == parm_regs[i])
4603       return true;
4604   return false;
4605 }
4606
4607 /* Return if we do not know how to pass TYPE solely in registers.  */
4608
4609 static bool
4610 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
4611 {
4612   if (must_pass_in_stack_var_size_or_pad (mode, type))
4613     return true;
4614
4615   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
4616      The layout_type routine is crafty and tries to trick us into passing
4617      currently unsupported vector types on the stack by using TImode.  */
4618   return (!TARGET_64BIT && mode == TImode
4619           && type && TREE_CODE (type) != VECTOR_TYPE);
4620 }
4621
4622 /* It returns the size, in bytes, of the area reserved for arguments passed
4623    in registers for the function represented by fndecl dependent to the used
4624    abi format.  */
4625 int
4626 ix86_reg_parm_stack_space (const_tree fndecl)
4627 {
4628   int call_abi = SYSV_ABI;
4629   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
4630     call_abi = ix86_function_abi (fndecl);
4631   else
4632     call_abi = ix86_function_type_abi (fndecl);
4633   if (call_abi == MS_ABI)
4634     return 32;
4635   return 0;
4636 }
4637
4638 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
4639    call abi used.  */
4640 int
4641 ix86_function_type_abi (const_tree fntype)
4642 {
4643   if (TARGET_64BIT && fntype != NULL)
4644     {
4645       int abi;
4646       if (DEFAULT_ABI == SYSV_ABI)
4647         abi = lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)) ? MS_ABI : SYSV_ABI;
4648       else
4649         abi = lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)) ? SYSV_ABI : MS_ABI;
4650
4651       return abi;
4652     }
4653   return DEFAULT_ABI;
4654 }
4655
4656 int
4657 ix86_function_abi (const_tree fndecl)
4658 {
4659   if (! fndecl)
4660     return DEFAULT_ABI;
4661   return ix86_function_type_abi (TREE_TYPE (fndecl));
4662 }
4663
4664 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
4665    call abi used.  */
4666 int
4667 ix86_cfun_abi (void)
4668 {
4669   if (! cfun || ! TARGET_64BIT)
4670     return DEFAULT_ABI;
4671   return cfun->machine->call_abi;
4672 }
4673
4674 /* regclass.c  */
4675 extern void init_regs (void);
4676
4677 /* Implementation of call abi switching target hook. Specific to FNDECL
4678    the specific call register sets are set. See also CONDITIONAL_REGISTER_USAGE
4679    for more details.  */
4680 void
4681 ix86_call_abi_override (const_tree fndecl)
4682 {
4683   if (fndecl == NULL_TREE)
4684     cfun->machine->call_abi = DEFAULT_ABI;
4685   else
4686     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
4687 }
4688
4689 /* MS and SYSV ABI have different set of call used registers.  Avoid expensive
4690    re-initialization of init_regs each time we switch function context since
4691    this is needed only during RTL expansion.  */
4692 static void
4693 ix86_maybe_switch_abi (void)
4694 {
4695   if (TARGET_64BIT &&
4696       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
4697     reinit_regs ();
4698 }
4699
4700 /* Initialize a variable CUM of type CUMULATIVE_ARGS
4701    for a call to a function whose data type is FNTYPE.
4702    For a library call, FNTYPE is 0.  */
4703
4704 void
4705 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
4706                       tree fntype,      /* tree ptr for function decl */
4707                       rtx libname,      /* SYMBOL_REF of library name or 0 */
4708                       tree fndecl)
4709 {
4710   struct cgraph_local_info *i = fndecl ? cgraph_local_info (fndecl) : NULL;
4711   memset (cum, 0, sizeof (*cum));
4712
4713   if (fndecl)
4714    cum->call_abi = ix86_function_abi (fndecl);
4715   else
4716    cum->call_abi = ix86_function_type_abi (fntype);
4717   /* Set up the number of registers to use for passing arguments.  */
4718
4719   if (cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
4720     sorry ("ms_abi attribute requires -maccumulate-outgoing-args "
4721            "or subtarget optimization implying it");
4722   cum->nregs = ix86_regparm;
4723   if (TARGET_64BIT)
4724     {
4725       if (cum->call_abi != DEFAULT_ABI)
4726         cum->nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX
4727                                              : X64_REGPARM_MAX;
4728     }
4729   if (TARGET_SSE)
4730     {
4731       cum->sse_nregs = SSE_REGPARM_MAX;
4732       if (TARGET_64BIT)
4733         {
4734           if (cum->call_abi != DEFAULT_ABI)
4735             cum->sse_nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
4736                                                      : X64_SSE_REGPARM_MAX;
4737         }
4738     }
4739   if (TARGET_MMX)
4740     cum->mmx_nregs = MMX_REGPARM_MAX;
4741   cum->warn_avx = true;
4742   cum->warn_sse = true;
4743   cum->warn_mmx = true;
4744
4745   /* Because type might mismatch in between caller and callee, we need to
4746      use actual type of function for local calls.
4747      FIXME: cgraph_analyze can be told to actually record if function uses
4748      va_start so for local functions maybe_vaarg can be made aggressive
4749      helping K&R code.
4750      FIXME: once typesytem is fixed, we won't need this code anymore.  */
4751   if (i && i->local)
4752     fntype = TREE_TYPE (fndecl);
4753   cum->maybe_vaarg = (fntype
4754                       ? (!prototype_p (fntype) || stdarg_p (fntype))
4755                       : !libname);
4756
4757   if (!TARGET_64BIT)
4758     {
4759       /* If there are variable arguments, then we won't pass anything
4760          in registers in 32-bit mode. */
4761       if (stdarg_p (fntype))
4762         {
4763           cum->nregs = 0;
4764           cum->sse_nregs = 0;
4765           cum->mmx_nregs = 0;
4766           cum->warn_avx = 0;
4767           cum->warn_sse = 0;
4768           cum->warn_mmx = 0;
4769           return;
4770         }
4771
4772       /* Use ecx and edx registers if function has fastcall attribute,
4773          else look for regparm information.  */
4774       if (fntype)
4775         {
4776           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
4777             {
4778               cum->nregs = 2;
4779               cum->fastcall = 1;
4780             }
4781           else
4782             cum->nregs = ix86_function_regparm (fntype, fndecl);
4783         }
4784
4785       /* Set up the number of SSE registers used for passing SFmode
4786          and DFmode arguments.  Warn for mismatching ABI.  */
4787       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
4788     }
4789 }
4790
4791 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
4792    But in the case of vector types, it is some vector mode.
4793
4794    When we have only some of our vector isa extensions enabled, then there
4795    are some modes for which vector_mode_supported_p is false.  For these
4796    modes, the generic vector support in gcc will choose some non-vector mode
4797    in order to implement the type.  By computing the natural mode, we'll
4798    select the proper ABI location for the operand and not depend on whatever
4799    the middle-end decides to do with these vector types.
4800
4801    The midde-end can't deal with the vector types > 16 bytes.  In this
4802    case, we return the original mode and warn ABI change if CUM isn't
4803    NULL.  */
4804
4805 static enum machine_mode
4806 type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
4807 {
4808   enum machine_mode mode = TYPE_MODE (type);
4809
4810   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
4811     {
4812       HOST_WIDE_INT size = int_size_in_bytes (type);
4813       if ((size == 8 || size == 16 || size == 32)
4814           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
4815           && TYPE_VECTOR_SUBPARTS (type) > 1)
4816         {
4817           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
4818
4819           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
4820             mode = MIN_MODE_VECTOR_FLOAT;
4821           else
4822             mode = MIN_MODE_VECTOR_INT;
4823
4824           /* Get the mode which has this inner mode and number of units.  */
4825           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
4826             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
4827                 && GET_MODE_INNER (mode) == innermode)
4828               {
4829                 if (size == 32 && !TARGET_AVX)
4830                   {
4831                     static bool warnedavx;
4832
4833                     if (cum
4834                         && !warnedavx 
4835                         && cum->warn_avx)
4836                       {
4837                         warnedavx = true;
4838                         warning (0, "AVX vector argument without AVX "
4839                                  "enabled changes the ABI");
4840                       }
4841                     return TYPE_MODE (type);
4842                   }
4843                 else
4844                   return mode;
4845               }
4846
4847           gcc_unreachable ();
4848         }
4849     }
4850
4851   return mode;
4852 }
4853
4854 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
4855    this may not agree with the mode that the type system has chosen for the
4856    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
4857    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
4858
4859 static rtx
4860 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
4861                      unsigned int regno)
4862 {
4863   rtx tmp;
4864
4865   if (orig_mode != BLKmode)
4866     tmp = gen_rtx_REG (orig_mode, regno);
4867   else
4868     {
4869       tmp = gen_rtx_REG (mode, regno);
4870       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
4871       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
4872     }
4873
4874   return tmp;
4875 }
4876
4877 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
4878    of this code is to classify each 8bytes of incoming argument by the register
4879    class and assign registers accordingly.  */
4880
4881 /* Return the union class of CLASS1 and CLASS2.
4882    See the x86-64 PS ABI for details.  */
4883
4884 static enum x86_64_reg_class
4885 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
4886 {
4887   /* Rule #1: If both classes are equal, this is the resulting class.  */
4888   if (class1 == class2)
4889     return class1;
4890
4891   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
4892      the other class.  */
4893   if (class1 == X86_64_NO_CLASS)
4894     return class2;
4895   if (class2 == X86_64_NO_CLASS)
4896     return class1;
4897
4898   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
4899   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
4900     return X86_64_MEMORY_CLASS;
4901
4902   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
4903   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
4904       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
4905     return X86_64_INTEGERSI_CLASS;
4906   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
4907       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
4908     return X86_64_INTEGER_CLASS;
4909
4910   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
4911      MEMORY is used.  */
4912   if (class1 == X86_64_X87_CLASS
4913       || class1 == X86_64_X87UP_CLASS
4914       || class1 == X86_64_COMPLEX_X87_CLASS
4915       || class2 == X86_64_X87_CLASS
4916       || class2 == X86_64_X87UP_CLASS
4917       || class2 == X86_64_COMPLEX_X87_CLASS)
4918     return X86_64_MEMORY_CLASS;
4919
4920   /* Rule #6: Otherwise class SSE is used.  */
4921   return X86_64_SSE_CLASS;
4922 }
4923
4924 /* Classify the argument of type TYPE and mode MODE.
4925    CLASSES will be filled by the register class used to pass each word
4926    of the operand.  The number of words is returned.  In case the parameter
4927    should be passed in memory, 0 is returned. As a special case for zero
4928    sized containers, classes[0] will be NO_CLASS and 1 is returned.
4929
4930    BIT_OFFSET is used internally for handling records and specifies offset
4931    of the offset in bits modulo 256 to avoid overflow cases.
4932
4933    See the x86-64 PS ABI for details.
4934 */
4935
4936 static int
4937 classify_argument (enum machine_mode mode, const_tree type,
4938                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
4939 {
4940   HOST_WIDE_INT bytes =
4941     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
4942   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4943
4944   /* Variable sized entities are always passed/returned in memory.  */
4945   if (bytes < 0)
4946     return 0;
4947
4948   if (mode != VOIDmode
4949       && targetm.calls.must_pass_in_stack (mode, type))
4950     return 0;
4951
4952   if (type && AGGREGATE_TYPE_P (type))
4953     {
4954       int i;
4955       tree field;
4956       enum x86_64_reg_class subclasses[MAX_CLASSES];
4957
4958       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
4959       if (bytes > 32)
4960         return 0;
4961
4962       for (i = 0; i < words; i++)
4963         classes[i] = X86_64_NO_CLASS;
4964
4965       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
4966          signalize memory class, so handle it as special case.  */
4967       if (!words)
4968         {
4969           classes[0] = X86_64_NO_CLASS;
4970           return 1;
4971         }
4972
4973       /* Classify each field of record and merge classes.  */
4974       switch (TREE_CODE (type))
4975         {
4976         case RECORD_TYPE:
4977           /* And now merge the fields of structure.  */
4978           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4979             {
4980               if (TREE_CODE (field) == FIELD_DECL)
4981                 {
4982                   int num;
4983
4984                   if (TREE_TYPE (field) == error_mark_node)
4985                     continue;
4986
4987                   /* Bitfields are always classified as integer.  Handle them
4988                      early, since later code would consider them to be
4989                      misaligned integers.  */
4990                   if (DECL_BIT_FIELD (field))
4991                     {
4992                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
4993                            i < ((int_bit_position (field) + (bit_offset % 64))
4994                                 + tree_low_cst (DECL_SIZE (field), 0)
4995                                 + 63) / 8 / 8; i++)
4996                         classes[i] =
4997                           merge_classes (X86_64_INTEGER_CLASS,
4998                                          classes[i]);
4999                     }
5000                   else
5001                     {
5002                       type = TREE_TYPE (field);
5003
5004                       /* Flexible array member is ignored.  */
5005                       if (TYPE_MODE (type) == BLKmode
5006                           && TREE_CODE (type) == ARRAY_TYPE
5007                           && TYPE_SIZE (type) == NULL_TREE
5008                           && TYPE_DOMAIN (type) != NULL_TREE
5009                           && (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
5010                               == NULL_TREE))
5011                         {
5012                           static bool warned;
5013                           
5014                           if (!warned && warn_psabi)
5015                             {
5016                               warned = true;
5017                               inform (input_location,
5018                                       "The ABI of passing struct with"
5019                                       " a flexible array member has"
5020                                       " changed in GCC 4.4");
5021                             }
5022                           continue;
5023                         }
5024                       num = classify_argument (TYPE_MODE (type), type,
5025                                                subclasses,
5026                                                (int_bit_position (field)
5027                                                 + bit_offset) % 256);
5028                       if (!num)
5029                         return 0;
5030                       for (i = 0; i < num; i++)
5031                         {
5032                           int pos =
5033                             (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
5034                           classes[i + pos] =
5035                             merge_classes (subclasses[i], classes[i + pos]);
5036                         }
5037                     }
5038                 }
5039             }
5040           break;
5041
5042         case ARRAY_TYPE:
5043           /* Arrays are handled as small records.  */
5044           {
5045             int num;
5046             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
5047                                      TREE_TYPE (type), subclasses, bit_offset);
5048             if (!num)
5049               return 0;
5050
5051             /* The partial classes are now full classes.  */
5052             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
5053               subclasses[0] = X86_64_SSE_CLASS;
5054             if (subclasses[0] == X86_64_INTEGERSI_CLASS
5055                 && !((bit_offset % 64) == 0 && bytes == 4))
5056               subclasses[0] = X86_64_INTEGER_CLASS;
5057
5058             for (i = 0; i < words; i++)
5059               classes[i] = subclasses[i % num];
5060
5061             break;
5062           }
5063         case UNION_TYPE:
5064         case QUAL_UNION_TYPE:
5065           /* Unions are similar to RECORD_TYPE but offset is always 0.
5066              */
5067           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5068             {
5069               if (TREE_CODE (field) == FIELD_DECL)
5070                 {
5071                   int num;
5072
5073                   if (TREE_TYPE (field) == error_mark_node)
5074                     continue;
5075
5076                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
5077                                            TREE_TYPE (field), subclasses,
5078                                            bit_offset);
5079                   if (!num)
5080                     return 0;
5081                   for (i = 0; i < num; i++)
5082                     classes[i] = merge_classes (subclasses[i], classes[i]);
5083                 }
5084             }
5085           break;
5086
5087         default:
5088           gcc_unreachable ();
5089         }
5090
5091       if (words > 2)
5092         {
5093           /* When size > 16 bytes, if the first one isn't
5094              X86_64_SSE_CLASS or any other ones aren't
5095              X86_64_SSEUP_CLASS, everything should be passed in
5096              memory.  */
5097           if (classes[0] != X86_64_SSE_CLASS)
5098               return 0;
5099
5100           for (i = 1; i < words; i++)
5101             if (classes[i] != X86_64_SSEUP_CLASS)
5102               return 0;
5103         }
5104
5105       /* Final merger cleanup.  */
5106       for (i = 0; i < words; i++)
5107         {
5108           /* If one class is MEMORY, everything should be passed in
5109              memory.  */
5110           if (classes[i] == X86_64_MEMORY_CLASS)
5111             return 0;
5112
5113           /* The X86_64_SSEUP_CLASS should be always preceded by
5114              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
5115           if (classes[i] == X86_64_SSEUP_CLASS
5116               && classes[i - 1] != X86_64_SSE_CLASS
5117               && classes[i - 1] != X86_64_SSEUP_CLASS)
5118             {
5119               /* The first one should never be X86_64_SSEUP_CLASS.  */
5120               gcc_assert (i != 0);
5121               classes[i] = X86_64_SSE_CLASS;
5122             }
5123
5124           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
5125                everything should be passed in memory.  */
5126           if (classes[i] == X86_64_X87UP_CLASS
5127               && (classes[i - 1] != X86_64_X87_CLASS))
5128             {
5129               static bool warned;
5130
5131               /* The first one should never be X86_64_X87UP_CLASS.  */
5132               gcc_assert (i != 0);
5133               if (!warned && warn_psabi)
5134                 {
5135                   warned = true;
5136                   inform (input_location,
5137                           "The ABI of passing union with long double"
5138                           " has changed in GCC 4.4");
5139                 }
5140               return 0;
5141             }
5142         }
5143       return words;
5144     }
5145
5146   /* Compute alignment needed.  We align all types to natural boundaries with
5147      exception of XFmode that is aligned to 64bits.  */
5148   if (mode != VOIDmode && mode != BLKmode)
5149     {
5150       int mode_alignment = GET_MODE_BITSIZE (mode);
5151
5152       if (mode == XFmode)
5153         mode_alignment = 128;
5154       else if (mode == XCmode)
5155         mode_alignment = 256;
5156       if (COMPLEX_MODE_P (mode))
5157         mode_alignment /= 2;
5158       /* Misaligned fields are always returned in memory.  */
5159       if (bit_offset % mode_alignment)
5160         return 0;
5161     }
5162
5163   /* for V1xx modes, just use the base mode */
5164   if (VECTOR_MODE_P (mode) && mode != V1DImode
5165       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
5166     mode = GET_MODE_INNER (mode);
5167
5168   /* Classification of atomic types.  */
5169   switch (mode)
5170     {
5171     case SDmode:
5172     case DDmode:
5173       classes[0] = X86_64_SSE_CLASS;
5174       return 1;
5175     case TDmode:
5176       classes[0] = X86_64_SSE_CLASS;
5177       classes[1] = X86_64_SSEUP_CLASS;
5178       return 2;
5179     case DImode:
5180     case SImode:
5181     case HImode:
5182     case QImode:
5183     case CSImode:
5184     case CHImode:
5185     case CQImode:
5186       {
5187         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
5188
5189         if (size <= 32)
5190           {
5191             classes[0] = X86_64_INTEGERSI_CLASS;
5192             return 1;
5193           }
5194         else if (size <= 64)
5195           {
5196             classes[0] = X86_64_INTEGER_CLASS;
5197             return 1;
5198           }
5199         else if (size <= 64+32)
5200           {
5201             classes[0] = X86_64_INTEGER_CLASS;
5202             classes[1] = X86_64_INTEGERSI_CLASS;
5203             return 2;
5204           }
5205         else if (size <= 64+64)
5206           {
5207             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5208             return 2;
5209           }
5210         else
5211           gcc_unreachable ();
5212       }
5213     case CDImode:
5214     case TImode:
5215       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5216       return 2;
5217     case COImode:
5218     case OImode:
5219       /* OImode shouldn't be used directly.  */
5220       gcc_unreachable ();
5221     case CTImode:
5222       return 0;
5223     case SFmode:
5224       if (!(bit_offset % 64))
5225         classes[0] = X86_64_SSESF_CLASS;
5226       else
5227         classes[0] = X86_64_SSE_CLASS;
5228       return 1;
5229     case DFmode:
5230       classes[0] = X86_64_SSEDF_CLASS;
5231       return 1;
5232     case XFmode:
5233       classes[0] = X86_64_X87_CLASS;
5234       classes[1] = X86_64_X87UP_CLASS;
5235       return 2;
5236     case TFmode:
5237       classes[0] = X86_64_SSE_CLASS;
5238       classes[1] = X86_64_SSEUP_CLASS;
5239       return 2;
5240     case SCmode:
5241       classes[0] = X86_64_SSE_CLASS;
5242       if (!(bit_offset % 64))
5243         return 1;
5244       else
5245         {
5246           static bool warned;
5247
5248           if (!warned && warn_psabi)
5249             {
5250               warned = true;
5251               inform (input_location,
5252                       "The ABI of passing structure with complex float"
5253                       " member has changed in GCC 4.4");
5254             }
5255           classes[1] = X86_64_SSESF_CLASS;
5256           return 2;
5257         }
5258     case DCmode:
5259       classes[0] = X86_64_SSEDF_CLASS;
5260       classes[1] = X86_64_SSEDF_CLASS;
5261       return 2;
5262     case XCmode:
5263       classes[0] = X86_64_COMPLEX_X87_CLASS;
5264       return 1;
5265     case TCmode:
5266       /* This modes is larger than 16 bytes.  */
5267       return 0;
5268     case V8SFmode:
5269     case V8SImode:
5270     case V32QImode:
5271     case V16HImode:
5272     case V4DFmode:
5273     case V4DImode:
5274       classes[0] = X86_64_SSE_CLASS;
5275       classes[1] = X86_64_SSEUP_CLASS;
5276       classes[2] = X86_64_SSEUP_CLASS;
5277       classes[3] = X86_64_SSEUP_CLASS;
5278       return 4;
5279     case V4SFmode:
5280     case V4SImode:
5281     case V16QImode:
5282     case V8HImode:
5283     case V2DFmode:
5284     case V2DImode:
5285       classes[0] = X86_64_SSE_CLASS;
5286       classes[1] = X86_64_SSEUP_CLASS;
5287       return 2;
5288     case V1DImode:
5289     case V2SFmode:
5290     case V2SImode:
5291     case V4HImode:
5292     case V8QImode:
5293       classes[0] = X86_64_SSE_CLASS;
5294       return 1;
5295     case BLKmode:
5296     case VOIDmode:
5297       return 0;
5298     default:
5299       gcc_assert (VECTOR_MODE_P (mode));
5300
5301       if (bytes > 16)
5302         return 0;
5303
5304       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
5305
5306       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
5307         classes[0] = X86_64_INTEGERSI_CLASS;
5308       else
5309         classes[0] = X86_64_INTEGER_CLASS;
5310       classes[1] = X86_64_INTEGER_CLASS;
5311       return 1 + (bytes > 8);
5312     }
5313 }
5314
5315 /* Examine the argument and return set number of register required in each
5316    class.  Return 0 iff parameter should be passed in memory.  */
5317 static int
5318 examine_argument (enum machine_mode mode, const_tree type, int in_return,
5319                   int *int_nregs, int *sse_nregs)
5320 {
5321   enum x86_64_reg_class regclass[MAX_CLASSES];
5322   int n = classify_argument (mode, type, regclass, 0);
5323
5324   *int_nregs = 0;
5325   *sse_nregs = 0;
5326   if (!n)
5327     return 0;
5328   for (n--; n >= 0; n--)
5329     switch (regclass[n])
5330       {
5331       case X86_64_INTEGER_CLASS:
5332       case X86_64_INTEGERSI_CLASS:
5333         (*int_nregs)++;
5334         break;
5335       case X86_64_SSE_CLASS:
5336       case X86_64_SSESF_CLASS:
5337       case X86_64_SSEDF_CLASS:
5338         (*sse_nregs)++;
5339         break;
5340       case X86_64_NO_CLASS:
5341       case X86_64_SSEUP_CLASS:
5342         break;
5343       case X86_64_X87_CLASS:
5344       case X86_64_X87UP_CLASS:
5345         if (!in_return)
5346           return 0;
5347         break;
5348       case X86_64_COMPLEX_X87_CLASS:
5349         return in_return ? 2 : 0;
5350       case X86_64_MEMORY_CLASS:
5351         gcc_unreachable ();
5352       }
5353   return 1;
5354 }
5355
5356 /* Construct container for the argument used by GCC interface.  See
5357    FUNCTION_ARG for the detailed description.  */
5358
5359 static rtx
5360 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
5361                      const_tree type, int in_return, int nintregs, int nsseregs,
5362                      const int *intreg, int sse_regno)
5363 {
5364   /* The following variables hold the static issued_error state.  */
5365   static bool issued_sse_arg_error;
5366   static bool issued_sse_ret_error;
5367   static bool issued_x87_ret_error;
5368
5369   enum machine_mode tmpmode;
5370   int bytes =
5371     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5372   enum x86_64_reg_class regclass[MAX_CLASSES];
5373   int n;
5374   int i;
5375   int nexps = 0;
5376   int needed_sseregs, needed_intregs;
5377   rtx exp[MAX_CLASSES];
5378   rtx ret;
5379
5380   n = classify_argument (mode, type, regclass, 0);
5381   if (!n)
5382     return NULL;
5383   if (!examine_argument (mode, type, in_return, &needed_intregs,
5384                          &needed_sseregs))
5385     return NULL;
5386   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
5387     return NULL;
5388
5389   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
5390      some less clueful developer tries to use floating-point anyway.  */
5391   if (needed_sseregs && !TARGET_SSE)
5392     {
5393       if (in_return)
5394         {
5395           if (!issued_sse_ret_error)
5396             {
5397               error ("SSE register return with SSE disabled");
5398               issued_sse_ret_error = true;
5399             }
5400         }
5401       else if (!issued_sse_arg_error)
5402         {
5403           error ("SSE register argument with SSE disabled");
5404           issued_sse_arg_error = true;
5405         }
5406       return NULL;
5407     }
5408
5409   /* Likewise, error if the ABI requires us to return values in the
5410      x87 registers and the user specified -mno-80387.  */
5411   if (!TARGET_80387 && in_return)
5412     for (i = 0; i < n; i++)
5413       if (regclass[i] == X86_64_X87_CLASS
5414           || regclass[i] == X86_64_X87UP_CLASS
5415           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
5416         {
5417           if (!issued_x87_ret_error)
5418             {
5419               error ("x87 register return with x87 disabled");
5420               issued_x87_ret_error = true;
5421             }
5422           return NULL;
5423         }
5424
5425   /* First construct simple cases.  Avoid SCmode, since we want to use
5426      single register to pass this type.  */
5427   if (n == 1 && mode != SCmode)
5428     switch (regclass[0])
5429       {
5430       case X86_64_INTEGER_CLASS:
5431       case X86_64_INTEGERSI_CLASS:
5432         return gen_rtx_REG (mode, intreg[0]);
5433       case X86_64_SSE_CLASS:
5434       case X86_64_SSESF_CLASS:
5435       case X86_64_SSEDF_CLASS:
5436         if (mode != BLKmode)
5437           return gen_reg_or_parallel (mode, orig_mode, 
5438                                       SSE_REGNO (sse_regno));
5439         break;
5440       case X86_64_X87_CLASS:
5441       case X86_64_COMPLEX_X87_CLASS:
5442         return gen_rtx_REG (mode, FIRST_STACK_REG);
5443       case X86_64_NO_CLASS:
5444         /* Zero sized array, struct or class.  */
5445         return NULL;
5446       default:
5447         gcc_unreachable ();
5448       }
5449   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
5450       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
5451     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5452   if (n == 4
5453       && regclass[0] == X86_64_SSE_CLASS
5454       && regclass[1] == X86_64_SSEUP_CLASS
5455       && regclass[2] == X86_64_SSEUP_CLASS
5456       && regclass[3] == X86_64_SSEUP_CLASS
5457       && mode != BLKmode)
5458     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5459
5460   if (n == 2
5461       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
5462     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
5463   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
5464       && regclass[1] == X86_64_INTEGER_CLASS
5465       && (mode == CDImode || mode == TImode || mode == TFmode)
5466       && intreg[0] + 1 == intreg[1])
5467     return gen_rtx_REG (mode, intreg[0]);
5468
5469   /* Otherwise figure out the entries of the PARALLEL.  */
5470   for (i = 0; i < n; i++)
5471     {
5472       int pos;
5473
5474       switch (regclass[i])
5475         {
5476           case X86_64_NO_CLASS:
5477             break;
5478           case X86_64_INTEGER_CLASS:
5479           case X86_64_INTEGERSI_CLASS:
5480             /* Merge TImodes on aligned occasions here too.  */
5481             if (i * 8 + 8 > bytes)
5482               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
5483             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
5484               tmpmode = SImode;
5485             else
5486               tmpmode = DImode;
5487             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
5488             if (tmpmode == BLKmode)
5489               tmpmode = DImode;
5490             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5491                                                gen_rtx_REG (tmpmode, *intreg),
5492                                                GEN_INT (i*8));
5493             intreg++;
5494             break;
5495           case X86_64_SSESF_CLASS:
5496             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5497                                                gen_rtx_REG (SFmode,
5498                                                             SSE_REGNO (sse_regno)),
5499                                                GEN_INT (i*8));
5500             sse_regno++;
5501             break;
5502           case X86_64_SSEDF_CLASS:
5503             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5504                                                gen_rtx_REG (DFmode,
5505                                                             SSE_REGNO (sse_regno)),
5506                                                GEN_INT (i*8));
5507             sse_regno++;
5508             break;
5509           case X86_64_SSE_CLASS:
5510             pos = i;
5511             switch (n)
5512               {
5513               case 1:
5514                 tmpmode = DImode;
5515                 break;
5516               case 2:
5517                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
5518                   {
5519                     tmpmode = TImode;
5520                     i++;
5521                   }
5522                 else
5523                   tmpmode = DImode;
5524                 break;
5525               case 4:
5526                 gcc_assert (i == 0
5527                             && regclass[1] == X86_64_SSEUP_CLASS
5528                             && regclass[2] == X86_64_SSEUP_CLASS
5529                             && regclass[3] == X86_64_SSEUP_CLASS);
5530                 tmpmode = OImode;
5531                 i += 3;
5532                 break;
5533               default:
5534                 gcc_unreachable ();
5535               }
5536             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5537                                                gen_rtx_REG (tmpmode,
5538                                                             SSE_REGNO (sse_regno)),
5539                                                GEN_INT (pos*8));
5540             sse_regno++;
5541             break;
5542           default:
5543             gcc_unreachable ();
5544         }
5545     }
5546
5547   /* Empty aligned struct, union or class.  */
5548   if (nexps == 0)
5549     return NULL;
5550
5551   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
5552   for (i = 0; i < nexps; i++)
5553     XVECEXP (ret, 0, i) = exp [i];
5554   return ret;
5555 }
5556
5557 /* Update the data in CUM to advance over an argument of mode MODE
5558    and data type TYPE.  (TYPE is null for libcalls where that information
5559    may not be available.)  */
5560
5561 static void
5562 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5563                          tree type, HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5564 {
5565   switch (mode)
5566     {
5567     default:
5568       break;
5569
5570     case BLKmode:
5571       if (bytes < 0)
5572         break;
5573       /* FALLTHRU */
5574
5575     case DImode:
5576     case SImode:
5577     case HImode:
5578     case QImode:
5579       cum->words += words;
5580       cum->nregs -= words;
5581       cum->regno += words;
5582
5583       if (cum->nregs <= 0)
5584         {
5585           cum->nregs = 0;
5586           cum->regno = 0;
5587         }
5588       break;
5589
5590     case OImode:
5591       /* OImode shouldn't be used directly.  */
5592       gcc_unreachable ();
5593
5594     case DFmode:
5595       if (cum->float_in_sse < 2)
5596         break;
5597     case SFmode:
5598       if (cum->float_in_sse < 1)
5599         break;
5600       /* FALLTHRU */
5601
5602     case V8SFmode:
5603     case V8SImode:
5604     case V32QImode:
5605     case V16HImode:
5606     case V4DFmode:
5607     case V4DImode:
5608     case TImode:
5609     case V16QImode:
5610     case V8HImode:
5611     case V4SImode:
5612     case V2DImode:
5613     case V4SFmode:
5614     case V2DFmode:
5615       if (!type || !AGGREGATE_TYPE_P (type))
5616         {
5617           cum->sse_words += words;
5618           cum->sse_nregs -= 1;
5619           cum->sse_regno += 1;
5620           if (cum->sse_nregs <= 0)
5621             {
5622               cum->sse_nregs = 0;
5623               cum->sse_regno = 0;
5624             }
5625         }
5626       break;
5627
5628     case V8QImode:
5629     case V4HImode:
5630     case V2SImode:
5631     case V2SFmode:
5632     case V1DImode:
5633       if (!type || !AGGREGATE_TYPE_P (type))
5634         {
5635           cum->mmx_words += words;
5636           cum->mmx_nregs -= 1;
5637           cum->mmx_regno += 1;
5638           if (cum->mmx_nregs <= 0)
5639             {
5640               cum->mmx_nregs = 0;
5641               cum->mmx_regno = 0;
5642             }
5643         }
5644       break;
5645     }
5646 }
5647
5648 static void
5649 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5650                          tree type, HOST_WIDE_INT words, int named)
5651 {
5652   int int_nregs, sse_nregs;
5653
5654   /* Unnamed 256bit vector mode parameters are passed on stack.  */
5655   if (!named && VALID_AVX256_REG_MODE (mode))
5656     return;
5657
5658   if (examine_argument (mode, type, 0, &int_nregs, &sse_nregs)
5659       && sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
5660     {
5661       cum->nregs -= int_nregs;
5662       cum->sse_nregs -= sse_nregs;
5663       cum->regno += int_nregs;
5664       cum->sse_regno += sse_nregs;
5665     }
5666   else
5667     {
5668       int align = ix86_function_arg_boundary (mode, type) / BITS_PER_WORD;
5669       cum->words = (cum->words + align - 1) & ~(align - 1);
5670       cum->words += words;
5671     }
5672 }
5673
5674 static void
5675 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
5676                             HOST_WIDE_INT words)
5677 {
5678   /* Otherwise, this should be passed indirect.  */
5679   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
5680
5681   cum->words += words;
5682   if (cum->nregs > 0)
5683     {
5684       cum->nregs -= 1;
5685       cum->regno += 1;
5686     }
5687 }
5688
5689 void
5690 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5691                       tree type, int named)
5692 {
5693   HOST_WIDE_INT bytes, words;
5694
5695   if (mode == BLKmode)
5696     bytes = int_size_in_bytes (type);
5697   else
5698     bytes = GET_MODE_SIZE (mode);
5699   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5700
5701   if (type)
5702     mode = type_natural_mode (type, NULL);
5703
5704   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5705     function_arg_advance_ms_64 (cum, bytes, words);
5706   else if (TARGET_64BIT)
5707     function_arg_advance_64 (cum, mode, type, words, named);
5708   else
5709     function_arg_advance_32 (cum, mode, type, bytes, words);
5710 }
5711
5712 /* Define where to put the arguments to a function.
5713    Value is zero to push the argument on the stack,
5714    or a hard register in which to store the argument.
5715
5716    MODE is the argument's machine mode.
5717    TYPE is the data type of the argument (as a tree).
5718     This is null for libcalls where that information may
5719     not be available.
5720    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5721     the preceding args and about the function being called.
5722    NAMED is nonzero if this argument is a named parameter
5723     (otherwise it is an extra parameter matching an ellipsis).  */
5724
5725 static rtx
5726 function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5727                  enum machine_mode orig_mode, tree type,
5728                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5729 {
5730   static bool warnedsse, warnedmmx;
5731
5732   /* Avoid the AL settings for the Unix64 ABI.  */
5733   if (mode == VOIDmode)
5734     return constm1_rtx;
5735
5736   switch (mode)
5737     {
5738     default:
5739       break;
5740
5741     case BLKmode:
5742       if (bytes < 0)
5743         break;
5744       /* FALLTHRU */
5745     case DImode:
5746     case SImode:
5747     case HImode:
5748     case QImode:
5749       if (words <= cum->nregs)
5750         {
5751           int regno = cum->regno;
5752
5753           /* Fastcall allocates the first two DWORD (SImode) or
5754             smaller arguments to ECX and EDX if it isn't an
5755             aggregate type .  */
5756           if (cum->fastcall)
5757             {
5758               if (mode == BLKmode
5759                   || mode == DImode
5760                   || (type && AGGREGATE_TYPE_P (type)))
5761                 break;
5762
5763               /* ECX not EAX is the first allocated register.  */
5764               if (regno == AX_REG)
5765                 regno = CX_REG;
5766             }
5767           return gen_rtx_REG (mode, regno);
5768         }
5769       break;
5770
5771     case DFmode:
5772       if (cum->float_in_sse < 2)
5773         break;
5774     case SFmode:
5775       if (cum->float_in_sse < 1)
5776         break;
5777       /* FALLTHRU */
5778     case TImode:
5779       /* In 32bit, we pass TImode in xmm registers.  */
5780     case V16QImode:
5781     case V8HImode:
5782     case V4SImode:
5783     case V2DImode:
5784     case V4SFmode:
5785     case V2DFmode:
5786       if (!type || !AGGREGATE_TYPE_P (type))
5787         {
5788           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
5789             {
5790               warnedsse = true;
5791               warning (0, "SSE vector argument without SSE enabled "
5792                        "changes the ABI");
5793             }
5794           if (cum->sse_nregs)
5795             return gen_reg_or_parallel (mode, orig_mode,
5796                                         cum->sse_regno + FIRST_SSE_REG);
5797         }
5798       break;
5799
5800     case OImode:
5801       /* OImode shouldn't be used directly.  */
5802       gcc_unreachable ();
5803
5804     case V8SFmode:
5805     case V8SImode:
5806     case V32QImode:
5807     case V16HImode:
5808     case V4DFmode:
5809     case V4DImode:
5810       if (!type || !AGGREGATE_TYPE_P (type))
5811         {
5812           if (cum->sse_nregs)
5813             return gen_reg_or_parallel (mode, orig_mode,
5814                                         cum->sse_regno + FIRST_SSE_REG);
5815         }
5816       break;
5817
5818     case V8QImode:
5819     case V4HImode:
5820     case V2SImode:
5821     case V2SFmode:
5822     case V1DImode:
5823       if (!type || !AGGREGATE_TYPE_P (type))
5824         {
5825           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
5826             {
5827               warnedmmx = true;
5828               warning (0, "MMX vector argument without MMX enabled "
5829                        "changes the ABI");
5830             }
5831           if (cum->mmx_nregs)
5832             return gen_reg_or_parallel (mode, orig_mode,
5833                                         cum->mmx_regno + FIRST_MMX_REG);
5834         }
5835       break;
5836     }
5837
5838   return NULL_RTX;
5839 }
5840
5841 static rtx
5842 function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5843                  enum machine_mode orig_mode, tree type, int named)
5844 {
5845   /* Handle a hidden AL argument containing number of registers
5846      for varargs x86-64 functions.  */
5847   if (mode == VOIDmode)
5848     return GEN_INT (cum->maybe_vaarg
5849                     ? (cum->sse_nregs < 0
5850                        ? (cum->call_abi == DEFAULT_ABI
5851                           ? SSE_REGPARM_MAX
5852                           : (DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
5853                                                      : X64_SSE_REGPARM_MAX))
5854                : cum->sse_regno)
5855                     : -1);
5856
5857   switch (mode)
5858     {
5859     default:
5860       break;
5861
5862     case V8SFmode:
5863     case V8SImode:
5864     case V32QImode:
5865     case V16HImode:
5866     case V4DFmode:
5867     case V4DImode:
5868       /* Unnamed 256bit vector mode parameters are passed on stack.  */
5869       if (!named)
5870         return NULL;
5871       break;
5872     }
5873
5874   return construct_container (mode, orig_mode, type, 0, cum->nregs,
5875                               cum->sse_nregs,
5876                               &x86_64_int_parameter_registers [cum->regno],
5877                               cum->sse_regno);
5878 }
5879
5880 static rtx
5881 function_arg_ms_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5882                     enum machine_mode orig_mode, int named,
5883                     HOST_WIDE_INT bytes)
5884 {
5885   unsigned int regno;
5886
5887   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
5888      We use value of -2 to specify that current function call is MSABI.  */
5889   if (mode == VOIDmode)
5890     return GEN_INT (-2);
5891
5892   /* If we've run out of registers, it goes on the stack.  */
5893   if (cum->nregs == 0)
5894     return NULL_RTX;
5895
5896   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
5897
5898   /* Only floating point modes are passed in anything but integer regs.  */
5899   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
5900     {
5901       if (named)
5902         regno = cum->regno + FIRST_SSE_REG;
5903       else
5904         {
5905           rtx t1, t2;
5906
5907           /* Unnamed floating parameters are passed in both the
5908              SSE and integer registers.  */
5909           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
5910           t2 = gen_rtx_REG (mode, regno);
5911           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
5912           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
5913           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
5914         }
5915     }
5916   /* Handle aggregated types passed in register.  */
5917   if (orig_mode == BLKmode)
5918     {
5919       if (bytes > 0 && bytes <= 8)
5920         mode = (bytes > 4 ? DImode : SImode);
5921       if (mode == BLKmode)
5922         mode = DImode;
5923     }
5924
5925   return gen_reg_or_parallel (mode, orig_mode, regno);
5926 }
5927
5928 rtx
5929 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
5930               tree type, int named)
5931 {
5932   enum machine_mode mode = omode;
5933   HOST_WIDE_INT bytes, words;
5934
5935   if (mode == BLKmode)
5936     bytes = int_size_in_bytes (type);
5937   else
5938     bytes = GET_MODE_SIZE (mode);
5939   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5940
5941   /* To simplify the code below, represent vector types with a vector mode
5942      even if MMX/SSE are not active.  */
5943   if (type && TREE_CODE (type) == VECTOR_TYPE)
5944     mode = type_natural_mode (type, cum);
5945
5946   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5947     return function_arg_ms_64 (cum, mode, omode, named, bytes);
5948   else if (TARGET_64BIT)
5949     return function_arg_64 (cum, mode, omode, type, named);
5950   else
5951     return function_arg_32 (cum, mode, omode, type, bytes, words);
5952 }
5953
5954 /* A C expression that indicates when an argument must be passed by
5955    reference.  If nonzero for an argument, a copy of that argument is
5956    made in memory and a pointer to the argument is passed instead of
5957    the argument itself.  The pointer is passed in whatever way is
5958    appropriate for passing a pointer to that type.  */
5959
5960 static bool
5961 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5962                         enum machine_mode mode ATTRIBUTE_UNUSED,
5963                         const_tree type, bool named ATTRIBUTE_UNUSED)
5964 {
5965   /* See Windows x64 Software Convention.  */
5966   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5967     {
5968       int msize = (int) GET_MODE_SIZE (mode);
5969       if (type)
5970         {
5971           /* Arrays are passed by reference.  */
5972           if (TREE_CODE (type) == ARRAY_TYPE)
5973             return true;
5974
5975           if (AGGREGATE_TYPE_P (type))
5976             {
5977               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
5978                  are passed by reference.  */
5979               msize = int_size_in_bytes (type);
5980             }
5981         }
5982
5983       /* __m128 is passed by reference.  */
5984       switch (msize) {
5985       case 1: case 2: case 4: case 8:
5986         break;
5987       default:
5988         return true;
5989       }
5990     }
5991   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
5992     return 1;
5993
5994   return 0;
5995 }
5996
5997 /* Return true when TYPE should be 128bit aligned for 32bit argument passing
5998    ABI.  */
5999 static bool
6000 contains_aligned_value_p (const_tree type)
6001 {
6002   enum machine_mode mode = TYPE_MODE (type);
6003   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
6004        || mode == TDmode
6005        || mode == TFmode
6006        || mode == TCmode)
6007       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
6008     return true;
6009   if (TYPE_ALIGN (type) < 128)
6010     return false;
6011
6012   if (AGGREGATE_TYPE_P (type))
6013     {
6014       /* Walk the aggregates recursively.  */
6015       switch (TREE_CODE (type))
6016         {
6017         case RECORD_TYPE:
6018         case UNION_TYPE:
6019         case QUAL_UNION_TYPE:
6020           {
6021             tree field;
6022
6023             /* Walk all the structure fields.  */
6024             for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6025               {
6026                 if (TREE_CODE (field) == FIELD_DECL
6027                     && contains_aligned_value_p (TREE_TYPE (field)))
6028                   return true;
6029               }
6030             break;
6031           }
6032
6033         case ARRAY_TYPE:
6034           /* Just for use if some languages passes arrays by value.  */
6035           if (contains_aligned_value_p (TREE_TYPE (type)))
6036             return true;
6037           break;
6038
6039         default:
6040           gcc_unreachable ();
6041         }
6042     }
6043   return false;
6044 }
6045
6046 /* Gives the alignment boundary, in bits, of an argument with the
6047    specified mode and type.  */
6048
6049 int
6050 ix86_function_arg_boundary (enum machine_mode mode, const_tree type)
6051 {
6052   int align;
6053   if (type)
6054     {
6055       /* Since canonical type is used for call, we convert it to
6056          canonical type if needed.  */
6057       if (!TYPE_STRUCTURAL_EQUALITY_P (type))
6058         type = TYPE_CANONICAL (type);
6059       align = TYPE_ALIGN (type);
6060     }
6061   else
6062     align = GET_MODE_ALIGNMENT (mode);
6063   if (align < PARM_BOUNDARY)
6064     align = PARM_BOUNDARY;
6065   /* In 32bit, only _Decimal128 and __float128 are aligned to their
6066      natural boundaries.  */
6067   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
6068     {
6069       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
6070          make an exception for SSE modes since these require 128bit
6071          alignment.
6072
6073          The handling here differs from field_alignment.  ICC aligns MMX
6074          arguments to 4 byte boundaries, while structure fields are aligned
6075          to 8 byte boundaries.  */
6076       if (!type)
6077         {
6078           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
6079             align = PARM_BOUNDARY;
6080         }
6081       else
6082         {
6083           if (!contains_aligned_value_p (type))
6084             align = PARM_BOUNDARY;
6085         }
6086     }
6087   if (align > BIGGEST_ALIGNMENT)
6088     align = BIGGEST_ALIGNMENT;
6089   return align;
6090 }
6091
6092 /* Return true if N is a possible register number of function value.  */
6093
6094 bool
6095 ix86_function_value_regno_p (int regno)
6096 {
6097   switch (regno)
6098     {
6099     case 0:
6100       return true;
6101
6102     case FIRST_FLOAT_REG:
6103       /* TODO: The function should depend on current function ABI but
6104        builtins.c would need updating then. Therefore we use the
6105        default ABI.  */
6106       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
6107         return false;
6108       return TARGET_FLOAT_RETURNS_IN_80387;
6109
6110     case FIRST_SSE_REG:
6111       return TARGET_SSE;
6112
6113     case FIRST_MMX_REG:
6114       if (TARGET_MACHO || TARGET_64BIT)
6115         return false;
6116       return TARGET_MMX;
6117     }
6118
6119   return false;
6120 }
6121
6122 /* Define how to find the value returned by a function.
6123    VALTYPE is the data type of the value (as a tree).
6124    If the precise function being called is known, FUNC is its FUNCTION_DECL;
6125    otherwise, FUNC is 0.  */
6126
6127 static rtx
6128 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
6129                    const_tree fntype, const_tree fn)
6130 {
6131   unsigned int regno;
6132
6133   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
6134      we normally prevent this case when mmx is not available.  However
6135      some ABIs may require the result to be returned like DImode.  */
6136   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6137     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
6138
6139   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
6140      we prevent this case when sse is not available.  However some ABIs
6141      may require the result to be returned like integer TImode.  */
6142   else if (mode == TImode
6143            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6144     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
6145
6146   /* 32-byte vector modes in %ymm0.   */
6147   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
6148     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
6149
6150   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
6151   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
6152     regno = FIRST_FLOAT_REG;
6153   else
6154     /* Most things go in %eax.  */
6155     regno = AX_REG;
6156
6157   /* Override FP return register with %xmm0 for local functions when
6158      SSE math is enabled or for functions with sseregparm attribute.  */
6159   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
6160     {
6161       int sse_level = ix86_function_sseregparm (fntype, fn, false);
6162       if ((sse_level >= 1 && mode == SFmode)
6163           || (sse_level == 2 && mode == DFmode))
6164         regno = FIRST_SSE_REG;
6165     }
6166
6167   /* OImode shouldn't be used directly.  */
6168   gcc_assert (mode != OImode);
6169
6170   return gen_rtx_REG (orig_mode, regno);
6171 }
6172
6173 static rtx
6174 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
6175                    const_tree valtype)
6176 {
6177   rtx ret;
6178
6179   /* Handle libcalls, which don't provide a type node.  */
6180   if (valtype == NULL)
6181     {
6182       switch (mode)
6183         {
6184         case SFmode:
6185         case SCmode:
6186         case DFmode:
6187         case DCmode:
6188         case TFmode:
6189         case SDmode:
6190         case DDmode:
6191         case TDmode:
6192           return gen_rtx_REG (mode, FIRST_SSE_REG);
6193         case XFmode:
6194         case XCmode:
6195           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
6196         case TCmode:
6197           return NULL;
6198         default:
6199           return gen_rtx_REG (mode, AX_REG);
6200         }
6201     }
6202
6203   ret = construct_container (mode, orig_mode, valtype, 1,
6204                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
6205                              x86_64_int_return_registers, 0);
6206
6207   /* For zero sized structures, construct_container returns NULL, but we
6208      need to keep rest of compiler happy by returning meaningful value.  */
6209   if (!ret)
6210     ret = gen_rtx_REG (orig_mode, AX_REG);
6211
6212   return ret;
6213 }
6214
6215 static rtx
6216 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
6217 {
6218   unsigned int regno = AX_REG;
6219
6220   if (TARGET_SSE)
6221     {
6222       switch (GET_MODE_SIZE (mode))
6223         {
6224         case 16:
6225           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6226              && !COMPLEX_MODE_P (mode))
6227             regno = FIRST_SSE_REG;
6228           break;
6229         case 8:
6230         case 4:
6231           if (mode == SFmode || mode == DFmode)
6232             regno = FIRST_SSE_REG;
6233           break;
6234         default:
6235           break;
6236         }
6237     }
6238   return gen_rtx_REG (orig_mode, regno);
6239 }
6240
6241 static rtx
6242 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
6243                        enum machine_mode orig_mode, enum machine_mode mode)
6244 {
6245   const_tree fn, fntype;
6246
6247   fn = NULL_TREE;
6248   if (fntype_or_decl && DECL_P (fntype_or_decl))
6249     fn = fntype_or_decl;
6250   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
6251
6252   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
6253     return function_value_ms_64 (orig_mode, mode);
6254   else if (TARGET_64BIT)
6255     return function_value_64 (orig_mode, mode, valtype);
6256   else
6257     return function_value_32 (orig_mode, mode, fntype, fn);
6258 }
6259
6260 static rtx
6261 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
6262                      bool outgoing ATTRIBUTE_UNUSED)
6263 {
6264   enum machine_mode mode, orig_mode;
6265
6266   orig_mode = TYPE_MODE (valtype);
6267   mode = type_natural_mode (valtype, NULL);
6268   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
6269 }
6270
6271 rtx
6272 ix86_libcall_value (enum machine_mode mode)
6273 {
6274   return ix86_function_value_1 (NULL, NULL, mode, mode);
6275 }
6276
6277 /* Return true iff type is returned in memory.  */
6278
6279 static int ATTRIBUTE_UNUSED
6280 return_in_memory_32 (const_tree type, enum machine_mode mode)
6281 {
6282   HOST_WIDE_INT size;
6283
6284   if (mode == BLKmode)
6285     return 1;
6286
6287   size = int_size_in_bytes (type);
6288
6289   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
6290     return 0;
6291
6292   if (VECTOR_MODE_P (mode) || mode == TImode)
6293     {
6294       /* User-created vectors small enough to fit in EAX.  */
6295       if (size < 8)
6296         return 0;
6297
6298       /* MMX/3dNow values are returned in MM0,
6299          except when it doesn't exits.  */
6300       if (size == 8)
6301         return (TARGET_MMX ? 0 : 1);
6302
6303       /* SSE values are returned in XMM0, except when it doesn't exist.  */
6304       if (size == 16)
6305         return (TARGET_SSE ? 0 : 1);
6306
6307       /* AVX values are returned in YMM0, except when it doesn't exist.  */
6308       if (size == 32)
6309         return TARGET_AVX ? 0 : 1;
6310     }
6311
6312   if (mode == XFmode)
6313     return 0;
6314
6315   if (size > 12)
6316     return 1;
6317
6318   /* OImode shouldn't be used directly.  */
6319   gcc_assert (mode != OImode);
6320
6321   return 0;
6322 }
6323
6324 static int ATTRIBUTE_UNUSED
6325 return_in_memory_64 (const_tree type, enum machine_mode mode)
6326 {
6327   int needed_intregs, needed_sseregs;
6328   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
6329 }
6330
6331 static int ATTRIBUTE_UNUSED
6332 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
6333 {
6334   HOST_WIDE_INT size = int_size_in_bytes (type);
6335
6336   /* __m128 is returned in xmm0.  */
6337   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6338       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
6339     return 0;
6340
6341   /* Otherwise, the size must be exactly in [1248]. */
6342   return (size != 1 && size != 2 && size != 4 && size != 8);
6343 }
6344
6345 static bool
6346 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6347 {
6348 #ifdef SUBTARGET_RETURN_IN_MEMORY
6349   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
6350 #else
6351   const enum machine_mode mode = type_natural_mode (type, NULL);
6352  
6353   if (TARGET_64BIT)
6354     {
6355       if (ix86_function_type_abi (fntype) == MS_ABI)
6356         return return_in_memory_ms_64 (type, mode);
6357       else
6358         return return_in_memory_64 (type, mode);
6359     }
6360   else
6361     return return_in_memory_32 (type, mode);
6362 #endif
6363 }
6364
6365 /* Return false iff TYPE is returned in memory.  This version is used
6366    on Solaris 2.  It is similar to the generic ix86_return_in_memory,
6367    but differs notably in that when MMX is available, 8-byte vectors
6368    are returned in memory, rather than in MMX registers.  */
6369
6370 bool
6371 ix86_solaris_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6372 {
6373   int size;
6374   enum machine_mode mode = type_natural_mode (type, NULL);
6375
6376   if (TARGET_64BIT)
6377     return return_in_memory_64 (type, mode);
6378
6379   if (mode == BLKmode)
6380     return 1;
6381
6382   size = int_size_in_bytes (type);
6383
6384   if (VECTOR_MODE_P (mode))
6385     {
6386       /* Return in memory only if MMX registers *are* available.  This
6387          seems backwards, but it is consistent with the existing
6388          Solaris x86 ABI.  */
6389       if (size == 8)
6390         return TARGET_MMX;
6391       if (size == 16)
6392         return !TARGET_SSE;
6393     }
6394   else if (mode == TImode)
6395     return !TARGET_SSE;
6396   else if (mode == XFmode)
6397     return 0;
6398
6399   return size > 12;
6400 }
6401
6402 /* When returning SSE vector types, we have a choice of either
6403      (1) being abi incompatible with a -march switch, or
6404      (2) generating an error.
6405    Given no good solution, I think the safest thing is one warning.
6406    The user won't be able to use -Werror, but....
6407
6408    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
6409    called in response to actually generating a caller or callee that
6410    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
6411    via aggregate_value_p for general type probing from tree-ssa.  */
6412
6413 static rtx
6414 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
6415 {
6416   static bool warnedsse, warnedmmx;
6417
6418   if (!TARGET_64BIT && type)
6419     {
6420       /* Look at the return type of the function, not the function type.  */
6421       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
6422
6423       if (!TARGET_SSE && !warnedsse)
6424         {
6425           if (mode == TImode
6426               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6427             {
6428               warnedsse = true;
6429               warning (0, "SSE vector return without SSE enabled "
6430                        "changes the ABI");
6431             }
6432         }
6433
6434       if (!TARGET_MMX && !warnedmmx)
6435         {
6436           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6437             {
6438               warnedmmx = true;
6439               warning (0, "MMX vector return without MMX enabled "
6440                        "changes the ABI");
6441             }
6442         }
6443     }
6444
6445   return NULL;
6446 }
6447
6448 \f
6449 /* Create the va_list data type.  */
6450
6451 /* Returns the calling convention specific va_list date type.
6452    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
6453
6454 static tree
6455 ix86_build_builtin_va_list_abi (enum calling_abi abi)
6456 {
6457   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
6458
6459   /* For i386 we use plain pointer to argument area.  */
6460   if (!TARGET_64BIT || abi == MS_ABI)
6461     return build_pointer_type (char_type_node);
6462
6463   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6464   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
6465
6466   f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"),
6467                       unsigned_type_node);
6468   f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"),
6469                       unsigned_type_node);
6470   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
6471                       ptr_type_node);
6472   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
6473                       ptr_type_node);
6474
6475   va_list_gpr_counter_field = f_gpr;
6476   va_list_fpr_counter_field = f_fpr;
6477
6478   DECL_FIELD_CONTEXT (f_gpr) = record;
6479   DECL_FIELD_CONTEXT (f_fpr) = record;
6480   DECL_FIELD_CONTEXT (f_ovf) = record;
6481   DECL_FIELD_CONTEXT (f_sav) = record;
6482
6483   TREE_CHAIN (record) = type_decl;
6484   TYPE_NAME (record) = type_decl;
6485   TYPE_FIELDS (record) = f_gpr;
6486   TREE_CHAIN (f_gpr) = f_fpr;
6487   TREE_CHAIN (f_fpr) = f_ovf;
6488   TREE_CHAIN (f_ovf) = f_sav;
6489
6490   layout_type (record);
6491
6492   /* The correct type is an array type of one element.  */
6493   return build_array_type (record, build_index_type (size_zero_node));
6494 }
6495
6496 /* Setup the builtin va_list data type and for 64-bit the additional
6497    calling convention specific va_list data types.  */
6498
6499 static tree
6500 ix86_build_builtin_va_list (void)
6501 {
6502   tree ret = ix86_build_builtin_va_list_abi (DEFAULT_ABI);
6503
6504   /* Initialize abi specific va_list builtin types.  */
6505   if (TARGET_64BIT)
6506     {
6507       tree t;
6508       if (DEFAULT_ABI == MS_ABI)
6509         {
6510           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
6511           if (TREE_CODE (t) != RECORD_TYPE)
6512             t = build_variant_type_copy (t);
6513           sysv_va_list_type_node = t;
6514         }
6515       else
6516         {
6517           t = ret;
6518           if (TREE_CODE (t) != RECORD_TYPE)
6519             t = build_variant_type_copy (t);
6520           sysv_va_list_type_node = t;
6521         }
6522       if (DEFAULT_ABI != MS_ABI)
6523         {
6524           t = ix86_build_builtin_va_list_abi (MS_ABI);
6525           if (TREE_CODE (t) != RECORD_TYPE)
6526             t = build_variant_type_copy (t);
6527           ms_va_list_type_node = t;
6528         }
6529       else
6530         {
6531           t = ret;
6532           if (TREE_CODE (t) != RECORD_TYPE)
6533             t = build_variant_type_copy (t);
6534           ms_va_list_type_node = t;
6535         }
6536     }
6537
6538   return ret;
6539 }
6540
6541 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
6542
6543 static void
6544 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
6545 {
6546   rtx save_area, mem;
6547   rtx label;
6548   rtx label_ref;
6549   rtx tmp_reg;
6550   rtx nsse_reg;
6551   alias_set_type set;
6552   int i;
6553   int regparm = ix86_regparm;
6554
6555   if (cum->call_abi != DEFAULT_ABI)
6556     regparm = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
6557
6558   /* GPR size of varargs save area.  */
6559   if (cfun->va_list_gpr_size)
6560     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
6561   else
6562     ix86_varargs_gpr_size = 0;
6563
6564   /* FPR size of varargs save area.  We don't need it if we don't pass
6565      anything in SSE registers.  */
6566   if (cum->sse_nregs && cfun->va_list_fpr_size)
6567     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
6568   else
6569     ix86_varargs_fpr_size = 0;
6570
6571   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
6572     return;
6573
6574   save_area = frame_pointer_rtx;
6575   set = get_varargs_alias_set ();
6576
6577   for (i = cum->regno;
6578        i < regparm
6579        && i < cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
6580        i++)
6581     {
6582       mem = gen_rtx_MEM (Pmode,
6583                          plus_constant (save_area, i * UNITS_PER_WORD));
6584       MEM_NOTRAP_P (mem) = 1;
6585       set_mem_alias_set (mem, set);
6586       emit_move_insn (mem, gen_rtx_REG (Pmode,
6587                                         x86_64_int_parameter_registers[i]));
6588     }
6589
6590   if (ix86_varargs_fpr_size)
6591     {
6592       /* Stack must be aligned to 16byte for FP register save area.  */
6593       if (crtl->stack_alignment_needed < 128)
6594         crtl->stack_alignment_needed = 128;
6595
6596       /* Now emit code to save SSE registers.  The AX parameter contains number
6597          of SSE parameter registers used to call this function.  We use
6598          sse_prologue_save insn template that produces computed jump across
6599          SSE saves.  We need some preparation work to get this working.  */
6600
6601       label = gen_label_rtx ();
6602       label_ref = gen_rtx_LABEL_REF (Pmode, label);
6603
6604       /* Compute address to jump to :
6605          label - eax*4 + nnamed_sse_arguments*4 Or
6606          label - eax*5 + nnamed_sse_arguments*5 for AVX.  */
6607       tmp_reg = gen_reg_rtx (Pmode);
6608       nsse_reg = gen_reg_rtx (Pmode);
6609       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, AX_REG)));
6610       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6611                               gen_rtx_MULT (Pmode, nsse_reg,
6612                                             GEN_INT (4))));
6613
6614       /* vmovaps is one byte longer than movaps.  */
6615       if (TARGET_AVX)
6616         emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6617                                 gen_rtx_PLUS (Pmode, tmp_reg,
6618                                               nsse_reg)));
6619
6620       if (cum->sse_regno)
6621         emit_move_insn
6622           (nsse_reg,
6623            gen_rtx_CONST (DImode,
6624                           gen_rtx_PLUS (DImode,
6625                                         label_ref,
6626                                         GEN_INT (cum->sse_regno
6627                                                  * (TARGET_AVX ? 5 : 4)))));
6628       else
6629         emit_move_insn (nsse_reg, label_ref);
6630       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
6631
6632       /* Compute address of memory block we save into.  We always use pointer
6633          pointing 127 bytes after first byte to store - this is needed to keep
6634          instruction size limited by 4 bytes (5 bytes for AVX) with one
6635          byte displacement.  */
6636       tmp_reg = gen_reg_rtx (Pmode);
6637       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6638                               plus_constant (save_area,
6639                                              ix86_varargs_gpr_size + 127)));
6640       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
6641       MEM_NOTRAP_P (mem) = 1;
6642       set_mem_alias_set (mem, set);
6643       set_mem_align (mem, BITS_PER_WORD);
6644
6645       /* And finally do the dirty job!  */
6646       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
6647                                         GEN_INT (cum->sse_regno), label));
6648     }
6649 }
6650
6651 static void
6652 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
6653 {
6654   alias_set_type set = get_varargs_alias_set ();
6655   int i;
6656
6657   for (i = cum->regno; i < X64_REGPARM_MAX; i++)
6658     {
6659       rtx reg, mem;
6660
6661       mem = gen_rtx_MEM (Pmode,
6662                          plus_constant (virtual_incoming_args_rtx,
6663                                         i * UNITS_PER_WORD));
6664       MEM_NOTRAP_P (mem) = 1;
6665       set_mem_alias_set (mem, set);
6666
6667       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
6668       emit_move_insn (mem, reg);
6669     }
6670 }
6671
6672 static void
6673 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6674                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
6675                              int no_rtl)
6676 {
6677   CUMULATIVE_ARGS next_cum;
6678   tree fntype;
6679
6680   /* This argument doesn't appear to be used anymore.  Which is good,
6681      because the old code here didn't suppress rtl generation.  */
6682   gcc_assert (!no_rtl);
6683
6684   if (!TARGET_64BIT)
6685     return;
6686
6687   fntype = TREE_TYPE (current_function_decl);
6688
6689   /* For varargs, we do not want to skip the dummy va_dcl argument.
6690      For stdargs, we do want to skip the last named argument.  */
6691   next_cum = *cum;
6692   if (stdarg_p (fntype))
6693     function_arg_advance (&next_cum, mode, type, 1);
6694
6695   if (cum->call_abi == MS_ABI)
6696     setup_incoming_varargs_ms_64 (&next_cum);
6697   else
6698     setup_incoming_varargs_64 (&next_cum);
6699 }
6700
6701 /* Checks if TYPE is of kind va_list char *.  */
6702
6703 static bool
6704 is_va_list_char_pointer (tree type)
6705 {
6706   tree canonic;
6707
6708   /* For 32-bit it is always true.  */
6709   if (!TARGET_64BIT)
6710     return true;
6711   canonic = ix86_canonical_va_list_type (type);
6712   return (canonic == ms_va_list_type_node
6713           || (DEFAULT_ABI == MS_ABI && canonic == va_list_type_node));
6714 }
6715
6716 /* Implement va_start.  */
6717
6718 static void
6719 ix86_va_start (tree valist, rtx nextarg)
6720 {
6721   HOST_WIDE_INT words, n_gpr, n_fpr;
6722   tree f_gpr, f_fpr, f_ovf, f_sav;
6723   tree gpr, fpr, ovf, sav, t;
6724   tree type;
6725
6726   /* Only 64bit target needs something special.  */
6727   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6728     {
6729       std_expand_builtin_va_start (valist, nextarg);
6730       return;
6731     }
6732
6733   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6734   f_fpr = TREE_CHAIN (f_gpr);
6735   f_ovf = TREE_CHAIN (f_fpr);
6736   f_sav = TREE_CHAIN (f_ovf);
6737
6738   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
6739   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6740   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6741   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6742   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6743
6744   /* Count number of gp and fp argument registers used.  */
6745   words = crtl->args.info.words;
6746   n_gpr = crtl->args.info.regno;
6747   n_fpr = crtl->args.info.sse_regno;
6748
6749   if (cfun->va_list_gpr_size)
6750     {
6751       type = TREE_TYPE (gpr);
6752       t = build2 (MODIFY_EXPR, type,
6753                   gpr, build_int_cst (type, n_gpr * 8));
6754       TREE_SIDE_EFFECTS (t) = 1;
6755       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6756     }
6757
6758   if (TARGET_SSE && cfun->va_list_fpr_size)
6759     {
6760       type = TREE_TYPE (fpr);
6761       t = build2 (MODIFY_EXPR, type, fpr,
6762                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
6763       TREE_SIDE_EFFECTS (t) = 1;
6764       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6765     }
6766
6767   /* Find the overflow area.  */
6768   type = TREE_TYPE (ovf);
6769   t = make_tree (type, crtl->args.internal_arg_pointer);
6770   if (words != 0)
6771     t = build2 (POINTER_PLUS_EXPR, type, t,
6772                 size_int (words * UNITS_PER_WORD));
6773   t = build2 (MODIFY_EXPR, type, ovf, t);
6774   TREE_SIDE_EFFECTS (t) = 1;
6775   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6776
6777   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
6778     {
6779       /* Find the register save area.
6780          Prologue of the function save it right above stack frame.  */
6781       type = TREE_TYPE (sav);
6782       t = make_tree (type, frame_pointer_rtx);
6783       if (!ix86_varargs_gpr_size)
6784         t = build2 (POINTER_PLUS_EXPR, type, t,
6785                     size_int (-8 * X86_64_REGPARM_MAX));
6786       t = build2 (MODIFY_EXPR, type, sav, t);
6787       TREE_SIDE_EFFECTS (t) = 1;
6788       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6789     }
6790 }
6791
6792 /* Implement va_arg.  */
6793
6794 static tree
6795 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6796                       gimple_seq *post_p)
6797 {
6798   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
6799   tree f_gpr, f_fpr, f_ovf, f_sav;
6800   tree gpr, fpr, ovf, sav, t;
6801   int size, rsize;
6802   tree lab_false, lab_over = NULL_TREE;
6803   tree addr, t2;
6804   rtx container;
6805   int indirect_p = 0;
6806   tree ptrtype;
6807   enum machine_mode nat_mode;
6808   int arg_boundary;
6809
6810   /* Only 64bit target needs something special.  */
6811   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6812     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6813
6814   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6815   f_fpr = TREE_CHAIN (f_gpr);
6816   f_ovf = TREE_CHAIN (f_fpr);
6817   f_sav = TREE_CHAIN (f_ovf);
6818
6819   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
6820                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
6821   valist = build_va_arg_indirect_ref (valist);
6822   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6823   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6824   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6825
6826   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
6827   if (indirect_p)
6828     type = build_pointer_type (type);
6829   size = int_size_in_bytes (type);
6830   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6831
6832   nat_mode = type_natural_mode (type, NULL);
6833   switch (nat_mode)
6834     {
6835     case V8SFmode:
6836     case V8SImode:
6837     case V32QImode:
6838     case V16HImode:
6839     case V4DFmode:
6840     case V4DImode:
6841       /* Unnamed 256bit vector mode parameters are passed on stack.  */
6842       if (ix86_cfun_abi () == SYSV_ABI)
6843         {
6844           container = NULL;
6845           break;
6846         }
6847
6848     default:
6849       container = construct_container (nat_mode, TYPE_MODE (type),
6850                                        type, 0, X86_64_REGPARM_MAX,
6851                                        X86_64_SSE_REGPARM_MAX, intreg,
6852                                        0);
6853       break;
6854     }
6855
6856   /* Pull the value out of the saved registers.  */
6857
6858   addr = create_tmp_var (ptr_type_node, "addr");
6859   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
6860
6861   if (container)
6862     {
6863       int needed_intregs, needed_sseregs;
6864       bool need_temp;
6865       tree int_addr, sse_addr;
6866
6867       lab_false = create_artificial_label ();
6868       lab_over = create_artificial_label ();
6869
6870       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
6871
6872       need_temp = (!REG_P (container)
6873                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
6874                        || TYPE_ALIGN (type) > 128));
6875
6876       /* In case we are passing structure, verify that it is consecutive block
6877          on the register save area.  If not we need to do moves.  */
6878       if (!need_temp && !REG_P (container))
6879         {
6880           /* Verify that all registers are strictly consecutive  */
6881           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
6882             {
6883               int i;
6884
6885               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6886                 {
6887                   rtx slot = XVECEXP (container, 0, i);
6888                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
6889                       || INTVAL (XEXP (slot, 1)) != i * 16)
6890                     need_temp = 1;
6891                 }
6892             }
6893           else
6894             {
6895               int i;
6896
6897               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6898                 {
6899                   rtx slot = XVECEXP (container, 0, i);
6900                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
6901                       || INTVAL (XEXP (slot, 1)) != i * 8)
6902                     need_temp = 1;
6903                 }
6904             }
6905         }
6906       if (!need_temp)
6907         {
6908           int_addr = addr;
6909           sse_addr = addr;
6910         }
6911       else
6912         {
6913           int_addr = create_tmp_var (ptr_type_node, "int_addr");
6914           DECL_POINTER_ALIAS_SET (int_addr) = get_varargs_alias_set ();
6915           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
6916           DECL_POINTER_ALIAS_SET (sse_addr) = get_varargs_alias_set ();
6917         }
6918
6919       /* First ensure that we fit completely in registers.  */
6920       if (needed_intregs)
6921         {
6922           t = build_int_cst (TREE_TYPE (gpr),
6923                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
6924           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
6925           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6926           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6927           gimplify_and_add (t, pre_p);
6928         }
6929       if (needed_sseregs)
6930         {
6931           t = build_int_cst (TREE_TYPE (fpr),
6932                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
6933                              + X86_64_REGPARM_MAX * 8);
6934           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
6935           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6936           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6937           gimplify_and_add (t, pre_p);
6938         }
6939
6940       /* Compute index to start of area used for integer regs.  */
6941       if (needed_intregs)
6942         {
6943           /* int_addr = gpr + sav; */
6944           t = fold_convert (sizetype, gpr);
6945           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6946           gimplify_assign (int_addr, t, pre_p);
6947         }
6948       if (needed_sseregs)
6949         {
6950           /* sse_addr = fpr + sav; */
6951           t = fold_convert (sizetype, fpr);
6952           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6953           gimplify_assign (sse_addr, t, pre_p);
6954         }
6955       if (need_temp)
6956         {
6957           int i, prev_size = 0;
6958           tree temp = create_tmp_var (type, "va_arg_tmp");
6959
6960           /* addr = &temp; */
6961           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
6962           gimplify_assign (addr, t, pre_p);
6963
6964           for (i = 0; i < XVECLEN (container, 0); i++)
6965             {
6966               rtx slot = XVECEXP (container, 0, i);
6967               rtx reg = XEXP (slot, 0);
6968               enum machine_mode mode = GET_MODE (reg);
6969               tree piece_type;
6970               tree addr_type;
6971               tree daddr_type;
6972               tree src_addr, src;
6973               int src_offset;
6974               tree dest_addr, dest;
6975               int cur_size = GET_MODE_SIZE (mode);
6976
6977               gcc_assert (prev_size <= INTVAL (XEXP (slot, 1)));
6978               prev_size = INTVAL (XEXP (slot, 1));
6979               if (prev_size + cur_size > size)
6980                 {
6981                   cur_size = size - prev_size;
6982                   mode = mode_for_size (cur_size * BITS_PER_UNIT, MODE_INT, 1);
6983                   if (mode == BLKmode)
6984                     mode = QImode;
6985                 }
6986               piece_type = lang_hooks.types.type_for_mode (mode, 1);
6987               if (mode == GET_MODE (reg))
6988                 addr_type = build_pointer_type (piece_type);
6989               else
6990                 addr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
6991                                                          true);
6992               daddr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
6993                                                         true);
6994
6995               if (SSE_REGNO_P (REGNO (reg)))
6996                 {
6997                   src_addr = sse_addr;
6998                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
6999                 }
7000               else
7001                 {
7002                   src_addr = int_addr;
7003                   src_offset = REGNO (reg) * 8;
7004                 }
7005               src_addr = fold_convert (addr_type, src_addr);
7006               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
7007                                       size_int (src_offset));
7008
7009               dest_addr = fold_convert (daddr_type, addr);
7010               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
7011                                        size_int (prev_size));
7012               if (cur_size == GET_MODE_SIZE (mode))
7013                 {
7014                   src = build_va_arg_indirect_ref (src_addr);
7015                   dest = build_va_arg_indirect_ref (dest_addr);
7016
7017                   gimplify_assign (dest, src, pre_p);
7018                 }
7019               else
7020                 {
7021                   tree copy
7022                     = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
7023                                        3, dest_addr, src_addr,
7024                                        size_int (cur_size));
7025                   gimplify_and_add (copy, pre_p);
7026                 }
7027               prev_size += cur_size;
7028             }
7029         }
7030
7031       if (needed_intregs)
7032         {
7033           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
7034                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
7035           gimplify_assign (gpr, t, pre_p);
7036         }
7037
7038       if (needed_sseregs)
7039         {
7040           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
7041                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
7042           gimplify_assign (fpr, t, pre_p);
7043         }
7044
7045       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
7046
7047       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
7048     }
7049
7050   /* ... otherwise out of the overflow area.  */
7051
7052   /* When we align parameter on stack for caller, if the parameter
7053      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
7054      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
7055      here with caller.  */
7056   arg_boundary = FUNCTION_ARG_BOUNDARY (VOIDmode, type);
7057   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
7058     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
7059
7060   /* Care for on-stack alignment if needed.  */
7061   if (arg_boundary <= 64
7062       || integer_zerop (TYPE_SIZE (type)))
7063     t = ovf;
7064  else
7065     {
7066       HOST_WIDE_INT align = arg_boundary / 8;
7067       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
7068                   size_int (align - 1));
7069       t = fold_convert (sizetype, t);
7070       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
7071                   size_int (-align));
7072       t = fold_convert (TREE_TYPE (ovf), t);
7073     }
7074   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
7075   gimplify_assign (addr, t, pre_p);
7076
7077   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
7078               size_int (rsize * UNITS_PER_WORD));
7079   gimplify_assign (unshare_expr (ovf), t, pre_p);
7080
7081   if (container)
7082     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
7083
7084   ptrtype = build_pointer_type (type);
7085   addr = fold_convert (ptrtype, addr);
7086
7087   if (indirect_p)
7088     addr = build_va_arg_indirect_ref (addr);
7089   return build_va_arg_indirect_ref (addr);
7090 }
7091 \f
7092 /* Return nonzero if OPNUM's MEM should be matched
7093    in movabs* patterns.  */
7094
7095 int
7096 ix86_check_movabs (rtx insn, int opnum)
7097 {
7098   rtx set, mem;
7099
7100   set = PATTERN (insn);
7101   if (GET_CODE (set) == PARALLEL)
7102     set = XVECEXP (set, 0, 0);
7103   gcc_assert (GET_CODE (set) == SET);
7104   mem = XEXP (set, opnum);
7105   while (GET_CODE (mem) == SUBREG)
7106     mem = SUBREG_REG (mem);
7107   gcc_assert (MEM_P (mem));
7108   return (volatile_ok || !MEM_VOLATILE_P (mem));
7109 }
7110 \f
7111 /* Initialize the table of extra 80387 mathematical constants.  */
7112
7113 static void
7114 init_ext_80387_constants (void)
7115 {
7116   static const char * cst[5] =
7117   {
7118     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
7119     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
7120     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
7121     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
7122     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
7123   };
7124   int i;
7125
7126   for (i = 0; i < 5; i++)
7127     {
7128       real_from_string (&ext_80387_constants_table[i], cst[i]);
7129       /* Ensure each constant is rounded to XFmode precision.  */
7130       real_convert (&ext_80387_constants_table[i],
7131                     XFmode, &ext_80387_constants_table[i]);
7132     }
7133
7134   ext_80387_constants_init = 1;
7135 }
7136
7137 /* Return true if the constant is something that can be loaded with
7138    a special instruction.  */
7139
7140 int
7141 standard_80387_constant_p (rtx x)
7142 {
7143   enum machine_mode mode = GET_MODE (x);
7144
7145   REAL_VALUE_TYPE r;
7146
7147   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
7148     return -1;
7149
7150   if (x == CONST0_RTX (mode))
7151     return 1;
7152   if (x == CONST1_RTX (mode))
7153     return 2;
7154
7155   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7156
7157   /* For XFmode constants, try to find a special 80387 instruction when
7158      optimizing for size or on those CPUs that benefit from them.  */
7159   if (mode == XFmode
7160       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
7161     {
7162       int i;
7163
7164       if (! ext_80387_constants_init)
7165         init_ext_80387_constants ();
7166
7167       for (i = 0; i < 5; i++)
7168         if (real_identical (&r, &ext_80387_constants_table[i]))
7169           return i + 3;
7170     }
7171
7172   /* Load of the constant -0.0 or -1.0 will be split as
7173      fldz;fchs or fld1;fchs sequence.  */
7174   if (real_isnegzero (&r))
7175     return 8;
7176   if (real_identical (&r, &dconstm1))
7177     return 9;
7178
7179   return 0;
7180 }
7181
7182 /* Return the opcode of the special instruction to be used to load
7183    the constant X.  */
7184
7185 const char *
7186 standard_80387_constant_opcode (rtx x)
7187 {
7188   switch (standard_80387_constant_p (x))
7189     {
7190     case 1:
7191       return "fldz";
7192     case 2:
7193       return "fld1";
7194     case 3:
7195       return "fldlg2";
7196     case 4:
7197       return "fldln2";
7198     case 5:
7199       return "fldl2e";
7200     case 6:
7201       return "fldl2t";
7202     case 7:
7203       return "fldpi";
7204     case 8:
7205     case 9:
7206       return "#";
7207     default:
7208       gcc_unreachable ();
7209     }
7210 }
7211
7212 /* Return the CONST_DOUBLE representing the 80387 constant that is
7213    loaded by the specified special instruction.  The argument IDX
7214    matches the return value from standard_80387_constant_p.  */
7215
7216 rtx
7217 standard_80387_constant_rtx (int idx)
7218 {
7219   int i;
7220
7221   if (! ext_80387_constants_init)
7222     init_ext_80387_constants ();
7223
7224   switch (idx)
7225     {
7226     case 3:
7227     case 4:
7228     case 5:
7229     case 6:
7230     case 7:
7231       i = idx - 3;
7232       break;
7233
7234     default:
7235       gcc_unreachable ();
7236     }
7237
7238   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
7239                                        XFmode);
7240 }
7241
7242 /* Return 1 if mode is a valid mode for sse.  */
7243 static int
7244 standard_sse_mode_p (enum machine_mode mode)
7245 {
7246   switch (mode)
7247     {
7248     case V16QImode:
7249     case V8HImode:
7250     case V4SImode:
7251     case V2DImode:
7252     case V4SFmode:
7253     case V2DFmode:
7254       return 1;
7255
7256     default:
7257       return 0;
7258     }
7259 }
7260
7261 /* Return 1 if X is all 0s.  For all 1s, return 2 if X is in 128bit
7262    SSE modes and SSE2 is enabled,  return 3 if X is in 256bit AVX
7263    modes and AVX is enabled.  */
7264
7265 int
7266 standard_sse_constant_p (rtx x)
7267 {
7268   enum machine_mode mode = GET_MODE (x);
7269
7270   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
7271     return 1;
7272   if (vector_all_ones_operand (x, mode))
7273     {
7274       if (standard_sse_mode_p (mode))
7275         return TARGET_SSE2 ? 2 : -2;
7276       else if (VALID_AVX256_REG_MODE (mode))
7277         return TARGET_AVX ? 3 : -3;
7278     }
7279
7280   return 0;
7281 }
7282
7283 /* Return the opcode of the special instruction to be used to load
7284    the constant X.  */
7285
7286 const char *
7287 standard_sse_constant_opcode (rtx insn, rtx x)
7288 {
7289   switch (standard_sse_constant_p (x))
7290     {
7291     case 1:
7292       switch (get_attr_mode (insn))
7293         {
7294         case MODE_V4SF:
7295           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
7296         case MODE_V2DF:
7297           return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
7298         case MODE_TI:
7299           return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
7300         case MODE_V8SF:
7301           return "vxorps\t%x0, %x0, %x0";
7302         case MODE_V4DF:
7303           return "vxorpd\t%x0, %x0, %x0";
7304         case MODE_OI:
7305           return "vpxor\t%x0, %x0, %x0";
7306         default:
7307           gcc_unreachable ();
7308         }
7309     case 2:
7310       if (TARGET_AVX)
7311         switch (get_attr_mode (insn))
7312           {
7313           case MODE_V4SF:
7314           case MODE_V2DF:
7315           case MODE_TI:
7316             return "vpcmpeqd\t%0, %0, %0";
7317             break;
7318           default:
7319             gcc_unreachable ();
7320         }
7321       else
7322         return "pcmpeqd\t%0, %0";
7323     }
7324   gcc_unreachable ();
7325 }
7326
7327 /* Returns 1 if OP contains a symbol reference */
7328
7329 int
7330 symbolic_reference_mentioned_p (rtx op)
7331 {
7332   const char *fmt;
7333   int i;
7334
7335   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
7336     return 1;
7337
7338   fmt = GET_RTX_FORMAT (GET_CODE (op));
7339   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
7340     {
7341       if (fmt[i] == 'E')
7342         {
7343           int j;
7344
7345           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
7346             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
7347               return 1;
7348         }
7349
7350       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
7351         return 1;
7352     }
7353
7354   return 0;
7355 }
7356
7357 /* Return 1 if it is appropriate to emit `ret' instructions in the
7358    body of a function.  Do this only if the epilogue is simple, needing a
7359    couple of insns.  Prior to reloading, we can't tell how many registers
7360    must be saved, so return 0 then.  Return 0 if there is no frame
7361    marker to de-allocate.  */
7362
7363 int
7364 ix86_can_use_return_insn_p (void)
7365 {
7366   struct ix86_frame frame;
7367
7368   if (! reload_completed || frame_pointer_needed)
7369     return 0;
7370
7371   /* Don't allow more than 32 pop, since that's all we can do
7372      with one instruction.  */
7373   if (crtl->args.pops_args
7374       && crtl->args.size >= 32768)
7375     return 0;
7376
7377   ix86_compute_frame_layout (&frame);
7378   return frame.to_allocate == 0 && frame.padding0 == 0
7379          && (frame.nregs + frame.nsseregs) == 0;
7380 }
7381 \f
7382 /* Value should be nonzero if functions must have frame pointers.
7383    Zero means the frame pointer need not be set up (and parms may
7384    be accessed via the stack pointer) in functions that seem suitable.  */
7385
7386 int
7387 ix86_frame_pointer_required (void)
7388 {
7389   /* If we accessed previous frames, then the generated code expects
7390      to be able to access the saved ebp value in our frame.  */
7391   if (cfun->machine->accesses_prev_frame)
7392     return 1;
7393
7394   /* Several x86 os'es need a frame pointer for other reasons,
7395      usually pertaining to setjmp.  */
7396   if (SUBTARGET_FRAME_POINTER_REQUIRED)
7397     return 1;
7398
7399   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
7400      the frame pointer by default.  Turn it back on now if we've not
7401      got a leaf function.  */
7402   if (TARGET_OMIT_LEAF_FRAME_POINTER
7403       && (!current_function_is_leaf
7404           || ix86_current_function_calls_tls_descriptor))
7405     return 1;
7406
7407   if (crtl->profile)
7408     return 1;
7409
7410   return 0;
7411 }
7412
7413 /* Record that the current function accesses previous call frames.  */
7414
7415 void
7416 ix86_setup_frame_addresses (void)
7417 {
7418   cfun->machine->accesses_prev_frame = 1;
7419 }
7420 \f
7421 #ifndef USE_HIDDEN_LINKONCE
7422 # if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
7423 #  define USE_HIDDEN_LINKONCE 1
7424 # else
7425 #  define USE_HIDDEN_LINKONCE 0
7426 # endif
7427 #endif
7428
7429 static int pic_labels_used;
7430
7431 /* Fills in the label name that should be used for a pc thunk for
7432    the given register.  */
7433
7434 static void
7435 get_pc_thunk_name (char name[32], unsigned int regno)
7436 {
7437   gcc_assert (!TARGET_64BIT);
7438
7439   if (USE_HIDDEN_LINKONCE)
7440     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
7441   else
7442     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
7443 }
7444
7445
7446 /* This function generates code for -fpic that loads %ebx with
7447    the return address of the caller and then returns.  */
7448
7449 void
7450 ix86_file_end (void)
7451 {
7452   rtx xops[2];
7453   int regno;
7454
7455   for (regno = 0; regno < 8; ++regno)
7456     {
7457       char name[32];
7458
7459       if (! ((pic_labels_used >> regno) & 1))
7460         continue;
7461
7462       get_pc_thunk_name (name, regno);
7463
7464 #if TARGET_MACHO
7465       if (TARGET_MACHO)
7466         {
7467           switch_to_section (darwin_sections[text_coal_section]);
7468           fputs ("\t.weak_definition\t", asm_out_file);
7469           assemble_name (asm_out_file, name);
7470           fputs ("\n\t.private_extern\t", asm_out_file);
7471           assemble_name (asm_out_file, name);
7472           fputs ("\n", asm_out_file);
7473           ASM_OUTPUT_LABEL (asm_out_file, name);
7474         }
7475       else
7476 #endif
7477       if (USE_HIDDEN_LINKONCE)
7478         {
7479           tree decl;
7480
7481           decl = build_decl (FUNCTION_DECL, get_identifier (name),
7482                              error_mark_node);
7483           TREE_PUBLIC (decl) = 1;
7484           TREE_STATIC (decl) = 1;
7485           DECL_ONE_ONLY (decl) = 1;
7486
7487           (*targetm.asm_out.unique_section) (decl, 0);
7488           switch_to_section (get_named_section (decl, NULL, 0));
7489
7490           (*targetm.asm_out.globalize_label) (asm_out_file, name);
7491           fputs ("\t.hidden\t", asm_out_file);
7492           assemble_name (asm_out_file, name);
7493           fputc ('\n', asm_out_file);
7494           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
7495         }
7496       else
7497         {
7498           switch_to_section (text_section);
7499           ASM_OUTPUT_LABEL (asm_out_file, name);
7500         }
7501
7502       xops[0] = gen_rtx_REG (Pmode, regno);
7503       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
7504       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
7505       output_asm_insn ("ret", xops);
7506     }
7507
7508   if (NEED_INDICATE_EXEC_STACK)
7509     file_end_indicate_exec_stack ();
7510 }
7511
7512 /* Emit code for the SET_GOT patterns.  */
7513
7514 const char *
7515 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
7516 {
7517   rtx xops[3];
7518
7519   xops[0] = dest;
7520
7521   if (TARGET_VXWORKS_RTP && flag_pic)
7522     {
7523       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
7524       xops[2] = gen_rtx_MEM (Pmode,
7525                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
7526       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
7527
7528       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
7529          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
7530          an unadorned address.  */
7531       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
7532       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
7533       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
7534       return "";
7535     }
7536
7537   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
7538
7539   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
7540     {
7541       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
7542
7543       if (!flag_pic)
7544         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
7545       else
7546         output_asm_insn ("call\t%a2", xops);
7547
7548 #if TARGET_MACHO
7549       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7550          is what will be referenced by the Mach-O PIC subsystem.  */
7551       if (!label)
7552         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7553 #endif
7554
7555       (*targetm.asm_out.internal_label) (asm_out_file, "L",
7556                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
7557
7558       if (flag_pic)
7559         output_asm_insn ("pop%z0\t%0", xops);
7560     }
7561   else
7562     {
7563       char name[32];
7564       get_pc_thunk_name (name, REGNO (dest));
7565       pic_labels_used |= 1 << REGNO (dest);
7566
7567       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
7568       xops[2] = gen_rtx_MEM (QImode, xops[2]);
7569       output_asm_insn ("call\t%X2", xops);
7570       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7571          is what will be referenced by the Mach-O PIC subsystem.  */
7572 #if TARGET_MACHO
7573       if (!label)
7574         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7575       else
7576         targetm.asm_out.internal_label (asm_out_file, "L",
7577                                            CODE_LABEL_NUMBER (label));
7578 #endif
7579     }
7580
7581   if (TARGET_MACHO)
7582     return "";
7583
7584   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
7585     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
7586   else
7587     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
7588
7589   return "";
7590 }
7591
7592 /* Generate an "push" pattern for input ARG.  */
7593
7594 static rtx
7595 gen_push (rtx arg)
7596 {
7597   return gen_rtx_SET (VOIDmode,
7598                       gen_rtx_MEM (Pmode,
7599                                    gen_rtx_PRE_DEC (Pmode,
7600                                                     stack_pointer_rtx)),
7601                       arg);
7602 }
7603
7604 /* Return >= 0 if there is an unused call-clobbered register available
7605    for the entire function.  */
7606
7607 static unsigned int
7608 ix86_select_alt_pic_regnum (void)
7609 {
7610   if (current_function_is_leaf && !crtl->profile
7611       && !ix86_current_function_calls_tls_descriptor)
7612     {
7613       int i, drap;
7614       /* Can't use the same register for both PIC and DRAP.  */
7615       if (crtl->drap_reg)
7616         drap = REGNO (crtl->drap_reg);
7617       else
7618         drap = -1;
7619       for (i = 2; i >= 0; --i)
7620         if (i != drap && !df_regs_ever_live_p (i))
7621           return i;
7622     }
7623
7624   return INVALID_REGNUM;
7625 }
7626
7627 /* Return 1 if we need to save REGNO.  */
7628 static int
7629 ix86_save_reg (unsigned int regno, int maybe_eh_return)
7630 {
7631   if (pic_offset_table_rtx
7632       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
7633       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
7634           || crtl->profile
7635           || crtl->calls_eh_return
7636           || crtl->uses_const_pool))
7637     {
7638       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
7639         return 0;
7640       return 1;
7641     }
7642
7643   if (crtl->calls_eh_return && maybe_eh_return)
7644     {
7645       unsigned i;
7646       for (i = 0; ; i++)
7647         {
7648           unsigned test = EH_RETURN_DATA_REGNO (i);
7649           if (test == INVALID_REGNUM)
7650             break;
7651           if (test == regno)
7652             return 1;
7653         }
7654     }
7655
7656   if (crtl->drap_reg
7657       && regno == REGNO (crtl->drap_reg))
7658     return 1;
7659
7660   return (df_regs_ever_live_p (regno)
7661           && !call_used_regs[regno]
7662           && !fixed_regs[regno]
7663           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
7664 }
7665
7666 /* Return number of saved general prupose registers.  */
7667
7668 static int
7669 ix86_nsaved_regs (void)
7670 {
7671   int nregs = 0;
7672   int regno;
7673
7674   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7675     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7676       nregs ++;
7677   return nregs;
7678 }
7679
7680 /* Return number of saved SSE registrers.  */
7681
7682 static int
7683 ix86_nsaved_sseregs (void)
7684 {
7685   int nregs = 0;
7686   int regno;
7687
7688   if (ix86_cfun_abi () != MS_ABI)
7689     return 0;
7690   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7691     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7692       nregs ++;
7693   return nregs;
7694 }
7695
7696 /* Given FROM and TO register numbers, say whether this elimination is
7697    allowed.  If stack alignment is needed, we can only replace argument
7698    pointer with hard frame pointer, or replace frame pointer with stack
7699    pointer.  Otherwise, frame pointer elimination is automatically
7700    handled and all other eliminations are valid.  */
7701
7702 int
7703 ix86_can_eliminate (int from, int to)
7704 {
7705   if (stack_realign_fp)
7706     return ((from == ARG_POINTER_REGNUM
7707              && to == HARD_FRAME_POINTER_REGNUM)
7708             || (from == FRAME_POINTER_REGNUM
7709                 && to == STACK_POINTER_REGNUM));
7710   else
7711     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : 1;
7712 }
7713
7714 /* Return the offset between two registers, one to be eliminated, and the other
7715    its replacement, at the start of a routine.  */
7716
7717 HOST_WIDE_INT
7718 ix86_initial_elimination_offset (int from, int to)
7719 {
7720   struct ix86_frame frame;
7721   ix86_compute_frame_layout (&frame);
7722
7723   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
7724     return frame.hard_frame_pointer_offset;
7725   else if (from == FRAME_POINTER_REGNUM
7726            && to == HARD_FRAME_POINTER_REGNUM)
7727     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
7728   else
7729     {
7730       gcc_assert (to == STACK_POINTER_REGNUM);
7731
7732       if (from == ARG_POINTER_REGNUM)
7733         return frame.stack_pointer_offset;
7734
7735       gcc_assert (from == FRAME_POINTER_REGNUM);
7736       return frame.stack_pointer_offset - frame.frame_pointer_offset;
7737     }
7738 }
7739
7740 /* In a dynamically-aligned function, we can't know the offset from
7741    stack pointer to frame pointer, so we must ensure that setjmp
7742    eliminates fp against the hard fp (%ebp) rather than trying to
7743    index from %esp up to the top of the frame across a gap that is
7744    of unknown (at compile-time) size.  */
7745 static rtx
7746 ix86_builtin_setjmp_frame_value (void)
7747 {
7748   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
7749 }
7750
7751 /* Fill structure ix86_frame about frame of currently computed function.  */
7752
7753 static void
7754 ix86_compute_frame_layout (struct ix86_frame *frame)
7755 {
7756   HOST_WIDE_INT total_size;
7757   unsigned int stack_alignment_needed;
7758   HOST_WIDE_INT offset;
7759   unsigned int preferred_alignment;
7760   HOST_WIDE_INT size = get_frame_size ();
7761
7762   frame->nregs = ix86_nsaved_regs ();
7763   frame->nsseregs = ix86_nsaved_sseregs ();
7764   total_size = size;
7765
7766   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
7767   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
7768
7769   /* MS ABI seem to require stack alignment to be always 16 except for function
7770      prologues.  */
7771   if (ix86_cfun_abi () == MS_ABI && preferred_alignment < 16)
7772     {
7773       preferred_alignment = 16;
7774       stack_alignment_needed = 16;
7775       crtl->preferred_stack_boundary = 128;
7776       crtl->stack_alignment_needed = 128;
7777     }
7778
7779   gcc_assert (!size || stack_alignment_needed);
7780   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
7781   gcc_assert (preferred_alignment <= stack_alignment_needed);
7782
7783   /* During reload iteration the amount of registers saved can change.
7784      Recompute the value as needed.  Do not recompute when amount of registers
7785      didn't change as reload does multiple calls to the function and does not
7786      expect the decision to change within single iteration.  */
7787   if (!optimize_function_for_size_p (cfun)
7788       && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
7789     {
7790       int count = frame->nregs;
7791
7792       cfun->machine->use_fast_prologue_epilogue_nregs = count;
7793       /* The fast prologue uses move instead of push to save registers.  This
7794          is significantly longer, but also executes faster as modern hardware
7795          can execute the moves in parallel, but can't do that for push/pop.
7796
7797          Be careful about choosing what prologue to emit:  When function takes
7798          many instructions to execute we may use slow version as well as in
7799          case function is known to be outside hot spot (this is known with
7800          feedback only).  Weight the size of function by number of registers
7801          to save as it is cheap to use one or two push instructions but very
7802          slow to use many of them.  */
7803       if (count)
7804         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
7805       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
7806           || (flag_branch_probabilities
7807               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
7808         cfun->machine->use_fast_prologue_epilogue = false;
7809       else
7810         cfun->machine->use_fast_prologue_epilogue
7811            = !expensive_function_p (count);
7812     }
7813   if (TARGET_PROLOGUE_USING_MOVE
7814       && cfun->machine->use_fast_prologue_epilogue)
7815     frame->save_regs_using_mov = true;
7816   else
7817     frame->save_regs_using_mov = false;
7818
7819
7820   /* Skip return address and saved base pointer.  */
7821   offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
7822
7823   frame->hard_frame_pointer_offset = offset;
7824
7825   /* Set offset to aligned because the realigned frame starts from
7826      here.  */
7827   if (stack_realign_fp)
7828     offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
7829
7830   /* Register save area */
7831   offset += frame->nregs * UNITS_PER_WORD;
7832
7833   /* Align SSE reg save area.  */
7834   if (frame->nsseregs)
7835     frame->padding0 = ((offset + 16 - 1) & -16) - offset;
7836   else
7837     frame->padding0 = 0;
7838   
7839   /* SSE register save area.  */
7840   offset += frame->padding0 + frame->nsseregs * 16;
7841
7842   /* Va-arg area */
7843   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
7844   offset += frame->va_arg_size;
7845
7846   /* Align start of frame for local function.  */
7847   frame->padding1 = ((offset + stack_alignment_needed - 1)
7848                      & -stack_alignment_needed) - offset;
7849
7850   offset += frame->padding1;
7851
7852   /* Frame pointer points here.  */
7853   frame->frame_pointer_offset = offset;
7854
7855   offset += size;
7856
7857   /* Add outgoing arguments area.  Can be skipped if we eliminated
7858      all the function calls as dead code.
7859      Skipping is however impossible when function calls alloca.  Alloca
7860      expander assumes that last crtl->outgoing_args_size
7861      of stack frame are unused.  */
7862   if (ACCUMULATE_OUTGOING_ARGS
7863       && (!current_function_is_leaf || cfun->calls_alloca
7864           || ix86_current_function_calls_tls_descriptor))
7865     {
7866       offset += crtl->outgoing_args_size;
7867       frame->outgoing_arguments_size = crtl->outgoing_args_size;
7868     }
7869   else
7870     frame->outgoing_arguments_size = 0;
7871
7872   /* Align stack boundary.  Only needed if we're calling another function
7873      or using alloca.  */
7874   if (!current_function_is_leaf || cfun->calls_alloca
7875       || ix86_current_function_calls_tls_descriptor)
7876     frame->padding2 = ((offset + preferred_alignment - 1)
7877                        & -preferred_alignment) - offset;
7878   else
7879     frame->padding2 = 0;
7880
7881   offset += frame->padding2;
7882
7883   /* We've reached end of stack frame.  */
7884   frame->stack_pointer_offset = offset;
7885
7886   /* Size prologue needs to allocate.  */
7887   frame->to_allocate =
7888     (size + frame->padding1 + frame->padding2
7889      + frame->outgoing_arguments_size + frame->va_arg_size);
7890
7891   if ((!frame->to_allocate && frame->nregs <= 1)
7892       || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
7893     frame->save_regs_using_mov = false;
7894
7895   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
7896       && current_function_sp_is_unchanging
7897       && current_function_is_leaf
7898       && !ix86_current_function_calls_tls_descriptor)
7899     {
7900       frame->red_zone_size = frame->to_allocate;
7901       if (frame->save_regs_using_mov)
7902         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
7903       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
7904         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
7905     }
7906   else
7907     frame->red_zone_size = 0;
7908   frame->to_allocate -= frame->red_zone_size;
7909   frame->stack_pointer_offset -= frame->red_zone_size;
7910 #if 0
7911   fprintf (stderr, "\n");
7912   fprintf (stderr, "size: %ld\n", (long)size);
7913   fprintf (stderr, "nregs: %ld\n", (long)frame->nregs);
7914   fprintf (stderr, "nsseregs: %ld\n", (long)frame->nsseregs);
7915   fprintf (stderr, "padding0: %ld\n", (long)frame->padding0);
7916   fprintf (stderr, "alignment1: %ld\n", (long)stack_alignment_needed);
7917   fprintf (stderr, "padding1: %ld\n", (long)frame->padding1);
7918   fprintf (stderr, "va_arg: %ld\n", (long)frame->va_arg_size);
7919   fprintf (stderr, "padding2: %ld\n", (long)frame->padding2);
7920   fprintf (stderr, "to_allocate: %ld\n", (long)frame->to_allocate);
7921   fprintf (stderr, "red_zone_size: %ld\n", (long)frame->red_zone_size);
7922   fprintf (stderr, "frame_pointer_offset: %ld\n", (long)frame->frame_pointer_offset);
7923   fprintf (stderr, "hard_frame_pointer_offset: %ld\n",
7924            (long)frame->hard_frame_pointer_offset);
7925   fprintf (stderr, "stack_pointer_offset: %ld\n", (long)frame->stack_pointer_offset);
7926   fprintf (stderr, "current_function_is_leaf: %ld\n", (long)current_function_is_leaf);
7927   fprintf (stderr, "cfun->calls_alloca: %ld\n", (long)cfun->calls_alloca);
7928   fprintf (stderr, "x86_current_function_calls_tls_descriptor: %ld\n", (long)ix86_current_function_calls_tls_descriptor);
7929 #endif
7930 }
7931
7932 /* Emit code to save registers in the prologue.  */
7933
7934 static void
7935 ix86_emit_save_regs (void)
7936 {
7937   unsigned int regno;
7938   rtx insn;
7939
7940   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
7941     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7942       {
7943         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
7944         RTX_FRAME_RELATED_P (insn) = 1;
7945       }
7946 }
7947
7948 /* Emit code to save registers using MOV insns.  First register
7949    is restored from POINTER + OFFSET.  */
7950 static void
7951 ix86_emit_save_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7952 {
7953   unsigned int regno;
7954   rtx insn;
7955
7956   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7957     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7958       {
7959         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
7960                                                Pmode, offset),
7961                                gen_rtx_REG (Pmode, regno));
7962         RTX_FRAME_RELATED_P (insn) = 1;
7963         offset += UNITS_PER_WORD;
7964       }
7965 }
7966
7967 /* Emit code to save registers using MOV insns.  First register
7968    is restored from POINTER + OFFSET.  */
7969 static void
7970 ix86_emit_save_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7971 {
7972   unsigned int regno;
7973   rtx insn;
7974   rtx mem;
7975
7976   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7977     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7978       {
7979         mem = adjust_address (gen_rtx_MEM (TImode, pointer), TImode, offset);
7980         set_mem_align (mem, 128);
7981         insn = emit_move_insn (mem, gen_rtx_REG (TImode, regno));
7982         RTX_FRAME_RELATED_P (insn) = 1;
7983         offset += 16;
7984       }
7985 }
7986
7987 /* Expand prologue or epilogue stack adjustment.
7988    The pattern exist to put a dependency on all ebp-based memory accesses.
7989    STYLE should be negative if instructions should be marked as frame related,
7990    zero if %r11 register is live and cannot be freely used and positive
7991    otherwise.  */
7992
7993 static void
7994 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset, int style)
7995 {
7996   rtx insn;
7997
7998   if (! TARGET_64BIT)
7999     insn = emit_insn (gen_pro_epilogue_adjust_stack_1 (dest, src, offset));
8000   else if (x86_64_immediate_operand (offset, DImode))
8001     insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
8002   else
8003     {
8004       rtx r11;
8005       /* r11 is used by indirect sibcall return as well, set before the
8006          epilogue and used after the epilogue.  ATM indirect sibcall
8007          shouldn't be used together with huge frame sizes in one
8008          function because of the frame_size check in sibcall.c.  */
8009       gcc_assert (style);
8010       r11 = gen_rtx_REG (DImode, R11_REG);
8011       insn = emit_insn (gen_rtx_SET (DImode, r11, offset));
8012       if (style < 0)
8013         RTX_FRAME_RELATED_P (insn) = 1;
8014       insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11,
8015                                                                offset));
8016     }
8017   if (style < 0)
8018     RTX_FRAME_RELATED_P (insn) = 1;
8019 }
8020
8021 /* Find an available register to be used as dynamic realign argument
8022    pointer regsiter.  Such a register will be written in prologue and
8023    used in begin of body, so it must not be
8024         1. parameter passing register.
8025         2. GOT pointer.
8026    We reuse static-chain register if it is available.  Otherwise, we
8027    use DI for i386 and R13 for x86-64.  We chose R13 since it has
8028    shorter encoding.
8029
8030    Return: the regno of chosen register.  */
8031
8032 static unsigned int 
8033 find_drap_reg (void)
8034 {
8035   tree decl = cfun->decl;
8036
8037   if (TARGET_64BIT)
8038     {
8039       /* Use R13 for nested function or function need static chain.
8040          Since function with tail call may use any caller-saved
8041          registers in epilogue, DRAP must not use caller-saved
8042          register in such case.  */
8043       if ((decl_function_context (decl)
8044            && !DECL_NO_STATIC_CHAIN (decl))
8045           || crtl->tail_call_emit)
8046         return R13_REG;
8047
8048       return R10_REG;
8049     }
8050   else
8051     {
8052       /* Use DI for nested function or function need static chain.
8053          Since function with tail call may use any caller-saved
8054          registers in epilogue, DRAP must not use caller-saved
8055          register in such case.  */
8056       if ((decl_function_context (decl)
8057            && !DECL_NO_STATIC_CHAIN (decl))
8058           || crtl->tail_call_emit)
8059         return DI_REG;
8060     
8061       /* Reuse static chain register if it isn't used for parameter
8062          passing.  */
8063       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2
8064           && !lookup_attribute ("fastcall",
8065                                 TYPE_ATTRIBUTES (TREE_TYPE (decl))))
8066         return CX_REG;
8067       else
8068         return DI_REG;
8069     }
8070 }
8071
8072 /* Update incoming stack boundary and estimated stack alignment.  */
8073
8074 static void
8075 ix86_update_stack_boundary (void)
8076 {
8077   /* Prefer the one specified at command line. */
8078   ix86_incoming_stack_boundary 
8079     = (ix86_user_incoming_stack_boundary
8080        ? ix86_user_incoming_stack_boundary
8081        : ix86_default_incoming_stack_boundary);
8082
8083   /* Incoming stack alignment can be changed on individual functions
8084      via force_align_arg_pointer attribute.  We use the smallest
8085      incoming stack boundary.  */
8086   if (ix86_incoming_stack_boundary > MIN_STACK_BOUNDARY
8087       && lookup_attribute (ix86_force_align_arg_pointer_string,
8088                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
8089     ix86_incoming_stack_boundary = MIN_STACK_BOUNDARY;
8090
8091   /* The incoming stack frame has to be aligned at least at
8092      parm_stack_boundary.  */
8093   if (ix86_incoming_stack_boundary < crtl->parm_stack_boundary)
8094     ix86_incoming_stack_boundary = crtl->parm_stack_boundary;
8095
8096   /* Stack at entrance of main is aligned by runtime.  We use the
8097      smallest incoming stack boundary. */
8098   if (ix86_incoming_stack_boundary > MAIN_STACK_BOUNDARY
8099       && DECL_NAME (current_function_decl)
8100       && MAIN_NAME_P (DECL_NAME (current_function_decl))
8101       && DECL_FILE_SCOPE_P (current_function_decl))
8102     ix86_incoming_stack_boundary = MAIN_STACK_BOUNDARY;
8103
8104   /* x86_64 vararg needs 16byte stack alignment for register save
8105      area.  */
8106   if (TARGET_64BIT
8107       && cfun->stdarg
8108       && crtl->stack_alignment_estimated < 128)
8109     crtl->stack_alignment_estimated = 128;
8110 }
8111
8112 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
8113    needed or an rtx for DRAP otherwise.  */
8114
8115 static rtx
8116 ix86_get_drap_rtx (void)
8117 {
8118   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
8119     crtl->need_drap = true;
8120
8121   if (stack_realign_drap)
8122     {
8123       /* Assign DRAP to vDRAP and returns vDRAP */
8124       unsigned int regno = find_drap_reg ();
8125       rtx drap_vreg;
8126       rtx arg_ptr;
8127       rtx seq, insn;
8128
8129       arg_ptr = gen_rtx_REG (Pmode, regno);
8130       crtl->drap_reg = arg_ptr;
8131
8132       start_sequence ();
8133       drap_vreg = copy_to_reg (arg_ptr);
8134       seq = get_insns ();
8135       end_sequence ();
8136       
8137       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
8138       RTX_FRAME_RELATED_P (insn) = 1;
8139       return drap_vreg;
8140     }
8141   else
8142     return NULL;
8143 }
8144
8145 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
8146
8147 static rtx
8148 ix86_internal_arg_pointer (void)
8149 {
8150   return virtual_incoming_args_rtx;
8151 }
8152
8153 /* Handle the TARGET_DWARF_HANDLE_FRAME_UNSPEC hook.
8154    This is called from dwarf2out.c to emit call frame instructions
8155    for frame-related insns containing UNSPECs and UNSPEC_VOLATILEs. */
8156 static void
8157 ix86_dwarf_handle_frame_unspec (const char *label, rtx pattern, int index)
8158 {
8159   rtx unspec = SET_SRC (pattern);
8160   gcc_assert (GET_CODE (unspec) == UNSPEC);
8161
8162   switch (index)
8163     {
8164     case UNSPEC_REG_SAVE:
8165       dwarf2out_reg_save_reg (label, XVECEXP (unspec, 0, 0),
8166                               SET_DEST (pattern));
8167       break;
8168     case UNSPEC_DEF_CFA:
8169       dwarf2out_def_cfa (label, REGNO (SET_DEST (pattern)),
8170                          INTVAL (XVECEXP (unspec, 0, 0)));
8171       break;
8172     default:
8173       gcc_unreachable ();
8174     }
8175 }
8176
8177 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
8178    to be generated in correct form.  */
8179 static void 
8180 ix86_finalize_stack_realign_flags (void)
8181 {
8182   /* Check if stack realign is really needed after reload, and 
8183      stores result in cfun */
8184   unsigned int incoming_stack_boundary
8185     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
8186        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
8187   unsigned int stack_realign = (incoming_stack_boundary
8188                                 < (current_function_is_leaf
8189                                    ? crtl->max_used_stack_slot_alignment
8190                                    : crtl->stack_alignment_needed));
8191
8192   if (crtl->stack_realign_finalized)
8193     {
8194       /* After stack_realign_needed is finalized, we can't no longer
8195          change it.  */
8196       gcc_assert (crtl->stack_realign_needed == stack_realign);
8197     }
8198   else
8199     {
8200       crtl->stack_realign_needed = stack_realign;
8201       crtl->stack_realign_finalized = true;
8202     }
8203 }
8204
8205 /* Expand the prologue into a bunch of separate insns.  */
8206
8207 void
8208 ix86_expand_prologue (void)
8209 {
8210   rtx insn;
8211   bool pic_reg_used;
8212   struct ix86_frame frame;
8213   HOST_WIDE_INT allocate;
8214
8215   ix86_finalize_stack_realign_flags ();
8216
8217   /* DRAP should not coexist with stack_realign_fp */
8218   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
8219
8220   ix86_compute_frame_layout (&frame);
8221
8222   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
8223      of DRAP is needed and stack realignment is really needed after reload */
8224   if (crtl->drap_reg && crtl->stack_realign_needed)
8225     {
8226       rtx x, y;
8227       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8228       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8229                               ? 0 : UNITS_PER_WORD);
8230
8231       gcc_assert (stack_realign_drap);
8232
8233       /* Grab the argument pointer.  */
8234       x = plus_constant (stack_pointer_rtx, 
8235                          (UNITS_PER_WORD + param_ptr_offset));
8236       y = crtl->drap_reg;
8237
8238       /* Only need to push parameter pointer reg if it is caller
8239          saved reg */
8240       if (!call_used_regs[REGNO (crtl->drap_reg)])
8241         {
8242           /* Push arg pointer reg */
8243           insn = emit_insn (gen_push (y));
8244           RTX_FRAME_RELATED_P (insn) = 1;
8245         }
8246
8247       insn = emit_insn (gen_rtx_SET (VOIDmode, y, x));
8248       RTX_FRAME_RELATED_P (insn) = 1; 
8249
8250       /* Align the stack.  */
8251       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8252                                            stack_pointer_rtx,
8253                                            GEN_INT (-align_bytes)));
8254       RTX_FRAME_RELATED_P (insn) = 1;
8255
8256       /* Replicate the return address on the stack so that return
8257          address can be reached via (argp - 1) slot.  This is needed
8258          to implement macro RETURN_ADDR_RTX and intrinsic function
8259          expand_builtin_return_addr etc.  */
8260       x = crtl->drap_reg;
8261       x = gen_frame_mem (Pmode,
8262                          plus_constant (x, -UNITS_PER_WORD));
8263       insn = emit_insn (gen_push (x));
8264       RTX_FRAME_RELATED_P (insn) = 1;
8265     }
8266
8267   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
8268      slower on all targets.  Also sdb doesn't like it.  */
8269
8270   if (frame_pointer_needed)
8271     {
8272       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
8273       RTX_FRAME_RELATED_P (insn) = 1;
8274
8275       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
8276       RTX_FRAME_RELATED_P (insn) = 1;
8277     }
8278
8279   if (stack_realign_fp)
8280     {
8281       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8282       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
8283
8284       /* Align the stack.  */
8285       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8286                                            stack_pointer_rtx,
8287                                            GEN_INT (-align_bytes)));
8288       RTX_FRAME_RELATED_P (insn) = 1;
8289     }
8290
8291   allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding0;
8292
8293   if (!frame.save_regs_using_mov)
8294     ix86_emit_save_regs ();
8295   else
8296     allocate += frame.nregs * UNITS_PER_WORD;
8297
8298   /* When using red zone we may start register saving before allocating
8299      the stack frame saving one cycle of the prologue. However I will
8300      avoid doing this if I am going to have to probe the stack since
8301      at least on x86_64 the stack probe can turn into a call that clobbers
8302      a red zone location */
8303   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && frame.save_regs_using_mov
8304       && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT))
8305     ix86_emit_save_regs_using_mov ((frame_pointer_needed
8306                                      && !crtl->stack_realign_needed) 
8307                                    ? hard_frame_pointer_rtx
8308                                    : stack_pointer_rtx,
8309                                    -frame.nregs * UNITS_PER_WORD);
8310
8311   if (allocate == 0)
8312     ;
8313   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
8314     pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8315                                GEN_INT (-allocate), -1);
8316   else
8317     {
8318       rtx eax = gen_rtx_REG (Pmode, AX_REG);
8319       bool eax_live;
8320       rtx t;
8321
8322       if (cfun->machine->call_abi == MS_ABI)
8323         eax_live = false;
8324       else
8325         eax_live = ix86_eax_live_at_start_p ();
8326
8327       if (eax_live)
8328         {
8329           emit_insn (gen_push (eax));
8330           allocate -= UNITS_PER_WORD;
8331         }
8332
8333       emit_move_insn (eax, GEN_INT (allocate));
8334
8335       if (TARGET_64BIT)
8336         insn = gen_allocate_stack_worker_64 (eax, eax);
8337       else
8338         insn = gen_allocate_stack_worker_32 (eax, eax);
8339       insn = emit_insn (insn);
8340       RTX_FRAME_RELATED_P (insn) = 1;
8341       t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-allocate));
8342       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8343       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8344                                             t, REG_NOTES (insn));
8345
8346       if (eax_live)
8347         {
8348           if (frame_pointer_needed)
8349             t = plus_constant (hard_frame_pointer_rtx,
8350                                allocate
8351                                - frame.to_allocate
8352                                - frame.nregs * UNITS_PER_WORD);
8353           else
8354             t = plus_constant (stack_pointer_rtx, allocate);
8355           emit_move_insn (eax, gen_rtx_MEM (Pmode, t));
8356         }
8357     }
8358
8359   if (frame.save_regs_using_mov
8360       && !(!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8361          && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
8362     {
8363       if (!frame_pointer_needed
8364           || !(frame.to_allocate + frame.padding0)
8365           || crtl->stack_realign_needed)
8366         ix86_emit_save_regs_using_mov (stack_pointer_rtx,
8367                                        frame.to_allocate
8368                                        + frame.nsseregs * 16 + frame.padding0);
8369       else
8370         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
8371                                        -frame.nregs * UNITS_PER_WORD);
8372     }
8373   if (!frame_pointer_needed
8374       || !(frame.to_allocate + frame.padding0)
8375       || crtl->stack_realign_needed)
8376     ix86_emit_save_sse_regs_using_mov (stack_pointer_rtx,
8377                                        frame.to_allocate);
8378   else
8379     ix86_emit_save_sse_regs_using_mov (hard_frame_pointer_rtx,
8380                                        - frame.nregs * UNITS_PER_WORD
8381                                        - frame.nsseregs * 16
8382                                        - frame.padding0);
8383
8384   pic_reg_used = false;
8385   if (pic_offset_table_rtx
8386       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
8387           || crtl->profile))
8388     {
8389       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
8390
8391       if (alt_pic_reg_used != INVALID_REGNUM)
8392         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
8393
8394       pic_reg_used = true;
8395     }
8396
8397   if (pic_reg_used)
8398     {
8399       if (TARGET_64BIT)
8400         {
8401           if (ix86_cmodel == CM_LARGE_PIC)
8402             {
8403               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
8404               rtx label = gen_label_rtx ();
8405               emit_label (label);
8406               LABEL_PRESERVE_P (label) = 1;
8407               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
8408               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
8409               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
8410               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
8411                                             pic_offset_table_rtx, tmp_reg));
8412             }
8413           else
8414             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
8415         }
8416       else
8417         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
8418     }
8419
8420   /* In the pic_reg_used case, make sure that the got load isn't deleted
8421      when mcount needs it.  Blockage to avoid call movement across mcount
8422      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
8423      note.  */
8424   if (crtl->profile && pic_reg_used)
8425     emit_insn (gen_prologue_use (pic_offset_table_rtx));
8426
8427   if (crtl->drap_reg && !crtl->stack_realign_needed)
8428     {
8429       /* vDRAP is setup but after reload it turns out stack realign
8430          isn't necessary, here we will emit prologue to setup DRAP
8431          without stack realign adjustment */
8432       int drap_bp_offset = UNITS_PER_WORD * 2;
8433       rtx x = plus_constant (hard_frame_pointer_rtx, drap_bp_offset);
8434       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, x));
8435     }
8436
8437   /* Prevent instructions from being scheduled into register save push
8438      sequence when access to the redzone area is done through frame pointer.
8439      The offset betweeh the frame pointer and the stack pointer is calculated
8440      relative to the value of the stack pointer at the end of the function
8441      prologue, and moving instructions that access redzone area via frame
8442      pointer inside push sequence violates this assumption.  */
8443   if (frame_pointer_needed && frame.red_zone_size)
8444     emit_insn (gen_memory_blockage ());
8445
8446   /* Emit cld instruction if stringops are used in the function.  */
8447   if (TARGET_CLD && ix86_current_function_needs_cld)
8448     emit_insn (gen_cld ());
8449 }
8450
8451 /* Emit code to restore saved registers using MOV insns.  First register
8452    is restored from POINTER + OFFSET.  */
8453 static void
8454 ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8455                                   int maybe_eh_return)
8456 {
8457   int regno;
8458   rtx base_address = gen_rtx_MEM (Pmode, pointer);
8459
8460   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8461     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8462       {
8463         /* Ensure that adjust_address won't be forced to produce pointer
8464            out of range allowed by x86-64 instruction set.  */
8465         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8466           {
8467             rtx r11;
8468
8469             r11 = gen_rtx_REG (DImode, R11_REG);
8470             emit_move_insn (r11, GEN_INT (offset));
8471             emit_insn (gen_adddi3 (r11, r11, pointer));
8472             base_address = gen_rtx_MEM (Pmode, r11);
8473             offset = 0;
8474           }
8475         emit_move_insn (gen_rtx_REG (Pmode, regno),
8476                         adjust_address (base_address, Pmode, offset));
8477         offset += UNITS_PER_WORD;
8478       }
8479 }
8480
8481 /* Emit code to restore saved registers using MOV insns.  First register
8482    is restored from POINTER + OFFSET.  */
8483 static void
8484 ix86_emit_restore_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8485                                       int maybe_eh_return)
8486 {
8487   int regno;
8488   rtx base_address = gen_rtx_MEM (TImode, pointer);
8489   rtx mem;
8490
8491   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8492     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8493       {
8494         /* Ensure that adjust_address won't be forced to produce pointer
8495            out of range allowed by x86-64 instruction set.  */
8496         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8497           {
8498             rtx r11;
8499
8500             r11 = gen_rtx_REG (DImode, R11_REG);
8501             emit_move_insn (r11, GEN_INT (offset));
8502             emit_insn (gen_adddi3 (r11, r11, pointer));
8503             base_address = gen_rtx_MEM (TImode, r11);
8504             offset = 0;
8505           }
8506         mem = adjust_address (base_address, TImode, offset);
8507         set_mem_align (mem, 128);
8508         emit_move_insn (gen_rtx_REG (TImode, regno), mem);
8509         offset += 16;
8510       }
8511 }
8512
8513 /* Restore function stack, frame, and registers.  */
8514
8515 void
8516 ix86_expand_epilogue (int style)
8517 {
8518   int regno;
8519   int sp_valid;
8520   struct ix86_frame frame;
8521   HOST_WIDE_INT offset;
8522
8523   ix86_finalize_stack_realign_flags ();
8524
8525  /* When stack is realigned, SP must be valid.  */
8526   sp_valid = (!frame_pointer_needed
8527               || current_function_sp_is_unchanging
8528               || stack_realign_fp);
8529
8530   ix86_compute_frame_layout (&frame);
8531
8532   /* See the comment about red zone and frame
8533      pointer usage in ix86_expand_prologue.  */
8534   if (frame_pointer_needed && frame.red_zone_size)
8535     emit_insn (gen_memory_blockage ()); 
8536
8537   /* Calculate start of saved registers relative to ebp.  Special care
8538      must be taken for the normal return case of a function using
8539      eh_return: the eax and edx registers are marked as saved, but not
8540      restored along this path.  */
8541   offset = frame.nregs;
8542   if (crtl->calls_eh_return && style != 2)
8543     offset -= 2;
8544   offset *= -UNITS_PER_WORD;
8545   offset -= frame.nsseregs * 16 + frame.padding0;
8546
8547   /* If we're only restoring one register and sp is not valid then
8548      using a move instruction to restore the register since it's
8549      less work than reloading sp and popping the register.
8550
8551      The default code result in stack adjustment using add/lea instruction,
8552      while this code results in LEAVE instruction (or discrete equivalent),
8553      so it is profitable in some other cases as well.  Especially when there
8554      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
8555      and there is exactly one register to pop. This heuristic may need some
8556      tuning in future.  */
8557   if ((!sp_valid && (frame.nregs + frame.nsseregs) <= 1)
8558       || (TARGET_EPILOGUE_USING_MOVE
8559           && cfun->machine->use_fast_prologue_epilogue
8560           && ((frame.nregs + frame.nsseregs) > 1
8561               || (frame.to_allocate + frame.padding0) != 0))
8562       || (frame_pointer_needed && !(frame.nregs + frame.nsseregs)
8563           && (frame.to_allocate + frame.padding0) != 0)
8564       || (frame_pointer_needed && TARGET_USE_LEAVE
8565           && cfun->machine->use_fast_prologue_epilogue
8566           && (frame.nregs + frame.nsseregs) == 1)
8567       || crtl->calls_eh_return)
8568     {
8569       /* Restore registers.  We can use ebp or esp to address the memory
8570          locations.  If both are available, default to ebp, since offsets
8571          are known to be small.  Only exception is esp pointing directly
8572          to the end of block of saved registers, where we may simplify
8573          addressing mode.
8574
8575          If we are realigning stack with bp and sp, regs restore can't
8576          be addressed by bp. sp must be used instead.  */
8577
8578       if (!frame_pointer_needed
8579           || (sp_valid && !(frame.to_allocate + frame.padding0))
8580           || stack_realign_fp)
8581         {
8582           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8583                                                 frame.to_allocate, style == 2);
8584           ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
8585                                             frame.to_allocate
8586                                             + frame.nsseregs * 16
8587                                             + frame.padding0, style == 2);
8588         }
8589       else
8590         {
8591           ix86_emit_restore_sse_regs_using_mov (hard_frame_pointer_rtx,
8592                                                 offset, style == 2);
8593           ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
8594                                             offset
8595                                             + frame.nsseregs * 16
8596                                             + frame.padding0, style == 2);
8597         }
8598
8599       /* eh_return epilogues need %ecx added to the stack pointer.  */
8600       if (style == 2)
8601         {
8602           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
8603
8604           /* Stack align doesn't work with eh_return.  */
8605           gcc_assert (!crtl->stack_realign_needed);
8606
8607           if (frame_pointer_needed)
8608             {
8609               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
8610               tmp = plus_constant (tmp, UNITS_PER_WORD);
8611               emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
8612
8613               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
8614               emit_move_insn (hard_frame_pointer_rtx, tmp);
8615
8616               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
8617                                          const0_rtx, style);
8618             }
8619           else
8620             {
8621               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
8622               tmp = plus_constant (tmp, (frame.to_allocate
8623                                          + frame.nregs * UNITS_PER_WORD
8624                                          + frame.nsseregs * 16
8625                                          + frame.padding0));
8626               emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
8627             }
8628         }
8629       else if (!frame_pointer_needed)
8630         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8631                                    GEN_INT (frame.to_allocate
8632                                             + frame.nregs * UNITS_PER_WORD
8633                                             + frame.nsseregs * 16
8634                                             + frame.padding0),
8635                                    style);
8636       /* If not an i386, mov & pop is faster than "leave".  */
8637       else if (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
8638                || !cfun->machine->use_fast_prologue_epilogue)
8639         emit_insn ((*ix86_gen_leave) ());
8640       else
8641         {
8642           pro_epilogue_adjust_stack (stack_pointer_rtx,
8643                                      hard_frame_pointer_rtx,
8644                                      const0_rtx, style);
8645
8646           emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8647         }
8648     }
8649   else
8650     {
8651       /* First step is to deallocate the stack frame so that we can
8652          pop the registers.
8653
8654          If we realign stack with frame pointer, then stack pointer
8655          won't be able to recover via lea $offset(%bp), %sp, because
8656          there is a padding area between bp and sp for realign. 
8657          "add $to_allocate, %sp" must be used instead.  */
8658       if (!sp_valid)
8659         {
8660           gcc_assert (frame_pointer_needed);
8661           gcc_assert (!stack_realign_fp);
8662           pro_epilogue_adjust_stack (stack_pointer_rtx,
8663                                      hard_frame_pointer_rtx,
8664                                      GEN_INT (offset), style);
8665           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8666                                                 0, style == 2);
8667           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8668                                      GEN_INT (frame.nsseregs * 16 +
8669                                        frame.padding0), style);
8670         }
8671       else if (frame.to_allocate || frame.padding0 || frame.nsseregs)
8672         {
8673           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8674                                                 frame.to_allocate,
8675                                                 style == 2);
8676           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8677                                      GEN_INT (frame.to_allocate
8678                                               + frame.nsseregs * 16
8679                                               + frame.padding0), style);
8680         }
8681
8682       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8683         if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
8684           emit_insn ((*ix86_gen_pop1) (gen_rtx_REG (Pmode, regno)));
8685       if (frame_pointer_needed)
8686         {
8687           /* Leave results in shorter dependency chains on CPUs that are
8688              able to grok it fast.  */
8689           if (TARGET_USE_LEAVE)
8690             emit_insn ((*ix86_gen_leave) ());
8691           else
8692             {
8693               /* For stack realigned really happens, recover stack 
8694                  pointer to hard frame pointer is a must, if not using 
8695                  leave.  */
8696               if (stack_realign_fp)
8697                 pro_epilogue_adjust_stack (stack_pointer_rtx,
8698                                            hard_frame_pointer_rtx,
8699                                            const0_rtx, style);
8700               emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8701             }
8702         }
8703     }
8704
8705   if (crtl->drap_reg && crtl->stack_realign_needed)
8706     {
8707       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8708                               ? 0 : UNITS_PER_WORD);
8709       gcc_assert (stack_realign_drap);
8710       emit_insn (gen_rtx_SET
8711                  (VOIDmode, stack_pointer_rtx,
8712                   gen_rtx_PLUS (Pmode,
8713                                 crtl->drap_reg,
8714                                 GEN_INT (-(UNITS_PER_WORD
8715                                            + param_ptr_offset)))));
8716       if (!call_used_regs[REGNO (crtl->drap_reg)])
8717         emit_insn ((*ix86_gen_pop1) (crtl->drap_reg));
8718       
8719     }
8720
8721   /* Sibcall epilogues don't want a return instruction.  */
8722   if (style == 0)
8723     return;
8724
8725   if (crtl->args.pops_args && crtl->args.size)
8726     {
8727       rtx popc = GEN_INT (crtl->args.pops_args);
8728
8729       /* i386 can only pop 64K bytes.  If asked to pop more, pop
8730          return address, do explicit add, and jump indirectly to the
8731          caller.  */
8732
8733       if (crtl->args.pops_args >= 65536)
8734         {
8735           rtx ecx = gen_rtx_REG (SImode, CX_REG);
8736
8737           /* There is no "pascal" calling convention in any 64bit ABI.  */
8738           gcc_assert (!TARGET_64BIT);
8739
8740           emit_insn (gen_popsi1 (ecx));
8741           emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
8742           emit_jump_insn (gen_return_indirect_internal (ecx));
8743         }
8744       else
8745         emit_jump_insn (gen_return_pop_internal (popc));
8746     }
8747   else
8748     emit_jump_insn (gen_return_internal ());
8749 }
8750
8751 /* Reset from the function's potential modifications.  */
8752
8753 static void
8754 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
8755                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8756 {
8757   if (pic_offset_table_rtx)
8758     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
8759 #if TARGET_MACHO
8760   /* Mach-O doesn't support labels at the end of objects, so if
8761      it looks like we might want one, insert a NOP.  */
8762   {
8763     rtx insn = get_last_insn ();
8764     while (insn
8765            && NOTE_P (insn)
8766            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
8767       insn = PREV_INSN (insn);
8768     if (insn
8769         && (LABEL_P (insn)
8770             || (NOTE_P (insn)
8771                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
8772       fputs ("\tnop\n", file);
8773   }
8774 #endif
8775
8776 }
8777 \f
8778 /* Extract the parts of an RTL expression that is a valid memory address
8779    for an instruction.  Return 0 if the structure of the address is
8780    grossly off.  Return -1 if the address contains ASHIFT, so it is not
8781    strictly valid, but still used for computing length of lea instruction.  */
8782
8783 int
8784 ix86_decompose_address (rtx addr, struct ix86_address *out)
8785 {
8786   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
8787   rtx base_reg, index_reg;
8788   HOST_WIDE_INT scale = 1;
8789   rtx scale_rtx = NULL_RTX;
8790   int retval = 1;
8791   enum ix86_address_seg seg = SEG_DEFAULT;
8792
8793   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
8794     base = addr;
8795   else if (GET_CODE (addr) == PLUS)
8796     {
8797       rtx addends[4], op;
8798       int n = 0, i;
8799
8800       op = addr;
8801       do
8802         {
8803           if (n >= 4)
8804             return 0;
8805           addends[n++] = XEXP (op, 1);
8806           op = XEXP (op, 0);
8807         }
8808       while (GET_CODE (op) == PLUS);
8809       if (n >= 4)
8810         return 0;
8811       addends[n] = op;
8812
8813       for (i = n; i >= 0; --i)
8814         {
8815           op = addends[i];
8816           switch (GET_CODE (op))
8817             {
8818             case MULT:
8819               if (index)
8820                 return 0;
8821               index = XEXP (op, 0);
8822               scale_rtx = XEXP (op, 1);
8823               break;
8824
8825             case UNSPEC:
8826               if (XINT (op, 1) == UNSPEC_TP
8827                   && TARGET_TLS_DIRECT_SEG_REFS
8828                   && seg == SEG_DEFAULT)
8829                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
8830               else
8831                 return 0;
8832               break;
8833
8834             case REG:
8835             case SUBREG:
8836               if (!base)
8837                 base = op;
8838               else if (!index)
8839                 index = op;
8840               else
8841                 return 0;
8842               break;
8843
8844             case CONST:
8845             case CONST_INT:
8846             case SYMBOL_REF:
8847             case LABEL_REF:
8848               if (disp)
8849                 return 0;
8850               disp = op;
8851               break;
8852
8853             default:
8854               return 0;
8855             }
8856         }
8857     }
8858   else if (GET_CODE (addr) == MULT)
8859     {
8860       index = XEXP (addr, 0);           /* index*scale */
8861       scale_rtx = XEXP (addr, 1);
8862     }
8863   else if (GET_CODE (addr) == ASHIFT)
8864     {
8865       rtx tmp;
8866
8867       /* We're called for lea too, which implements ashift on occasion.  */
8868       index = XEXP (addr, 0);
8869       tmp = XEXP (addr, 1);
8870       if (!CONST_INT_P (tmp))
8871         return 0;
8872       scale = INTVAL (tmp);
8873       if ((unsigned HOST_WIDE_INT) scale > 3)
8874         return 0;
8875       scale = 1 << scale;
8876       retval = -1;
8877     }
8878   else
8879     disp = addr;                        /* displacement */
8880
8881   /* Extract the integral value of scale.  */
8882   if (scale_rtx)
8883     {
8884       if (!CONST_INT_P (scale_rtx))
8885         return 0;
8886       scale = INTVAL (scale_rtx);
8887     }
8888
8889   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
8890   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
8891
8892   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
8893   if (base_reg && index_reg && scale == 1
8894       && (index_reg == arg_pointer_rtx
8895           || index_reg == frame_pointer_rtx
8896           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
8897     {
8898       rtx tmp;
8899       tmp = base, base = index, index = tmp;
8900       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
8901     }
8902
8903   /* Special case: %ebp cannot be encoded as a base without a displacement.  */
8904   if ((base_reg == hard_frame_pointer_rtx
8905        || base_reg == frame_pointer_rtx
8906        || base_reg == arg_pointer_rtx) && !disp)
8907     disp = const0_rtx;
8908
8909   /* Special case: on K6, [%esi] makes the instruction vector decoded.
8910      Avoid this by transforming to [%esi+0].
8911      Reload calls address legitimization without cfun defined, so we need
8912      to test cfun for being non-NULL. */
8913   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
8914       && base_reg && !index_reg && !disp
8915       && REG_P (base_reg) && REGNO (base_reg) == SI_REG)
8916     disp = const0_rtx;
8917
8918   /* Special case: encode reg+reg instead of reg*2.  */
8919   if (!base && index && scale && scale == 2)
8920     base = index, base_reg = index_reg, scale = 1;
8921
8922   /* Special case: scaling cannot be encoded without base or displacement.  */
8923   if (!base && !disp && index && scale != 1)
8924     disp = const0_rtx;
8925
8926   out->base = base;
8927   out->index = index;
8928   out->disp = disp;
8929   out->scale = scale;
8930   out->seg = seg;
8931
8932   return retval;
8933 }
8934 \f
8935 /* Return cost of the memory address x.
8936    For i386, it is better to use a complex address than let gcc copy
8937    the address into a reg and make a new pseudo.  But not if the address
8938    requires to two regs - that would mean more pseudos with longer
8939    lifetimes.  */
8940 static int
8941 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
8942 {
8943   struct ix86_address parts;
8944   int cost = 1;
8945   int ok = ix86_decompose_address (x, &parts);
8946
8947   gcc_assert (ok);
8948
8949   if (parts.base && GET_CODE (parts.base) == SUBREG)
8950     parts.base = SUBREG_REG (parts.base);
8951   if (parts.index && GET_CODE (parts.index) == SUBREG)
8952     parts.index = SUBREG_REG (parts.index);
8953
8954   /* Attempt to minimize number of registers in the address.  */
8955   if ((parts.base
8956        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
8957       || (parts.index
8958           && (!REG_P (parts.index)
8959               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
8960     cost++;
8961
8962   if (parts.base
8963       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
8964       && parts.index
8965       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
8966       && parts.base != parts.index)
8967     cost++;
8968
8969   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
8970      since it's predecode logic can't detect the length of instructions
8971      and it degenerates to vector decoded.  Increase cost of such
8972      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
8973      to split such addresses or even refuse such addresses at all.
8974
8975      Following addressing modes are affected:
8976       [base+scale*index]
8977       [scale*index+disp]
8978       [base+index]
8979
8980      The first and last case  may be avoidable by explicitly coding the zero in
8981      memory address, but I don't have AMD-K6 machine handy to check this
8982      theory.  */
8983
8984   if (TARGET_K6
8985       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
8986           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
8987           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
8988     cost += 10;
8989
8990   return cost;
8991 }
8992 \f
8993 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
8994    this is used for to form addresses to local data when -fPIC is in
8995    use.  */
8996
8997 static bool
8998 darwin_local_data_pic (rtx disp)
8999 {
9000   return (GET_CODE (disp) == UNSPEC
9001           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
9002 }
9003
9004 /* Determine if a given RTX is a valid constant.  We already know this
9005    satisfies CONSTANT_P.  */
9006
9007 bool
9008 legitimate_constant_p (rtx x)
9009 {
9010   switch (GET_CODE (x))
9011     {
9012     case CONST:
9013       x = XEXP (x, 0);
9014
9015       if (GET_CODE (x) == PLUS)
9016         {
9017           if (!CONST_INT_P (XEXP (x, 1)))
9018             return false;
9019           x = XEXP (x, 0);
9020         }
9021
9022       if (TARGET_MACHO && darwin_local_data_pic (x))
9023         return true;
9024
9025       /* Only some unspecs are valid as "constants".  */
9026       if (GET_CODE (x) == UNSPEC)
9027         switch (XINT (x, 1))
9028           {
9029           case UNSPEC_GOT:
9030           case UNSPEC_GOTOFF:
9031           case UNSPEC_PLTOFF:
9032             return TARGET_64BIT;
9033           case UNSPEC_TPOFF:
9034           case UNSPEC_NTPOFF:
9035             x = XVECEXP (x, 0, 0);
9036             return (GET_CODE (x) == SYMBOL_REF
9037                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9038           case UNSPEC_DTPOFF:
9039             x = XVECEXP (x, 0, 0);
9040             return (GET_CODE (x) == SYMBOL_REF
9041                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
9042           default:
9043             return false;
9044           }
9045
9046       /* We must have drilled down to a symbol.  */
9047       if (GET_CODE (x) == LABEL_REF)
9048         return true;
9049       if (GET_CODE (x) != SYMBOL_REF)
9050         return false;
9051       /* FALLTHRU */
9052
9053     case SYMBOL_REF:
9054       /* TLS symbols are never valid.  */
9055       if (SYMBOL_REF_TLS_MODEL (x))
9056         return false;
9057
9058       /* DLLIMPORT symbols are never valid.  */
9059       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
9060           && SYMBOL_REF_DLLIMPORT_P (x))
9061         return false;
9062       break;
9063
9064     case CONST_DOUBLE:
9065       if (GET_MODE (x) == TImode
9066           && x != CONST0_RTX (TImode)
9067           && !TARGET_64BIT)
9068         return false;
9069       break;
9070
9071     case CONST_VECTOR:
9072       if (x == CONST0_RTX (GET_MODE (x)))
9073         return true;
9074       return false;
9075
9076     default:
9077       break;
9078     }
9079
9080   /* Otherwise we handle everything else in the move patterns.  */
9081   return true;
9082 }
9083
9084 /* Determine if it's legal to put X into the constant pool.  This
9085    is not possible for the address of thread-local symbols, which
9086    is checked above.  */
9087
9088 static bool
9089 ix86_cannot_force_const_mem (rtx x)
9090 {
9091   /* We can always put integral constants and vectors in memory.  */
9092   switch (GET_CODE (x))
9093     {
9094     case CONST_INT:
9095     case CONST_DOUBLE:
9096     case CONST_VECTOR:
9097       return false;
9098
9099     default:
9100       break;
9101     }
9102   return !legitimate_constant_p (x);
9103 }
9104
9105 /* Determine if a given RTX is a valid constant address.  */
9106
9107 bool
9108 constant_address_p (rtx x)
9109 {
9110   return CONSTANT_P (x) && legitimate_address_p (Pmode, x, 1);
9111 }
9112
9113 /* Nonzero if the constant value X is a legitimate general operand
9114    when generating PIC code.  It is given that flag_pic is on and
9115    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
9116
9117 bool
9118 legitimate_pic_operand_p (rtx x)
9119 {
9120   rtx inner;
9121
9122   switch (GET_CODE (x))
9123     {
9124     case CONST:
9125       inner = XEXP (x, 0);
9126       if (GET_CODE (inner) == PLUS
9127           && CONST_INT_P (XEXP (inner, 1)))
9128         inner = XEXP (inner, 0);
9129
9130       /* Only some unspecs are valid as "constants".  */
9131       if (GET_CODE (inner) == UNSPEC)
9132         switch (XINT (inner, 1))
9133           {
9134           case UNSPEC_GOT:
9135           case UNSPEC_GOTOFF:
9136           case UNSPEC_PLTOFF:
9137             return TARGET_64BIT;
9138           case UNSPEC_TPOFF:
9139             x = XVECEXP (inner, 0, 0);
9140             return (GET_CODE (x) == SYMBOL_REF
9141                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9142           case UNSPEC_MACHOPIC_OFFSET:
9143             return legitimate_pic_address_disp_p (x);
9144           default:
9145             return false;
9146           }
9147       /* FALLTHRU */
9148
9149     case SYMBOL_REF:
9150     case LABEL_REF:
9151       return legitimate_pic_address_disp_p (x);
9152
9153     default:
9154       return true;
9155     }
9156 }
9157
9158 /* Determine if a given CONST RTX is a valid memory displacement
9159    in PIC mode.  */
9160
9161 int
9162 legitimate_pic_address_disp_p (rtx disp)
9163 {
9164   bool saw_plus;
9165
9166   /* In 64bit mode we can allow direct addresses of symbols and labels
9167      when they are not dynamic symbols.  */
9168   if (TARGET_64BIT)
9169     {
9170       rtx op0 = disp, op1;
9171
9172       switch (GET_CODE (disp))
9173         {
9174         case LABEL_REF:
9175           return true;
9176
9177         case CONST:
9178           if (GET_CODE (XEXP (disp, 0)) != PLUS)
9179             break;
9180           op0 = XEXP (XEXP (disp, 0), 0);
9181           op1 = XEXP (XEXP (disp, 0), 1);
9182           if (!CONST_INT_P (op1)
9183               || INTVAL (op1) >= 16*1024*1024
9184               || INTVAL (op1) < -16*1024*1024)
9185             break;
9186           if (GET_CODE (op0) == LABEL_REF)
9187             return true;
9188           if (GET_CODE (op0) != SYMBOL_REF)
9189             break;
9190           /* FALLTHRU */
9191
9192         case SYMBOL_REF:
9193           /* TLS references should always be enclosed in UNSPEC.  */
9194           if (SYMBOL_REF_TLS_MODEL (op0))
9195             return false;
9196           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
9197               && ix86_cmodel != CM_LARGE_PIC)
9198             return true;
9199           break;
9200
9201         default:
9202           break;
9203         }
9204     }
9205   if (GET_CODE (disp) != CONST)
9206     return 0;
9207   disp = XEXP (disp, 0);
9208
9209   if (TARGET_64BIT)
9210     {
9211       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
9212          of GOT tables.  We should not need these anyway.  */
9213       if (GET_CODE (disp) != UNSPEC
9214           || (XINT (disp, 1) != UNSPEC_GOTPCREL
9215               && XINT (disp, 1) != UNSPEC_GOTOFF
9216               && XINT (disp, 1) != UNSPEC_PLTOFF))
9217         return 0;
9218
9219       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
9220           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
9221         return 0;
9222       return 1;
9223     }
9224
9225   saw_plus = false;
9226   if (GET_CODE (disp) == PLUS)
9227     {
9228       if (!CONST_INT_P (XEXP (disp, 1)))
9229         return 0;
9230       disp = XEXP (disp, 0);
9231       saw_plus = true;
9232     }
9233
9234   if (TARGET_MACHO && darwin_local_data_pic (disp))
9235     return 1;
9236
9237   if (GET_CODE (disp) != UNSPEC)
9238     return 0;
9239
9240   switch (XINT (disp, 1))
9241     {
9242     case UNSPEC_GOT:
9243       if (saw_plus)
9244         return false;
9245       /* We need to check for both symbols and labels because VxWorks loads
9246          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
9247          details.  */
9248       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9249               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
9250     case UNSPEC_GOTOFF:
9251       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
9252          While ABI specify also 32bit relocation but we don't produce it in
9253          small PIC model at all.  */
9254       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9255            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
9256           && !TARGET_64BIT)
9257         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
9258       return false;
9259     case UNSPEC_GOTTPOFF:
9260     case UNSPEC_GOTNTPOFF:
9261     case UNSPEC_INDNTPOFF:
9262       if (saw_plus)
9263         return false;
9264       disp = XVECEXP (disp, 0, 0);
9265       return (GET_CODE (disp) == SYMBOL_REF
9266               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
9267     case UNSPEC_NTPOFF:
9268       disp = XVECEXP (disp, 0, 0);
9269       return (GET_CODE (disp) == SYMBOL_REF
9270               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
9271     case UNSPEC_DTPOFF:
9272       disp = XVECEXP (disp, 0, 0);
9273       return (GET_CODE (disp) == SYMBOL_REF
9274               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
9275     }
9276
9277   return 0;
9278 }
9279
9280 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression that is a valid
9281    memory address for an instruction.  The MODE argument is the machine mode
9282    for the MEM expression that wants to use this address.
9283
9284    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
9285    convert common non-canonical forms to canonical form so that they will
9286    be recognized.  */
9287
9288 int
9289 legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
9290                       rtx addr, int strict)
9291 {
9292   struct ix86_address parts;
9293   rtx base, index, disp;
9294   HOST_WIDE_INT scale;
9295   const char *reason = NULL;
9296   rtx reason_rtx = NULL_RTX;
9297
9298   if (ix86_decompose_address (addr, &parts) <= 0)
9299     {
9300       reason = "decomposition failed";
9301       goto report_error;
9302     }
9303
9304   base = parts.base;
9305   index = parts.index;
9306   disp = parts.disp;
9307   scale = parts.scale;
9308
9309   /* Validate base register.
9310
9311      Don't allow SUBREG's that span more than a word here.  It can lead to spill
9312      failures when the base is one word out of a two word structure, which is
9313      represented internally as a DImode int.  */
9314
9315   if (base)
9316     {
9317       rtx reg;
9318       reason_rtx = base;
9319
9320       if (REG_P (base))
9321         reg = base;
9322       else if (GET_CODE (base) == SUBREG
9323                && REG_P (SUBREG_REG (base))
9324                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
9325                   <= UNITS_PER_WORD)
9326         reg = SUBREG_REG (base);
9327       else
9328         {
9329           reason = "base is not a register";
9330           goto report_error;
9331         }
9332
9333       if (GET_MODE (base) != Pmode)
9334         {
9335           reason = "base is not in Pmode";
9336           goto report_error;
9337         }
9338
9339       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
9340           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
9341         {
9342           reason = "base is not valid";
9343           goto report_error;
9344         }
9345     }
9346
9347   /* Validate index register.
9348
9349      Don't allow SUBREG's that span more than a word here -- same as above.  */
9350
9351   if (index)
9352     {
9353       rtx reg;
9354       reason_rtx = index;
9355
9356       if (REG_P (index))
9357         reg = index;
9358       else if (GET_CODE (index) == SUBREG
9359                && REG_P (SUBREG_REG (index))
9360                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
9361                   <= UNITS_PER_WORD)
9362         reg = SUBREG_REG (index);
9363       else
9364         {
9365           reason = "index is not a register";
9366           goto report_error;
9367         }
9368
9369       if (GET_MODE (index) != Pmode)
9370         {
9371           reason = "index is not in Pmode";
9372           goto report_error;
9373         }
9374
9375       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
9376           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
9377         {
9378           reason = "index is not valid";
9379           goto report_error;
9380         }
9381     }
9382
9383   /* Validate scale factor.  */
9384   if (scale != 1)
9385     {
9386       reason_rtx = GEN_INT (scale);
9387       if (!index)
9388         {
9389           reason = "scale without index";
9390           goto report_error;
9391         }
9392
9393       if (scale != 2 && scale != 4 && scale != 8)
9394         {
9395           reason = "scale is not a valid multiplier";
9396           goto report_error;
9397         }
9398     }
9399
9400   /* Validate displacement.  */
9401   if (disp)
9402     {
9403       reason_rtx = disp;
9404
9405       if (GET_CODE (disp) == CONST
9406           && GET_CODE (XEXP (disp, 0)) == UNSPEC
9407           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
9408         switch (XINT (XEXP (disp, 0), 1))
9409           {
9410           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
9411              used.  While ABI specify also 32bit relocations, we don't produce
9412              them at all and use IP relative instead.  */
9413           case UNSPEC_GOT:
9414           case UNSPEC_GOTOFF:
9415             gcc_assert (flag_pic);
9416             if (!TARGET_64BIT)
9417               goto is_legitimate_pic;
9418             reason = "64bit address unspec";
9419             goto report_error;
9420
9421           case UNSPEC_GOTPCREL:
9422             gcc_assert (flag_pic);
9423             goto is_legitimate_pic;
9424
9425           case UNSPEC_GOTTPOFF:
9426           case UNSPEC_GOTNTPOFF:
9427           case UNSPEC_INDNTPOFF:
9428           case UNSPEC_NTPOFF:
9429           case UNSPEC_DTPOFF:
9430             break;
9431
9432           default:
9433             reason = "invalid address unspec";
9434             goto report_error;
9435           }
9436
9437       else if (SYMBOLIC_CONST (disp)
9438                && (flag_pic
9439                    || (TARGET_MACHO
9440 #if TARGET_MACHO
9441                        && MACHOPIC_INDIRECT
9442                        && !machopic_operand_p (disp)
9443 #endif
9444                )))
9445         {
9446
9447         is_legitimate_pic:
9448           if (TARGET_64BIT && (index || base))
9449             {
9450               /* foo@dtpoff(%rX) is ok.  */
9451               if (GET_CODE (disp) != CONST
9452                   || GET_CODE (XEXP (disp, 0)) != PLUS
9453                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
9454                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
9455                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
9456                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
9457                 {
9458                   reason = "non-constant pic memory reference";
9459                   goto report_error;
9460                 }
9461             }
9462           else if (! legitimate_pic_address_disp_p (disp))
9463             {
9464               reason = "displacement is an invalid pic construct";
9465               goto report_error;
9466             }
9467
9468           /* This code used to verify that a symbolic pic displacement
9469              includes the pic_offset_table_rtx register.
9470
9471              While this is good idea, unfortunately these constructs may
9472              be created by "adds using lea" optimization for incorrect
9473              code like:
9474
9475              int a;
9476              int foo(int i)
9477                {
9478                  return *(&a+i);
9479                }
9480
9481              This code is nonsensical, but results in addressing
9482              GOT table with pic_offset_table_rtx base.  We can't
9483              just refuse it easily, since it gets matched by
9484              "addsi3" pattern, that later gets split to lea in the
9485              case output register differs from input.  While this
9486              can be handled by separate addsi pattern for this case
9487              that never results in lea, this seems to be easier and
9488              correct fix for crash to disable this test.  */
9489         }
9490       else if (GET_CODE (disp) != LABEL_REF
9491                && !CONST_INT_P (disp)
9492                && (GET_CODE (disp) != CONST
9493                    || !legitimate_constant_p (disp))
9494                && (GET_CODE (disp) != SYMBOL_REF
9495                    || !legitimate_constant_p (disp)))
9496         {
9497           reason = "displacement is not constant";
9498           goto report_error;
9499         }
9500       else if (TARGET_64BIT
9501                && !x86_64_immediate_operand (disp, VOIDmode))
9502         {
9503           reason = "displacement is out of range";
9504           goto report_error;
9505         }
9506     }
9507
9508   /* Everything looks valid.  */
9509   return TRUE;
9510
9511  report_error:
9512   return FALSE;
9513 }
9514 \f
9515 /* Return a unique alias set for the GOT.  */
9516
9517 static alias_set_type
9518 ix86_GOT_alias_set (void)
9519 {
9520   static alias_set_type set = -1;
9521   if (set == -1)
9522     set = new_alias_set ();
9523   return set;
9524 }
9525
9526 /* Return a legitimate reference for ORIG (an address) using the
9527    register REG.  If REG is 0, a new pseudo is generated.
9528
9529    There are two types of references that must be handled:
9530
9531    1. Global data references must load the address from the GOT, via
9532       the PIC reg.  An insn is emitted to do this load, and the reg is
9533       returned.
9534
9535    2. Static data references, constant pool addresses, and code labels
9536       compute the address as an offset from the GOT, whose base is in
9537       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
9538       differentiate them from global data objects.  The returned
9539       address is the PIC reg + an unspec constant.
9540
9541    GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
9542    reg also appears in the address.  */
9543
9544 static rtx
9545 legitimize_pic_address (rtx orig, rtx reg)
9546 {
9547   rtx addr = orig;
9548   rtx new_rtx = orig;
9549   rtx base;
9550
9551 #if TARGET_MACHO
9552   if (TARGET_MACHO && !TARGET_64BIT)
9553     {
9554       if (reg == 0)
9555         reg = gen_reg_rtx (Pmode);
9556       /* Use the generic Mach-O PIC machinery.  */
9557       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
9558     }
9559 #endif
9560
9561   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
9562     new_rtx = addr;
9563   else if (TARGET_64BIT
9564            && ix86_cmodel != CM_SMALL_PIC
9565            && gotoff_operand (addr, Pmode))
9566     {
9567       rtx tmpreg;
9568       /* This symbol may be referenced via a displacement from the PIC
9569          base address (@GOTOFF).  */
9570
9571       if (reload_in_progress)
9572         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9573       if (GET_CODE (addr) == CONST)
9574         addr = XEXP (addr, 0);
9575       if (GET_CODE (addr) == PLUS)
9576           {
9577             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9578                                       UNSPEC_GOTOFF);
9579             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9580           }
9581         else
9582           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9583       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9584       if (!reg)
9585         tmpreg = gen_reg_rtx (Pmode);
9586       else
9587         tmpreg = reg;
9588       emit_move_insn (tmpreg, new_rtx);
9589
9590       if (reg != 0)
9591         {
9592           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
9593                                          tmpreg, 1, OPTAB_DIRECT);
9594           new_rtx = reg;
9595         }
9596       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
9597     }
9598   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
9599     {
9600       /* This symbol may be referenced via a displacement from the PIC
9601          base address (@GOTOFF).  */
9602
9603       if (reload_in_progress)
9604         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9605       if (GET_CODE (addr) == CONST)
9606         addr = XEXP (addr, 0);
9607       if (GET_CODE (addr) == PLUS)
9608           {
9609             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9610                                       UNSPEC_GOTOFF);
9611             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9612           }
9613         else
9614           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9615       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9616       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9617
9618       if (reg != 0)
9619         {
9620           emit_move_insn (reg, new_rtx);
9621           new_rtx = reg;
9622         }
9623     }
9624   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
9625            /* We can't use @GOTOFF for text labels on VxWorks;
9626               see gotoff_operand.  */
9627            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
9628     {
9629       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
9630         {
9631           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
9632             return legitimize_dllimport_symbol (addr, true);
9633           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
9634               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
9635               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
9636             {
9637               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
9638               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
9639             }
9640         }
9641
9642       if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
9643         {
9644           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
9645           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9646           new_rtx = gen_const_mem (Pmode, new_rtx);
9647           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9648
9649           if (reg == 0)
9650             reg = gen_reg_rtx (Pmode);
9651           /* Use directly gen_movsi, otherwise the address is loaded
9652              into register for CSE.  We don't want to CSE this addresses,
9653              instead we CSE addresses from the GOT table, so skip this.  */
9654           emit_insn (gen_movsi (reg, new_rtx));
9655           new_rtx = reg;
9656         }
9657       else
9658         {
9659           /* This symbol must be referenced via a load from the
9660              Global Offset Table (@GOT).  */
9661
9662           if (reload_in_progress)
9663             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9664           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
9665           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9666           if (TARGET_64BIT)
9667             new_rtx = force_reg (Pmode, new_rtx);
9668           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9669           new_rtx = gen_const_mem (Pmode, new_rtx);
9670           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9671
9672           if (reg == 0)
9673             reg = gen_reg_rtx (Pmode);
9674           emit_move_insn (reg, new_rtx);
9675           new_rtx = reg;
9676         }
9677     }
9678   else
9679     {
9680       if (CONST_INT_P (addr)
9681           && !x86_64_immediate_operand (addr, VOIDmode))
9682         {
9683           if (reg)
9684             {
9685               emit_move_insn (reg, addr);
9686               new_rtx = reg;
9687             }
9688           else
9689             new_rtx = force_reg (Pmode, addr);
9690         }
9691       else if (GET_CODE (addr) == CONST)
9692         {
9693           addr = XEXP (addr, 0);
9694
9695           /* We must match stuff we generate before.  Assume the only
9696              unspecs that can get here are ours.  Not that we could do
9697              anything with them anyway....  */
9698           if (GET_CODE (addr) == UNSPEC
9699               || (GET_CODE (addr) == PLUS
9700                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
9701             return orig;
9702           gcc_assert (GET_CODE (addr) == PLUS);
9703         }
9704       if (GET_CODE (addr) == PLUS)
9705         {
9706           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
9707
9708           /* Check first to see if this is a constant offset from a @GOTOFF
9709              symbol reference.  */
9710           if (gotoff_operand (op0, Pmode)
9711               && CONST_INT_P (op1))
9712             {
9713               if (!TARGET_64BIT)
9714                 {
9715                   if (reload_in_progress)
9716                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9717                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
9718                                             UNSPEC_GOTOFF);
9719                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
9720                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9721                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9722
9723                   if (reg != 0)
9724                     {
9725                       emit_move_insn (reg, new_rtx);
9726                       new_rtx = reg;
9727                     }
9728                 }
9729               else
9730                 {
9731                   if (INTVAL (op1) < -16*1024*1024
9732                       || INTVAL (op1) >= 16*1024*1024)
9733                     {
9734                       if (!x86_64_immediate_operand (op1, Pmode))
9735                         op1 = force_reg (Pmode, op1);
9736                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
9737                     }
9738                 }
9739             }
9740           else
9741             {
9742               base = legitimize_pic_address (XEXP (addr, 0), reg);
9743               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
9744                                                  base == reg ? NULL_RTX : reg);
9745
9746               if (CONST_INT_P (new_rtx))
9747                 new_rtx = plus_constant (base, INTVAL (new_rtx));
9748               else
9749                 {
9750                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
9751                     {
9752                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
9753                       new_rtx = XEXP (new_rtx, 1);
9754                     }
9755                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
9756                 }
9757             }
9758         }
9759     }
9760   return new_rtx;
9761 }
9762 \f
9763 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
9764
9765 static rtx
9766 get_thread_pointer (int to_reg)
9767 {
9768   rtx tp, reg, insn;
9769
9770   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
9771   if (!to_reg)
9772     return tp;
9773
9774   reg = gen_reg_rtx (Pmode);
9775   insn = gen_rtx_SET (VOIDmode, reg, tp);
9776   insn = emit_insn (insn);
9777
9778   return reg;
9779 }
9780
9781 /* A subroutine of legitimize_address and ix86_expand_move.  FOR_MOV is
9782    false if we expect this to be used for a memory address and true if
9783    we expect to load the address into a register.  */
9784
9785 static rtx
9786 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
9787 {
9788   rtx dest, base, off, pic, tp;
9789   int type;
9790
9791   switch (model)
9792     {
9793     case TLS_MODEL_GLOBAL_DYNAMIC:
9794       dest = gen_reg_rtx (Pmode);
9795       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9796
9797       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9798         {
9799           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
9800
9801           start_sequence ();
9802           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
9803           insns = get_insns ();
9804           end_sequence ();
9805
9806           RTL_CONST_CALL_P (insns) = 1;
9807           emit_libcall_block (insns, dest, rax, x);
9808         }
9809       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9810         emit_insn (gen_tls_global_dynamic_64 (dest, x));
9811       else
9812         emit_insn (gen_tls_global_dynamic_32 (dest, x));
9813
9814       if (TARGET_GNU2_TLS)
9815         {
9816           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
9817
9818           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9819         }
9820       break;
9821
9822     case TLS_MODEL_LOCAL_DYNAMIC:
9823       base = gen_reg_rtx (Pmode);
9824       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9825
9826       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9827         {
9828           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
9829
9830           start_sequence ();
9831           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
9832           insns = get_insns ();
9833           end_sequence ();
9834
9835           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
9836           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
9837           RTL_CONST_CALL_P (insns) = 1;
9838           emit_libcall_block (insns, base, rax, note);
9839         }
9840       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9841         emit_insn (gen_tls_local_dynamic_base_64 (base));
9842       else
9843         emit_insn (gen_tls_local_dynamic_base_32 (base));
9844
9845       if (TARGET_GNU2_TLS)
9846         {
9847           rtx x = ix86_tls_module_base ();
9848
9849           set_unique_reg_note (get_last_insn (), REG_EQUIV,
9850                                gen_rtx_MINUS (Pmode, x, tp));
9851         }
9852
9853       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
9854       off = gen_rtx_CONST (Pmode, off);
9855
9856       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
9857
9858       if (TARGET_GNU2_TLS)
9859         {
9860           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
9861
9862           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9863         }
9864
9865       break;
9866
9867     case TLS_MODEL_INITIAL_EXEC:
9868       if (TARGET_64BIT)
9869         {
9870           if (TARGET_SUN_TLS)
9871             {
9872               /* The Sun linker took the AMD64 TLS spec literally
9873                  and can only handle %rax as destination of the
9874                  initial executable code sequence.  */
9875
9876               dest = gen_reg_rtx (Pmode);
9877               emit_insn (gen_tls_initial_exec_64_sun (dest, x));
9878               return dest;
9879             }
9880
9881           pic = NULL;
9882           type = UNSPEC_GOTNTPOFF;
9883         }
9884       else if (flag_pic)
9885         {
9886           if (reload_in_progress)
9887             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9888           pic = pic_offset_table_rtx;
9889           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
9890         }
9891       else if (!TARGET_ANY_GNU_TLS)
9892         {
9893           pic = gen_reg_rtx (Pmode);
9894           emit_insn (gen_set_got (pic));
9895           type = UNSPEC_GOTTPOFF;
9896         }
9897       else
9898         {
9899           pic = NULL;
9900           type = UNSPEC_INDNTPOFF;
9901         }
9902
9903       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
9904       off = gen_rtx_CONST (Pmode, off);
9905       if (pic)
9906         off = gen_rtx_PLUS (Pmode, pic, off);
9907       off = gen_const_mem (Pmode, off);
9908       set_mem_alias_set (off, ix86_GOT_alias_set ());
9909
9910       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9911         {
9912           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9913           off = force_reg (Pmode, off);
9914           return gen_rtx_PLUS (Pmode, base, off);
9915         }
9916       else
9917         {
9918           base = get_thread_pointer (true);
9919           dest = gen_reg_rtx (Pmode);
9920           emit_insn (gen_subsi3 (dest, base, off));
9921         }
9922       break;
9923
9924     case TLS_MODEL_LOCAL_EXEC:
9925       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
9926                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9927                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
9928       off = gen_rtx_CONST (Pmode, off);
9929
9930       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9931         {
9932           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9933           return gen_rtx_PLUS (Pmode, base, off);
9934         }
9935       else
9936         {
9937           base = get_thread_pointer (true);
9938           dest = gen_reg_rtx (Pmode);
9939           emit_insn (gen_subsi3 (dest, base, off));
9940         }
9941       break;
9942
9943     default:
9944       gcc_unreachable ();
9945     }
9946
9947   return dest;
9948 }
9949
9950 /* Create or return the unique __imp_DECL dllimport symbol corresponding
9951    to symbol DECL.  */
9952
9953 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
9954   htab_t dllimport_map;
9955
9956 static tree
9957 get_dllimport_decl (tree decl)
9958 {
9959   struct tree_map *h, in;
9960   void **loc;
9961   const char *name;
9962   const char *prefix;
9963   size_t namelen, prefixlen;
9964   char *imp_name;
9965   tree to;
9966   rtx rtl;
9967
9968   if (!dllimport_map)
9969     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
9970
9971   in.hash = htab_hash_pointer (decl);
9972   in.base.from = decl;
9973   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
9974   h = (struct tree_map *) *loc;
9975   if (h)
9976     return h->to;
9977
9978   *loc = h = GGC_NEW (struct tree_map);
9979   h->hash = in.hash;
9980   h->base.from = decl;
9981   h->to = to = build_decl (VAR_DECL, NULL, ptr_type_node);
9982   DECL_ARTIFICIAL (to) = 1;
9983   DECL_IGNORED_P (to) = 1;
9984   DECL_EXTERNAL (to) = 1;
9985   TREE_READONLY (to) = 1;
9986
9987   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
9988   name = targetm.strip_name_encoding (name);
9989   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
9990     ? "*__imp_" : "*__imp__";
9991   namelen = strlen (name);
9992   prefixlen = strlen (prefix);
9993   imp_name = (char *) alloca (namelen + prefixlen + 1);
9994   memcpy (imp_name, prefix, prefixlen);
9995   memcpy (imp_name + prefixlen, name, namelen + 1);
9996
9997   name = ggc_alloc_string (imp_name, namelen + prefixlen);
9998   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
9999   SET_SYMBOL_REF_DECL (rtl, to);
10000   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
10001
10002   rtl = gen_const_mem (Pmode, rtl);
10003   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
10004
10005   SET_DECL_RTL (to, rtl);
10006   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
10007
10008   return to;
10009 }
10010
10011 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
10012    true if we require the result be a register.  */
10013
10014 static rtx
10015 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
10016 {
10017   tree imp_decl;
10018   rtx x;
10019
10020   gcc_assert (SYMBOL_REF_DECL (symbol));
10021   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
10022
10023   x = DECL_RTL (imp_decl);
10024   if (want_reg)
10025     x = force_reg (Pmode, x);
10026   return x;
10027 }
10028
10029 /* Try machine-dependent ways of modifying an illegitimate address
10030    to be legitimate.  If we find one, return the new, valid address.
10031    This macro is used in only one place: `memory_address' in explow.c.
10032
10033    OLDX is the address as it was before break_out_memory_refs was called.
10034    In some cases it is useful to look at this to decide what needs to be done.
10035
10036    MODE and WIN are passed so that this macro can use
10037    GO_IF_LEGITIMATE_ADDRESS.
10038
10039    It is always safe for this macro to do nothing.  It exists to recognize
10040    opportunities to optimize the output.
10041
10042    For the 80386, we handle X+REG by loading X into a register R and
10043    using R+REG.  R will go in a general reg and indexing will be used.
10044    However, if REG is a broken-out memory address or multiplication,
10045    nothing needs to be done because REG can certainly go in a general reg.
10046
10047    When -fpic is used, special handling is needed for symbolic references.
10048    See comments by legitimize_pic_address in i386.c for details.  */
10049
10050 rtx
10051 legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
10052 {
10053   int changed = 0;
10054   unsigned log;
10055
10056   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
10057   if (log)
10058     return legitimize_tls_address (x, (enum tls_model) log, false);
10059   if (GET_CODE (x) == CONST
10060       && GET_CODE (XEXP (x, 0)) == PLUS
10061       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10062       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
10063     {
10064       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
10065                                       (enum tls_model) log, false);
10066       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10067     }
10068
10069   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
10070     {
10071       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
10072         return legitimize_dllimport_symbol (x, true);
10073       if (GET_CODE (x) == CONST
10074           && GET_CODE (XEXP (x, 0)) == PLUS
10075           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10076           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
10077         {
10078           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
10079           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10080         }
10081     }
10082
10083   if (flag_pic && SYMBOLIC_CONST (x))
10084     return legitimize_pic_address (x, 0);
10085
10086   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
10087   if (GET_CODE (x) == ASHIFT
10088       && CONST_INT_P (XEXP (x, 1))
10089       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
10090     {
10091       changed = 1;
10092       log = INTVAL (XEXP (x, 1));
10093       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
10094                         GEN_INT (1 << log));
10095     }
10096
10097   if (GET_CODE (x) == PLUS)
10098     {
10099       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
10100
10101       if (GET_CODE (XEXP (x, 0)) == ASHIFT
10102           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
10103           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
10104         {
10105           changed = 1;
10106           log = INTVAL (XEXP (XEXP (x, 0), 1));
10107           XEXP (x, 0) = gen_rtx_MULT (Pmode,
10108                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
10109                                       GEN_INT (1 << log));
10110         }
10111
10112       if (GET_CODE (XEXP (x, 1)) == ASHIFT
10113           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
10114           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
10115         {
10116           changed = 1;
10117           log = INTVAL (XEXP (XEXP (x, 1), 1));
10118           XEXP (x, 1) = gen_rtx_MULT (Pmode,
10119                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
10120                                       GEN_INT (1 << log));
10121         }
10122
10123       /* Put multiply first if it isn't already.  */
10124       if (GET_CODE (XEXP (x, 1)) == MULT)
10125         {
10126           rtx tmp = XEXP (x, 0);
10127           XEXP (x, 0) = XEXP (x, 1);
10128           XEXP (x, 1) = tmp;
10129           changed = 1;
10130         }
10131
10132       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
10133          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
10134          created by virtual register instantiation, register elimination, and
10135          similar optimizations.  */
10136       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
10137         {
10138           changed = 1;
10139           x = gen_rtx_PLUS (Pmode,
10140                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
10141                                           XEXP (XEXP (x, 1), 0)),
10142                             XEXP (XEXP (x, 1), 1));
10143         }
10144
10145       /* Canonicalize
10146          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
10147          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
10148       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
10149                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
10150                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
10151                && CONSTANT_P (XEXP (x, 1)))
10152         {
10153           rtx constant;
10154           rtx other = NULL_RTX;
10155
10156           if (CONST_INT_P (XEXP (x, 1)))
10157             {
10158               constant = XEXP (x, 1);
10159               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
10160             }
10161           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
10162             {
10163               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
10164               other = XEXP (x, 1);
10165             }
10166           else
10167             constant = 0;
10168
10169           if (constant)
10170             {
10171               changed = 1;
10172               x = gen_rtx_PLUS (Pmode,
10173                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
10174                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
10175                                 plus_constant (other, INTVAL (constant)));
10176             }
10177         }
10178
10179       if (changed && legitimate_address_p (mode, x, FALSE))
10180         return x;
10181
10182       if (GET_CODE (XEXP (x, 0)) == MULT)
10183         {
10184           changed = 1;
10185           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
10186         }
10187
10188       if (GET_CODE (XEXP (x, 1)) == MULT)
10189         {
10190           changed = 1;
10191           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
10192         }
10193
10194       if (changed
10195           && REG_P (XEXP (x, 1))
10196           && REG_P (XEXP (x, 0)))
10197         return x;
10198
10199       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
10200         {
10201           changed = 1;
10202           x = legitimize_pic_address (x, 0);
10203         }
10204
10205       if (changed && legitimate_address_p (mode, x, FALSE))
10206         return x;
10207
10208       if (REG_P (XEXP (x, 0)))
10209         {
10210           rtx temp = gen_reg_rtx (Pmode);
10211           rtx val  = force_operand (XEXP (x, 1), temp);
10212           if (val != temp)
10213             emit_move_insn (temp, val);
10214
10215           XEXP (x, 1) = temp;
10216           return x;
10217         }
10218
10219       else if (REG_P (XEXP (x, 1)))
10220         {
10221           rtx temp = gen_reg_rtx (Pmode);
10222           rtx val  = force_operand (XEXP (x, 0), temp);
10223           if (val != temp)
10224             emit_move_insn (temp, val);
10225
10226           XEXP (x, 0) = temp;
10227           return x;
10228         }
10229     }
10230
10231   return x;
10232 }
10233 \f
10234 /* Print an integer constant expression in assembler syntax.  Addition
10235    and subtraction are the only arithmetic that may appear in these
10236    expressions.  FILE is the stdio stream to write to, X is the rtx, and
10237    CODE is the operand print code from the output string.  */
10238
10239 static void
10240 output_pic_addr_const (FILE *file, rtx x, int code)
10241 {
10242   char buf[256];
10243
10244   switch (GET_CODE (x))
10245     {
10246     case PC:
10247       gcc_assert (flag_pic);
10248       putc ('.', file);
10249       break;
10250
10251     case SYMBOL_REF:
10252       if (! TARGET_MACHO || TARGET_64BIT)
10253         output_addr_const (file, x);
10254       else
10255         {
10256           const char *name = XSTR (x, 0);
10257
10258           /* Mark the decl as referenced so that cgraph will
10259              output the function.  */
10260           if (SYMBOL_REF_DECL (x))
10261             mark_decl_referenced (SYMBOL_REF_DECL (x));
10262
10263 #if TARGET_MACHO
10264           if (MACHOPIC_INDIRECT
10265               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10266             name = machopic_indirection_name (x, /*stub_p=*/true);
10267 #endif
10268           assemble_name (file, name);
10269         }
10270       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
10271           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
10272         fputs ("@PLT", file);
10273       break;
10274
10275     case LABEL_REF:
10276       x = XEXP (x, 0);
10277       /* FALLTHRU */
10278     case CODE_LABEL:
10279       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
10280       assemble_name (asm_out_file, buf);
10281       break;
10282
10283     case CONST_INT:
10284       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
10285       break;
10286
10287     case CONST:
10288       /* This used to output parentheses around the expression,
10289          but that does not work on the 386 (either ATT or BSD assembler).  */
10290       output_pic_addr_const (file, XEXP (x, 0), code);
10291       break;
10292
10293     case CONST_DOUBLE:
10294       if (GET_MODE (x) == VOIDmode)
10295         {
10296           /* We can use %d if the number is <32 bits and positive.  */
10297           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
10298             fprintf (file, "0x%lx%08lx",
10299                      (unsigned long) CONST_DOUBLE_HIGH (x),
10300                      (unsigned long) CONST_DOUBLE_LOW (x));
10301           else
10302             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
10303         }
10304       else
10305         /* We can't handle floating point constants;
10306            PRINT_OPERAND must handle them.  */
10307         output_operand_lossage ("floating constant misused");
10308       break;
10309
10310     case PLUS:
10311       /* Some assemblers need integer constants to appear first.  */
10312       if (CONST_INT_P (XEXP (x, 0)))
10313         {
10314           output_pic_addr_const (file, XEXP (x, 0), code);
10315           putc ('+', file);
10316           output_pic_addr_const (file, XEXP (x, 1), code);
10317         }
10318       else
10319         {
10320           gcc_assert (CONST_INT_P (XEXP (x, 1)));
10321           output_pic_addr_const (file, XEXP (x, 1), code);
10322           putc ('+', file);
10323           output_pic_addr_const (file, XEXP (x, 0), code);
10324         }
10325       break;
10326
10327     case MINUS:
10328       if (!TARGET_MACHO)
10329         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
10330       output_pic_addr_const (file, XEXP (x, 0), code);
10331       putc ('-', file);
10332       output_pic_addr_const (file, XEXP (x, 1), code);
10333       if (!TARGET_MACHO)
10334         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
10335       break;
10336
10337      case UNSPEC:
10338        gcc_assert (XVECLEN (x, 0) == 1);
10339        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
10340        switch (XINT (x, 1))
10341         {
10342         case UNSPEC_GOT:
10343           fputs ("@GOT", file);
10344           break;
10345         case UNSPEC_GOTOFF:
10346           fputs ("@GOTOFF", file);
10347           break;
10348         case UNSPEC_PLTOFF:
10349           fputs ("@PLTOFF", file);
10350           break;
10351         case UNSPEC_GOTPCREL:
10352           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10353                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
10354           break;
10355         case UNSPEC_GOTTPOFF:
10356           /* FIXME: This might be @TPOFF in Sun ld too.  */
10357           fputs ("@GOTTPOFF", file);
10358           break;
10359         case UNSPEC_TPOFF:
10360           fputs ("@TPOFF", file);
10361           break;
10362         case UNSPEC_NTPOFF:
10363           if (TARGET_64BIT)
10364             fputs ("@TPOFF", file);
10365           else
10366             fputs ("@NTPOFF", file);
10367           break;
10368         case UNSPEC_DTPOFF:
10369           fputs ("@DTPOFF", file);
10370           break;
10371         case UNSPEC_GOTNTPOFF:
10372           if (TARGET_64BIT)
10373             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10374                    "@GOTTPOFF(%rip)": "@GOTTPOFF[rip]", file);
10375           else
10376             fputs ("@GOTNTPOFF", file);
10377           break;
10378         case UNSPEC_INDNTPOFF:
10379           fputs ("@INDNTPOFF", file);
10380           break;
10381 #if TARGET_MACHO
10382         case UNSPEC_MACHOPIC_OFFSET:
10383           putc ('-', file);
10384           machopic_output_function_base_name (file);
10385           break;
10386 #endif
10387         default:
10388           output_operand_lossage ("invalid UNSPEC as operand");
10389           break;
10390         }
10391        break;
10392
10393     default:
10394       output_operand_lossage ("invalid expression as operand");
10395     }
10396 }
10397
10398 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
10399    We need to emit DTP-relative relocations.  */
10400
10401 static void ATTRIBUTE_UNUSED
10402 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
10403 {
10404   fputs (ASM_LONG, file);
10405   output_addr_const (file, x);
10406   fputs ("@DTPOFF", file);
10407   switch (size)
10408     {
10409     case 4:
10410       break;
10411     case 8:
10412       fputs (", 0", file);
10413       break;
10414     default:
10415       gcc_unreachable ();
10416    }
10417 }
10418
10419 /* Return true if X is a representation of the PIC register.  This copes
10420    with calls from ix86_find_base_term, where the register might have
10421    been replaced by a cselib value.  */
10422
10423 static bool
10424 ix86_pic_register_p (rtx x)
10425 {
10426   if (GET_CODE (x) == VALUE && CSELIB_VAL_PTR (x))
10427     return (pic_offset_table_rtx
10428             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
10429   else
10430     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
10431 }
10432
10433 /* In the name of slightly smaller debug output, and to cater to
10434    general assembler lossage, recognize PIC+GOTOFF and turn it back
10435    into a direct symbol reference.
10436
10437    On Darwin, this is necessary to avoid a crash, because Darwin
10438    has a different PIC label for each routine but the DWARF debugging
10439    information is not associated with any particular routine, so it's
10440    necessary to remove references to the PIC label from RTL stored by
10441    the DWARF output code.  */
10442
10443 static rtx
10444 ix86_delegitimize_address (rtx orig_x)
10445 {
10446   rtx x = orig_x;
10447   /* reg_addend is NULL or a multiple of some register.  */
10448   rtx reg_addend = NULL_RTX;
10449   /* const_addend is NULL or a const_int.  */
10450   rtx const_addend = NULL_RTX;
10451   /* This is the result, or NULL.  */
10452   rtx result = NULL_RTX;
10453
10454   if (MEM_P (x))
10455     x = XEXP (x, 0);
10456
10457   if (TARGET_64BIT)
10458     {
10459       if (GET_CODE (x) != CONST
10460           || GET_CODE (XEXP (x, 0)) != UNSPEC
10461           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
10462           || !MEM_P (orig_x))
10463         return orig_x;
10464       return XVECEXP (XEXP (x, 0), 0, 0);
10465     }
10466
10467   if (GET_CODE (x) != PLUS
10468       || GET_CODE (XEXP (x, 1)) != CONST)
10469     return orig_x;
10470
10471   if (ix86_pic_register_p (XEXP (x, 0)))
10472     /* %ebx + GOT/GOTOFF */
10473     ;
10474   else if (GET_CODE (XEXP (x, 0)) == PLUS)
10475     {
10476       /* %ebx + %reg * scale + GOT/GOTOFF */
10477       reg_addend = XEXP (x, 0);
10478       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
10479         reg_addend = XEXP (reg_addend, 1);
10480       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
10481         reg_addend = XEXP (reg_addend, 0);
10482       else
10483         return orig_x;
10484       if (!REG_P (reg_addend)
10485           && GET_CODE (reg_addend) != MULT
10486           && GET_CODE (reg_addend) != ASHIFT)
10487         return orig_x;
10488     }
10489   else
10490     return orig_x;
10491
10492   x = XEXP (XEXP (x, 1), 0);
10493   if (GET_CODE (x) == PLUS
10494       && CONST_INT_P (XEXP (x, 1)))
10495     {
10496       const_addend = XEXP (x, 1);
10497       x = XEXP (x, 0);
10498     }
10499
10500   if (GET_CODE (x) == UNSPEC
10501       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x))
10502           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
10503     result = XVECEXP (x, 0, 0);
10504
10505   if (TARGET_MACHO && darwin_local_data_pic (x)
10506       && !MEM_P (orig_x))
10507     result = XVECEXP (x, 0, 0);
10508
10509   if (! result)
10510     return orig_x;
10511
10512   if (const_addend)
10513     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
10514   if (reg_addend)
10515     result = gen_rtx_PLUS (Pmode, reg_addend, result);
10516   return result;
10517 }
10518
10519 /* If X is a machine specific address (i.e. a symbol or label being
10520    referenced as a displacement from the GOT implemented using an
10521    UNSPEC), then return the base term.  Otherwise return X.  */
10522
10523 rtx
10524 ix86_find_base_term (rtx x)
10525 {
10526   rtx term;
10527
10528   if (TARGET_64BIT)
10529     {
10530       if (GET_CODE (x) != CONST)
10531         return x;
10532       term = XEXP (x, 0);
10533       if (GET_CODE (term) == PLUS
10534           && (CONST_INT_P (XEXP (term, 1))
10535               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
10536         term = XEXP (term, 0);
10537       if (GET_CODE (term) != UNSPEC
10538           || XINT (term, 1) != UNSPEC_GOTPCREL)
10539         return x;
10540
10541       return XVECEXP (term, 0, 0);
10542     }
10543
10544   return ix86_delegitimize_address (x);
10545 }
10546 \f
10547 static void
10548 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
10549                     int fp, FILE *file)
10550 {
10551   const char *suffix;
10552
10553   if (mode == CCFPmode || mode == CCFPUmode)
10554     {
10555       enum rtx_code second_code, bypass_code;
10556       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
10557       gcc_assert (bypass_code == UNKNOWN && second_code == UNKNOWN);
10558       code = ix86_fp_compare_code_to_integer (code);
10559       mode = CCmode;
10560     }
10561   if (reverse)
10562     code = reverse_condition (code);
10563
10564   switch (code)
10565     {
10566     case EQ:
10567       switch (mode)
10568         {
10569         case CCAmode:
10570           suffix = "a";
10571           break;
10572
10573         case CCCmode:
10574           suffix = "c";
10575           break;
10576
10577         case CCOmode:
10578           suffix = "o";
10579           break;
10580
10581         case CCSmode:
10582           suffix = "s";
10583           break;
10584
10585         default:
10586           suffix = "e";
10587         }
10588       break;
10589     case NE:
10590       switch (mode)
10591         {
10592         case CCAmode:
10593           suffix = "na";
10594           break;
10595
10596         case CCCmode:
10597           suffix = "nc";
10598           break;
10599
10600         case CCOmode:
10601           suffix = "no";
10602           break;
10603
10604         case CCSmode:
10605           suffix = "ns";
10606           break;
10607
10608         default:
10609           suffix = "ne";
10610         }
10611       break;
10612     case GT:
10613       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
10614       suffix = "g";
10615       break;
10616     case GTU:
10617       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
10618          Those same assemblers have the same but opposite lossage on cmov.  */
10619       if (mode == CCmode)
10620         suffix = fp ? "nbe" : "a";
10621       else if (mode == CCCmode)
10622         suffix = "b";
10623       else
10624         gcc_unreachable ();
10625       break;
10626     case LT:
10627       switch (mode)
10628         {
10629         case CCNOmode:
10630         case CCGOCmode:
10631           suffix = "s";
10632           break;
10633
10634         case CCmode:
10635         case CCGCmode:
10636           suffix = "l";
10637           break;
10638
10639         default:
10640           gcc_unreachable ();
10641         }
10642       break;
10643     case LTU:
10644       gcc_assert (mode == CCmode || mode == CCCmode);
10645       suffix = "b";
10646       break;
10647     case GE:
10648       switch (mode)
10649         {
10650         case CCNOmode:
10651         case CCGOCmode:
10652           suffix = "ns";
10653           break;
10654
10655         case CCmode:
10656         case CCGCmode:
10657           suffix = "ge";
10658           break;
10659
10660         default:
10661           gcc_unreachable ();
10662         }
10663       break;
10664     case GEU:
10665       /* ??? As above.  */
10666       gcc_assert (mode == CCmode || mode == CCCmode);
10667       suffix = fp ? "nb" : "ae";
10668       break;
10669     case LE:
10670       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
10671       suffix = "le";
10672       break;
10673     case LEU:
10674       /* ??? As above.  */
10675       if (mode == CCmode)
10676         suffix = "be";
10677       else if (mode == CCCmode)
10678         suffix = fp ? "nb" : "ae";
10679       else
10680         gcc_unreachable ();
10681       break;
10682     case UNORDERED:
10683       suffix = fp ? "u" : "p";
10684       break;
10685     case ORDERED:
10686       suffix = fp ? "nu" : "np";
10687       break;
10688     default:
10689       gcc_unreachable ();
10690     }
10691   fputs (suffix, file);
10692 }
10693
10694 /* Print the name of register X to FILE based on its machine mode and number.
10695    If CODE is 'w', pretend the mode is HImode.
10696    If CODE is 'b', pretend the mode is QImode.
10697    If CODE is 'k', pretend the mode is SImode.
10698    If CODE is 'q', pretend the mode is DImode.
10699    If CODE is 'x', pretend the mode is V4SFmode.
10700    If CODE is 't', pretend the mode is V8SFmode.
10701    If CODE is 'h', pretend the reg is the 'high' byte register.
10702    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
10703    If CODE is 'd', duplicate the operand for AVX instruction.
10704  */
10705
10706 void
10707 print_reg (rtx x, int code, FILE *file)
10708 {
10709   const char *reg;
10710   bool duplicated = code == 'd' && TARGET_AVX;
10711
10712   gcc_assert (x == pc_rtx
10713               || (REGNO (x) != ARG_POINTER_REGNUM
10714                   && REGNO (x) != FRAME_POINTER_REGNUM
10715                   && REGNO (x) != FLAGS_REG
10716                   && REGNO (x) != FPSR_REG
10717                   && REGNO (x) != FPCR_REG));
10718
10719   if (ASSEMBLER_DIALECT == ASM_ATT)
10720     putc ('%', file);
10721
10722   if (x == pc_rtx)
10723     {
10724       gcc_assert (TARGET_64BIT);
10725       fputs ("rip", file);
10726       return;
10727     }
10728
10729   if (code == 'w' || MMX_REG_P (x))
10730     code = 2;
10731   else if (code == 'b')
10732     code = 1;
10733   else if (code == 'k')
10734     code = 4;
10735   else if (code == 'q')
10736     code = 8;
10737   else if (code == 'y')
10738     code = 3;
10739   else if (code == 'h')
10740     code = 0;
10741   else if (code == 'x')
10742     code = 16;
10743   else if (code == 't')
10744     code = 32;
10745   else
10746     code = GET_MODE_SIZE (GET_MODE (x));
10747
10748   /* Irritatingly, AMD extended registers use different naming convention
10749      from the normal registers.  */
10750   if (REX_INT_REG_P (x))
10751     {
10752       gcc_assert (TARGET_64BIT);
10753       switch (code)
10754         {
10755           case 0:
10756             error ("extended registers have no high halves");
10757             break;
10758           case 1:
10759             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
10760             break;
10761           case 2:
10762             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
10763             break;
10764           case 4:
10765             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
10766             break;
10767           case 8:
10768             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
10769             break;
10770           default:
10771             error ("unsupported operand size for extended register");
10772             break;
10773         }
10774       return;
10775     }
10776
10777   reg = NULL;
10778   switch (code)
10779     {
10780     case 3:
10781       if (STACK_TOP_P (x))
10782         {
10783           reg = "st(0)";
10784           break;
10785         }
10786       /* FALLTHRU */
10787     case 8:
10788     case 4:
10789     case 12:
10790       if (! ANY_FP_REG_P (x))
10791         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
10792       /* FALLTHRU */
10793     case 16:
10794     case 2:
10795     normal:
10796       reg = hi_reg_name[REGNO (x)];
10797       break;
10798     case 1:
10799       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
10800         goto normal;
10801       reg = qi_reg_name[REGNO (x)];
10802       break;
10803     case 0:
10804       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
10805         goto normal;
10806       reg = qi_high_reg_name[REGNO (x)];
10807       break;
10808     case 32:
10809       if (SSE_REG_P (x))
10810         {
10811           gcc_assert (!duplicated);
10812           putc ('y', file);
10813           fputs (hi_reg_name[REGNO (x)] + 1, file);
10814           return;
10815         }
10816       break;
10817     default:
10818       gcc_unreachable ();
10819     }
10820
10821   fputs (reg, file);
10822   if (duplicated)
10823     {
10824       if (ASSEMBLER_DIALECT == ASM_ATT)
10825         fprintf (file, ", %%%s", reg);
10826       else
10827         fprintf (file, ", %s", reg);
10828     }
10829 }
10830
10831 /* Locate some local-dynamic symbol still in use by this function
10832    so that we can print its name in some tls_local_dynamic_base
10833    pattern.  */
10834
10835 static int
10836 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
10837 {
10838   rtx x = *px;
10839
10840   if (GET_CODE (x) == SYMBOL_REF
10841       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
10842     {
10843       cfun->machine->some_ld_name = XSTR (x, 0);
10844       return 1;
10845     }
10846
10847   return 0;
10848 }
10849
10850 static const char *
10851 get_some_local_dynamic_name (void)
10852 {
10853   rtx insn;
10854
10855   if (cfun->machine->some_ld_name)
10856     return cfun->machine->some_ld_name;
10857
10858   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
10859     if (INSN_P (insn)
10860         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
10861       return cfun->machine->some_ld_name;
10862
10863   gcc_unreachable ();
10864 }
10865
10866 /* Meaning of CODE:
10867    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
10868    C -- print opcode suffix for set/cmov insn.
10869    c -- like C, but print reversed condition
10870    F,f -- likewise, but for floating-point.
10871    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
10872         otherwise nothing
10873    R -- print the prefix for register names.
10874    z -- print the opcode suffix for the size of the current operand.
10875    * -- print a star (in certain assembler syntax)
10876    A -- print an absolute memory reference.
10877    w -- print the operand as if it's a "word" (HImode) even if it isn't.
10878    s -- print a shift double count, followed by the assemblers argument
10879         delimiter.
10880    b -- print the QImode name of the register for the indicated operand.
10881         %b0 would print %al if operands[0] is reg 0.
10882    w --  likewise, print the HImode name of the register.
10883    k --  likewise, print the SImode name of the register.
10884    q --  likewise, print the DImode name of the register.
10885    x --  likewise, print the V4SFmode name of the register.
10886    t --  likewise, print the V8SFmode name of the register.
10887    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
10888    y -- print "st(0)" instead of "st" as a register.
10889    d -- print duplicated register operand for AVX instruction.
10890    D -- print condition for SSE cmp instruction.
10891    P -- if PIC, print an @PLT suffix.
10892    X -- don't print any sort of PIC '@' suffix for a symbol.
10893    & -- print some in-use local-dynamic symbol name.
10894    H -- print a memory address offset by 8; used for sse high-parts
10895    Y -- print condition for SSE5 com* instruction.
10896    + -- print a branch hint as 'cs' or 'ds' prefix
10897    ; -- print a semicolon (after prefixes due to bug in older gas).
10898  */
10899
10900 void
10901 print_operand (FILE *file, rtx x, int code)
10902 {
10903   if (code)
10904     {
10905       switch (code)
10906         {
10907         case '*':
10908           if (ASSEMBLER_DIALECT == ASM_ATT)
10909             putc ('*', file);
10910           return;
10911
10912         case '&':
10913           assemble_name (file, get_some_local_dynamic_name ());
10914           return;
10915
10916         case 'A':
10917           switch (ASSEMBLER_DIALECT)
10918             {
10919             case ASM_ATT:
10920               putc ('*', file);
10921               break;
10922
10923             case ASM_INTEL:
10924               /* Intel syntax. For absolute addresses, registers should not
10925                  be surrounded by braces.  */
10926               if (!REG_P (x))
10927                 {
10928                   putc ('[', file);
10929                   PRINT_OPERAND (file, x, 0);
10930                   putc (']', file);
10931                   return;
10932                 }
10933               break;
10934
10935             default:
10936               gcc_unreachable ();
10937             }
10938
10939           PRINT_OPERAND (file, x, 0);
10940           return;
10941
10942
10943         case 'L':
10944           if (ASSEMBLER_DIALECT == ASM_ATT)
10945             putc ('l', file);
10946           return;
10947
10948         case 'W':
10949           if (ASSEMBLER_DIALECT == ASM_ATT)
10950             putc ('w', file);
10951           return;
10952
10953         case 'B':
10954           if (ASSEMBLER_DIALECT == ASM_ATT)
10955             putc ('b', file);
10956           return;
10957
10958         case 'Q':
10959           if (ASSEMBLER_DIALECT == ASM_ATT)
10960             putc ('l', file);
10961           return;
10962
10963         case 'S':
10964           if (ASSEMBLER_DIALECT == ASM_ATT)
10965             putc ('s', file);
10966           return;
10967
10968         case 'T':
10969           if (ASSEMBLER_DIALECT == ASM_ATT)
10970             putc ('t', file);
10971           return;
10972
10973         case 'z':
10974           /* 387 opcodes don't get size suffixes if the operands are
10975              registers.  */
10976           if (STACK_REG_P (x))
10977             return;
10978
10979           /* Likewise if using Intel opcodes.  */
10980           if (ASSEMBLER_DIALECT == ASM_INTEL)
10981             return;
10982
10983           /* This is the size of op from size of operand.  */
10984           switch (GET_MODE_SIZE (GET_MODE (x)))
10985             {
10986             case 1:
10987               putc ('b', file);
10988               return;
10989
10990             case 2:
10991               if (MEM_P (x))
10992                 {
10993 #ifdef HAVE_GAS_FILDS_FISTS
10994                   putc ('s', file);
10995 #endif
10996                   return;
10997                 }
10998               else
10999                 putc ('w', file);
11000               return;
11001
11002             case 4:
11003               if (GET_MODE (x) == SFmode)
11004                 {
11005                   putc ('s', file);
11006                   return;
11007                 }
11008               else
11009                 putc ('l', file);
11010               return;
11011
11012             case 12:
11013             case 16:
11014               putc ('t', file);
11015               return;
11016
11017             case 8:
11018               if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
11019                 {
11020                   if (MEM_P (x))
11021                     {
11022 #ifdef GAS_MNEMONICS
11023                       putc ('q', file);
11024 #else
11025                       putc ('l', file);
11026                       putc ('l', file);
11027 #endif
11028                     }
11029                   else
11030                     putc ('q', file);
11031                 }
11032               else
11033                 putc ('l', file);
11034               return;
11035
11036             default:
11037               gcc_unreachable ();
11038             }
11039
11040         case 'd':
11041         case 'b':
11042         case 'w':
11043         case 'k':
11044         case 'q':
11045         case 'h':
11046         case 't':
11047         case 'y':
11048         case 'x':
11049         case 'X':
11050         case 'P':
11051           break;
11052
11053         case 's':
11054           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
11055             {
11056               PRINT_OPERAND (file, x, 0);
11057               fputs (", ", file);
11058             }
11059           return;
11060
11061         case 'D':
11062           /* Little bit of braindamage here.  The SSE compare instructions
11063              does use completely different names for the comparisons that the
11064              fp conditional moves.  */
11065           if (TARGET_AVX)
11066             {
11067               switch (GET_CODE (x))
11068                 {
11069                 case EQ:
11070                   fputs ("eq", file);
11071                   break;
11072                 case UNEQ:
11073                   fputs ("eq_us", file);
11074                   break;
11075                 case LT:
11076                   fputs ("lt", file);
11077                   break;
11078                 case UNLT:
11079                   fputs ("nge", file);
11080                   break;
11081                 case LE:
11082                   fputs ("le", file);
11083                   break;
11084                 case UNLE:
11085                   fputs ("ngt", file);
11086                   break;
11087                 case UNORDERED:
11088                   fputs ("unord", file);
11089                   break;
11090                 case NE:
11091                   fputs ("neq", file);
11092                   break;
11093                 case LTGT:
11094                   fputs ("neq_oq", file);
11095                   break;
11096                 case GE:
11097                   fputs ("ge", file);
11098                   break;
11099                 case UNGE:
11100                   fputs ("nlt", file);
11101                   break;
11102                 case GT:
11103                   fputs ("gt", file);
11104                   break;
11105                 case UNGT:
11106                   fputs ("nle", file);
11107                   break;
11108                 case ORDERED:
11109                   fputs ("ord", file);
11110                   break;
11111                 default:
11112                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11113                   return;
11114                 }
11115             }
11116           else
11117             {
11118               switch (GET_CODE (x))
11119                 {
11120                 case EQ:
11121                 case UNEQ:
11122                   fputs ("eq", file);
11123                   break;
11124                 case LT:
11125                 case UNLT:
11126                   fputs ("lt", file);
11127                   break;
11128                 case LE:
11129                 case UNLE:
11130                   fputs ("le", file);
11131                   break;
11132                 case UNORDERED:
11133                   fputs ("unord", file);
11134                   break;
11135                 case NE:
11136                 case LTGT:
11137                   fputs ("neq", file);
11138                   break;
11139                 case UNGE:
11140                 case GE:
11141                   fputs ("nlt", file);
11142                   break;
11143                 case UNGT:
11144                 case GT:
11145                   fputs ("nle", file);
11146                   break;
11147                 case ORDERED:
11148                   fputs ("ord", file);
11149                   break;
11150                 default:
11151                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11152                   return;
11153                 }
11154             }
11155           return;
11156         case 'O':
11157 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11158           if (ASSEMBLER_DIALECT == ASM_ATT)
11159             {
11160               switch (GET_MODE (x))
11161                 {
11162                 case HImode: putc ('w', file); break;
11163                 case SImode:
11164                 case SFmode: putc ('l', file); break;
11165                 case DImode:
11166                 case DFmode: putc ('q', file); break;
11167                 default: gcc_unreachable ();
11168                 }
11169               putc ('.', file);
11170             }
11171 #endif
11172           return;
11173         case 'C':
11174           if (!COMPARISON_P (x))
11175             {
11176               output_operand_lossage ("operand is neither a constant nor a "
11177                                       "condition code, invalid operand code "
11178                                       "'C'");
11179               return;
11180             }
11181           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
11182           return;
11183         case 'F':
11184           if (!COMPARISON_P (x))
11185             {
11186               output_operand_lossage ("operand is neither a constant nor a "
11187                                       "condition code, invalid operand code "
11188                                       "'F'");
11189               return;
11190             }
11191 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11192           if (ASSEMBLER_DIALECT == ASM_ATT)
11193             putc ('.', file);
11194 #endif
11195           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
11196           return;
11197
11198           /* Like above, but reverse condition */
11199         case 'c':
11200           /* Check to see if argument to %c is really a constant
11201              and not a condition code which needs to be reversed.  */
11202           if (!COMPARISON_P (x))
11203             {
11204               output_operand_lossage ("operand is neither a constant nor a "
11205                                       "condition code, invalid operand "
11206                                       "code 'c'");
11207               return;
11208             }
11209           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
11210           return;
11211         case 'f':
11212           if (!COMPARISON_P (x))
11213             {
11214               output_operand_lossage ("operand is neither a constant nor a "
11215                                       "condition code, invalid operand "
11216                                       "code 'f'");
11217               return;
11218             }
11219 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11220           if (ASSEMBLER_DIALECT == ASM_ATT)
11221             putc ('.', file);
11222 #endif
11223           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
11224           return;
11225
11226         case 'H':
11227           if (!offsettable_memref_p (x))
11228             {
11229               output_operand_lossage ("operand is not an offsettable memory "
11230                                       "reference, invalid operand "
11231                                       "code 'H'");
11232               return;
11233             }
11234           /* It doesn't actually matter what mode we use here, as we're
11235              only going to use this for printing.  */
11236           x = adjust_address_nv (x, DImode, 8);
11237           break;
11238
11239         case '+':
11240           {
11241             rtx x;
11242
11243             if (!optimize
11244                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
11245               return;
11246
11247             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
11248             if (x)
11249               {
11250                 int pred_val = INTVAL (XEXP (x, 0));
11251
11252                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
11253                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
11254                   {
11255                     int taken = pred_val > REG_BR_PROB_BASE / 2;
11256                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
11257
11258                     /* Emit hints only in the case default branch prediction
11259                        heuristics would fail.  */
11260                     if (taken != cputaken)
11261                       {
11262                         /* We use 3e (DS) prefix for taken branches and
11263                            2e (CS) prefix for not taken branches.  */
11264                         if (taken)
11265                           fputs ("ds ; ", file);
11266                         else
11267                           fputs ("cs ; ", file);
11268                       }
11269                   }
11270               }
11271             return;
11272           }
11273
11274         case 'Y':
11275           switch (GET_CODE (x))
11276             {
11277             case NE:
11278               fputs ("neq", file);
11279               break;
11280             case EQ:
11281               fputs ("eq", file);
11282               break;
11283             case GE:
11284             case GEU:
11285               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
11286               break;
11287             case GT:
11288             case GTU:
11289               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
11290               break;
11291             case LE:
11292             case LEU:
11293               fputs ("le", file);
11294               break;
11295             case LT:
11296             case LTU:
11297               fputs ("lt", file);
11298               break;
11299             case UNORDERED:
11300               fputs ("unord", file);
11301               break;
11302             case ORDERED:
11303               fputs ("ord", file);
11304               break;
11305             case UNEQ:
11306               fputs ("ueq", file);
11307               break;
11308             case UNGE:
11309               fputs ("nlt", file);
11310               break;
11311             case UNGT:
11312               fputs ("nle", file);
11313               break;
11314             case UNLE:
11315               fputs ("ule", file);
11316               break;
11317             case UNLT:
11318               fputs ("ult", file);
11319               break;
11320             case LTGT:
11321               fputs ("une", file);
11322               break;
11323             default:
11324               output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11325               return;
11326             }
11327           return;
11328
11329         case ';':
11330 #if TARGET_MACHO || !HAVE_AS_IX86_REP_LOCK_PREFIX
11331           fputs (";", file);
11332 #endif
11333           return;
11334
11335         default:
11336             output_operand_lossage ("invalid operand code '%c'", code);
11337         }
11338     }
11339
11340   if (REG_P (x))
11341     print_reg (x, code, file);
11342
11343   else if (MEM_P (x))
11344     {
11345       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
11346       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
11347           && GET_MODE (x) != BLKmode)
11348         {
11349           const char * size;
11350           switch (GET_MODE_SIZE (GET_MODE (x)))
11351             {
11352             case 1: size = "BYTE"; break;
11353             case 2: size = "WORD"; break;
11354             case 4: size = "DWORD"; break;
11355             case 8: size = "QWORD"; break;
11356             case 12: size = "TBYTE"; break;
11357             case 16:
11358               if (GET_MODE (x) == XFmode)
11359                 size = "TBYTE";
11360               else
11361                 size = "XMMWORD";
11362               break;
11363             case 32: size = "YMMWORD"; break;
11364             default:
11365               gcc_unreachable ();
11366             }
11367
11368           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
11369           if (code == 'b')
11370             size = "BYTE";
11371           else if (code == 'w')
11372             size = "WORD";
11373           else if (code == 'k')
11374             size = "DWORD";
11375
11376           fputs (size, file);
11377           fputs (" PTR ", file);
11378         }
11379
11380       x = XEXP (x, 0);
11381       /* Avoid (%rip) for call operands.  */
11382       if (CONSTANT_ADDRESS_P (x) && code == 'P'
11383           && !CONST_INT_P (x))
11384         output_addr_const (file, x);
11385       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
11386         output_operand_lossage ("invalid constraints for operand");
11387       else
11388         output_address (x);
11389     }
11390
11391   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
11392     {
11393       REAL_VALUE_TYPE r;
11394       long l;
11395
11396       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
11397       REAL_VALUE_TO_TARGET_SINGLE (r, l);
11398
11399       if (ASSEMBLER_DIALECT == ASM_ATT)
11400         putc ('$', file);
11401       fprintf (file, "0x%08lx", (long unsigned int) l);
11402     }
11403
11404   /* These float cases don't actually occur as immediate operands.  */
11405   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
11406     {
11407       char dstr[30];
11408
11409       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11410       fprintf (file, "%s", dstr);
11411     }
11412
11413   else if (GET_CODE (x) == CONST_DOUBLE
11414            && GET_MODE (x) == XFmode)
11415     {
11416       char dstr[30];
11417
11418       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11419       fprintf (file, "%s", dstr);
11420     }
11421
11422   else
11423     {
11424       /* We have patterns that allow zero sets of memory, for instance.
11425          In 64-bit mode, we should probably support all 8-byte vectors,
11426          since we can in fact encode that into an immediate.  */
11427       if (GET_CODE (x) == CONST_VECTOR)
11428         {
11429           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
11430           x = const0_rtx;
11431         }
11432
11433       if (code != 'P')
11434         {
11435           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
11436             {
11437               if (ASSEMBLER_DIALECT == ASM_ATT)
11438                 putc ('$', file);
11439             }
11440           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
11441                    || GET_CODE (x) == LABEL_REF)
11442             {
11443               if (ASSEMBLER_DIALECT == ASM_ATT)
11444                 putc ('$', file);
11445               else
11446                 fputs ("OFFSET FLAT:", file);
11447             }
11448         }
11449       if (CONST_INT_P (x))
11450         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
11451       else if (flag_pic)
11452         output_pic_addr_const (file, x, code);
11453       else
11454         output_addr_const (file, x);
11455     }
11456 }
11457 \f
11458 /* Print a memory operand whose address is ADDR.  */
11459
11460 void
11461 print_operand_address (FILE *file, rtx addr)
11462 {
11463   struct ix86_address parts;
11464   rtx base, index, disp;
11465   int scale;
11466   int ok = ix86_decompose_address (addr, &parts);
11467
11468   gcc_assert (ok);
11469
11470   base = parts.base;
11471   index = parts.index;
11472   disp = parts.disp;
11473   scale = parts.scale;
11474
11475   switch (parts.seg)
11476     {
11477     case SEG_DEFAULT:
11478       break;
11479     case SEG_FS:
11480     case SEG_GS:
11481       if (ASSEMBLER_DIALECT == ASM_ATT)
11482         putc ('%', file);
11483       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
11484       break;
11485     default:
11486       gcc_unreachable ();
11487     }
11488
11489   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
11490   if (TARGET_64BIT && !base && !index)
11491     {
11492       rtx symbol = disp;
11493
11494       if (GET_CODE (disp) == CONST
11495           && GET_CODE (XEXP (disp, 0)) == PLUS
11496           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11497         symbol = XEXP (XEXP (disp, 0), 0);
11498
11499       if (GET_CODE (symbol) == LABEL_REF
11500           || (GET_CODE (symbol) == SYMBOL_REF
11501               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
11502         base = pc_rtx;
11503     }
11504   if (!base && !index)
11505     {
11506       /* Displacement only requires special attention.  */
11507
11508       if (CONST_INT_P (disp))
11509         {
11510           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
11511             fputs ("ds:", file);
11512           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
11513         }
11514       else if (flag_pic)
11515         output_pic_addr_const (file, disp, 0);
11516       else
11517         output_addr_const (file, disp);
11518     }
11519   else
11520     {
11521       if (ASSEMBLER_DIALECT == ASM_ATT)
11522         {
11523           if (disp)
11524             {
11525               if (flag_pic)
11526                 output_pic_addr_const (file, disp, 0);
11527               else if (GET_CODE (disp) == LABEL_REF)
11528                 output_asm_label (disp);
11529               else
11530                 output_addr_const (file, disp);
11531             }
11532
11533           putc ('(', file);
11534           if (base)
11535             print_reg (base, 0, file);
11536           if (index)
11537             {
11538               putc (',', file);
11539               print_reg (index, 0, file);
11540               if (scale != 1)
11541                 fprintf (file, ",%d", scale);
11542             }
11543           putc (')', file);
11544         }
11545       else
11546         {
11547           rtx offset = NULL_RTX;
11548
11549           if (disp)
11550             {
11551               /* Pull out the offset of a symbol; print any symbol itself.  */
11552               if (GET_CODE (disp) == CONST
11553                   && GET_CODE (XEXP (disp, 0)) == PLUS
11554                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11555                 {
11556                   offset = XEXP (XEXP (disp, 0), 1);
11557                   disp = gen_rtx_CONST (VOIDmode,
11558                                         XEXP (XEXP (disp, 0), 0));
11559                 }
11560
11561               if (flag_pic)
11562                 output_pic_addr_const (file, disp, 0);
11563               else if (GET_CODE (disp) == LABEL_REF)
11564                 output_asm_label (disp);
11565               else if (CONST_INT_P (disp))
11566                 offset = disp;
11567               else
11568                 output_addr_const (file, disp);
11569             }
11570
11571           putc ('[', file);
11572           if (base)
11573             {
11574               print_reg (base, 0, file);
11575               if (offset)
11576                 {
11577                   if (INTVAL (offset) >= 0)
11578                     putc ('+', file);
11579                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11580                 }
11581             }
11582           else if (offset)
11583             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11584           else
11585             putc ('0', file);
11586
11587           if (index)
11588             {
11589               putc ('+', file);
11590               print_reg (index, 0, file);
11591               if (scale != 1)
11592                 fprintf (file, "*%d", scale);
11593             }
11594           putc (']', file);
11595         }
11596     }
11597 }
11598
11599 bool
11600 output_addr_const_extra (FILE *file, rtx x)
11601 {
11602   rtx op;
11603
11604   if (GET_CODE (x) != UNSPEC)
11605     return false;
11606
11607   op = XVECEXP (x, 0, 0);
11608   switch (XINT (x, 1))
11609     {
11610     case UNSPEC_GOTTPOFF:
11611       output_addr_const (file, op);
11612       /* FIXME: This might be @TPOFF in Sun ld.  */
11613       fputs ("@GOTTPOFF", file);
11614       break;
11615     case UNSPEC_TPOFF:
11616       output_addr_const (file, op);
11617       fputs ("@TPOFF", file);
11618       break;
11619     case UNSPEC_NTPOFF:
11620       output_addr_const (file, op);
11621       if (TARGET_64BIT)
11622         fputs ("@TPOFF", file);
11623       else
11624         fputs ("@NTPOFF", file);
11625       break;
11626     case UNSPEC_DTPOFF:
11627       output_addr_const (file, op);
11628       fputs ("@DTPOFF", file);
11629       break;
11630     case UNSPEC_GOTNTPOFF:
11631       output_addr_const (file, op);
11632       if (TARGET_64BIT)
11633         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
11634                "@GOTTPOFF(%rip)" : "@GOTTPOFF[rip]", file);
11635       else
11636         fputs ("@GOTNTPOFF", file);
11637       break;
11638     case UNSPEC_INDNTPOFF:
11639       output_addr_const (file, op);
11640       fputs ("@INDNTPOFF", file);
11641       break;
11642 #if TARGET_MACHO
11643     case UNSPEC_MACHOPIC_OFFSET:
11644       output_addr_const (file, op);
11645       putc ('-', file);
11646       machopic_output_function_base_name (file);
11647       break;
11648 #endif
11649
11650     default:
11651       return false;
11652     }
11653
11654   return true;
11655 }
11656 \f
11657 /* Split one or more DImode RTL references into pairs of SImode
11658    references.  The RTL can be REG, offsettable MEM, integer constant, or
11659    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11660    split and "num" is its length.  lo_half and hi_half are output arrays
11661    that parallel "operands".  */
11662
11663 void
11664 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11665 {
11666   while (num--)
11667     {
11668       rtx op = operands[num];
11669
11670       /* simplify_subreg refuse to split volatile memory addresses,
11671          but we still have to handle it.  */
11672       if (MEM_P (op))
11673         {
11674           lo_half[num] = adjust_address (op, SImode, 0);
11675           hi_half[num] = adjust_address (op, SImode, 4);
11676         }
11677       else
11678         {
11679           lo_half[num] = simplify_gen_subreg (SImode, op,
11680                                               GET_MODE (op) == VOIDmode
11681                                               ? DImode : GET_MODE (op), 0);
11682           hi_half[num] = simplify_gen_subreg (SImode, op,
11683                                               GET_MODE (op) == VOIDmode
11684                                               ? DImode : GET_MODE (op), 4);
11685         }
11686     }
11687 }
11688 /* Split one or more TImode RTL references into pairs of DImode
11689    references.  The RTL can be REG, offsettable MEM, integer constant, or
11690    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11691    split and "num" is its length.  lo_half and hi_half are output arrays
11692    that parallel "operands".  */
11693
11694 void
11695 split_ti (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11696 {
11697   while (num--)
11698     {
11699       rtx op = operands[num];
11700
11701       /* simplify_subreg refuse to split volatile memory addresses, but we
11702          still have to handle it.  */
11703       if (MEM_P (op))
11704         {
11705           lo_half[num] = adjust_address (op, DImode, 0);
11706           hi_half[num] = adjust_address (op, DImode, 8);
11707         }
11708       else
11709         {
11710           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
11711           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
11712         }
11713     }
11714 }
11715 \f
11716 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
11717    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
11718    is the expression of the binary operation.  The output may either be
11719    emitted here, or returned to the caller, like all output_* functions.
11720
11721    There is no guarantee that the operands are the same mode, as they
11722    might be within FLOAT or FLOAT_EXTEND expressions.  */
11723
11724 #ifndef SYSV386_COMPAT
11725 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
11726    wants to fix the assemblers because that causes incompatibility
11727    with gcc.  No-one wants to fix gcc because that causes
11728    incompatibility with assemblers...  You can use the option of
11729    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
11730 #define SYSV386_COMPAT 1
11731 #endif
11732
11733 const char *
11734 output_387_binary_op (rtx insn, rtx *operands)
11735 {
11736   static char buf[40];
11737   const char *p;
11738   const char *ssep;
11739   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
11740
11741 #ifdef ENABLE_CHECKING
11742   /* Even if we do not want to check the inputs, this documents input
11743      constraints.  Which helps in understanding the following code.  */
11744   if (STACK_REG_P (operands[0])
11745       && ((REG_P (operands[1])
11746            && REGNO (operands[0]) == REGNO (operands[1])
11747            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
11748           || (REG_P (operands[2])
11749               && REGNO (operands[0]) == REGNO (operands[2])
11750               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
11751       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
11752     ; /* ok */
11753   else
11754     gcc_assert (is_sse);
11755 #endif
11756
11757   switch (GET_CODE (operands[3]))
11758     {
11759     case PLUS:
11760       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11761           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11762         p = "fiadd";
11763       else
11764         p = "fadd";
11765       ssep = "vadd";
11766       break;
11767
11768     case MINUS:
11769       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11770           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11771         p = "fisub";
11772       else
11773         p = "fsub";
11774       ssep = "vsub";
11775       break;
11776
11777     case MULT:
11778       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11779           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11780         p = "fimul";
11781       else
11782         p = "fmul";
11783       ssep = "vmul";
11784       break;
11785
11786     case DIV:
11787       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11788           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11789         p = "fidiv";
11790       else
11791         p = "fdiv";
11792       ssep = "vdiv";
11793       break;
11794
11795     default:
11796       gcc_unreachable ();
11797     }
11798
11799   if (is_sse)
11800    {
11801      if (TARGET_AVX)
11802        {
11803          strcpy (buf, ssep);
11804          if (GET_MODE (operands[0]) == SFmode)
11805            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
11806          else
11807            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
11808        }
11809      else
11810        {
11811          strcpy (buf, ssep + 1);
11812          if (GET_MODE (operands[0]) == SFmode)
11813            strcat (buf, "ss\t{%2, %0|%0, %2}");
11814          else
11815            strcat (buf, "sd\t{%2, %0|%0, %2}");
11816        }
11817       return buf;
11818    }
11819   strcpy (buf, p);
11820
11821   switch (GET_CODE (operands[3]))
11822     {
11823     case MULT:
11824     case PLUS:
11825       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
11826         {
11827           rtx temp = operands[2];
11828           operands[2] = operands[1];
11829           operands[1] = temp;
11830         }
11831
11832       /* know operands[0] == operands[1].  */
11833
11834       if (MEM_P (operands[2]))
11835         {
11836           p = "%z2\t%2";
11837           break;
11838         }
11839
11840       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11841         {
11842           if (STACK_TOP_P (operands[0]))
11843             /* How is it that we are storing to a dead operand[2]?
11844                Well, presumably operands[1] is dead too.  We can't
11845                store the result to st(0) as st(0) gets popped on this
11846                instruction.  Instead store to operands[2] (which I
11847                think has to be st(1)).  st(1) will be popped later.
11848                gcc <= 2.8.1 didn't have this check and generated
11849                assembly code that the Unixware assembler rejected.  */
11850             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
11851           else
11852             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11853           break;
11854         }
11855
11856       if (STACK_TOP_P (operands[0]))
11857         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
11858       else
11859         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
11860       break;
11861
11862     case MINUS:
11863     case DIV:
11864       if (MEM_P (operands[1]))
11865         {
11866           p = "r%z1\t%1";
11867           break;
11868         }
11869
11870       if (MEM_P (operands[2]))
11871         {
11872           p = "%z2\t%2";
11873           break;
11874         }
11875
11876       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11877         {
11878 #if SYSV386_COMPAT
11879           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
11880              derived assemblers, confusingly reverse the direction of
11881              the operation for fsub{r} and fdiv{r} when the
11882              destination register is not st(0).  The Intel assembler
11883              doesn't have this brain damage.  Read !SYSV386_COMPAT to
11884              figure out what the hardware really does.  */
11885           if (STACK_TOP_P (operands[0]))
11886             p = "{p\t%0, %2|rp\t%2, %0}";
11887           else
11888             p = "{rp\t%2, %0|p\t%0, %2}";
11889 #else
11890           if (STACK_TOP_P (operands[0]))
11891             /* As above for fmul/fadd, we can't store to st(0).  */
11892             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
11893           else
11894             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11895 #endif
11896           break;
11897         }
11898
11899       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
11900         {
11901 #if SYSV386_COMPAT
11902           if (STACK_TOP_P (operands[0]))
11903             p = "{rp\t%0, %1|p\t%1, %0}";
11904           else
11905             p = "{p\t%1, %0|rp\t%0, %1}";
11906 #else
11907           if (STACK_TOP_P (operands[0]))
11908             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
11909           else
11910             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
11911 #endif
11912           break;
11913         }
11914
11915       if (STACK_TOP_P (operands[0]))
11916         {
11917           if (STACK_TOP_P (operands[1]))
11918             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
11919           else
11920             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
11921           break;
11922         }
11923       else if (STACK_TOP_P (operands[1]))
11924         {
11925 #if SYSV386_COMPAT
11926           p = "{\t%1, %0|r\t%0, %1}";
11927 #else
11928           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
11929 #endif
11930         }
11931       else
11932         {
11933 #if SYSV386_COMPAT
11934           p = "{r\t%2, %0|\t%0, %2}";
11935 #else
11936           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
11937 #endif
11938         }
11939       break;
11940
11941     default:
11942       gcc_unreachable ();
11943     }
11944
11945   strcat (buf, p);
11946   return buf;
11947 }
11948
11949 /* Return needed mode for entity in optimize_mode_switching pass.  */
11950
11951 int
11952 ix86_mode_needed (int entity, rtx insn)
11953 {
11954   enum attr_i387_cw mode;
11955
11956   /* The mode UNINITIALIZED is used to store control word after a
11957      function call or ASM pattern.  The mode ANY specify that function
11958      has no requirements on the control word and make no changes in the
11959      bits we are interested in.  */
11960
11961   if (CALL_P (insn)
11962       || (NONJUMP_INSN_P (insn)
11963           && (asm_noperands (PATTERN (insn)) >= 0
11964               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
11965     return I387_CW_UNINITIALIZED;
11966
11967   if (recog_memoized (insn) < 0)
11968     return I387_CW_ANY;
11969
11970   mode = get_attr_i387_cw (insn);
11971
11972   switch (entity)
11973     {
11974     case I387_TRUNC:
11975       if (mode == I387_CW_TRUNC)
11976         return mode;
11977       break;
11978
11979     case I387_FLOOR:
11980       if (mode == I387_CW_FLOOR)
11981         return mode;
11982       break;
11983
11984     case I387_CEIL:
11985       if (mode == I387_CW_CEIL)
11986         return mode;
11987       break;
11988
11989     case I387_MASK_PM:
11990       if (mode == I387_CW_MASK_PM)
11991         return mode;
11992       break;
11993
11994     default:
11995       gcc_unreachable ();
11996     }
11997
11998   return I387_CW_ANY;
11999 }
12000
12001 /* Output code to initialize control word copies used by trunc?f?i and
12002    rounding patterns.  CURRENT_MODE is set to current control word,
12003    while NEW_MODE is set to new control word.  */
12004
12005 void
12006 emit_i387_cw_initialization (int mode)
12007 {
12008   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
12009   rtx new_mode;
12010
12011   enum ix86_stack_slot slot;
12012
12013   rtx reg = gen_reg_rtx (HImode);
12014
12015   emit_insn (gen_x86_fnstcw_1 (stored_mode));
12016   emit_move_insn (reg, copy_rtx (stored_mode));
12017
12018   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
12019       || optimize_function_for_size_p (cfun))
12020     {
12021       switch (mode)
12022         {
12023         case I387_CW_TRUNC:
12024           /* round toward zero (truncate) */
12025           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
12026           slot = SLOT_CW_TRUNC;
12027           break;
12028
12029         case I387_CW_FLOOR:
12030           /* round down toward -oo */
12031           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12032           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
12033           slot = SLOT_CW_FLOOR;
12034           break;
12035
12036         case I387_CW_CEIL:
12037           /* round up toward +oo */
12038           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12039           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
12040           slot = SLOT_CW_CEIL;
12041           break;
12042
12043         case I387_CW_MASK_PM:
12044           /* mask precision exception for nearbyint() */
12045           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12046           slot = SLOT_CW_MASK_PM;
12047           break;
12048
12049         default:
12050           gcc_unreachable ();
12051         }
12052     }
12053   else
12054     {
12055       switch (mode)
12056         {
12057         case I387_CW_TRUNC:
12058           /* round toward zero (truncate) */
12059           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
12060           slot = SLOT_CW_TRUNC;
12061           break;
12062
12063         case I387_CW_FLOOR:
12064           /* round down toward -oo */
12065           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
12066           slot = SLOT_CW_FLOOR;
12067           break;
12068
12069         case I387_CW_CEIL:
12070           /* round up toward +oo */
12071           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
12072           slot = SLOT_CW_CEIL;
12073           break;
12074
12075         case I387_CW_MASK_PM:
12076           /* mask precision exception for nearbyint() */
12077           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12078           slot = SLOT_CW_MASK_PM;
12079           break;
12080
12081         default:
12082           gcc_unreachable ();
12083         }
12084     }
12085
12086   gcc_assert (slot < MAX_386_STACK_LOCALS);
12087
12088   new_mode = assign_386_stack_local (HImode, slot);
12089   emit_move_insn (new_mode, reg);
12090 }
12091
12092 /* Output code for INSN to convert a float to a signed int.  OPERANDS
12093    are the insn operands.  The output may be [HSD]Imode and the input
12094    operand may be [SDX]Fmode.  */
12095
12096 const char *
12097 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
12098 {
12099   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12100   int dimode_p = GET_MODE (operands[0]) == DImode;
12101   int round_mode = get_attr_i387_cw (insn);
12102
12103   /* Jump through a hoop or two for DImode, since the hardware has no
12104      non-popping instruction.  We used to do this a different way, but
12105      that was somewhat fragile and broke with post-reload splitters.  */
12106   if ((dimode_p || fisttp) && !stack_top_dies)
12107     output_asm_insn ("fld\t%y1", operands);
12108
12109   gcc_assert (STACK_TOP_P (operands[1]));
12110   gcc_assert (MEM_P (operands[0]));
12111   gcc_assert (GET_MODE (operands[1]) != TFmode);
12112
12113   if (fisttp)
12114       output_asm_insn ("fisttp%z0\t%0", operands);
12115   else
12116     {
12117       if (round_mode != I387_CW_ANY)
12118         output_asm_insn ("fldcw\t%3", operands);
12119       if (stack_top_dies || dimode_p)
12120         output_asm_insn ("fistp%z0\t%0", operands);
12121       else
12122         output_asm_insn ("fist%z0\t%0", operands);
12123       if (round_mode != I387_CW_ANY)
12124         output_asm_insn ("fldcw\t%2", operands);
12125     }
12126
12127   return "";
12128 }
12129
12130 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
12131    have the values zero or one, indicates the ffreep insn's operand
12132    from the OPERANDS array.  */
12133
12134 static const char *
12135 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
12136 {
12137   if (TARGET_USE_FFREEP)
12138 #ifdef HAVE_AS_IX86_FFREEP
12139     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
12140 #else
12141     {
12142       static char retval[32];
12143       int regno = REGNO (operands[opno]);
12144
12145       gcc_assert (FP_REGNO_P (regno));
12146
12147       regno -= FIRST_STACK_REG;
12148
12149       snprintf (retval, sizeof (retval), ASM_SHORT "0xc%ddf", regno);
12150       return retval;
12151     }
12152 #endif
12153
12154   return opno ? "fstp\t%y1" : "fstp\t%y0";
12155 }
12156
12157
12158 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
12159    should be used.  UNORDERED_P is true when fucom should be used.  */
12160
12161 const char *
12162 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
12163 {
12164   int stack_top_dies;
12165   rtx cmp_op0, cmp_op1;
12166   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
12167
12168   if (eflags_p)
12169     {
12170       cmp_op0 = operands[0];
12171       cmp_op1 = operands[1];
12172     }
12173   else
12174     {
12175       cmp_op0 = operands[1];
12176       cmp_op1 = operands[2];
12177     }
12178
12179   if (is_sse)
12180     {
12181       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
12182       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
12183       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
12184       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
12185
12186       if (GET_MODE (operands[0]) == SFmode)
12187         if (unordered_p)
12188           return &ucomiss[TARGET_AVX ? 0 : 1];
12189         else
12190           return &comiss[TARGET_AVX ? 0 : 1];
12191       else
12192         if (unordered_p)
12193           return &ucomisd[TARGET_AVX ? 0 : 1];
12194         else
12195           return &comisd[TARGET_AVX ? 0 : 1];
12196     }
12197
12198   gcc_assert (STACK_TOP_P (cmp_op0));
12199
12200   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12201
12202   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
12203     {
12204       if (stack_top_dies)
12205         {
12206           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
12207           return output_387_ffreep (operands, 1);
12208         }
12209       else
12210         return "ftst\n\tfnstsw\t%0";
12211     }
12212
12213   if (STACK_REG_P (cmp_op1)
12214       && stack_top_dies
12215       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
12216       && REGNO (cmp_op1) != FIRST_STACK_REG)
12217     {
12218       /* If both the top of the 387 stack dies, and the other operand
12219          is also a stack register that dies, then this must be a
12220          `fcompp' float compare */
12221
12222       if (eflags_p)
12223         {
12224           /* There is no double popping fcomi variant.  Fortunately,
12225              eflags is immune from the fstp's cc clobbering.  */
12226           if (unordered_p)
12227             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
12228           else
12229             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
12230           return output_387_ffreep (operands, 0);
12231         }
12232       else
12233         {
12234           if (unordered_p)
12235             return "fucompp\n\tfnstsw\t%0";
12236           else
12237             return "fcompp\n\tfnstsw\t%0";
12238         }
12239     }
12240   else
12241     {
12242       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
12243
12244       static const char * const alt[16] =
12245       {
12246         "fcom%z2\t%y2\n\tfnstsw\t%0",
12247         "fcomp%z2\t%y2\n\tfnstsw\t%0",
12248         "fucom%z2\t%y2\n\tfnstsw\t%0",
12249         "fucomp%z2\t%y2\n\tfnstsw\t%0",
12250
12251         "ficom%z2\t%y2\n\tfnstsw\t%0",
12252         "ficomp%z2\t%y2\n\tfnstsw\t%0",
12253         NULL,
12254         NULL,
12255
12256         "fcomi\t{%y1, %0|%0, %y1}",
12257         "fcomip\t{%y1, %0|%0, %y1}",
12258         "fucomi\t{%y1, %0|%0, %y1}",
12259         "fucomip\t{%y1, %0|%0, %y1}",
12260
12261         NULL,
12262         NULL,
12263         NULL,
12264         NULL
12265       };
12266
12267       int mask;
12268       const char *ret;
12269
12270       mask  = eflags_p << 3;
12271       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
12272       mask |= unordered_p << 1;
12273       mask |= stack_top_dies;
12274
12275       gcc_assert (mask < 16);
12276       ret = alt[mask];
12277       gcc_assert (ret);
12278
12279       return ret;
12280     }
12281 }
12282
12283 void
12284 ix86_output_addr_vec_elt (FILE *file, int value)
12285 {
12286   const char *directive = ASM_LONG;
12287
12288 #ifdef ASM_QUAD
12289   if (TARGET_64BIT)
12290     directive = ASM_QUAD;
12291 #else
12292   gcc_assert (!TARGET_64BIT);
12293 #endif
12294
12295   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
12296 }
12297
12298 void
12299 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
12300 {
12301   const char *directive = ASM_LONG;
12302
12303 #ifdef ASM_QUAD
12304   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
12305     directive = ASM_QUAD;
12306 #else
12307   gcc_assert (!TARGET_64BIT);
12308 #endif
12309   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
12310   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
12311     fprintf (file, "%s%s%d-%s%d\n",
12312              directive, LPREFIX, value, LPREFIX, rel);
12313   else if (HAVE_AS_GOTOFF_IN_DATA)
12314     fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value);
12315 #if TARGET_MACHO
12316   else if (TARGET_MACHO)
12317     {
12318       fprintf (file, "%s%s%d-", ASM_LONG, LPREFIX, value);
12319       machopic_output_function_base_name (file);
12320       fprintf(file, "\n");
12321     }
12322 #endif
12323   else
12324     asm_fprintf (file, "%s%U%s+[.-%s%d]\n",
12325                  ASM_LONG, GOT_SYMBOL_NAME, LPREFIX, value);
12326 }
12327 \f
12328 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
12329    for the target.  */
12330
12331 void
12332 ix86_expand_clear (rtx dest)
12333 {
12334   rtx tmp;
12335
12336   /* We play register width games, which are only valid after reload.  */
12337   gcc_assert (reload_completed);
12338
12339   /* Avoid HImode and its attendant prefix byte.  */
12340   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
12341     dest = gen_rtx_REG (SImode, REGNO (dest));
12342   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
12343
12344   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
12345   if (reload_completed && (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ()))
12346     {
12347       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12348       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
12349     }
12350
12351   emit_insn (tmp);
12352 }
12353
12354 /* X is an unchanging MEM.  If it is a constant pool reference, return
12355    the constant pool rtx, else NULL.  */
12356
12357 rtx
12358 maybe_get_pool_constant (rtx x)
12359 {
12360   x = ix86_delegitimize_address (XEXP (x, 0));
12361
12362   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
12363     return get_pool_constant (x);
12364
12365   return NULL_RTX;
12366 }
12367
12368 void
12369 ix86_expand_move (enum machine_mode mode, rtx operands[])
12370 {
12371   rtx op0, op1;
12372   enum tls_model model;
12373
12374   op0 = operands[0];
12375   op1 = operands[1];
12376
12377   if (GET_CODE (op1) == SYMBOL_REF)
12378     {
12379       model = SYMBOL_REF_TLS_MODEL (op1);
12380       if (model)
12381         {
12382           op1 = legitimize_tls_address (op1, model, true);
12383           op1 = force_operand (op1, op0);
12384           if (op1 == op0)
12385             return;
12386         }
12387       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12388                && SYMBOL_REF_DLLIMPORT_P (op1))
12389         op1 = legitimize_dllimport_symbol (op1, false);
12390     }
12391   else if (GET_CODE (op1) == CONST
12392            && GET_CODE (XEXP (op1, 0)) == PLUS
12393            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
12394     {
12395       rtx addend = XEXP (XEXP (op1, 0), 1);
12396       rtx symbol = XEXP (XEXP (op1, 0), 0);
12397       rtx tmp = NULL;
12398
12399       model = SYMBOL_REF_TLS_MODEL (symbol);
12400       if (model)
12401         tmp = legitimize_tls_address (symbol, model, true);
12402       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12403                && SYMBOL_REF_DLLIMPORT_P (symbol))
12404         tmp = legitimize_dllimport_symbol (symbol, true);
12405
12406       if (tmp)
12407         {
12408           tmp = force_operand (tmp, NULL);
12409           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
12410                                      op0, 1, OPTAB_DIRECT);
12411           if (tmp == op0)
12412             return;
12413         }
12414     }
12415
12416   if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
12417     {
12418       if (TARGET_MACHO && !TARGET_64BIT)
12419         {
12420 #if TARGET_MACHO
12421           if (MACHOPIC_PURE)
12422             {
12423               rtx temp = ((reload_in_progress
12424                            || ((op0 && REG_P (op0))
12425                                && mode == Pmode))
12426                           ? op0 : gen_reg_rtx (Pmode));
12427               op1 = machopic_indirect_data_reference (op1, temp);
12428               op1 = machopic_legitimize_pic_address (op1, mode,
12429                                                      temp == op1 ? 0 : temp);
12430             }
12431           else if (MACHOPIC_INDIRECT)
12432             op1 = machopic_indirect_data_reference (op1, 0);
12433           if (op0 == op1)
12434             return;
12435 #endif
12436         }
12437       else
12438         {
12439           if (MEM_P (op0))
12440             op1 = force_reg (Pmode, op1);
12441           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
12442             {
12443               rtx reg = !can_create_pseudo_p () ? op0 : NULL_RTX;
12444               op1 = legitimize_pic_address (op1, reg);
12445               if (op0 == op1)
12446                 return;
12447             }
12448         }
12449     }
12450   else
12451     {
12452       if (MEM_P (op0)
12453           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
12454               || !push_operand (op0, mode))
12455           && MEM_P (op1))
12456         op1 = force_reg (mode, op1);
12457
12458       if (push_operand (op0, mode)
12459           && ! general_no_elim_operand (op1, mode))
12460         op1 = copy_to_mode_reg (mode, op1);
12461
12462       /* Force large constants in 64bit compilation into register
12463          to get them CSEed.  */
12464       if (can_create_pseudo_p ()
12465           && (mode == DImode) && TARGET_64BIT
12466           && immediate_operand (op1, mode)
12467           && !x86_64_zext_immediate_operand (op1, VOIDmode)
12468           && !register_operand (op0, mode)
12469           && optimize)
12470         op1 = copy_to_mode_reg (mode, op1);
12471
12472       if (can_create_pseudo_p ()
12473           && FLOAT_MODE_P (mode)
12474           && GET_CODE (op1) == CONST_DOUBLE)
12475         {
12476           /* If we are loading a floating point constant to a register,
12477              force the value to memory now, since we'll get better code
12478              out the back end.  */
12479
12480           op1 = validize_mem (force_const_mem (mode, op1));
12481           if (!register_operand (op0, mode))
12482             {
12483               rtx temp = gen_reg_rtx (mode);
12484               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
12485               emit_move_insn (op0, temp);
12486               return;
12487             }
12488         }
12489     }
12490
12491   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12492 }
12493
12494 void
12495 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
12496 {
12497   rtx op0 = operands[0], op1 = operands[1];
12498   unsigned int align = GET_MODE_ALIGNMENT (mode);
12499
12500   /* Force constants other than zero into memory.  We do not know how
12501      the instructions used to build constants modify the upper 64 bits
12502      of the register, once we have that information we may be able
12503      to handle some of them more efficiently.  */
12504   if (can_create_pseudo_p ()
12505       && register_operand (op0, mode)
12506       && (CONSTANT_P (op1)
12507           || (GET_CODE (op1) == SUBREG
12508               && CONSTANT_P (SUBREG_REG (op1))))
12509       && standard_sse_constant_p (op1) <= 0)
12510     op1 = validize_mem (force_const_mem (mode, op1));
12511
12512   /* We need to check memory alignment for SSE mode since attribute
12513      can make operands unaligned.  */
12514   if (can_create_pseudo_p ()
12515       && SSE_REG_MODE_P (mode)
12516       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
12517           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
12518     {
12519       rtx tmp[2];
12520
12521       /* ix86_expand_vector_move_misalign() does not like constants ... */
12522       if (CONSTANT_P (op1)
12523           || (GET_CODE (op1) == SUBREG
12524               && CONSTANT_P (SUBREG_REG (op1))))
12525         op1 = validize_mem (force_const_mem (mode, op1));
12526
12527       /* ... nor both arguments in memory.  */
12528       if (!register_operand (op0, mode)
12529           && !register_operand (op1, mode))
12530         op1 = force_reg (mode, op1);
12531
12532       tmp[0] = op0; tmp[1] = op1;
12533       ix86_expand_vector_move_misalign (mode, tmp);
12534       return;
12535     }
12536
12537   /* Make operand1 a register if it isn't already.  */
12538   if (can_create_pseudo_p ()
12539       && !register_operand (op0, mode)
12540       && !register_operand (op1, mode))
12541     {
12542       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
12543       return;
12544     }
12545
12546   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12547 }
12548
12549 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
12550    straight to ix86_expand_vector_move.  */
12551 /* Code generation for scalar reg-reg moves of single and double precision data:
12552      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
12553        movaps reg, reg
12554      else
12555        movss reg, reg
12556      if (x86_sse_partial_reg_dependency == true)
12557        movapd reg, reg
12558      else
12559        movsd reg, reg
12560
12561    Code generation for scalar loads of double precision data:
12562      if (x86_sse_split_regs == true)
12563        movlpd mem, reg      (gas syntax)
12564      else
12565        movsd mem, reg
12566
12567    Code generation for unaligned packed loads of single precision data
12568    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
12569      if (x86_sse_unaligned_move_optimal)
12570        movups mem, reg
12571
12572      if (x86_sse_partial_reg_dependency == true)
12573        {
12574          xorps  reg, reg
12575          movlps mem, reg
12576          movhps mem+8, reg
12577        }
12578      else
12579        {
12580          movlps mem, reg
12581          movhps mem+8, reg
12582        }
12583
12584    Code generation for unaligned packed loads of double precision data
12585    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
12586      if (x86_sse_unaligned_move_optimal)
12587        movupd mem, reg
12588
12589      if (x86_sse_split_regs == true)
12590        {
12591          movlpd mem, reg
12592          movhpd mem+8, reg
12593        }
12594      else
12595        {
12596          movsd  mem, reg
12597          movhpd mem+8, reg
12598        }
12599  */
12600
12601 void
12602 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
12603 {
12604   rtx op0, op1, m;
12605
12606   op0 = operands[0];
12607   op1 = operands[1];
12608
12609   if (TARGET_AVX)
12610     {
12611       switch (GET_MODE_CLASS (mode))
12612         {
12613         case MODE_VECTOR_INT:
12614         case MODE_INT:
12615           switch (GET_MODE_SIZE (mode))
12616             {
12617             case 16:
12618               op0 = gen_lowpart (V16QImode, op0);
12619               op1 = gen_lowpart (V16QImode, op1);
12620               emit_insn (gen_avx_movdqu (op0, op1));
12621               break;
12622             case 32:
12623               op0 = gen_lowpart (V32QImode, op0);
12624               op1 = gen_lowpart (V32QImode, op1);
12625               emit_insn (gen_avx_movdqu256 (op0, op1));
12626               break;
12627             default:
12628               gcc_unreachable ();
12629             }
12630           break;
12631         case MODE_VECTOR_FLOAT:
12632           op0 = gen_lowpart (mode, op0);
12633           op1 = gen_lowpart (mode, op1);
12634
12635           switch (mode)
12636             { 
12637             case V4SFmode:
12638               emit_insn (gen_avx_movups (op0, op1));
12639               break;
12640             case V8SFmode:
12641               emit_insn (gen_avx_movups256 (op0, op1));
12642               break;
12643             case V2DFmode:
12644               emit_insn (gen_avx_movupd (op0, op1));
12645               break;
12646             case V4DFmode:
12647               emit_insn (gen_avx_movupd256 (op0, op1));
12648               break;
12649             default:
12650               gcc_unreachable ();
12651             }
12652           break;
12653
12654         default:
12655           gcc_unreachable ();
12656         }
12657
12658       return;
12659     }
12660
12661   if (MEM_P (op1))
12662     {
12663       /* If we're optimizing for size, movups is the smallest.  */
12664       if (optimize_insn_for_size_p ())
12665         {
12666           op0 = gen_lowpart (V4SFmode, op0);
12667           op1 = gen_lowpart (V4SFmode, op1);
12668           emit_insn (gen_sse_movups (op0, op1));
12669           return;
12670         }
12671
12672       /* ??? If we have typed data, then it would appear that using
12673          movdqu is the only way to get unaligned data loaded with
12674          integer type.  */
12675       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12676         {
12677           op0 = gen_lowpart (V16QImode, op0);
12678           op1 = gen_lowpart (V16QImode, op1);
12679           emit_insn (gen_sse2_movdqu (op0, op1));
12680           return;
12681         }
12682
12683       if (TARGET_SSE2 && mode == V2DFmode)
12684         {
12685           rtx zero;
12686
12687           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12688             {
12689               op0 = gen_lowpart (V2DFmode, op0);
12690               op1 = gen_lowpart (V2DFmode, op1);
12691               emit_insn (gen_sse2_movupd (op0, op1));
12692               return;
12693             }
12694
12695           /* When SSE registers are split into halves, we can avoid
12696              writing to the top half twice.  */
12697           if (TARGET_SSE_SPLIT_REGS)
12698             {
12699               emit_clobber (op0);
12700               zero = op0;
12701             }
12702           else
12703             {
12704               /* ??? Not sure about the best option for the Intel chips.
12705                  The following would seem to satisfy; the register is
12706                  entirely cleared, breaking the dependency chain.  We
12707                  then store to the upper half, with a dependency depth
12708                  of one.  A rumor has it that Intel recommends two movsd
12709                  followed by an unpacklpd, but this is unconfirmed.  And
12710                  given that the dependency depth of the unpacklpd would
12711                  still be one, I'm not sure why this would be better.  */
12712               zero = CONST0_RTX (V2DFmode);
12713             }
12714
12715           m = adjust_address (op1, DFmode, 0);
12716           emit_insn (gen_sse2_loadlpd (op0, zero, m));
12717           m = adjust_address (op1, DFmode, 8);
12718           emit_insn (gen_sse2_loadhpd (op0, op0, m));
12719         }
12720       else
12721         {
12722           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12723             {
12724               op0 = gen_lowpart (V4SFmode, op0);
12725               op1 = gen_lowpart (V4SFmode, op1);
12726               emit_insn (gen_sse_movups (op0, op1));
12727               return;
12728             }
12729
12730           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
12731             emit_move_insn (op0, CONST0_RTX (mode));
12732           else
12733             emit_clobber (op0);
12734
12735           if (mode != V4SFmode)
12736             op0 = gen_lowpart (V4SFmode, op0);
12737           m = adjust_address (op1, V2SFmode, 0);
12738           emit_insn (gen_sse_loadlps (op0, op0, m));
12739           m = adjust_address (op1, V2SFmode, 8);
12740           emit_insn (gen_sse_loadhps (op0, op0, m));
12741         }
12742     }
12743   else if (MEM_P (op0))
12744     {
12745       /* If we're optimizing for size, movups is the smallest.  */
12746       if (optimize_insn_for_size_p ())
12747         {
12748           op0 = gen_lowpart (V4SFmode, op0);
12749           op1 = gen_lowpart (V4SFmode, op1);
12750           emit_insn (gen_sse_movups (op0, op1));
12751           return;
12752         }
12753
12754       /* ??? Similar to above, only less clear because of quote
12755          typeless stores unquote.  */
12756       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
12757           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12758         {
12759           op0 = gen_lowpart (V16QImode, op0);
12760           op1 = gen_lowpart (V16QImode, op1);
12761           emit_insn (gen_sse2_movdqu (op0, op1));
12762           return;
12763         }
12764
12765       if (TARGET_SSE2 && mode == V2DFmode)
12766         {
12767           m = adjust_address (op0, DFmode, 0);
12768           emit_insn (gen_sse2_storelpd (m, op1));
12769           m = adjust_address (op0, DFmode, 8);
12770           emit_insn (gen_sse2_storehpd (m, op1));
12771         }
12772       else
12773         {
12774           if (mode != V4SFmode)
12775             op1 = gen_lowpart (V4SFmode, op1);
12776           m = adjust_address (op0, V2SFmode, 0);
12777           emit_insn (gen_sse_storelps (m, op1));
12778           m = adjust_address (op0, V2SFmode, 8);
12779           emit_insn (gen_sse_storehps (m, op1));
12780         }
12781     }
12782   else
12783     gcc_unreachable ();
12784 }
12785
12786 /* Expand a push in MODE.  This is some mode for which we do not support
12787    proper push instructions, at least from the registers that we expect
12788    the value to live in.  */
12789
12790 void
12791 ix86_expand_push (enum machine_mode mode, rtx x)
12792 {
12793   rtx tmp;
12794
12795   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
12796                              GEN_INT (-GET_MODE_SIZE (mode)),
12797                              stack_pointer_rtx, 1, OPTAB_DIRECT);
12798   if (tmp != stack_pointer_rtx)
12799     emit_move_insn (stack_pointer_rtx, tmp);
12800
12801   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
12802
12803   /* When we push an operand onto stack, it has to be aligned at least
12804      at the function argument boundary.  However since we don't have
12805      the argument type, we can't determine the actual argument
12806      boundary.  */
12807   emit_move_insn (tmp, x);
12808 }
12809
12810 /* Helper function of ix86_fixup_binary_operands to canonicalize
12811    operand order.  Returns true if the operands should be swapped.  */
12812
12813 static bool
12814 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
12815                              rtx operands[])
12816 {
12817   rtx dst = operands[0];
12818   rtx src1 = operands[1];
12819   rtx src2 = operands[2];
12820
12821   /* If the operation is not commutative, we can't do anything.  */
12822   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
12823     return false;
12824
12825   /* Highest priority is that src1 should match dst.  */
12826   if (rtx_equal_p (dst, src1))
12827     return false;
12828   if (rtx_equal_p (dst, src2))
12829     return true;
12830
12831   /* Next highest priority is that immediate constants come second.  */
12832   if (immediate_operand (src2, mode))
12833     return false;
12834   if (immediate_operand (src1, mode))
12835     return true;
12836
12837   /* Lowest priority is that memory references should come second.  */
12838   if (MEM_P (src2))
12839     return false;
12840   if (MEM_P (src1))
12841     return true;
12842
12843   return false;
12844 }
12845
12846
12847 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
12848    destination to use for the operation.  If different from the true
12849    destination in operands[0], a copy operation will be required.  */
12850
12851 rtx
12852 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
12853                             rtx operands[])
12854 {
12855   rtx dst = operands[0];
12856   rtx src1 = operands[1];
12857   rtx src2 = operands[2];
12858
12859   /* Canonicalize operand order.  */
12860   if (ix86_swap_binary_operands_p (code, mode, operands))
12861     {
12862       rtx temp;
12863
12864       /* It is invalid to swap operands of different modes.  */
12865       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
12866
12867       temp = src1;
12868       src1 = src2;
12869       src2 = temp;
12870     }
12871
12872   /* Both source operands cannot be in memory.  */
12873   if (MEM_P (src1) && MEM_P (src2))
12874     {
12875       /* Optimization: Only read from memory once.  */
12876       if (rtx_equal_p (src1, src2))
12877         {
12878           src2 = force_reg (mode, src2);
12879           src1 = src2;
12880         }
12881       else
12882         src2 = force_reg (mode, src2);
12883     }
12884
12885   /* If the destination is memory, and we do not have matching source
12886      operands, do things in registers.  */
12887   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12888     dst = gen_reg_rtx (mode);
12889
12890   /* Source 1 cannot be a constant.  */
12891   if (CONSTANT_P (src1))
12892     src1 = force_reg (mode, src1);
12893
12894   /* Source 1 cannot be a non-matching memory.  */
12895   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12896     src1 = force_reg (mode, src1);
12897
12898   operands[1] = src1;
12899   operands[2] = src2;
12900   return dst;
12901 }
12902
12903 /* Similarly, but assume that the destination has already been
12904    set up properly.  */
12905
12906 void
12907 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
12908                                     enum machine_mode mode, rtx operands[])
12909 {
12910   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
12911   gcc_assert (dst == operands[0]);
12912 }
12913
12914 /* Attempt to expand a binary operator.  Make the expansion closer to the
12915    actual machine, then just general_operand, which will allow 3 separate
12916    memory references (one output, two input) in a single insn.  */
12917
12918 void
12919 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
12920                              rtx operands[])
12921 {
12922   rtx src1, src2, dst, op, clob;
12923
12924   dst = ix86_fixup_binary_operands (code, mode, operands);
12925   src1 = operands[1];
12926   src2 = operands[2];
12927
12928  /* Emit the instruction.  */
12929
12930   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
12931   if (reload_in_progress)
12932     {
12933       /* Reload doesn't know about the flags register, and doesn't know that
12934          it doesn't want to clobber it.  We can only do this with PLUS.  */
12935       gcc_assert (code == PLUS);
12936       emit_insn (op);
12937     }
12938   else
12939     {
12940       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12941       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
12942     }
12943
12944   /* Fix up the destination if needed.  */
12945   if (dst != operands[0])
12946     emit_move_insn (operands[0], dst);
12947 }
12948
12949 /* Return TRUE or FALSE depending on whether the binary operator meets the
12950    appropriate constraints.  */
12951
12952 int
12953 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
12954                          rtx operands[3])
12955 {
12956   rtx dst = operands[0];
12957   rtx src1 = operands[1];
12958   rtx src2 = operands[2];
12959
12960   /* Both source operands cannot be in memory.  */
12961   if (MEM_P (src1) && MEM_P (src2))
12962     return 0;
12963
12964   /* Canonicalize operand order for commutative operators.  */
12965   if (ix86_swap_binary_operands_p (code, mode, operands))
12966     {
12967       rtx temp = src1;
12968       src1 = src2;
12969       src2 = temp;
12970     }
12971
12972   /* If the destination is memory, we must have a matching source operand.  */
12973   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12974       return 0;
12975
12976   /* Source 1 cannot be a constant.  */
12977   if (CONSTANT_P (src1))
12978     return 0;
12979
12980   /* Source 1 cannot be a non-matching memory.  */
12981   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12982     return 0;
12983
12984   return 1;
12985 }
12986
12987 /* Attempt to expand a unary operator.  Make the expansion closer to the
12988    actual machine, then just general_operand, which will allow 2 separate
12989    memory references (one output, one input) in a single insn.  */
12990
12991 void
12992 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
12993                             rtx operands[])
12994 {
12995   int matching_memory;
12996   rtx src, dst, op, clob;
12997
12998   dst = operands[0];
12999   src = operands[1];
13000
13001   /* If the destination is memory, and we do not have matching source
13002      operands, do things in registers.  */
13003   matching_memory = 0;
13004   if (MEM_P (dst))
13005     {
13006       if (rtx_equal_p (dst, src))
13007         matching_memory = 1;
13008       else
13009         dst = gen_reg_rtx (mode);
13010     }
13011
13012   /* When source operand is memory, destination must match.  */
13013   if (MEM_P (src) && !matching_memory)
13014     src = force_reg (mode, src);
13015
13016   /* Emit the instruction.  */
13017
13018   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
13019   if (reload_in_progress || code == NOT)
13020     {
13021       /* Reload doesn't know about the flags register, and doesn't know that
13022          it doesn't want to clobber it.  */
13023       gcc_assert (code == NOT);
13024       emit_insn (op);
13025     }
13026   else
13027     {
13028       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13029       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
13030     }
13031
13032   /* Fix up the destination if needed.  */
13033   if (dst != operands[0])
13034     emit_move_insn (operands[0], dst);
13035 }
13036
13037 /* Return TRUE or FALSE depending on whether the unary operator meets the
13038    appropriate constraints.  */
13039
13040 int
13041 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
13042                         enum machine_mode mode ATTRIBUTE_UNUSED,
13043                         rtx operands[2] ATTRIBUTE_UNUSED)
13044 {
13045   /* If one of operands is memory, source and destination must match.  */
13046   if ((MEM_P (operands[0])
13047        || MEM_P (operands[1]))
13048       && ! rtx_equal_p (operands[0], operands[1]))
13049     return FALSE;
13050   return TRUE;
13051 }
13052
13053 /* Post-reload splitter for converting an SF or DFmode value in an
13054    SSE register into an unsigned SImode.  */
13055
13056 void
13057 ix86_split_convert_uns_si_sse (rtx operands[])
13058 {
13059   enum machine_mode vecmode;
13060   rtx value, large, zero_or_two31, input, two31, x;
13061
13062   large = operands[1];
13063   zero_or_two31 = operands[2];
13064   input = operands[3];
13065   two31 = operands[4];
13066   vecmode = GET_MODE (large);
13067   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
13068
13069   /* Load up the value into the low element.  We must ensure that the other
13070      elements are valid floats -- zero is the easiest such value.  */
13071   if (MEM_P (input))
13072     {
13073       if (vecmode == V4SFmode)
13074         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
13075       else
13076         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
13077     }
13078   else
13079     {
13080       input = gen_rtx_REG (vecmode, REGNO (input));
13081       emit_move_insn (value, CONST0_RTX (vecmode));
13082       if (vecmode == V4SFmode)
13083         emit_insn (gen_sse_movss (value, value, input));
13084       else
13085         emit_insn (gen_sse2_movsd (value, value, input));
13086     }
13087
13088   emit_move_insn (large, two31);
13089   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
13090
13091   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
13092   emit_insn (gen_rtx_SET (VOIDmode, large, x));
13093
13094   x = gen_rtx_AND (vecmode, zero_or_two31, large);
13095   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
13096
13097   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
13098   emit_insn (gen_rtx_SET (VOIDmode, value, x));
13099
13100   large = gen_rtx_REG (V4SImode, REGNO (large));
13101   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
13102
13103   x = gen_rtx_REG (V4SImode, REGNO (value));
13104   if (vecmode == V4SFmode)
13105     emit_insn (gen_sse2_cvttps2dq (x, value));
13106   else
13107     emit_insn (gen_sse2_cvttpd2dq (x, value));
13108   value = x;
13109
13110   emit_insn (gen_xorv4si3 (value, value, large));
13111 }
13112
13113 /* Convert an unsigned DImode value into a DFmode, using only SSE.
13114    Expects the 64-bit DImode to be supplied in a pair of integral
13115    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
13116    -mfpmath=sse, !optimize_size only.  */
13117
13118 void
13119 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
13120 {
13121   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
13122   rtx int_xmm, fp_xmm;
13123   rtx biases, exponents;
13124   rtx x;
13125
13126   int_xmm = gen_reg_rtx (V4SImode);
13127   if (TARGET_INTER_UNIT_MOVES)
13128     emit_insn (gen_movdi_to_sse (int_xmm, input));
13129   else if (TARGET_SSE_SPLIT_REGS)
13130     {
13131       emit_clobber (int_xmm);
13132       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
13133     }
13134   else
13135     {
13136       x = gen_reg_rtx (V2DImode);
13137       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
13138       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
13139     }
13140
13141   x = gen_rtx_CONST_VECTOR (V4SImode,
13142                             gen_rtvec (4, GEN_INT (0x43300000UL),
13143                                        GEN_INT (0x45300000UL),
13144                                        const0_rtx, const0_rtx));
13145   exponents = validize_mem (force_const_mem (V4SImode, x));
13146
13147   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
13148   emit_insn (gen_sse2_punpckldq (int_xmm, int_xmm, exponents));
13149
13150   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
13151      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
13152      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
13153      (0x1.0p84 + double(fp_value_hi_xmm)).
13154      Note these exponents differ by 32.  */
13155
13156   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
13157
13158   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
13159      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
13160   real_ldexp (&bias_lo_rvt, &dconst1, 52);
13161   real_ldexp (&bias_hi_rvt, &dconst1, 84);
13162   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
13163   x = const_double_from_real_value (bias_hi_rvt, DFmode);
13164   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
13165   biases = validize_mem (force_const_mem (V2DFmode, biases));
13166   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
13167
13168   /* Add the upper and lower DFmode values together.  */
13169   if (TARGET_SSE3)
13170     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
13171   else
13172     {
13173       x = copy_to_mode_reg (V2DFmode, fp_xmm);
13174       emit_insn (gen_sse2_unpckhpd (fp_xmm, fp_xmm, fp_xmm));
13175       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
13176     }
13177
13178   ix86_expand_vector_extract (false, target, fp_xmm, 0);
13179 }
13180
13181 /* Not used, but eases macroization of patterns.  */
13182 void
13183 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
13184                                   rtx input ATTRIBUTE_UNUSED)
13185 {
13186   gcc_unreachable ();
13187 }
13188
13189 /* Convert an unsigned SImode value into a DFmode.  Only currently used
13190    for SSE, but applicable anywhere.  */
13191
13192 void
13193 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
13194 {
13195   REAL_VALUE_TYPE TWO31r;
13196   rtx x, fp;
13197
13198   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
13199                            NULL, 1, OPTAB_DIRECT);
13200
13201   fp = gen_reg_rtx (DFmode);
13202   emit_insn (gen_floatsidf2 (fp, x));
13203
13204   real_ldexp (&TWO31r, &dconst1, 31);
13205   x = const_double_from_real_value (TWO31r, DFmode);
13206
13207   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
13208   if (x != target)
13209     emit_move_insn (target, x);
13210 }
13211
13212 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
13213    32-bit mode; otherwise we have a direct convert instruction.  */
13214
13215 void
13216 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
13217 {
13218   REAL_VALUE_TYPE TWO32r;
13219   rtx fp_lo, fp_hi, x;
13220
13221   fp_lo = gen_reg_rtx (DFmode);
13222   fp_hi = gen_reg_rtx (DFmode);
13223
13224   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
13225
13226   real_ldexp (&TWO32r, &dconst1, 32);
13227   x = const_double_from_real_value (TWO32r, DFmode);
13228   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
13229
13230   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
13231
13232   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
13233                            0, OPTAB_DIRECT);
13234   if (x != target)
13235     emit_move_insn (target, x);
13236 }
13237
13238 /* Convert an unsigned SImode value into a SFmode, using only SSE.
13239    For x86_32, -mfpmath=sse, !optimize_size only.  */
13240 void
13241 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
13242 {
13243   REAL_VALUE_TYPE ONE16r;
13244   rtx fp_hi, fp_lo, int_hi, int_lo, x;
13245
13246   real_ldexp (&ONE16r, &dconst1, 16);
13247   x = const_double_from_real_value (ONE16r, SFmode);
13248   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
13249                                       NULL, 0, OPTAB_DIRECT);
13250   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
13251                                       NULL, 0, OPTAB_DIRECT);
13252   fp_hi = gen_reg_rtx (SFmode);
13253   fp_lo = gen_reg_rtx (SFmode);
13254   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
13255   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
13256   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
13257                                0, OPTAB_DIRECT);
13258   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
13259                                0, OPTAB_DIRECT);
13260   if (!rtx_equal_p (target, fp_hi))
13261     emit_move_insn (target, fp_hi);
13262 }
13263
13264 /* A subroutine of ix86_build_signbit_mask_vector.  If VECT is true,
13265    then replicate the value for all elements of the vector
13266    register.  */
13267
13268 rtx
13269 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
13270 {
13271   rtvec v;
13272   switch (mode)
13273     {
13274     case SImode:
13275       gcc_assert (vect);
13276       v = gen_rtvec (4, value, value, value, value);
13277       return gen_rtx_CONST_VECTOR (V4SImode, v);
13278
13279     case DImode:
13280       gcc_assert (vect);
13281       v = gen_rtvec (2, value, value);
13282       return gen_rtx_CONST_VECTOR (V2DImode, v);
13283
13284     case SFmode:
13285       if (vect)
13286         v = gen_rtvec (4, value, value, value, value);
13287       else
13288         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
13289                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13290       return gen_rtx_CONST_VECTOR (V4SFmode, v);
13291
13292     case DFmode:
13293       if (vect)
13294         v = gen_rtvec (2, value, value);
13295       else
13296         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
13297       return gen_rtx_CONST_VECTOR (V2DFmode, v);
13298
13299     default:
13300       gcc_unreachable ();
13301     }
13302 }
13303
13304 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
13305    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
13306    for an SSE register.  If VECT is true, then replicate the mask for
13307    all elements of the vector register.  If INVERT is true, then create
13308    a mask excluding the sign bit.  */
13309
13310 rtx
13311 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
13312 {
13313   enum machine_mode vec_mode, imode;
13314   HOST_WIDE_INT hi, lo;
13315   int shift = 63;
13316   rtx v;
13317   rtx mask;
13318
13319   /* Find the sign bit, sign extended to 2*HWI.  */
13320   switch (mode)
13321     {
13322     case SImode:
13323     case SFmode:
13324       imode = SImode;
13325       vec_mode = (mode == SImode) ? V4SImode : V4SFmode;
13326       lo = 0x80000000, hi = lo < 0;
13327       break;
13328
13329     case DImode:
13330     case DFmode:
13331       imode = DImode;
13332       vec_mode = (mode == DImode) ? V2DImode : V2DFmode;
13333       if (HOST_BITS_PER_WIDE_INT >= 64)
13334         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
13335       else
13336         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13337       break;
13338
13339     case TImode:
13340     case TFmode:
13341       vec_mode = VOIDmode;
13342       if (HOST_BITS_PER_WIDE_INT >= 64)
13343         {
13344           imode = TImode;
13345           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
13346         }
13347       else
13348         {
13349           rtvec vec;
13350
13351           imode = DImode;
13352           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13353
13354           if (invert)
13355             {
13356               lo = ~lo, hi = ~hi;
13357               v = constm1_rtx;
13358             }
13359           else
13360             v = const0_rtx;
13361
13362           mask = immed_double_const (lo, hi, imode);
13363
13364           vec = gen_rtvec (2, v, mask);
13365           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
13366           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
13367
13368           return v;
13369         }
13370      break;
13371
13372     default:
13373       gcc_unreachable ();
13374     }
13375
13376   if (invert)
13377     lo = ~lo, hi = ~hi;
13378
13379   /* Force this value into the low part of a fp vector constant.  */
13380   mask = immed_double_const (lo, hi, imode);
13381   mask = gen_lowpart (mode, mask);
13382
13383   if (vec_mode == VOIDmode)
13384     return force_reg (mode, mask);
13385
13386   v = ix86_build_const_vector (mode, vect, mask);
13387   return force_reg (vec_mode, v);
13388 }
13389
13390 /* Generate code for floating point ABS or NEG.  */
13391
13392 void
13393 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
13394                                 rtx operands[])
13395 {
13396   rtx mask, set, use, clob, dst, src;
13397   bool use_sse = false;
13398   bool vector_mode = VECTOR_MODE_P (mode);
13399   enum machine_mode elt_mode = mode;
13400
13401   if (vector_mode)
13402     {
13403       elt_mode = GET_MODE_INNER (mode);
13404       use_sse = true;
13405     }
13406   else if (mode == TFmode)
13407     use_sse = true;
13408   else if (TARGET_SSE_MATH)
13409     use_sse = SSE_FLOAT_MODE_P (mode);
13410
13411   /* NEG and ABS performed with SSE use bitwise mask operations.
13412      Create the appropriate mask now.  */
13413   if (use_sse)
13414     mask = ix86_build_signbit_mask (elt_mode, vector_mode, code == ABS);
13415   else
13416     mask = NULL_RTX;
13417
13418   dst = operands[0];
13419   src = operands[1];
13420
13421   if (vector_mode)
13422     {
13423       set = gen_rtx_fmt_ee (code == NEG ? XOR : AND, mode, src, mask);
13424       set = gen_rtx_SET (VOIDmode, dst, set);
13425       emit_insn (set);
13426     }
13427   else
13428     {
13429       set = gen_rtx_fmt_e (code, mode, src);
13430       set = gen_rtx_SET (VOIDmode, dst, set);
13431       if (mask)
13432         {
13433           use = gen_rtx_USE (VOIDmode, mask);
13434           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13435           emit_insn (gen_rtx_PARALLEL (VOIDmode,
13436                                        gen_rtvec (3, set, use, clob)));
13437         }
13438       else
13439         emit_insn (set);
13440     }
13441 }
13442
13443 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
13444
13445 void
13446 ix86_expand_copysign (rtx operands[])
13447 {
13448   enum machine_mode mode;
13449   rtx dest, op0, op1, mask, nmask;
13450
13451   dest = operands[0];
13452   op0 = operands[1];
13453   op1 = operands[2];
13454
13455   mode = GET_MODE (dest);
13456
13457   if (GET_CODE (op0) == CONST_DOUBLE)
13458     {
13459       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
13460
13461       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
13462         op0 = simplify_unary_operation (ABS, mode, op0, mode);
13463
13464       if (mode == SFmode || mode == DFmode)
13465         {
13466           enum machine_mode vmode;
13467
13468           vmode = mode == SFmode ? V4SFmode : V2DFmode;
13469
13470           if (op0 == CONST0_RTX (mode))
13471             op0 = CONST0_RTX (vmode);
13472           else
13473             {
13474               rtvec v;
13475
13476               if (mode == SFmode)
13477                 v = gen_rtvec (4, op0, CONST0_RTX (SFmode),
13478                                CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13479               else
13480                 v = gen_rtvec (2, op0, CONST0_RTX (DFmode));
13481
13482               op0 = force_reg (vmode, gen_rtx_CONST_VECTOR (vmode, v));
13483             }
13484         }
13485       else if (op0 != CONST0_RTX (mode))
13486         op0 = force_reg (mode, op0);
13487
13488       mask = ix86_build_signbit_mask (mode, 0, 0);
13489
13490       if (mode == SFmode)
13491         copysign_insn = gen_copysignsf3_const;
13492       else if (mode == DFmode)
13493         copysign_insn = gen_copysigndf3_const;
13494       else
13495         copysign_insn = gen_copysigntf3_const;
13496
13497         emit_insn (copysign_insn (dest, op0, op1, mask));
13498     }
13499   else
13500     {
13501       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
13502
13503       nmask = ix86_build_signbit_mask (mode, 0, 1);
13504       mask = ix86_build_signbit_mask (mode, 0, 0);
13505
13506       if (mode == SFmode)
13507         copysign_insn = gen_copysignsf3_var;
13508       else if (mode == DFmode)
13509         copysign_insn = gen_copysigndf3_var;
13510       else
13511         copysign_insn = gen_copysigntf3_var;
13512
13513       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
13514     }
13515 }
13516
13517 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
13518    be a constant, and so has already been expanded into a vector constant.  */
13519
13520 void
13521 ix86_split_copysign_const (rtx operands[])
13522 {
13523   enum machine_mode mode, vmode;
13524   rtx dest, op0, op1, mask, x;
13525
13526   dest = operands[0];
13527   op0 = operands[1];
13528   op1 = operands[2];
13529   mask = operands[3];
13530
13531   mode = GET_MODE (dest);
13532   vmode = GET_MODE (mask);
13533
13534   dest = simplify_gen_subreg (vmode, dest, mode, 0);
13535   x = gen_rtx_AND (vmode, dest, mask);
13536   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13537
13538   if (op0 != CONST0_RTX (vmode))
13539     {
13540       x = gen_rtx_IOR (vmode, dest, op0);
13541       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13542     }
13543 }
13544
13545 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
13546    so we have to do two masks.  */
13547
13548 void
13549 ix86_split_copysign_var (rtx operands[])
13550 {
13551   enum machine_mode mode, vmode;
13552   rtx dest, scratch, op0, op1, mask, nmask, x;
13553
13554   dest = operands[0];
13555   scratch = operands[1];
13556   op0 = operands[2];
13557   op1 = operands[3];
13558   nmask = operands[4];
13559   mask = operands[5];
13560
13561   mode = GET_MODE (dest);
13562   vmode = GET_MODE (mask);
13563
13564   if (rtx_equal_p (op0, op1))
13565     {
13566       /* Shouldn't happen often (it's useless, obviously), but when it does
13567          we'd generate incorrect code if we continue below.  */
13568       emit_move_insn (dest, op0);
13569       return;
13570     }
13571
13572   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
13573     {
13574       gcc_assert (REGNO (op1) == REGNO (scratch));
13575
13576       x = gen_rtx_AND (vmode, scratch, mask);
13577       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13578
13579       dest = mask;
13580       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13581       x = gen_rtx_NOT (vmode, dest);
13582       x = gen_rtx_AND (vmode, x, op0);
13583       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13584     }
13585   else
13586     {
13587       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
13588         {
13589           x = gen_rtx_AND (vmode, scratch, mask);
13590         }
13591       else                                              /* alternative 2,4 */
13592         {
13593           gcc_assert (REGNO (mask) == REGNO (scratch));
13594           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
13595           x = gen_rtx_AND (vmode, scratch, op1);
13596         }
13597       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13598
13599       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
13600         {
13601           dest = simplify_gen_subreg (vmode, op0, mode, 0);
13602           x = gen_rtx_AND (vmode, dest, nmask);
13603         }
13604       else                                              /* alternative 3,4 */
13605         {
13606           gcc_assert (REGNO (nmask) == REGNO (dest));
13607           dest = nmask;
13608           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13609           x = gen_rtx_AND (vmode, dest, op0);
13610         }
13611       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13612     }
13613
13614   x = gen_rtx_IOR (vmode, dest, scratch);
13615   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13616 }
13617
13618 /* Return TRUE or FALSE depending on whether the first SET in INSN
13619    has source and destination with matching CC modes, and that the
13620    CC mode is at least as constrained as REQ_MODE.  */
13621
13622 int
13623 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
13624 {
13625   rtx set;
13626   enum machine_mode set_mode;
13627
13628   set = PATTERN (insn);
13629   if (GET_CODE (set) == PARALLEL)
13630     set = XVECEXP (set, 0, 0);
13631   gcc_assert (GET_CODE (set) == SET);
13632   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
13633
13634   set_mode = GET_MODE (SET_DEST (set));
13635   switch (set_mode)
13636     {
13637     case CCNOmode:
13638       if (req_mode != CCNOmode
13639           && (req_mode != CCmode
13640               || XEXP (SET_SRC (set), 1) != const0_rtx))
13641         return 0;
13642       break;
13643     case CCmode:
13644       if (req_mode == CCGCmode)
13645         return 0;
13646       /* FALLTHRU */
13647     case CCGCmode:
13648       if (req_mode == CCGOCmode || req_mode == CCNOmode)
13649         return 0;
13650       /* FALLTHRU */
13651     case CCGOCmode:
13652       if (req_mode == CCZmode)
13653         return 0;
13654       /* FALLTHRU */
13655     case CCZmode:
13656       break;
13657
13658     case CCAmode:
13659     case CCCmode:
13660     case CCOmode:
13661     case CCSmode:
13662       if (set_mode != req_mode)
13663         return 0;
13664       break;
13665
13666     default:
13667       gcc_unreachable ();
13668     }
13669
13670   return (GET_MODE (SET_SRC (set)) == set_mode);
13671 }
13672
13673 /* Generate insn patterns to do an integer compare of OPERANDS.  */
13674
13675 static rtx
13676 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
13677 {
13678   enum machine_mode cmpmode;
13679   rtx tmp, flags;
13680
13681   cmpmode = SELECT_CC_MODE (code, op0, op1);
13682   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
13683
13684   /* This is very simple, but making the interface the same as in the
13685      FP case makes the rest of the code easier.  */
13686   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
13687   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
13688
13689   /* Return the test that should be put into the flags user, i.e.
13690      the bcc, scc, or cmov instruction.  */
13691   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
13692 }
13693
13694 /* Figure out whether to use ordered or unordered fp comparisons.
13695    Return the appropriate mode to use.  */
13696
13697 enum machine_mode
13698 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
13699 {
13700   /* ??? In order to make all comparisons reversible, we do all comparisons
13701      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
13702      all forms trapping and nontrapping comparisons, we can make inequality
13703      comparisons trapping again, since it results in better code when using
13704      FCOM based compares.  */
13705   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
13706 }
13707
13708 enum machine_mode
13709 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
13710 {
13711   enum machine_mode mode = GET_MODE (op0);
13712
13713   if (SCALAR_FLOAT_MODE_P (mode))
13714     {
13715       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
13716       return ix86_fp_compare_mode (code);
13717     }
13718
13719   switch (code)
13720     {
13721       /* Only zero flag is needed.  */
13722     case EQ:                    /* ZF=0 */
13723     case NE:                    /* ZF!=0 */
13724       return CCZmode;
13725       /* Codes needing carry flag.  */
13726     case GEU:                   /* CF=0 */
13727     case LTU:                   /* CF=1 */
13728       /* Detect overflow checks.  They need just the carry flag.  */
13729       if (GET_CODE (op0) == PLUS
13730           && rtx_equal_p (op1, XEXP (op0, 0)))
13731         return CCCmode;
13732       else
13733         return CCmode;
13734     case GTU:                   /* CF=0 & ZF=0 */
13735     case LEU:                   /* CF=1 | ZF=1 */
13736       /* Detect overflow checks.  They need just the carry flag.  */
13737       if (GET_CODE (op0) == MINUS
13738           && rtx_equal_p (op1, XEXP (op0, 0)))
13739         return CCCmode;
13740       else
13741         return CCmode;
13742       /* Codes possibly doable only with sign flag when
13743          comparing against zero.  */
13744     case GE:                    /* SF=OF   or   SF=0 */
13745     case LT:                    /* SF<>OF  or   SF=1 */
13746       if (op1 == const0_rtx)
13747         return CCGOCmode;
13748       else
13749         /* For other cases Carry flag is not required.  */
13750         return CCGCmode;
13751       /* Codes doable only with sign flag when comparing
13752          against zero, but we miss jump instruction for it
13753          so we need to use relational tests against overflow
13754          that thus needs to be zero.  */
13755     case GT:                    /* ZF=0 & SF=OF */
13756     case LE:                    /* ZF=1 | SF<>OF */
13757       if (op1 == const0_rtx)
13758         return CCNOmode;
13759       else
13760         return CCGCmode;
13761       /* strcmp pattern do (use flags) and combine may ask us for proper
13762          mode.  */
13763     case USE:
13764       return CCmode;
13765     default:
13766       gcc_unreachable ();
13767     }
13768 }
13769
13770 /* Return the fixed registers used for condition codes.  */
13771
13772 static bool
13773 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
13774 {
13775   *p1 = FLAGS_REG;
13776   *p2 = FPSR_REG;
13777   return true;
13778 }
13779
13780 /* If two condition code modes are compatible, return a condition code
13781    mode which is compatible with both.  Otherwise, return
13782    VOIDmode.  */
13783
13784 static enum machine_mode
13785 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
13786 {
13787   if (m1 == m2)
13788     return m1;
13789
13790   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
13791     return VOIDmode;
13792
13793   if ((m1 == CCGCmode && m2 == CCGOCmode)
13794       || (m1 == CCGOCmode && m2 == CCGCmode))
13795     return CCGCmode;
13796
13797   switch (m1)
13798     {
13799     default:
13800       gcc_unreachable ();
13801
13802     case CCmode:
13803     case CCGCmode:
13804     case CCGOCmode:
13805     case CCNOmode:
13806     case CCAmode:
13807     case CCCmode:
13808     case CCOmode:
13809     case CCSmode:
13810     case CCZmode:
13811       switch (m2)
13812         {
13813         default:
13814           return VOIDmode;
13815
13816         case CCmode:
13817         case CCGCmode:
13818         case CCGOCmode:
13819         case CCNOmode:
13820         case CCAmode:
13821         case CCCmode:
13822         case CCOmode:
13823         case CCSmode:
13824         case CCZmode:
13825           return CCmode;
13826         }
13827
13828     case CCFPmode:
13829     case CCFPUmode:
13830       /* These are only compatible with themselves, which we already
13831          checked above.  */
13832       return VOIDmode;
13833     }
13834 }
13835
13836 /* Split comparison code CODE into comparisons we can do using branch
13837    instructions.  BYPASS_CODE is comparison code for branch that will
13838    branch around FIRST_CODE and SECOND_CODE.  If some of branches
13839    is not required, set value to UNKNOWN.
13840    We never require more than two branches.  */
13841
13842 void
13843 ix86_fp_comparison_codes (enum rtx_code code, enum rtx_code *bypass_code,
13844                           enum rtx_code *first_code,
13845                           enum rtx_code *second_code)
13846 {
13847   *first_code = code;
13848   *bypass_code = UNKNOWN;
13849   *second_code = UNKNOWN;
13850
13851   /* The fcomi comparison sets flags as follows:
13852
13853      cmp    ZF PF CF
13854      >      0  0  0
13855      <      0  0  1
13856      =      1  0  0
13857      un     1  1  1 */
13858
13859   switch (code)
13860     {
13861     case GT:                    /* GTU - CF=0 & ZF=0 */
13862     case GE:                    /* GEU - CF=0 */
13863     case ORDERED:               /* PF=0 */
13864     case UNORDERED:             /* PF=1 */
13865     case UNEQ:                  /* EQ - ZF=1 */
13866     case UNLT:                  /* LTU - CF=1 */
13867     case UNLE:                  /* LEU - CF=1 | ZF=1 */
13868     case LTGT:                  /* EQ - ZF=0 */
13869       break;
13870     case LT:                    /* LTU - CF=1 - fails on unordered */
13871       *first_code = UNLT;
13872       *bypass_code = UNORDERED;
13873       break;
13874     case LE:                    /* LEU - CF=1 | ZF=1 - fails on unordered */
13875       *first_code = UNLE;
13876       *bypass_code = UNORDERED;
13877       break;
13878     case EQ:                    /* EQ - ZF=1 - fails on unordered */
13879       *first_code = UNEQ;
13880       *bypass_code = UNORDERED;
13881       break;
13882     case NE:                    /* NE - ZF=0 - fails on unordered */
13883       *first_code = LTGT;
13884       *second_code = UNORDERED;
13885       break;
13886     case UNGE:                  /* GEU - CF=0 - fails on unordered */
13887       *first_code = GE;
13888       *second_code = UNORDERED;
13889       break;
13890     case UNGT:                  /* GTU - CF=0 & ZF=0 - fails on unordered */
13891       *first_code = GT;
13892       *second_code = UNORDERED;
13893       break;
13894     default:
13895       gcc_unreachable ();
13896     }
13897   if (!TARGET_IEEE_FP)
13898     {
13899       *second_code = UNKNOWN;
13900       *bypass_code = UNKNOWN;
13901     }
13902 }
13903
13904 /* Return cost of comparison done fcom + arithmetics operations on AX.
13905    All following functions do use number of instructions as a cost metrics.
13906    In future this should be tweaked to compute bytes for optimize_size and
13907    take into account performance of various instructions on various CPUs.  */
13908 static int
13909 ix86_fp_comparison_arithmetics_cost (enum rtx_code code)
13910 {
13911   if (!TARGET_IEEE_FP)
13912     return 4;
13913   /* The cost of code output by ix86_expand_fp_compare.  */
13914   switch (code)
13915     {
13916     case UNLE:
13917     case UNLT:
13918     case LTGT:
13919     case GT:
13920     case GE:
13921     case UNORDERED:
13922     case ORDERED:
13923     case UNEQ:
13924       return 4;
13925       break;
13926     case LT:
13927     case NE:
13928     case EQ:
13929     case UNGE:
13930       return 5;
13931       break;
13932     case LE:
13933     case UNGT:
13934       return 6;
13935       break;
13936     default:
13937       gcc_unreachable ();
13938     }
13939 }
13940
13941 /* Return cost of comparison done using fcomi operation.
13942    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13943 static int
13944 ix86_fp_comparison_fcomi_cost (enum rtx_code code)
13945 {
13946   enum rtx_code bypass_code, first_code, second_code;
13947   /* Return arbitrarily high cost when instruction is not supported - this
13948      prevents gcc from using it.  */
13949   if (!TARGET_CMOVE)
13950     return 1024;
13951   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13952   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 2;
13953 }
13954
13955 /* Return cost of comparison done using sahf operation.
13956    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13957 static int
13958 ix86_fp_comparison_sahf_cost (enum rtx_code code)
13959 {
13960   enum rtx_code bypass_code, first_code, second_code;
13961   /* Return arbitrarily high cost when instruction is not preferred - this
13962      avoids gcc from using it.  */
13963   if (!(TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ())))
13964     return 1024;
13965   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13966   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 3;
13967 }
13968
13969 /* Compute cost of the comparison done using any method.
13970    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13971 static int
13972 ix86_fp_comparison_cost (enum rtx_code code)
13973 {
13974   int fcomi_cost, sahf_cost, arithmetics_cost = 1024;
13975   int min;
13976
13977   fcomi_cost = ix86_fp_comparison_fcomi_cost (code);
13978   sahf_cost = ix86_fp_comparison_sahf_cost (code);
13979
13980   min = arithmetics_cost = ix86_fp_comparison_arithmetics_cost (code);
13981   if (min > sahf_cost)
13982     min = sahf_cost;
13983   if (min > fcomi_cost)
13984     min = fcomi_cost;
13985   return min;
13986 }
13987
13988 /* Return true if we should use an FCOMI instruction for this
13989    fp comparison.  */
13990
13991 int
13992 ix86_use_fcomi_compare (enum rtx_code code ATTRIBUTE_UNUSED)
13993 {
13994   enum rtx_code swapped_code = swap_condition (code);
13995
13996   return ((ix86_fp_comparison_cost (code)
13997            == ix86_fp_comparison_fcomi_cost (code))
13998           || (ix86_fp_comparison_cost (swapped_code)
13999               == ix86_fp_comparison_fcomi_cost (swapped_code)));
14000 }
14001
14002 /* Swap, force into registers, or otherwise massage the two operands
14003    to a fp comparison.  The operands are updated in place; the new
14004    comparison code is returned.  */
14005
14006 static enum rtx_code
14007 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
14008 {
14009   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
14010   rtx op0 = *pop0, op1 = *pop1;
14011   enum machine_mode op_mode = GET_MODE (op0);
14012   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
14013
14014   /* All of the unordered compare instructions only work on registers.
14015      The same is true of the fcomi compare instructions.  The XFmode
14016      compare instructions require registers except when comparing
14017      against zero or when converting operand 1 from fixed point to
14018      floating point.  */
14019
14020   if (!is_sse
14021       && (fpcmp_mode == CCFPUmode
14022           || (op_mode == XFmode
14023               && ! (standard_80387_constant_p (op0) == 1
14024                     || standard_80387_constant_p (op1) == 1)
14025               && GET_CODE (op1) != FLOAT)
14026           || ix86_use_fcomi_compare (code)))
14027     {
14028       op0 = force_reg (op_mode, op0);
14029       op1 = force_reg (op_mode, op1);
14030     }
14031   else
14032     {
14033       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
14034          things around if they appear profitable, otherwise force op0
14035          into a register.  */
14036
14037       if (standard_80387_constant_p (op0) == 0
14038           || (MEM_P (op0)
14039               && ! (standard_80387_constant_p (op1) == 0
14040                     || MEM_P (op1))))
14041         {
14042           rtx tmp;
14043           tmp = op0, op0 = op1, op1 = tmp;
14044           code = swap_condition (code);
14045         }
14046
14047       if (!REG_P (op0))
14048         op0 = force_reg (op_mode, op0);
14049
14050       if (CONSTANT_P (op1))
14051         {
14052           int tmp = standard_80387_constant_p (op1);
14053           if (tmp == 0)
14054             op1 = validize_mem (force_const_mem (op_mode, op1));
14055           else if (tmp == 1)
14056             {
14057               if (TARGET_CMOVE)
14058                 op1 = force_reg (op_mode, op1);
14059             }
14060           else
14061             op1 = force_reg (op_mode, op1);
14062         }
14063     }
14064
14065   /* Try to rearrange the comparison to make it cheaper.  */
14066   if (ix86_fp_comparison_cost (code)
14067       > ix86_fp_comparison_cost (swap_condition (code))
14068       && (REG_P (op1) || can_create_pseudo_p ()))
14069     {
14070       rtx tmp;
14071       tmp = op0, op0 = op1, op1 = tmp;
14072       code = swap_condition (code);
14073       if (!REG_P (op0))
14074         op0 = force_reg (op_mode, op0);
14075     }
14076
14077   *pop0 = op0;
14078   *pop1 = op1;
14079   return code;
14080 }
14081
14082 /* Convert comparison codes we use to represent FP comparison to integer
14083    code that will result in proper branch.  Return UNKNOWN if no such code
14084    is available.  */
14085
14086 enum rtx_code
14087 ix86_fp_compare_code_to_integer (enum rtx_code code)
14088 {
14089   switch (code)
14090     {
14091     case GT:
14092       return GTU;
14093     case GE:
14094       return GEU;
14095     case ORDERED:
14096     case UNORDERED:
14097       return code;
14098       break;
14099     case UNEQ:
14100       return EQ;
14101       break;
14102     case UNLT:
14103       return LTU;
14104       break;
14105     case UNLE:
14106       return LEU;
14107       break;
14108     case LTGT:
14109       return NE;
14110       break;
14111     default:
14112       return UNKNOWN;
14113     }
14114 }
14115
14116 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
14117
14118 static rtx
14119 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch,
14120                         rtx *second_test, rtx *bypass_test)
14121 {
14122   enum machine_mode fpcmp_mode, intcmp_mode;
14123   rtx tmp, tmp2;
14124   int cost = ix86_fp_comparison_cost (code);
14125   enum rtx_code bypass_code, first_code, second_code;
14126
14127   fpcmp_mode = ix86_fp_compare_mode (code);
14128   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
14129
14130   if (second_test)
14131     *second_test = NULL_RTX;
14132   if (bypass_test)
14133     *bypass_test = NULL_RTX;
14134
14135   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14136
14137   /* Do fcomi/sahf based test when profitable.  */
14138   if (ix86_fp_comparison_arithmetics_cost (code) > cost
14139       && (bypass_code == UNKNOWN || bypass_test)
14140       && (second_code == UNKNOWN || second_test))
14141     {
14142       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14143       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
14144                          tmp);
14145       if (TARGET_CMOVE)
14146         emit_insn (tmp);
14147       else
14148         {
14149           gcc_assert (TARGET_SAHF);
14150
14151           if (!scratch)
14152             scratch = gen_reg_rtx (HImode);
14153           tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
14154
14155           emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
14156         }
14157
14158       /* The FP codes work out to act like unsigned.  */
14159       intcmp_mode = fpcmp_mode;
14160       code = first_code;
14161       if (bypass_code != UNKNOWN)
14162         *bypass_test = gen_rtx_fmt_ee (bypass_code, VOIDmode,
14163                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
14164                                        const0_rtx);
14165       if (second_code != UNKNOWN)
14166         *second_test = gen_rtx_fmt_ee (second_code, VOIDmode,
14167                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
14168                                        const0_rtx);
14169     }
14170   else
14171     {
14172       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
14173       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14174       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
14175       if (!scratch)
14176         scratch = gen_reg_rtx (HImode);
14177       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
14178
14179       /* In the unordered case, we have to check C2 for NaN's, which
14180          doesn't happen to work out to anything nice combination-wise.
14181          So do some bit twiddling on the value we've got in AH to come
14182          up with an appropriate set of condition codes.  */
14183
14184       intcmp_mode = CCNOmode;
14185       switch (code)
14186         {
14187         case GT:
14188         case UNGT:
14189           if (code == GT || !TARGET_IEEE_FP)
14190             {
14191               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14192               code = EQ;
14193             }
14194           else
14195             {
14196               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14197               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14198               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
14199               intcmp_mode = CCmode;
14200               code = GEU;
14201             }
14202           break;
14203         case LT:
14204         case UNLT:
14205           if (code == LT && TARGET_IEEE_FP)
14206             {
14207               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14208               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x01)));
14209               intcmp_mode = CCmode;
14210               code = EQ;
14211             }
14212           else
14213             {
14214               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x01)));
14215               code = NE;
14216             }
14217           break;
14218         case GE:
14219         case UNGE:
14220           if (code == GE || !TARGET_IEEE_FP)
14221             {
14222               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
14223               code = EQ;
14224             }
14225           else
14226             {
14227               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14228               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14229                                              GEN_INT (0x01)));
14230               code = NE;
14231             }
14232           break;
14233         case LE:
14234         case UNLE:
14235           if (code == LE && TARGET_IEEE_FP)
14236             {
14237               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14238               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14239               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14240               intcmp_mode = CCmode;
14241               code = LTU;
14242             }
14243           else
14244             {
14245               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14246               code = NE;
14247             }
14248           break;
14249         case EQ:
14250         case UNEQ:
14251           if (code == EQ && TARGET_IEEE_FP)
14252             {
14253               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14254               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14255               intcmp_mode = CCmode;
14256               code = EQ;
14257             }
14258           else
14259             {
14260               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14261               code = NE;
14262               break;
14263             }
14264           break;
14265         case NE:
14266         case LTGT:
14267           if (code == NE && TARGET_IEEE_FP)
14268             {
14269               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14270               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14271                                              GEN_INT (0x40)));
14272               code = NE;
14273             }
14274           else
14275             {
14276               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14277               code = EQ;
14278             }
14279           break;
14280
14281         case UNORDERED:
14282           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14283           code = NE;
14284           break;
14285         case ORDERED:
14286           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14287           code = EQ;
14288           break;
14289
14290         default:
14291           gcc_unreachable ();
14292         }
14293     }
14294
14295   /* Return the test that should be put into the flags user, i.e.
14296      the bcc, scc, or cmov instruction.  */
14297   return gen_rtx_fmt_ee (code, VOIDmode,
14298                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
14299                          const0_rtx);
14300 }
14301
14302 rtx
14303 ix86_expand_compare (enum rtx_code code, rtx *second_test, rtx *bypass_test)
14304 {
14305   rtx op0, op1, ret;
14306   op0 = ix86_compare_op0;
14307   op1 = ix86_compare_op1;
14308
14309   if (second_test)
14310     *second_test = NULL_RTX;
14311   if (bypass_test)
14312     *bypass_test = NULL_RTX;
14313
14314   if (ix86_compare_emitted)
14315     {
14316       ret = gen_rtx_fmt_ee (code, VOIDmode, ix86_compare_emitted, const0_rtx);
14317       ix86_compare_emitted = NULL_RTX;
14318     }
14319   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
14320     {
14321       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
14322       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
14323                                     second_test, bypass_test);
14324     }
14325   else
14326     ret = ix86_expand_int_compare (code, op0, op1);
14327
14328   return ret;
14329 }
14330
14331 /* Return true if the CODE will result in nontrivial jump sequence.  */
14332 bool
14333 ix86_fp_jump_nontrivial_p (enum rtx_code code)
14334 {
14335   enum rtx_code bypass_code, first_code, second_code;
14336   if (!TARGET_CMOVE)
14337     return true;
14338   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14339   return bypass_code != UNKNOWN || second_code != UNKNOWN;
14340 }
14341
14342 void
14343 ix86_expand_branch (enum rtx_code code, rtx label)
14344 {
14345   rtx tmp;
14346
14347   /* If we have emitted a compare insn, go straight to simple.
14348      ix86_expand_compare won't emit anything if ix86_compare_emitted
14349      is non NULL.  */
14350   if (ix86_compare_emitted)
14351     goto simple;
14352
14353   switch (GET_MODE (ix86_compare_op0))
14354     {
14355     case QImode:
14356     case HImode:
14357     case SImode:
14358       simple:
14359       tmp = ix86_expand_compare (code, NULL, NULL);
14360       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14361                                   gen_rtx_LABEL_REF (VOIDmode, label),
14362                                   pc_rtx);
14363       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
14364       return;
14365
14366     case SFmode:
14367     case DFmode:
14368     case XFmode:
14369       {
14370         rtvec vec;
14371         int use_fcomi;
14372         enum rtx_code bypass_code, first_code, second_code;
14373
14374         code = ix86_prepare_fp_compare_args (code, &ix86_compare_op0,
14375                                              &ix86_compare_op1);
14376
14377         ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14378
14379         /* Check whether we will use the natural sequence with one jump.  If
14380            so, we can expand jump early.  Otherwise delay expansion by
14381            creating compound insn to not confuse optimizers.  */
14382         if (bypass_code == UNKNOWN && second_code == UNKNOWN)
14383           {
14384             ix86_split_fp_branch (code, ix86_compare_op0, ix86_compare_op1,
14385                                   gen_rtx_LABEL_REF (VOIDmode, label),
14386                                   pc_rtx, NULL_RTX, NULL_RTX);
14387           }
14388         else
14389           {
14390             tmp = gen_rtx_fmt_ee (code, VOIDmode,
14391                                   ix86_compare_op0, ix86_compare_op1);
14392             tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14393                                         gen_rtx_LABEL_REF (VOIDmode, label),
14394                                         pc_rtx);
14395             tmp = gen_rtx_SET (VOIDmode, pc_rtx, tmp);
14396
14397             use_fcomi = ix86_use_fcomi_compare (code);
14398             vec = rtvec_alloc (3 + !use_fcomi);
14399             RTVEC_ELT (vec, 0) = tmp;
14400             RTVEC_ELT (vec, 1)
14401               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FPSR_REG));
14402             RTVEC_ELT (vec, 2)
14403               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FLAGS_REG));
14404             if (! use_fcomi)
14405               RTVEC_ELT (vec, 3)
14406                 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (HImode));
14407
14408             emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, vec));
14409           }
14410         return;
14411       }
14412
14413     case DImode:
14414       if (TARGET_64BIT)
14415         goto simple;
14416     case TImode:
14417       /* Expand DImode branch into multiple compare+branch.  */
14418       {
14419         rtx lo[2], hi[2], label2;
14420         enum rtx_code code1, code2, code3;
14421         enum machine_mode submode;
14422
14423         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
14424           {
14425             tmp = ix86_compare_op0;
14426             ix86_compare_op0 = ix86_compare_op1;
14427             ix86_compare_op1 = tmp;
14428             code = swap_condition (code);
14429           }
14430         if (GET_MODE (ix86_compare_op0) == DImode)
14431           {
14432             split_di (&ix86_compare_op0, 1, lo+0, hi+0);
14433             split_di (&ix86_compare_op1, 1, lo+1, hi+1);
14434             submode = SImode;
14435           }
14436         else
14437           {
14438             split_ti (&ix86_compare_op0, 1, lo+0, hi+0);
14439             split_ti (&ix86_compare_op1, 1, lo+1, hi+1);
14440             submode = DImode;
14441           }
14442
14443         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
14444            avoid two branches.  This costs one extra insn, so disable when
14445            optimizing for size.  */
14446
14447         if ((code == EQ || code == NE)
14448             && (!optimize_insn_for_size_p ()
14449                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
14450           {
14451             rtx xor0, xor1;
14452
14453             xor1 = hi[0];
14454             if (hi[1] != const0_rtx)
14455               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
14456                                    NULL_RTX, 0, OPTAB_WIDEN);
14457
14458             xor0 = lo[0];
14459             if (lo[1] != const0_rtx)
14460               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
14461                                    NULL_RTX, 0, OPTAB_WIDEN);
14462
14463             tmp = expand_binop (submode, ior_optab, xor1, xor0,
14464                                 NULL_RTX, 0, OPTAB_WIDEN);
14465
14466             ix86_compare_op0 = tmp;
14467             ix86_compare_op1 = const0_rtx;
14468             ix86_expand_branch (code, label);
14469             return;
14470           }
14471
14472         /* Otherwise, if we are doing less-than or greater-or-equal-than,
14473            op1 is a constant and the low word is zero, then we can just
14474            examine the high word.  Similarly for low word -1 and
14475            less-or-equal-than or greater-than.  */
14476
14477         if (CONST_INT_P (hi[1]))
14478           switch (code)
14479             {
14480             case LT: case LTU: case GE: case GEU:
14481               if (lo[1] == const0_rtx)
14482                 {
14483                   ix86_compare_op0 = hi[0];
14484                   ix86_compare_op1 = hi[1];
14485                   ix86_expand_branch (code, label);
14486                   return;
14487                 }
14488               break;
14489             case LE: case LEU: case GT: case GTU:
14490               if (lo[1] == constm1_rtx)
14491                 {
14492                   ix86_compare_op0 = hi[0];
14493                   ix86_compare_op1 = hi[1];
14494                   ix86_expand_branch (code, label);
14495                   return;
14496                 }
14497               break;
14498             default:
14499               break;
14500             }
14501
14502         /* Otherwise, we need two or three jumps.  */
14503
14504         label2 = gen_label_rtx ();
14505
14506         code1 = code;
14507         code2 = swap_condition (code);
14508         code3 = unsigned_condition (code);
14509
14510         switch (code)
14511           {
14512           case LT: case GT: case LTU: case GTU:
14513             break;
14514
14515           case LE:   code1 = LT;  code2 = GT;  break;
14516           case GE:   code1 = GT;  code2 = LT;  break;
14517           case LEU:  code1 = LTU; code2 = GTU; break;
14518           case GEU:  code1 = GTU; code2 = LTU; break;
14519
14520           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
14521           case NE:   code2 = UNKNOWN; break;
14522
14523           default:
14524             gcc_unreachable ();
14525           }
14526
14527         /*
14528          * a < b =>
14529          *    if (hi(a) < hi(b)) goto true;
14530          *    if (hi(a) > hi(b)) goto false;
14531          *    if (lo(a) < lo(b)) goto true;
14532          *  false:
14533          */
14534
14535         ix86_compare_op0 = hi[0];
14536         ix86_compare_op1 = hi[1];
14537
14538         if (code1 != UNKNOWN)
14539           ix86_expand_branch (code1, label);
14540         if (code2 != UNKNOWN)
14541           ix86_expand_branch (code2, label2);
14542
14543         ix86_compare_op0 = lo[0];
14544         ix86_compare_op1 = lo[1];
14545         ix86_expand_branch (code3, label);
14546
14547         if (code2 != UNKNOWN)
14548           emit_label (label2);
14549         return;
14550       }
14551
14552     default:
14553       gcc_unreachable ();
14554     }
14555 }
14556
14557 /* Split branch based on floating point condition.  */
14558 void
14559 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
14560                       rtx target1, rtx target2, rtx tmp, rtx pushed)
14561 {
14562   rtx second, bypass;
14563   rtx label = NULL_RTX;
14564   rtx condition;
14565   int bypass_probability = -1, second_probability = -1, probability = -1;
14566   rtx i;
14567
14568   if (target2 != pc_rtx)
14569     {
14570       rtx tmp = target2;
14571       code = reverse_condition_maybe_unordered (code);
14572       target2 = target1;
14573       target1 = tmp;
14574     }
14575
14576   condition = ix86_expand_fp_compare (code, op1, op2,
14577                                       tmp, &second, &bypass);
14578
14579   /* Remove pushed operand from stack.  */
14580   if (pushed)
14581     ix86_free_from_memory (GET_MODE (pushed));
14582
14583   if (split_branch_probability >= 0)
14584     {
14585       /* Distribute the probabilities across the jumps.
14586          Assume the BYPASS and SECOND to be always test
14587          for UNORDERED.  */
14588       probability = split_branch_probability;
14589
14590       /* Value of 1 is low enough to make no need for probability
14591          to be updated.  Later we may run some experiments and see
14592          if unordered values are more frequent in practice.  */
14593       if (bypass)
14594         bypass_probability = 1;
14595       if (second)
14596         second_probability = 1;
14597     }
14598   if (bypass != NULL_RTX)
14599     {
14600       label = gen_label_rtx ();
14601       i = emit_jump_insn (gen_rtx_SET
14602                           (VOIDmode, pc_rtx,
14603                            gen_rtx_IF_THEN_ELSE (VOIDmode,
14604                                                  bypass,
14605                                                  gen_rtx_LABEL_REF (VOIDmode,
14606                                                                     label),
14607                                                  pc_rtx)));
14608       if (bypass_probability >= 0)
14609         REG_NOTES (i)
14610           = gen_rtx_EXPR_LIST (REG_BR_PROB,
14611                                GEN_INT (bypass_probability),
14612                                REG_NOTES (i));
14613     }
14614   i = emit_jump_insn (gen_rtx_SET
14615                       (VOIDmode, pc_rtx,
14616                        gen_rtx_IF_THEN_ELSE (VOIDmode,
14617                                              condition, target1, target2)));
14618   if (probability >= 0)
14619     REG_NOTES (i)
14620       = gen_rtx_EXPR_LIST (REG_BR_PROB,
14621                            GEN_INT (probability),
14622                            REG_NOTES (i));
14623   if (second != NULL_RTX)
14624     {
14625       i = emit_jump_insn (gen_rtx_SET
14626                           (VOIDmode, pc_rtx,
14627                            gen_rtx_IF_THEN_ELSE (VOIDmode, second, target1,
14628                                                  target2)));
14629       if (second_probability >= 0)
14630         REG_NOTES (i)
14631           = gen_rtx_EXPR_LIST (REG_BR_PROB,
14632                                GEN_INT (second_probability),
14633                                REG_NOTES (i));
14634     }
14635   if (label != NULL_RTX)
14636     emit_label (label);
14637 }
14638
14639 int
14640 ix86_expand_setcc (enum rtx_code code, rtx dest)
14641 {
14642   rtx ret, tmp, tmpreg, equiv;
14643   rtx second_test, bypass_test;
14644
14645   if (GET_MODE (ix86_compare_op0) == (TARGET_64BIT ? TImode : DImode))
14646     return 0; /* FAIL */
14647
14648   gcc_assert (GET_MODE (dest) == QImode);
14649
14650   ret = ix86_expand_compare (code, &second_test, &bypass_test);
14651   PUT_MODE (ret, QImode);
14652
14653   tmp = dest;
14654   tmpreg = dest;
14655
14656   emit_insn (gen_rtx_SET (VOIDmode, tmp, ret));
14657   if (bypass_test || second_test)
14658     {
14659       rtx test = second_test;
14660       int bypass = 0;
14661       rtx tmp2 = gen_reg_rtx (QImode);
14662       if (bypass_test)
14663         {
14664           gcc_assert (!second_test);
14665           test = bypass_test;
14666           bypass = 1;
14667           PUT_CODE (test, reverse_condition_maybe_unordered (GET_CODE (test)));
14668         }
14669       PUT_MODE (test, QImode);
14670       emit_insn (gen_rtx_SET (VOIDmode, tmp2, test));
14671
14672       if (bypass)
14673         emit_insn (gen_andqi3 (tmp, tmpreg, tmp2));
14674       else
14675         emit_insn (gen_iorqi3 (tmp, tmpreg, tmp2));
14676     }
14677
14678   /* Attach a REG_EQUAL note describing the comparison result.  */
14679   if (ix86_compare_op0 && ix86_compare_op1)
14680     {
14681       equiv = simplify_gen_relational (code, QImode,
14682                                        GET_MODE (ix86_compare_op0),
14683                                        ix86_compare_op0, ix86_compare_op1);
14684       set_unique_reg_note (get_last_insn (), REG_EQUAL, equiv);
14685     }
14686
14687   return 1; /* DONE */
14688 }
14689
14690 /* Expand comparison setting or clearing carry flag.  Return true when
14691    successful and set pop for the operation.  */
14692 static bool
14693 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
14694 {
14695   enum machine_mode mode =
14696     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
14697
14698   /* Do not handle DImode compares that go through special path.  */
14699   if (mode == (TARGET_64BIT ? TImode : DImode))
14700     return false;
14701
14702   if (SCALAR_FLOAT_MODE_P (mode))
14703     {
14704       rtx second_test = NULL, bypass_test = NULL;
14705       rtx compare_op, compare_seq;
14706
14707       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
14708
14709       /* Shortcut:  following common codes never translate
14710          into carry flag compares.  */
14711       if (code == EQ || code == NE || code == UNEQ || code == LTGT
14712           || code == ORDERED || code == UNORDERED)
14713         return false;
14714
14715       /* These comparisons require zero flag; swap operands so they won't.  */
14716       if ((code == GT || code == UNLE || code == LE || code == UNGT)
14717           && !TARGET_IEEE_FP)
14718         {
14719           rtx tmp = op0;
14720           op0 = op1;
14721           op1 = tmp;
14722           code = swap_condition (code);
14723         }
14724
14725       /* Try to expand the comparison and verify that we end up with
14726          carry flag based comparison.  This fails to be true only when
14727          we decide to expand comparison using arithmetic that is not
14728          too common scenario.  */
14729       start_sequence ();
14730       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
14731                                            &second_test, &bypass_test);
14732       compare_seq = get_insns ();
14733       end_sequence ();
14734
14735       if (second_test || bypass_test)
14736         return false;
14737
14738       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
14739           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
14740         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
14741       else
14742         code = GET_CODE (compare_op);
14743
14744       if (code != LTU && code != GEU)
14745         return false;
14746
14747       emit_insn (compare_seq);
14748       *pop = compare_op;
14749       return true;
14750     }
14751
14752   if (!INTEGRAL_MODE_P (mode))
14753     return false;
14754
14755   switch (code)
14756     {
14757     case LTU:
14758     case GEU:
14759       break;
14760
14761     /* Convert a==0 into (unsigned)a<1.  */
14762     case EQ:
14763     case NE:
14764       if (op1 != const0_rtx)
14765         return false;
14766       op1 = const1_rtx;
14767       code = (code == EQ ? LTU : GEU);
14768       break;
14769
14770     /* Convert a>b into b<a or a>=b-1.  */
14771     case GTU:
14772     case LEU:
14773       if (CONST_INT_P (op1))
14774         {
14775           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
14776           /* Bail out on overflow.  We still can swap operands but that
14777              would force loading of the constant into register.  */
14778           if (op1 == const0_rtx
14779               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
14780             return false;
14781           code = (code == GTU ? GEU : LTU);
14782         }
14783       else
14784         {
14785           rtx tmp = op1;
14786           op1 = op0;
14787           op0 = tmp;
14788           code = (code == GTU ? LTU : GEU);
14789         }
14790       break;
14791
14792     /* Convert a>=0 into (unsigned)a<0x80000000.  */
14793     case LT:
14794     case GE:
14795       if (mode == DImode || op1 != const0_rtx)
14796         return false;
14797       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
14798       code = (code == LT ? GEU : LTU);
14799       break;
14800     case LE:
14801     case GT:
14802       if (mode == DImode || op1 != constm1_rtx)
14803         return false;
14804       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
14805       code = (code == LE ? GEU : LTU);
14806       break;
14807
14808     default:
14809       return false;
14810     }
14811   /* Swapping operands may cause constant to appear as first operand.  */
14812   if (!nonimmediate_operand (op0, VOIDmode))
14813     {
14814       if (!can_create_pseudo_p ())
14815         return false;
14816       op0 = force_reg (mode, op0);
14817     }
14818   ix86_compare_op0 = op0;
14819   ix86_compare_op1 = op1;
14820   *pop = ix86_expand_compare (code, NULL, NULL);
14821   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
14822   return true;
14823 }
14824
14825 int
14826 ix86_expand_int_movcc (rtx operands[])
14827 {
14828   enum rtx_code code = GET_CODE (operands[1]), compare_code;
14829   rtx compare_seq, compare_op;
14830   rtx second_test, bypass_test;
14831   enum machine_mode mode = GET_MODE (operands[0]);
14832   bool sign_bit_compare_p = false;;
14833
14834   start_sequence ();
14835   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
14836   compare_seq = get_insns ();
14837   end_sequence ();
14838
14839   compare_code = GET_CODE (compare_op);
14840
14841   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
14842       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
14843     sign_bit_compare_p = true;
14844
14845   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
14846      HImode insns, we'd be swallowed in word prefix ops.  */
14847
14848   if ((mode != HImode || TARGET_FAST_PREFIX)
14849       && (mode != (TARGET_64BIT ? TImode : DImode))
14850       && CONST_INT_P (operands[2])
14851       && CONST_INT_P (operands[3]))
14852     {
14853       rtx out = operands[0];
14854       HOST_WIDE_INT ct = INTVAL (operands[2]);
14855       HOST_WIDE_INT cf = INTVAL (operands[3]);
14856       HOST_WIDE_INT diff;
14857
14858       diff = ct - cf;
14859       /*  Sign bit compares are better done using shifts than we do by using
14860           sbb.  */
14861       if (sign_bit_compare_p
14862           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
14863                                              ix86_compare_op1, &compare_op))
14864         {
14865           /* Detect overlap between destination and compare sources.  */
14866           rtx tmp = out;
14867
14868           if (!sign_bit_compare_p)
14869             {
14870               bool fpcmp = false;
14871
14872               compare_code = GET_CODE (compare_op);
14873
14874               if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
14875                   || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
14876                 {
14877                   fpcmp = true;
14878                   compare_code = ix86_fp_compare_code_to_integer (compare_code);
14879                 }
14880
14881               /* To simplify rest of code, restrict to the GEU case.  */
14882               if (compare_code == LTU)
14883                 {
14884                   HOST_WIDE_INT tmp = ct;
14885                   ct = cf;
14886                   cf = tmp;
14887                   compare_code = reverse_condition (compare_code);
14888                   code = reverse_condition (code);
14889                 }
14890               else
14891                 {
14892                   if (fpcmp)
14893                     PUT_CODE (compare_op,
14894                               reverse_condition_maybe_unordered
14895                                 (GET_CODE (compare_op)));
14896                   else
14897                     PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
14898                 }
14899               diff = ct - cf;
14900
14901               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
14902                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
14903                 tmp = gen_reg_rtx (mode);
14904
14905               if (mode == DImode)
14906                 emit_insn (gen_x86_movdicc_0_m1_rex64 (tmp, compare_op));
14907               else
14908                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp), compare_op));
14909             }
14910           else
14911             {
14912               if (code == GT || code == GE)
14913                 code = reverse_condition (code);
14914               else
14915                 {
14916                   HOST_WIDE_INT tmp = ct;
14917                   ct = cf;
14918                   cf = tmp;
14919                   diff = ct - cf;
14920                 }
14921               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
14922                                      ix86_compare_op1, VOIDmode, 0, -1);
14923             }
14924
14925           if (diff == 1)
14926             {
14927               /*
14928                * cmpl op0,op1
14929                * sbbl dest,dest
14930                * [addl dest, ct]
14931                *
14932                * Size 5 - 8.
14933                */
14934               if (ct)
14935                 tmp = expand_simple_binop (mode, PLUS,
14936                                            tmp, GEN_INT (ct),
14937                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14938             }
14939           else if (cf == -1)
14940             {
14941               /*
14942                * cmpl op0,op1
14943                * sbbl dest,dest
14944                * orl $ct, dest
14945                *
14946                * Size 8.
14947                */
14948               tmp = expand_simple_binop (mode, IOR,
14949                                          tmp, GEN_INT (ct),
14950                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
14951             }
14952           else if (diff == -1 && ct)
14953             {
14954               /*
14955                * cmpl op0,op1
14956                * sbbl dest,dest
14957                * notl dest
14958                * [addl dest, cf]
14959                *
14960                * Size 8 - 11.
14961                */
14962               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
14963               if (cf)
14964                 tmp = expand_simple_binop (mode, PLUS,
14965                                            copy_rtx (tmp), GEN_INT (cf),
14966                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14967             }
14968           else
14969             {
14970               /*
14971                * cmpl op0,op1
14972                * sbbl dest,dest
14973                * [notl dest]
14974                * andl cf - ct, dest
14975                * [addl dest, ct]
14976                *
14977                * Size 8 - 11.
14978                */
14979
14980               if (cf == 0)
14981                 {
14982                   cf = ct;
14983                   ct = 0;
14984                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
14985                 }
14986
14987               tmp = expand_simple_binop (mode, AND,
14988                                          copy_rtx (tmp),
14989                                          gen_int_mode (cf - ct, mode),
14990                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
14991               if (ct)
14992                 tmp = expand_simple_binop (mode, PLUS,
14993                                            copy_rtx (tmp), GEN_INT (ct),
14994                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14995             }
14996
14997           if (!rtx_equal_p (tmp, out))
14998             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
14999
15000           return 1; /* DONE */
15001         }
15002
15003       if (diff < 0)
15004         {
15005           enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15006
15007           HOST_WIDE_INT tmp;
15008           tmp = ct, ct = cf, cf = tmp;
15009           diff = -diff;
15010
15011           if (SCALAR_FLOAT_MODE_P (cmp_mode))
15012             {
15013               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15014
15015               /* We may be reversing unordered compare to normal compare, that
15016                  is not valid in general (we may convert non-trapping condition
15017                  to trapping one), however on i386 we currently emit all
15018                  comparisons unordered.  */
15019               compare_code = reverse_condition_maybe_unordered (compare_code);
15020               code = reverse_condition_maybe_unordered (code);
15021             }
15022           else
15023             {
15024               compare_code = reverse_condition (compare_code);
15025               code = reverse_condition (code);
15026             }
15027         }
15028
15029       compare_code = UNKNOWN;
15030       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
15031           && CONST_INT_P (ix86_compare_op1))
15032         {
15033           if (ix86_compare_op1 == const0_rtx
15034               && (code == LT || code == GE))
15035             compare_code = code;
15036           else if (ix86_compare_op1 == constm1_rtx)
15037             {
15038               if (code == LE)
15039                 compare_code = LT;
15040               else if (code == GT)
15041                 compare_code = GE;
15042             }
15043         }
15044
15045       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
15046       if (compare_code != UNKNOWN
15047           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
15048           && (cf == -1 || ct == -1))
15049         {
15050           /* If lea code below could be used, only optimize
15051              if it results in a 2 insn sequence.  */
15052
15053           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
15054                  || diff == 3 || diff == 5 || diff == 9)
15055               || (compare_code == LT && ct == -1)
15056               || (compare_code == GE && cf == -1))
15057             {
15058               /*
15059                * notl op1       (if necessary)
15060                * sarl $31, op1
15061                * orl cf, op1
15062                */
15063               if (ct != -1)
15064                 {
15065                   cf = ct;
15066                   ct = -1;
15067                   code = reverse_condition (code);
15068                 }
15069
15070               out = emit_store_flag (out, code, ix86_compare_op0,
15071                                      ix86_compare_op1, VOIDmode, 0, -1);
15072
15073               out = expand_simple_binop (mode, IOR,
15074                                          out, GEN_INT (cf),
15075                                          out, 1, OPTAB_DIRECT);
15076               if (out != operands[0])
15077                 emit_move_insn (operands[0], out);
15078
15079               return 1; /* DONE */
15080             }
15081         }
15082
15083
15084       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
15085            || diff == 3 || diff == 5 || diff == 9)
15086           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
15087           && (mode != DImode
15088               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
15089         {
15090           /*
15091            * xorl dest,dest
15092            * cmpl op1,op2
15093            * setcc dest
15094            * lea cf(dest*(ct-cf)),dest
15095            *
15096            * Size 14.
15097            *
15098            * This also catches the degenerate setcc-only case.
15099            */
15100
15101           rtx tmp;
15102           int nops;
15103
15104           out = emit_store_flag (out, code, ix86_compare_op0,
15105                                  ix86_compare_op1, VOIDmode, 0, 1);
15106
15107           nops = 0;
15108           /* On x86_64 the lea instruction operates on Pmode, so we need
15109              to get arithmetics done in proper mode to match.  */
15110           if (diff == 1)
15111             tmp = copy_rtx (out);
15112           else
15113             {
15114               rtx out1;
15115               out1 = copy_rtx (out);
15116               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
15117               nops++;
15118               if (diff & 1)
15119                 {
15120                   tmp = gen_rtx_PLUS (mode, tmp, out1);
15121                   nops++;
15122                 }
15123             }
15124           if (cf != 0)
15125             {
15126               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
15127               nops++;
15128             }
15129           if (!rtx_equal_p (tmp, out))
15130             {
15131               if (nops == 1)
15132                 out = force_operand (tmp, copy_rtx (out));
15133               else
15134                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
15135             }
15136           if (!rtx_equal_p (out, operands[0]))
15137             emit_move_insn (operands[0], copy_rtx (out));
15138
15139           return 1; /* DONE */
15140         }
15141
15142       /*
15143        * General case:                  Jumpful:
15144        *   xorl dest,dest               cmpl op1, op2
15145        *   cmpl op1, op2                movl ct, dest
15146        *   setcc dest                   jcc 1f
15147        *   decl dest                    movl cf, dest
15148        *   andl (cf-ct),dest            1:
15149        *   addl ct,dest
15150        *
15151        * Size 20.                       Size 14.
15152        *
15153        * This is reasonably steep, but branch mispredict costs are
15154        * high on modern cpus, so consider failing only if optimizing
15155        * for space.
15156        */
15157
15158       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15159           && BRANCH_COST (optimize_insn_for_speed_p (),
15160                           false) >= 2)
15161         {
15162           if (cf == 0)
15163             {
15164               enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15165
15166               cf = ct;
15167               ct = 0;
15168
15169               if (SCALAR_FLOAT_MODE_P (cmp_mode))
15170                 {
15171                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15172
15173                   /* We may be reversing unordered compare to normal compare,
15174                      that is not valid in general (we may convert non-trapping
15175                      condition to trapping one), however on i386 we currently
15176                      emit all comparisons unordered.  */
15177                   code = reverse_condition_maybe_unordered (code);
15178                 }
15179               else
15180                 {
15181                   code = reverse_condition (code);
15182                   if (compare_code != UNKNOWN)
15183                     compare_code = reverse_condition (compare_code);
15184                 }
15185             }
15186
15187           if (compare_code != UNKNOWN)
15188             {
15189               /* notl op1       (if needed)
15190                  sarl $31, op1
15191                  andl (cf-ct), op1
15192                  addl ct, op1
15193
15194                  For x < 0 (resp. x <= -1) there will be no notl,
15195                  so if possible swap the constants to get rid of the
15196                  complement.
15197                  True/false will be -1/0 while code below (store flag
15198                  followed by decrement) is 0/-1, so the constants need
15199                  to be exchanged once more.  */
15200
15201               if (compare_code == GE || !cf)
15202                 {
15203                   code = reverse_condition (code);
15204                   compare_code = LT;
15205                 }
15206               else
15207                 {
15208                   HOST_WIDE_INT tmp = cf;
15209                   cf = ct;
15210                   ct = tmp;
15211                 }
15212
15213               out = emit_store_flag (out, code, ix86_compare_op0,
15214                                      ix86_compare_op1, VOIDmode, 0, -1);
15215             }
15216           else
15217             {
15218               out = emit_store_flag (out, code, ix86_compare_op0,
15219                                      ix86_compare_op1, VOIDmode, 0, 1);
15220
15221               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
15222                                          copy_rtx (out), 1, OPTAB_DIRECT);
15223             }
15224
15225           out = expand_simple_binop (mode, AND, copy_rtx (out),
15226                                      gen_int_mode (cf - ct, mode),
15227                                      copy_rtx (out), 1, OPTAB_DIRECT);
15228           if (ct)
15229             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
15230                                        copy_rtx (out), 1, OPTAB_DIRECT);
15231           if (!rtx_equal_p (out, operands[0]))
15232             emit_move_insn (operands[0], copy_rtx (out));
15233
15234           return 1; /* DONE */
15235         }
15236     }
15237
15238   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15239     {
15240       /* Try a few things more with specific constants and a variable.  */
15241
15242       optab op;
15243       rtx var, orig_out, out, tmp;
15244
15245       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
15246         return 0; /* FAIL */
15247
15248       /* If one of the two operands is an interesting constant, load a
15249          constant with the above and mask it in with a logical operation.  */
15250
15251       if (CONST_INT_P (operands[2]))
15252         {
15253           var = operands[3];
15254           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
15255             operands[3] = constm1_rtx, op = and_optab;
15256           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
15257             operands[3] = const0_rtx, op = ior_optab;
15258           else
15259             return 0; /* FAIL */
15260         }
15261       else if (CONST_INT_P (operands[3]))
15262         {
15263           var = operands[2];
15264           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
15265             operands[2] = constm1_rtx, op = and_optab;
15266           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
15267             operands[2] = const0_rtx, op = ior_optab;
15268           else
15269             return 0; /* FAIL */
15270         }
15271       else
15272         return 0; /* FAIL */
15273
15274       orig_out = operands[0];
15275       tmp = gen_reg_rtx (mode);
15276       operands[0] = tmp;
15277
15278       /* Recurse to get the constant loaded.  */
15279       if (ix86_expand_int_movcc (operands) == 0)
15280         return 0; /* FAIL */
15281
15282       /* Mask in the interesting variable.  */
15283       out = expand_binop (mode, op, var, tmp, orig_out, 0,
15284                           OPTAB_WIDEN);
15285       if (!rtx_equal_p (out, orig_out))
15286         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
15287
15288       return 1; /* DONE */
15289     }
15290
15291   /*
15292    * For comparison with above,
15293    *
15294    * movl cf,dest
15295    * movl ct,tmp
15296    * cmpl op1,op2
15297    * cmovcc tmp,dest
15298    *
15299    * Size 15.
15300    */
15301
15302   if (! nonimmediate_operand (operands[2], mode))
15303     operands[2] = force_reg (mode, operands[2]);
15304   if (! nonimmediate_operand (operands[3], mode))
15305     operands[3] = force_reg (mode, operands[3]);
15306
15307   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15308     {
15309       rtx tmp = gen_reg_rtx (mode);
15310       emit_move_insn (tmp, operands[3]);
15311       operands[3] = tmp;
15312     }
15313   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15314     {
15315       rtx tmp = gen_reg_rtx (mode);
15316       emit_move_insn (tmp, operands[2]);
15317       operands[2] = tmp;
15318     }
15319
15320   if (! register_operand (operands[2], VOIDmode)
15321       && (mode == QImode
15322           || ! register_operand (operands[3], VOIDmode)))
15323     operands[2] = force_reg (mode, operands[2]);
15324
15325   if (mode == QImode
15326       && ! register_operand (operands[3], VOIDmode))
15327     operands[3] = force_reg (mode, operands[3]);
15328
15329   emit_insn (compare_seq);
15330   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15331                           gen_rtx_IF_THEN_ELSE (mode,
15332                                                 compare_op, operands[2],
15333                                                 operands[3])));
15334   if (bypass_test)
15335     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15336                             gen_rtx_IF_THEN_ELSE (mode,
15337                                   bypass_test,
15338                                   copy_rtx (operands[3]),
15339                                   copy_rtx (operands[0]))));
15340   if (second_test)
15341     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15342                             gen_rtx_IF_THEN_ELSE (mode,
15343                                   second_test,
15344                                   copy_rtx (operands[2]),
15345                                   copy_rtx (operands[0]))));
15346
15347   return 1; /* DONE */
15348 }
15349
15350 /* Swap, force into registers, or otherwise massage the two operands
15351    to an sse comparison with a mask result.  Thus we differ a bit from
15352    ix86_prepare_fp_compare_args which expects to produce a flags result.
15353
15354    The DEST operand exists to help determine whether to commute commutative
15355    operators.  The POP0/POP1 operands are updated in place.  The new
15356    comparison code is returned, or UNKNOWN if not implementable.  */
15357
15358 static enum rtx_code
15359 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
15360                                   rtx *pop0, rtx *pop1)
15361 {
15362   rtx tmp;
15363
15364   switch (code)
15365     {
15366     case LTGT:
15367     case UNEQ:
15368       /* We have no LTGT as an operator.  We could implement it with
15369          NE & ORDERED, but this requires an extra temporary.  It's
15370          not clear that it's worth it.  */
15371       return UNKNOWN;
15372
15373     case LT:
15374     case LE:
15375     case UNGT:
15376     case UNGE:
15377       /* These are supported directly.  */
15378       break;
15379
15380     case EQ:
15381     case NE:
15382     case UNORDERED:
15383     case ORDERED:
15384       /* For commutative operators, try to canonicalize the destination
15385          operand to be first in the comparison - this helps reload to
15386          avoid extra moves.  */
15387       if (!dest || !rtx_equal_p (dest, *pop1))
15388         break;
15389       /* FALLTHRU */
15390
15391     case GE:
15392     case GT:
15393     case UNLE:
15394     case UNLT:
15395       /* These are not supported directly.  Swap the comparison operands
15396          to transform into something that is supported.  */
15397       tmp = *pop0;
15398       *pop0 = *pop1;
15399       *pop1 = tmp;
15400       code = swap_condition (code);
15401       break;
15402
15403     default:
15404       gcc_unreachable ();
15405     }
15406
15407   return code;
15408 }
15409
15410 /* Detect conditional moves that exactly match min/max operational
15411    semantics.  Note that this is IEEE safe, as long as we don't
15412    interchange the operands.
15413
15414    Returns FALSE if this conditional move doesn't match a MIN/MAX,
15415    and TRUE if the operation is successful and instructions are emitted.  */
15416
15417 static bool
15418 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
15419                            rtx cmp_op1, rtx if_true, rtx if_false)
15420 {
15421   enum machine_mode mode;
15422   bool is_min;
15423   rtx tmp;
15424
15425   if (code == LT)
15426     ;
15427   else if (code == UNGE)
15428     {
15429       tmp = if_true;
15430       if_true = if_false;
15431       if_false = tmp;
15432     }
15433   else
15434     return false;
15435
15436   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
15437     is_min = true;
15438   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
15439     is_min = false;
15440   else
15441     return false;
15442
15443   mode = GET_MODE (dest);
15444
15445   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
15446      but MODE may be a vector mode and thus not appropriate.  */
15447   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
15448     {
15449       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
15450       rtvec v;
15451
15452       if_true = force_reg (mode, if_true);
15453       v = gen_rtvec (2, if_true, if_false);
15454       tmp = gen_rtx_UNSPEC (mode, v, u);
15455     }
15456   else
15457     {
15458       code = is_min ? SMIN : SMAX;
15459       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
15460     }
15461
15462   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
15463   return true;
15464 }
15465
15466 /* Expand an sse vector comparison.  Return the register with the result.  */
15467
15468 static rtx
15469 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
15470                      rtx op_true, rtx op_false)
15471 {
15472   enum machine_mode mode = GET_MODE (dest);
15473   rtx x;
15474
15475   cmp_op0 = force_reg (mode, cmp_op0);
15476   if (!nonimmediate_operand (cmp_op1, mode))
15477     cmp_op1 = force_reg (mode, cmp_op1);
15478
15479   if (optimize
15480       || reg_overlap_mentioned_p (dest, op_true)
15481       || reg_overlap_mentioned_p (dest, op_false))
15482     dest = gen_reg_rtx (mode);
15483
15484   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
15485   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15486
15487   return dest;
15488 }
15489
15490 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
15491    operations.  This is used for both scalar and vector conditional moves.  */
15492
15493 static void
15494 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
15495 {
15496   enum machine_mode mode = GET_MODE (dest);
15497   rtx t2, t3, x;
15498
15499   if (op_false == CONST0_RTX (mode))
15500     {
15501       op_true = force_reg (mode, op_true);
15502       x = gen_rtx_AND (mode, cmp, op_true);
15503       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15504     }
15505   else if (op_true == CONST0_RTX (mode))
15506     {
15507       op_false = force_reg (mode, op_false);
15508       x = gen_rtx_NOT (mode, cmp);
15509       x = gen_rtx_AND (mode, x, op_false);
15510       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15511     }
15512   else if (TARGET_SSE5)
15513     {
15514       rtx pcmov = gen_rtx_SET (mode, dest,
15515                                gen_rtx_IF_THEN_ELSE (mode, cmp,
15516                                                      op_true,
15517                                                      op_false));
15518       emit_insn (pcmov);
15519     }
15520   else
15521     {
15522       op_true = force_reg (mode, op_true);
15523       op_false = force_reg (mode, op_false);
15524
15525       t2 = gen_reg_rtx (mode);
15526       if (optimize)
15527         t3 = gen_reg_rtx (mode);
15528       else
15529         t3 = dest;
15530
15531       x = gen_rtx_AND (mode, op_true, cmp);
15532       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
15533
15534       x = gen_rtx_NOT (mode, cmp);
15535       x = gen_rtx_AND (mode, x, op_false);
15536       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
15537
15538       x = gen_rtx_IOR (mode, t3, t2);
15539       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15540     }
15541 }
15542
15543 /* Expand a floating-point conditional move.  Return true if successful.  */
15544
15545 int
15546 ix86_expand_fp_movcc (rtx operands[])
15547 {
15548   enum machine_mode mode = GET_MODE (operands[0]);
15549   enum rtx_code code = GET_CODE (operands[1]);
15550   rtx tmp, compare_op, second_test, bypass_test;
15551
15552   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
15553     {
15554       enum machine_mode cmode;
15555
15556       /* Since we've no cmove for sse registers, don't force bad register
15557          allocation just to gain access to it.  Deny movcc when the
15558          comparison mode doesn't match the move mode.  */
15559       cmode = GET_MODE (ix86_compare_op0);
15560       if (cmode == VOIDmode)
15561         cmode = GET_MODE (ix86_compare_op1);
15562       if (cmode != mode)
15563         return 0;
15564
15565       code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15566                                                &ix86_compare_op0,
15567                                                &ix86_compare_op1);
15568       if (code == UNKNOWN)
15569         return 0;
15570
15571       if (ix86_expand_sse_fp_minmax (operands[0], code, ix86_compare_op0,
15572                                      ix86_compare_op1, operands[2],
15573                                      operands[3]))
15574         return 1;
15575
15576       tmp = ix86_expand_sse_cmp (operands[0], code, ix86_compare_op0,
15577                                  ix86_compare_op1, operands[2], operands[3]);
15578       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
15579       return 1;
15580     }
15581
15582   /* The floating point conditional move instructions don't directly
15583      support conditions resulting from a signed integer comparison.  */
15584
15585   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
15586
15587   /* The floating point conditional move instructions don't directly
15588      support signed integer comparisons.  */
15589
15590   if (!fcmov_comparison_operator (compare_op, VOIDmode))
15591     {
15592       gcc_assert (!second_test && !bypass_test);
15593       tmp = gen_reg_rtx (QImode);
15594       ix86_expand_setcc (code, tmp);
15595       code = NE;
15596       ix86_compare_op0 = tmp;
15597       ix86_compare_op1 = const0_rtx;
15598       compare_op = ix86_expand_compare (code,  &second_test, &bypass_test);
15599     }
15600   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15601     {
15602       tmp = gen_reg_rtx (mode);
15603       emit_move_insn (tmp, operands[3]);
15604       operands[3] = tmp;
15605     }
15606   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15607     {
15608       tmp = gen_reg_rtx (mode);
15609       emit_move_insn (tmp, operands[2]);
15610       operands[2] = tmp;
15611     }
15612
15613   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15614                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
15615                                                 operands[2], operands[3])));
15616   if (bypass_test)
15617     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15618                             gen_rtx_IF_THEN_ELSE (mode, bypass_test,
15619                                                   operands[3], operands[0])));
15620   if (second_test)
15621     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15622                             gen_rtx_IF_THEN_ELSE (mode, second_test,
15623                                                   operands[2], operands[0])));
15624
15625   return 1;
15626 }
15627
15628 /* Expand a floating-point vector conditional move; a vcond operation
15629    rather than a movcc operation.  */
15630
15631 bool
15632 ix86_expand_fp_vcond (rtx operands[])
15633 {
15634   enum rtx_code code = GET_CODE (operands[3]);
15635   rtx cmp;
15636
15637   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15638                                            &operands[4], &operands[5]);
15639   if (code == UNKNOWN)
15640     return false;
15641
15642   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
15643                                  operands[5], operands[1], operands[2]))
15644     return true;
15645
15646   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
15647                              operands[1], operands[2]);
15648   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
15649   return true;
15650 }
15651
15652 /* Expand a signed/unsigned integral vector conditional move.  */
15653
15654 bool
15655 ix86_expand_int_vcond (rtx operands[])
15656 {
15657   enum machine_mode mode = GET_MODE (operands[0]);
15658   enum rtx_code code = GET_CODE (operands[3]);
15659   bool negate = false;
15660   rtx x, cop0, cop1;
15661
15662   cop0 = operands[4];
15663   cop1 = operands[5];
15664
15665   /* SSE5 supports all of the comparisons on all vector int types.  */
15666   if (!TARGET_SSE5)
15667     {
15668       /* Canonicalize the comparison to EQ, GT, GTU.  */
15669       switch (code)
15670         {
15671         case EQ:
15672         case GT:
15673         case GTU:
15674           break;
15675
15676         case NE:
15677         case LE:
15678         case LEU:
15679           code = reverse_condition (code);
15680           negate = true;
15681           break;
15682
15683         case GE:
15684         case GEU:
15685           code = reverse_condition (code);
15686           negate = true;
15687           /* FALLTHRU */
15688
15689         case LT:
15690         case LTU:
15691           code = swap_condition (code);
15692           x = cop0, cop0 = cop1, cop1 = x;
15693           break;
15694
15695         default:
15696           gcc_unreachable ();
15697         }
15698
15699       /* Only SSE4.1/SSE4.2 supports V2DImode.  */
15700       if (mode == V2DImode)
15701         {
15702           switch (code)
15703             {
15704             case EQ:
15705               /* SSE4.1 supports EQ.  */
15706               if (!TARGET_SSE4_1)
15707                 return false;
15708               break;
15709
15710             case GT:
15711             case GTU:
15712               /* SSE4.2 supports GT/GTU.  */
15713               if (!TARGET_SSE4_2)
15714                 return false;
15715               break;
15716
15717             default:
15718               gcc_unreachable ();
15719             }
15720         }
15721
15722       /* Unsigned parallel compare is not supported by the hardware.
15723          Play some tricks to turn this into a signed comparison
15724          against 0.  */
15725       if (code == GTU)
15726         {
15727           cop0 = force_reg (mode, cop0);
15728
15729           switch (mode)
15730             {
15731             case V4SImode:
15732             case V2DImode:
15733                 {
15734                   rtx t1, t2, mask;
15735                   rtx (*gen_sub3) (rtx, rtx, rtx);
15736
15737                   /* Subtract (-(INT MAX) - 1) from both operands to make
15738                      them signed.  */
15739                   mask = ix86_build_signbit_mask (GET_MODE_INNER (mode),
15740                                                   true, false);
15741                   gen_sub3 = (mode == V4SImode
15742                               ? gen_subv4si3 : gen_subv2di3);
15743                   t1 = gen_reg_rtx (mode);
15744                   emit_insn (gen_sub3 (t1, cop0, mask));
15745
15746                   t2 = gen_reg_rtx (mode);
15747                   emit_insn (gen_sub3 (t2, cop1, mask));
15748
15749                   cop0 = t1;
15750                   cop1 = t2;
15751                   code = GT;
15752                 }
15753               break;
15754
15755             case V16QImode:
15756             case V8HImode:
15757               /* Perform a parallel unsigned saturating subtraction.  */
15758               x = gen_reg_rtx (mode);
15759               emit_insn (gen_rtx_SET (VOIDmode, x,
15760                                       gen_rtx_US_MINUS (mode, cop0, cop1)));
15761
15762               cop0 = x;
15763               cop1 = CONST0_RTX (mode);
15764               code = EQ;
15765               negate = !negate;
15766               break;
15767
15768             default:
15769               gcc_unreachable ();
15770             }
15771         }
15772     }
15773
15774   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
15775                            operands[1+negate], operands[2-negate]);
15776
15777   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
15778                          operands[2-negate]);
15779   return true;
15780 }
15781
15782 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
15783    true if we should do zero extension, else sign extension.  HIGH_P is
15784    true if we want the N/2 high elements, else the low elements.  */
15785
15786 void
15787 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15788 {
15789   enum machine_mode imode = GET_MODE (operands[1]);
15790   rtx (*unpack)(rtx, rtx, rtx);
15791   rtx se, dest;
15792
15793   switch (imode)
15794     {
15795     case V16QImode:
15796       if (high_p)
15797         unpack = gen_vec_interleave_highv16qi;
15798       else
15799         unpack = gen_vec_interleave_lowv16qi;
15800       break;
15801     case V8HImode:
15802       if (high_p)
15803         unpack = gen_vec_interleave_highv8hi;
15804       else
15805         unpack = gen_vec_interleave_lowv8hi;
15806       break;
15807     case V4SImode:
15808       if (high_p)
15809         unpack = gen_vec_interleave_highv4si;
15810       else
15811         unpack = gen_vec_interleave_lowv4si;
15812       break;
15813     default:
15814       gcc_unreachable ();
15815     }
15816
15817   dest = gen_lowpart (imode, operands[0]);
15818
15819   if (unsigned_p)
15820     se = force_reg (imode, CONST0_RTX (imode));
15821   else
15822     se = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
15823                               operands[1], pc_rtx, pc_rtx);
15824
15825   emit_insn (unpack (dest, operands[1], se));
15826 }
15827
15828 /* This function performs the same task as ix86_expand_sse_unpack,
15829    but with SSE4.1 instructions.  */
15830
15831 void
15832 ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15833 {
15834   enum machine_mode imode = GET_MODE (operands[1]);
15835   rtx (*unpack)(rtx, rtx);
15836   rtx src, dest;
15837
15838   switch (imode)
15839     {
15840     case V16QImode:
15841       if (unsigned_p)
15842         unpack = gen_sse4_1_zero_extendv8qiv8hi2;
15843       else
15844         unpack = gen_sse4_1_extendv8qiv8hi2;
15845       break;
15846     case V8HImode:
15847       if (unsigned_p)
15848         unpack = gen_sse4_1_zero_extendv4hiv4si2;
15849       else
15850         unpack = gen_sse4_1_extendv4hiv4si2;
15851       break;
15852     case V4SImode:
15853       if (unsigned_p)
15854         unpack = gen_sse4_1_zero_extendv2siv2di2;
15855       else
15856         unpack = gen_sse4_1_extendv2siv2di2;
15857       break;
15858     default:
15859       gcc_unreachable ();
15860     }
15861
15862   dest = operands[0];
15863   if (high_p)
15864     {
15865       /* Shift higher 8 bytes to lower 8 bytes.  */
15866       src = gen_reg_rtx (imode);
15867       emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, src),
15868                                    gen_lowpart (TImode, operands[1]),
15869                                    GEN_INT (64)));
15870     }
15871   else
15872     src = operands[1];
15873
15874   emit_insn (unpack (dest, src));
15875 }
15876
15877 /* This function performs the same task as ix86_expand_sse_unpack,
15878    but with sse5 instructions.  */
15879
15880 void
15881 ix86_expand_sse5_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15882 {
15883   enum machine_mode imode = GET_MODE (operands[1]);
15884   int pperm_bytes[16];
15885   int i;
15886   int h = (high_p) ? 8 : 0;
15887   int h2;
15888   int sign_extend;
15889   rtvec v = rtvec_alloc (16);
15890   rtvec vs;
15891   rtx x, p;
15892   rtx op0 = operands[0], op1 = operands[1];
15893
15894   switch (imode)
15895     {
15896     case V16QImode:
15897       vs = rtvec_alloc (8);
15898       h2 = (high_p) ? 8 : 0;
15899       for (i = 0; i < 8; i++)
15900         {
15901           pperm_bytes[2*i+0] = PPERM_SRC | PPERM_SRC2 | i | h;
15902           pperm_bytes[2*i+1] = ((unsigned_p)
15903                                 ? PPERM_ZERO
15904                                 : PPERM_SIGN | PPERM_SRC2 | i | h);
15905         }
15906
15907       for (i = 0; i < 16; i++)
15908         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15909
15910       for (i = 0; i < 8; i++)
15911         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15912
15913       p = gen_rtx_PARALLEL (VOIDmode, vs);
15914       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15915       if (unsigned_p)
15916         emit_insn (gen_sse5_pperm_zero_v16qi_v8hi (op0, op1, p, x));
15917       else
15918         emit_insn (gen_sse5_pperm_sign_v16qi_v8hi (op0, op1, p, x));
15919       break;
15920
15921     case V8HImode:
15922       vs = rtvec_alloc (4);
15923       h2 = (high_p) ? 4 : 0;
15924       for (i = 0; i < 4; i++)
15925         {
15926           sign_extend = ((unsigned_p)
15927                          ? PPERM_ZERO
15928                          : PPERM_SIGN | PPERM_SRC2 | ((2*i) + 1 + h));
15929           pperm_bytes[4*i+0] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 0 + h);
15930           pperm_bytes[4*i+1] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 1 + h);
15931           pperm_bytes[4*i+2] = sign_extend;
15932           pperm_bytes[4*i+3] = sign_extend;
15933         }
15934
15935       for (i = 0; i < 16; i++)
15936         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15937
15938       for (i = 0; i < 4; i++)
15939         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15940
15941       p = gen_rtx_PARALLEL (VOIDmode, vs);
15942       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15943       if (unsigned_p)
15944         emit_insn (gen_sse5_pperm_zero_v8hi_v4si (op0, op1, p, x));
15945       else
15946         emit_insn (gen_sse5_pperm_sign_v8hi_v4si (op0, op1, p, x));
15947       break;
15948
15949     case V4SImode:
15950       vs = rtvec_alloc (2);
15951       h2 = (high_p) ? 2 : 0;
15952       for (i = 0; i < 2; i++)
15953         {
15954           sign_extend = ((unsigned_p)
15955                          ? PPERM_ZERO
15956                          : PPERM_SIGN | PPERM_SRC2 | ((4*i) + 3 + h));
15957           pperm_bytes[8*i+0] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 0 + h);
15958           pperm_bytes[8*i+1] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 1 + h);
15959           pperm_bytes[8*i+2] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 2 + h);
15960           pperm_bytes[8*i+3] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 3 + h);
15961           pperm_bytes[8*i+4] = sign_extend;
15962           pperm_bytes[8*i+5] = sign_extend;
15963           pperm_bytes[8*i+6] = sign_extend;
15964           pperm_bytes[8*i+7] = sign_extend;
15965         }
15966
15967       for (i = 0; i < 16; i++)
15968         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15969
15970       for (i = 0; i < 2; i++)
15971         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15972
15973       p = gen_rtx_PARALLEL (VOIDmode, vs);
15974       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15975       if (unsigned_p)
15976         emit_insn (gen_sse5_pperm_zero_v4si_v2di (op0, op1, p, x));
15977       else
15978         emit_insn (gen_sse5_pperm_sign_v4si_v2di (op0, op1, p, x));
15979       break;
15980
15981     default:
15982       gcc_unreachable ();
15983     }
15984
15985   return;
15986 }
15987
15988 /* Pack the high bits from OPERANDS[1] and low bits from OPERANDS[2] into the
15989    next narrower integer vector type */
15990 void
15991 ix86_expand_sse5_pack (rtx operands[3])
15992 {
15993   enum machine_mode imode = GET_MODE (operands[0]);
15994   int pperm_bytes[16];
15995   int i;
15996   rtvec v = rtvec_alloc (16);
15997   rtx x;
15998   rtx op0 = operands[0];
15999   rtx op1 = operands[1];
16000   rtx op2 = operands[2];
16001
16002   switch (imode)
16003     {
16004     case V16QImode:
16005       for (i = 0; i < 8; i++)
16006         {
16007           pperm_bytes[i+0] = PPERM_SRC | PPERM_SRC1 | (i*2);
16008           pperm_bytes[i+8] = PPERM_SRC | PPERM_SRC2 | (i*2);
16009         }
16010
16011       for (i = 0; i < 16; i++)
16012         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16013
16014       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16015       emit_insn (gen_sse5_pperm_pack_v8hi_v16qi (op0, op1, op2, x));
16016       break;
16017
16018     case V8HImode:
16019       for (i = 0; i < 4; i++)
16020         {
16021           pperm_bytes[(2*i)+0] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 0);
16022           pperm_bytes[(2*i)+1] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 1);
16023           pperm_bytes[(2*i)+8] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 0);
16024           pperm_bytes[(2*i)+9] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 1);
16025         }
16026
16027       for (i = 0; i < 16; i++)
16028         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16029
16030       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16031       emit_insn (gen_sse5_pperm_pack_v4si_v8hi (op0, op1, op2, x));
16032       break;
16033
16034     case V4SImode:
16035       for (i = 0; i < 2; i++)
16036         {
16037           pperm_bytes[(4*i)+0]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 0);
16038           pperm_bytes[(4*i)+1]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 1);
16039           pperm_bytes[(4*i)+2]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 2);
16040           pperm_bytes[(4*i)+3]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 3);
16041           pperm_bytes[(4*i)+8]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 0);
16042           pperm_bytes[(4*i)+9]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 1);
16043           pperm_bytes[(4*i)+10] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 2);
16044           pperm_bytes[(4*i)+11] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 3);
16045         }
16046
16047       for (i = 0; i < 16; i++)
16048         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16049
16050       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16051       emit_insn (gen_sse5_pperm_pack_v2di_v4si (op0, op1, op2, x));
16052       break;
16053
16054     default:
16055       gcc_unreachable ();
16056     }
16057
16058   return;
16059 }
16060
16061 /* Expand conditional increment or decrement using adb/sbb instructions.
16062    The default case using setcc followed by the conditional move can be
16063    done by generic code.  */
16064 int
16065 ix86_expand_int_addcc (rtx operands[])
16066 {
16067   enum rtx_code code = GET_CODE (operands[1]);
16068   rtx compare_op;
16069   rtx val = const0_rtx;
16070   bool fpcmp = false;
16071   enum machine_mode mode = GET_MODE (operands[0]);
16072
16073   if (operands[3] != const1_rtx
16074       && operands[3] != constm1_rtx)
16075     return 0;
16076   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
16077                                        ix86_compare_op1, &compare_op))
16078      return 0;
16079   code = GET_CODE (compare_op);
16080
16081   if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
16082       || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
16083     {
16084       fpcmp = true;
16085       code = ix86_fp_compare_code_to_integer (code);
16086     }
16087
16088   if (code != LTU)
16089     {
16090       val = constm1_rtx;
16091       if (fpcmp)
16092         PUT_CODE (compare_op,
16093                   reverse_condition_maybe_unordered
16094                     (GET_CODE (compare_op)));
16095       else
16096         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
16097     }
16098   PUT_MODE (compare_op, mode);
16099
16100   /* Construct either adc or sbb insn.  */
16101   if ((code == LTU) == (operands[3] == constm1_rtx))
16102     {
16103       switch (GET_MODE (operands[0]))
16104         {
16105           case QImode:
16106             emit_insn (gen_subqi3_carry (operands[0], operands[2], val, compare_op));
16107             break;
16108           case HImode:
16109             emit_insn (gen_subhi3_carry (operands[0], operands[2], val, compare_op));
16110             break;
16111           case SImode:
16112             emit_insn (gen_subsi3_carry (operands[0], operands[2], val, compare_op));
16113             break;
16114           case DImode:
16115             emit_insn (gen_subdi3_carry_rex64 (operands[0], operands[2], val, compare_op));
16116             break;
16117           default:
16118             gcc_unreachable ();
16119         }
16120     }
16121   else
16122     {
16123       switch (GET_MODE (operands[0]))
16124         {
16125           case QImode:
16126             emit_insn (gen_addqi3_carry (operands[0], operands[2], val, compare_op));
16127             break;
16128           case HImode:
16129             emit_insn (gen_addhi3_carry (operands[0], operands[2], val, compare_op));
16130             break;
16131           case SImode:
16132             emit_insn (gen_addsi3_carry (operands[0], operands[2], val, compare_op));
16133             break;
16134           case DImode:
16135             emit_insn (gen_adddi3_carry_rex64 (operands[0], operands[2], val, compare_op));
16136             break;
16137           default:
16138             gcc_unreachable ();
16139         }
16140     }
16141   return 1; /* DONE */
16142 }
16143
16144
16145 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
16146    works for floating pointer parameters and nonoffsetable memories.
16147    For pushes, it returns just stack offsets; the values will be saved
16148    in the right order.  Maximally three parts are generated.  */
16149
16150 static int
16151 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
16152 {
16153   int size;
16154
16155   if (!TARGET_64BIT)
16156     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
16157   else
16158     size = (GET_MODE_SIZE (mode) + 4) / 8;
16159
16160   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
16161   gcc_assert (size >= 2 && size <= 4);
16162
16163   /* Optimize constant pool reference to immediates.  This is used by fp
16164      moves, that force all constants to memory to allow combining.  */
16165   if (MEM_P (operand) && MEM_READONLY_P (operand))
16166     {
16167       rtx tmp = maybe_get_pool_constant (operand);
16168       if (tmp)
16169         operand = tmp;
16170     }
16171
16172   if (MEM_P (operand) && !offsettable_memref_p (operand))
16173     {
16174       /* The only non-offsetable memories we handle are pushes.  */
16175       int ok = push_operand (operand, VOIDmode);
16176
16177       gcc_assert (ok);
16178
16179       operand = copy_rtx (operand);
16180       PUT_MODE (operand, Pmode);
16181       parts[0] = parts[1] = parts[2] = parts[3] = operand;
16182       return size;
16183     }
16184
16185   if (GET_CODE (operand) == CONST_VECTOR)
16186     {
16187       enum machine_mode imode = int_mode_for_mode (mode);
16188       /* Caution: if we looked through a constant pool memory above,
16189          the operand may actually have a different mode now.  That's
16190          ok, since we want to pun this all the way back to an integer.  */
16191       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
16192       gcc_assert (operand != NULL);
16193       mode = imode;
16194     }
16195
16196   if (!TARGET_64BIT)
16197     {
16198       if (mode == DImode)
16199         split_di (&operand, 1, &parts[0], &parts[1]);
16200       else
16201         {
16202           int i;
16203
16204           if (REG_P (operand))
16205             {
16206               gcc_assert (reload_completed);
16207               for (i = 0; i < size; i++)
16208                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
16209             }
16210           else if (offsettable_memref_p (operand))
16211             {
16212               operand = adjust_address (operand, SImode, 0);
16213               parts[0] = operand;
16214               for (i = 1; i < size; i++)
16215                 parts[i] = adjust_address (operand, SImode, 4 * i);
16216             }
16217           else if (GET_CODE (operand) == CONST_DOUBLE)
16218             {
16219               REAL_VALUE_TYPE r;
16220               long l[4];
16221
16222               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16223               switch (mode)
16224                 {
16225                 case TFmode:
16226                   real_to_target (l, &r, mode);
16227                   parts[3] = gen_int_mode (l[3], SImode);
16228                   parts[2] = gen_int_mode (l[2], SImode);
16229                   break;
16230                 case XFmode:
16231                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
16232                   parts[2] = gen_int_mode (l[2], SImode);
16233                   break;
16234                 case DFmode:
16235                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
16236                   break;
16237                 default:
16238                   gcc_unreachable ();
16239                 }
16240               parts[1] = gen_int_mode (l[1], SImode);
16241               parts[0] = gen_int_mode (l[0], SImode);
16242             }
16243           else
16244             gcc_unreachable ();
16245         }
16246     }
16247   else
16248     {
16249       if (mode == TImode)
16250         split_ti (&operand, 1, &parts[0], &parts[1]);
16251       if (mode == XFmode || mode == TFmode)
16252         {
16253           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
16254           if (REG_P (operand))
16255             {
16256               gcc_assert (reload_completed);
16257               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
16258               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
16259             }
16260           else if (offsettable_memref_p (operand))
16261             {
16262               operand = adjust_address (operand, DImode, 0);
16263               parts[0] = operand;
16264               parts[1] = adjust_address (operand, upper_mode, 8);
16265             }
16266           else if (GET_CODE (operand) == CONST_DOUBLE)
16267             {
16268               REAL_VALUE_TYPE r;
16269               long l[4];
16270
16271               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16272               real_to_target (l, &r, mode);
16273
16274               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
16275               if (HOST_BITS_PER_WIDE_INT >= 64)
16276                 parts[0]
16277                   = gen_int_mode
16278                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
16279                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
16280                        DImode);
16281               else
16282                 parts[0] = immed_double_const (l[0], l[1], DImode);
16283
16284               if (upper_mode == SImode)
16285                 parts[1] = gen_int_mode (l[2], SImode);
16286               else if (HOST_BITS_PER_WIDE_INT >= 64)
16287                 parts[1]
16288                   = gen_int_mode
16289                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
16290                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
16291                        DImode);
16292               else
16293                 parts[1] = immed_double_const (l[2], l[3], DImode);
16294             }
16295           else
16296             gcc_unreachable ();
16297         }
16298     }
16299
16300   return size;
16301 }
16302
16303 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
16304    Return false when normal moves are needed; true when all required
16305    insns have been emitted.  Operands 2-4 contain the input values
16306    int the correct order; operands 5-7 contain the output values.  */
16307
16308 void
16309 ix86_split_long_move (rtx operands[])
16310 {
16311   rtx part[2][4];
16312   int nparts, i, j;
16313   int push = 0;
16314   int collisions = 0;
16315   enum machine_mode mode = GET_MODE (operands[0]);
16316   bool collisionparts[4];
16317
16318   /* The DFmode expanders may ask us to move double.
16319      For 64bit target this is single move.  By hiding the fact
16320      here we simplify i386.md splitters.  */
16321   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
16322     {
16323       /* Optimize constant pool reference to immediates.  This is used by
16324          fp moves, that force all constants to memory to allow combining.  */
16325
16326       if (MEM_P (operands[1])
16327           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
16328           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
16329         operands[1] = get_pool_constant (XEXP (operands[1], 0));
16330       if (push_operand (operands[0], VOIDmode))
16331         {
16332           operands[0] = copy_rtx (operands[0]);
16333           PUT_MODE (operands[0], Pmode);
16334         }
16335       else
16336         operands[0] = gen_lowpart (DImode, operands[0]);
16337       operands[1] = gen_lowpart (DImode, operands[1]);
16338       emit_move_insn (operands[0], operands[1]);
16339       return;
16340     }
16341
16342   /* The only non-offsettable memory we handle is push.  */
16343   if (push_operand (operands[0], VOIDmode))
16344     push = 1;
16345   else
16346     gcc_assert (!MEM_P (operands[0])
16347                 || offsettable_memref_p (operands[0]));
16348
16349   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
16350   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
16351
16352   /* When emitting push, take care for source operands on the stack.  */
16353   if (push && MEM_P (operands[1])
16354       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
16355     {
16356       rtx src_base = XEXP (part[1][nparts - 1], 0);
16357
16358       /* Compensate for the stack decrement by 4.  */
16359       if (!TARGET_64BIT && nparts == 3
16360           && mode == XFmode && TARGET_128BIT_LONG_DOUBLE)
16361         src_base = plus_constant (src_base, 4);
16362
16363       /* src_base refers to the stack pointer and is
16364          automatically decreased by emitted push.  */
16365       for (i = 0; i < nparts; i++)
16366         part[1][i] = change_address (part[1][i],
16367                                      GET_MODE (part[1][i]), src_base);
16368     }
16369
16370   /* We need to do copy in the right order in case an address register
16371      of the source overlaps the destination.  */
16372   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
16373     {
16374       rtx tmp;
16375
16376       for (i = 0; i < nparts; i++)
16377         {
16378           collisionparts[i]
16379             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
16380           if (collisionparts[i])
16381             collisions++;
16382         }
16383
16384       /* Collision in the middle part can be handled by reordering.  */
16385       if (collisions == 1 && nparts == 3 && collisionparts [1])
16386         {
16387           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16388           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16389         }
16390       else if (collisions == 1
16391                && nparts == 4
16392                && (collisionparts [1] || collisionparts [2]))
16393         {
16394           if (collisionparts [1])
16395             {
16396               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16397               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16398             }
16399           else
16400             {
16401               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
16402               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
16403             }
16404         }
16405
16406       /* If there are more collisions, we can't handle it by reordering.
16407          Do an lea to the last part and use only one colliding move.  */
16408       else if (collisions > 1)
16409         {
16410           rtx base;
16411
16412           collisions = 1;
16413
16414           base = part[0][nparts - 1];
16415
16416           /* Handle the case when the last part isn't valid for lea.
16417              Happens in 64-bit mode storing the 12-byte XFmode.  */
16418           if (GET_MODE (base) != Pmode)
16419             base = gen_rtx_REG (Pmode, REGNO (base));
16420
16421           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
16422           part[1][0] = replace_equiv_address (part[1][0], base);
16423           for (i = 1; i < nparts; i++)
16424             {
16425               tmp = plus_constant (base, UNITS_PER_WORD * i);
16426               part[1][i] = replace_equiv_address (part[1][i], tmp);
16427             }
16428         }
16429     }
16430
16431   if (push)
16432     {
16433       if (!TARGET_64BIT)
16434         {
16435           if (nparts == 3)
16436             {
16437               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
16438                 emit_insn (gen_addsi3 (stack_pointer_rtx,
16439                                        stack_pointer_rtx, GEN_INT (-4)));
16440               emit_move_insn (part[0][2], part[1][2]);
16441             }
16442           else if (nparts == 4)
16443             {
16444               emit_move_insn (part[0][3], part[1][3]);
16445               emit_move_insn (part[0][2], part[1][2]);
16446             }
16447         }
16448       else
16449         {
16450           /* In 64bit mode we don't have 32bit push available.  In case this is
16451              register, it is OK - we will just use larger counterpart.  We also
16452              retype memory - these comes from attempt to avoid REX prefix on
16453              moving of second half of TFmode value.  */
16454           if (GET_MODE (part[1][1]) == SImode)
16455             {
16456               switch (GET_CODE (part[1][1]))
16457                 {
16458                 case MEM:
16459                   part[1][1] = adjust_address (part[1][1], DImode, 0);
16460                   break;
16461
16462                 case REG:
16463                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
16464                   break;
16465
16466                 default:
16467                   gcc_unreachable ();
16468                 }
16469
16470               if (GET_MODE (part[1][0]) == SImode)
16471                 part[1][0] = part[1][1];
16472             }
16473         }
16474       emit_move_insn (part[0][1], part[1][1]);
16475       emit_move_insn (part[0][0], part[1][0]);
16476       return;
16477     }
16478
16479   /* Choose correct order to not overwrite the source before it is copied.  */
16480   if ((REG_P (part[0][0])
16481        && REG_P (part[1][1])
16482        && (REGNO (part[0][0]) == REGNO (part[1][1])
16483            || (nparts == 3
16484                && REGNO (part[0][0]) == REGNO (part[1][2]))
16485            || (nparts == 4
16486                && REGNO (part[0][0]) == REGNO (part[1][3]))))
16487       || (collisions > 0
16488           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
16489     {
16490       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
16491         {
16492           operands[2 + i] = part[0][j];
16493           operands[6 + i] = part[1][j];
16494         }
16495     }
16496   else
16497     {
16498       for (i = 0; i < nparts; i++)
16499         {
16500           operands[2 + i] = part[0][i];
16501           operands[6 + i] = part[1][i];
16502         }
16503     }
16504
16505   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
16506   if (optimize_insn_for_size_p ())
16507     {
16508       for (j = 0; j < nparts - 1; j++)
16509         if (CONST_INT_P (operands[6 + j])
16510             && operands[6 + j] != const0_rtx
16511             && REG_P (operands[2 + j]))
16512           for (i = j; i < nparts - 1; i++)
16513             if (CONST_INT_P (operands[7 + i])
16514                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
16515               operands[7 + i] = operands[2 + j];
16516     }
16517
16518   for (i = 0; i < nparts; i++)
16519     emit_move_insn (operands[2 + i], operands[6 + i]);
16520
16521   return;
16522 }
16523
16524 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
16525    left shift by a constant, either using a single shift or
16526    a sequence of add instructions.  */
16527
16528 static void
16529 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
16530 {
16531   if (count == 1)
16532     {
16533       emit_insn ((mode == DImode
16534                   ? gen_addsi3
16535                   : gen_adddi3) (operand, operand, operand));
16536     }
16537   else if (!optimize_insn_for_size_p ()
16538            && count * ix86_cost->add <= ix86_cost->shift_const)
16539     {
16540       int i;
16541       for (i=0; i<count; i++)
16542         {
16543           emit_insn ((mode == DImode
16544                       ? gen_addsi3
16545                       : gen_adddi3) (operand, operand, operand));
16546         }
16547     }
16548   else
16549     emit_insn ((mode == DImode
16550                 ? gen_ashlsi3
16551                 : gen_ashldi3) (operand, operand, GEN_INT (count)));
16552 }
16553
16554 void
16555 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
16556 {
16557   rtx low[2], high[2];
16558   int count;
16559   const int single_width = mode == DImode ? 32 : 64;
16560
16561   if (CONST_INT_P (operands[2]))
16562     {
16563       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16564       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16565
16566       if (count >= single_width)
16567         {
16568           emit_move_insn (high[0], low[1]);
16569           emit_move_insn (low[0], const0_rtx);
16570
16571           if (count > single_width)
16572             ix86_expand_ashl_const (high[0], count - single_width, mode);
16573         }
16574       else
16575         {
16576           if (!rtx_equal_p (operands[0], operands[1]))
16577             emit_move_insn (operands[0], operands[1]);
16578           emit_insn ((mode == DImode
16579                      ? gen_x86_shld
16580                      : gen_x86_64_shld) (high[0], low[0], GEN_INT (count)));
16581           ix86_expand_ashl_const (low[0], count, mode);
16582         }
16583       return;
16584     }
16585
16586   (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16587
16588   if (operands[1] == const1_rtx)
16589     {
16590       /* Assuming we've chosen a QImode capable registers, then 1 << N
16591          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
16592       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
16593         {
16594           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
16595
16596           ix86_expand_clear (low[0]);
16597           ix86_expand_clear (high[0]);
16598           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (single_width)));
16599
16600           d = gen_lowpart (QImode, low[0]);
16601           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16602           s = gen_rtx_EQ (QImode, flags, const0_rtx);
16603           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16604
16605           d = gen_lowpart (QImode, high[0]);
16606           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16607           s = gen_rtx_NE (QImode, flags, const0_rtx);
16608           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16609         }
16610
16611       /* Otherwise, we can get the same results by manually performing
16612          a bit extract operation on bit 5/6, and then performing the two
16613          shifts.  The two methods of getting 0/1 into low/high are exactly
16614          the same size.  Avoiding the shift in the bit extract case helps
16615          pentium4 a bit; no one else seems to care much either way.  */
16616       else
16617         {
16618           rtx x;
16619
16620           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
16621             x = gen_rtx_ZERO_EXTEND (mode == DImode ? SImode : DImode, operands[2]);
16622           else
16623             x = gen_lowpart (mode == DImode ? SImode : DImode, operands[2]);
16624           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
16625
16626           emit_insn ((mode == DImode
16627                       ? gen_lshrsi3
16628                       : gen_lshrdi3) (high[0], high[0], GEN_INT (mode == DImode ? 5 : 6)));
16629           emit_insn ((mode == DImode
16630                       ? gen_andsi3
16631                       : gen_anddi3) (high[0], high[0], GEN_INT (1)));
16632           emit_move_insn (low[0], high[0]);
16633           emit_insn ((mode == DImode
16634                       ? gen_xorsi3
16635                       : gen_xordi3) (low[0], low[0], GEN_INT (1)));
16636         }
16637
16638       emit_insn ((mode == DImode
16639                     ? gen_ashlsi3
16640                     : gen_ashldi3) (low[0], low[0], operands[2]));
16641       emit_insn ((mode == DImode
16642                     ? gen_ashlsi3
16643                     : gen_ashldi3) (high[0], high[0], operands[2]));
16644       return;
16645     }
16646
16647   if (operands[1] == constm1_rtx)
16648     {
16649       /* For -1 << N, we can avoid the shld instruction, because we
16650          know that we're shifting 0...31/63 ones into a -1.  */
16651       emit_move_insn (low[0], constm1_rtx);
16652       if (optimize_insn_for_size_p ())
16653         emit_move_insn (high[0], low[0]);
16654       else
16655         emit_move_insn (high[0], constm1_rtx);
16656     }
16657   else
16658     {
16659       if (!rtx_equal_p (operands[0], operands[1]))
16660         emit_move_insn (operands[0], operands[1]);
16661
16662       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16663       emit_insn ((mode == DImode
16664                   ? gen_x86_shld
16665                   : gen_x86_64_shld) (high[0], low[0], operands[2]));
16666     }
16667
16668   emit_insn ((mode == DImode ? gen_ashlsi3 : gen_ashldi3) (low[0], low[0], operands[2]));
16669
16670   if (TARGET_CMOVE && scratch)
16671     {
16672       ix86_expand_clear (scratch);
16673       emit_insn ((mode == DImode
16674                   ? gen_x86_shift_adj_1
16675                   : gen_x86_64_shift_adj_1) (high[0], low[0], operands[2],
16676                                              scratch));
16677     }
16678   else
16679     emit_insn ((mode == DImode
16680                 ? gen_x86_shift_adj_2
16681                 : gen_x86_64_shift_adj_2) (high[0], low[0], operands[2]));
16682 }
16683
16684 void
16685 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
16686 {
16687   rtx low[2], high[2];
16688   int count;
16689   const int single_width = mode == DImode ? 32 : 64;
16690
16691   if (CONST_INT_P (operands[2]))
16692     {
16693       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16694       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16695
16696       if (count == single_width * 2 - 1)
16697         {
16698           emit_move_insn (high[0], high[1]);
16699           emit_insn ((mode == DImode
16700                       ? gen_ashrsi3
16701                       : gen_ashrdi3) (high[0], high[0],
16702                                       GEN_INT (single_width - 1)));
16703           emit_move_insn (low[0], high[0]);
16704
16705         }
16706       else if (count >= single_width)
16707         {
16708           emit_move_insn (low[0], high[1]);
16709           emit_move_insn (high[0], low[0]);
16710           emit_insn ((mode == DImode
16711                       ? gen_ashrsi3
16712                       : gen_ashrdi3) (high[0], high[0],
16713                                       GEN_INT (single_width - 1)));
16714           if (count > single_width)
16715             emit_insn ((mode == DImode
16716                         ? gen_ashrsi3
16717                         : gen_ashrdi3) (low[0], low[0],
16718                                         GEN_INT (count - single_width)));
16719         }
16720       else
16721         {
16722           if (!rtx_equal_p (operands[0], operands[1]))
16723             emit_move_insn (operands[0], operands[1]);
16724           emit_insn ((mode == DImode
16725                       ? gen_x86_shrd
16726                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
16727           emit_insn ((mode == DImode
16728                       ? gen_ashrsi3
16729                       : gen_ashrdi3) (high[0], high[0], GEN_INT (count)));
16730         }
16731     }
16732   else
16733     {
16734       if (!rtx_equal_p (operands[0], operands[1]))
16735         emit_move_insn (operands[0], operands[1]);
16736
16737       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16738
16739       emit_insn ((mode == DImode
16740                   ? gen_x86_shrd
16741                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
16742       emit_insn ((mode == DImode
16743                   ? gen_ashrsi3
16744                   : gen_ashrdi3)  (high[0], high[0], operands[2]));
16745
16746       if (TARGET_CMOVE && scratch)
16747         {
16748           emit_move_insn (scratch, high[0]);
16749           emit_insn ((mode == DImode
16750                       ? gen_ashrsi3
16751                       : gen_ashrdi3) (scratch, scratch,
16752                                       GEN_INT (single_width - 1)));
16753           emit_insn ((mode == DImode
16754                       ? gen_x86_shift_adj_1
16755                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
16756                                                  scratch));
16757         }
16758       else
16759         emit_insn ((mode == DImode
16760                     ? gen_x86_shift_adj_3
16761                     : gen_x86_64_shift_adj_3) (low[0], high[0], operands[2]));
16762     }
16763 }
16764
16765 void
16766 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
16767 {
16768   rtx low[2], high[2];
16769   int count;
16770   const int single_width = mode == DImode ? 32 : 64;
16771
16772   if (CONST_INT_P (operands[2]))
16773     {
16774       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16775       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16776
16777       if (count >= single_width)
16778         {
16779           emit_move_insn (low[0], high[1]);
16780           ix86_expand_clear (high[0]);
16781
16782           if (count > single_width)
16783             emit_insn ((mode == DImode
16784                         ? gen_lshrsi3
16785                         : gen_lshrdi3) (low[0], low[0],
16786                                         GEN_INT (count - single_width)));
16787         }
16788       else
16789         {
16790           if (!rtx_equal_p (operands[0], operands[1]))
16791             emit_move_insn (operands[0], operands[1]);
16792           emit_insn ((mode == DImode
16793                       ? gen_x86_shrd
16794                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
16795           emit_insn ((mode == DImode
16796                       ? gen_lshrsi3
16797                       : gen_lshrdi3) (high[0], high[0], GEN_INT (count)));
16798         }
16799     }
16800   else
16801     {
16802       if (!rtx_equal_p (operands[0], operands[1]))
16803         emit_move_insn (operands[0], operands[1]);
16804
16805       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16806
16807       emit_insn ((mode == DImode
16808                   ? gen_x86_shrd
16809                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
16810       emit_insn ((mode == DImode
16811                   ? gen_lshrsi3
16812                   : gen_lshrdi3) (high[0], high[0], operands[2]));
16813
16814       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
16815       if (TARGET_CMOVE && scratch)
16816         {
16817           ix86_expand_clear (scratch);
16818           emit_insn ((mode == DImode
16819                       ? gen_x86_shift_adj_1
16820                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
16821                                                  scratch));
16822         }
16823       else
16824         emit_insn ((mode == DImode
16825                     ? gen_x86_shift_adj_2
16826                     : gen_x86_64_shift_adj_2) (low[0], high[0], operands[2]));
16827     }
16828 }
16829
16830 /* Predict just emitted jump instruction to be taken with probability PROB.  */
16831 static void
16832 predict_jump (int prob)
16833 {
16834   rtx insn = get_last_insn ();
16835   gcc_assert (JUMP_P (insn));
16836   REG_NOTES (insn)
16837     = gen_rtx_EXPR_LIST (REG_BR_PROB,
16838                          GEN_INT (prob),
16839                          REG_NOTES (insn));
16840 }
16841
16842 /* Helper function for the string operations below.  Dest VARIABLE whether
16843    it is aligned to VALUE bytes.  If true, jump to the label.  */
16844 static rtx
16845 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
16846 {
16847   rtx label = gen_label_rtx ();
16848   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
16849   if (GET_MODE (variable) == DImode)
16850     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
16851   else
16852     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
16853   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
16854                            1, label);
16855   if (epilogue)
16856     predict_jump (REG_BR_PROB_BASE * 50 / 100);
16857   else
16858     predict_jump (REG_BR_PROB_BASE * 90 / 100);
16859   return label;
16860 }
16861
16862 /* Adjust COUNTER by the VALUE.  */
16863 static void
16864 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
16865 {
16866   if (GET_MODE (countreg) == DImode)
16867     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
16868   else
16869     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
16870 }
16871
16872 /* Zero extend possibly SImode EXP to Pmode register.  */
16873 rtx
16874 ix86_zero_extend_to_Pmode (rtx exp)
16875 {
16876   rtx r;
16877   if (GET_MODE (exp) == VOIDmode)
16878     return force_reg (Pmode, exp);
16879   if (GET_MODE (exp) == Pmode)
16880     return copy_to_mode_reg (Pmode, exp);
16881   r = gen_reg_rtx (Pmode);
16882   emit_insn (gen_zero_extendsidi2 (r, exp));
16883   return r;
16884 }
16885
16886 /* Divide COUNTREG by SCALE.  */
16887 static rtx
16888 scale_counter (rtx countreg, int scale)
16889 {
16890   rtx sc;
16891   rtx piece_size_mask;
16892
16893   if (scale == 1)
16894     return countreg;
16895   if (CONST_INT_P (countreg))
16896     return GEN_INT (INTVAL (countreg) / scale);
16897   gcc_assert (REG_P (countreg));
16898
16899   piece_size_mask = GEN_INT (scale - 1);
16900   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
16901                             GEN_INT (exact_log2 (scale)),
16902                             NULL, 1, OPTAB_DIRECT);
16903   return sc;
16904 }
16905
16906 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
16907    DImode for constant loop counts.  */
16908
16909 static enum machine_mode
16910 counter_mode (rtx count_exp)
16911 {
16912   if (GET_MODE (count_exp) != VOIDmode)
16913     return GET_MODE (count_exp);
16914   if (GET_CODE (count_exp) != CONST_INT)
16915     return Pmode;
16916   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
16917     return DImode;
16918   return SImode;
16919 }
16920
16921 /* When SRCPTR is non-NULL, output simple loop to move memory
16922    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
16923    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
16924    equivalent loop to set memory by VALUE (supposed to be in MODE).
16925
16926    The size is rounded down to whole number of chunk size moved at once.
16927    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
16928
16929
16930 static void
16931 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
16932                                rtx destptr, rtx srcptr, rtx value,
16933                                rtx count, enum machine_mode mode, int unroll,
16934                                int expected_size)
16935 {
16936   rtx out_label, top_label, iter, tmp;
16937   enum machine_mode iter_mode = counter_mode (count);
16938   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
16939   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
16940   rtx size;
16941   rtx x_addr;
16942   rtx y_addr;
16943   int i;
16944
16945   top_label = gen_label_rtx ();
16946   out_label = gen_label_rtx ();
16947   iter = gen_reg_rtx (iter_mode);
16948
16949   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
16950                               NULL, 1, OPTAB_DIRECT);
16951   /* Those two should combine.  */
16952   if (piece_size == const1_rtx)
16953     {
16954       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
16955                                true, out_label);
16956       predict_jump (REG_BR_PROB_BASE * 10 / 100);
16957     }
16958   emit_move_insn (iter, const0_rtx);
16959
16960   emit_label (top_label);
16961
16962   tmp = convert_modes (Pmode, iter_mode, iter, true);
16963   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
16964   destmem = change_address (destmem, mode, x_addr);
16965
16966   if (srcmem)
16967     {
16968       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
16969       srcmem = change_address (srcmem, mode, y_addr);
16970
16971       /* When unrolling for chips that reorder memory reads and writes,
16972          we can save registers by using single temporary.
16973          Also using 4 temporaries is overkill in 32bit mode.  */
16974       if (!TARGET_64BIT && 0)
16975         {
16976           for (i = 0; i < unroll; i++)
16977             {
16978               if (i)
16979                 {
16980                   destmem =
16981                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
16982                   srcmem =
16983                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
16984                 }
16985               emit_move_insn (destmem, srcmem);
16986             }
16987         }
16988       else
16989         {
16990           rtx tmpreg[4];
16991           gcc_assert (unroll <= 4);
16992           for (i = 0; i < unroll; i++)
16993             {
16994               tmpreg[i] = gen_reg_rtx (mode);
16995               if (i)
16996                 {
16997                   srcmem =
16998                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
16999                 }
17000               emit_move_insn (tmpreg[i], srcmem);
17001             }
17002           for (i = 0; i < unroll; i++)
17003             {
17004               if (i)
17005                 {
17006                   destmem =
17007                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17008                 }
17009               emit_move_insn (destmem, tmpreg[i]);
17010             }
17011         }
17012     }
17013   else
17014     for (i = 0; i < unroll; i++)
17015       {
17016         if (i)
17017           destmem =
17018             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17019         emit_move_insn (destmem, value);
17020       }
17021
17022   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
17023                              true, OPTAB_LIB_WIDEN);
17024   if (tmp != iter)
17025     emit_move_insn (iter, tmp);
17026
17027   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
17028                            true, top_label);
17029   if (expected_size != -1)
17030     {
17031       expected_size /= GET_MODE_SIZE (mode) * unroll;
17032       if (expected_size == 0)
17033         predict_jump (0);
17034       else if (expected_size > REG_BR_PROB_BASE)
17035         predict_jump (REG_BR_PROB_BASE - 1);
17036       else
17037         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
17038     }
17039   else
17040     predict_jump (REG_BR_PROB_BASE * 80 / 100);
17041   iter = ix86_zero_extend_to_Pmode (iter);
17042   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
17043                              true, OPTAB_LIB_WIDEN);
17044   if (tmp != destptr)
17045     emit_move_insn (destptr, tmp);
17046   if (srcptr)
17047     {
17048       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
17049                                  true, OPTAB_LIB_WIDEN);
17050       if (tmp != srcptr)
17051         emit_move_insn (srcptr, tmp);
17052     }
17053   emit_label (out_label);
17054 }
17055
17056 /* Output "rep; mov" instruction.
17057    Arguments have same meaning as for previous function */
17058 static void
17059 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
17060                            rtx destptr, rtx srcptr,
17061                            rtx count,
17062                            enum machine_mode mode)
17063 {
17064   rtx destexp;
17065   rtx srcexp;
17066   rtx countreg;
17067
17068   /* If the size is known, it is shorter to use rep movs.  */
17069   if (mode == QImode && CONST_INT_P (count)
17070       && !(INTVAL (count) & 3))
17071     mode = SImode;
17072
17073   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17074     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17075   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
17076     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
17077   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17078   if (mode != QImode)
17079     {
17080       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17081                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17082       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17083       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
17084                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17085       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
17086     }
17087   else
17088     {
17089       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17090       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
17091     }
17092   if (CONST_INT_P (count))
17093     {
17094       count = GEN_INT (INTVAL (count)
17095                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17096       destmem = shallow_copy_rtx (destmem);
17097       srcmem = shallow_copy_rtx (srcmem);
17098       set_mem_size (destmem, count);
17099       set_mem_size (srcmem, count);
17100     }
17101   else
17102     {
17103       if (MEM_SIZE (destmem))
17104         set_mem_size (destmem, NULL_RTX);
17105       if (MEM_SIZE (srcmem))
17106         set_mem_size (srcmem, NULL_RTX);
17107     }
17108   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
17109                           destexp, srcexp));
17110 }
17111
17112 /* Output "rep; stos" instruction.
17113    Arguments have same meaning as for previous function */
17114 static void
17115 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
17116                             rtx count, enum machine_mode mode,
17117                             rtx orig_value)
17118 {
17119   rtx destexp;
17120   rtx countreg;
17121
17122   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17123     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17124   value = force_reg (mode, gen_lowpart (mode, value));
17125   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17126   if (mode != QImode)
17127     {
17128       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17129                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17130       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17131     }
17132   else
17133     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17134   if (orig_value == const0_rtx && CONST_INT_P (count))
17135     {
17136       count = GEN_INT (INTVAL (count)
17137                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17138       destmem = shallow_copy_rtx (destmem);
17139       set_mem_size (destmem, count);
17140     }
17141   else if (MEM_SIZE (destmem))
17142     set_mem_size (destmem, NULL_RTX);
17143   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
17144 }
17145
17146 static void
17147 emit_strmov (rtx destmem, rtx srcmem,
17148              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
17149 {
17150   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
17151   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
17152   emit_insn (gen_strmov (destptr, dest, srcptr, src));
17153 }
17154
17155 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
17156 static void
17157 expand_movmem_epilogue (rtx destmem, rtx srcmem,
17158                         rtx destptr, rtx srcptr, rtx count, int max_size)
17159 {
17160   rtx src, dest;
17161   if (CONST_INT_P (count))
17162     {
17163       HOST_WIDE_INT countval = INTVAL (count);
17164       int offset = 0;
17165
17166       if ((countval & 0x10) && max_size > 16)
17167         {
17168           if (TARGET_64BIT)
17169             {
17170               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17171               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
17172             }
17173           else
17174             gcc_unreachable ();
17175           offset += 16;
17176         }
17177       if ((countval & 0x08) && max_size > 8)
17178         {
17179           if (TARGET_64BIT)
17180             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17181           else
17182             {
17183               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17184               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
17185             }
17186           offset += 8;
17187         }
17188       if ((countval & 0x04) && max_size > 4)
17189         {
17190           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17191           offset += 4;
17192         }
17193       if ((countval & 0x02) && max_size > 2)
17194         {
17195           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
17196           offset += 2;
17197         }
17198       if ((countval & 0x01) && max_size > 1)
17199         {
17200           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
17201           offset += 1;
17202         }
17203       return;
17204     }
17205   if (max_size > 8)
17206     {
17207       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
17208                                     count, 1, OPTAB_DIRECT);
17209       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
17210                                      count, QImode, 1, 4);
17211       return;
17212     }
17213
17214   /* When there are stringops, we can cheaply increase dest and src pointers.
17215      Otherwise we save code size by maintaining offset (zero is readily
17216      available from preceding rep operation) and using x86 addressing modes.
17217    */
17218   if (TARGET_SINGLE_STRINGOP)
17219     {
17220       if (max_size > 4)
17221         {
17222           rtx label = ix86_expand_aligntest (count, 4, true);
17223           src = change_address (srcmem, SImode, srcptr);
17224           dest = change_address (destmem, SImode, destptr);
17225           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17226           emit_label (label);
17227           LABEL_NUSES (label) = 1;
17228         }
17229       if (max_size > 2)
17230         {
17231           rtx label = ix86_expand_aligntest (count, 2, true);
17232           src = change_address (srcmem, HImode, srcptr);
17233           dest = change_address (destmem, HImode, destptr);
17234           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17235           emit_label (label);
17236           LABEL_NUSES (label) = 1;
17237         }
17238       if (max_size > 1)
17239         {
17240           rtx label = ix86_expand_aligntest (count, 1, true);
17241           src = change_address (srcmem, QImode, srcptr);
17242           dest = change_address (destmem, QImode, destptr);
17243           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17244           emit_label (label);
17245           LABEL_NUSES (label) = 1;
17246         }
17247     }
17248   else
17249     {
17250       rtx offset = force_reg (Pmode, const0_rtx);
17251       rtx tmp;
17252
17253       if (max_size > 4)
17254         {
17255           rtx label = ix86_expand_aligntest (count, 4, true);
17256           src = change_address (srcmem, SImode, srcptr);
17257           dest = change_address (destmem, SImode, destptr);
17258           emit_move_insn (dest, src);
17259           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
17260                                      true, OPTAB_LIB_WIDEN);
17261           if (tmp != offset)
17262             emit_move_insn (offset, tmp);
17263           emit_label (label);
17264           LABEL_NUSES (label) = 1;
17265         }
17266       if (max_size > 2)
17267         {
17268           rtx label = ix86_expand_aligntest (count, 2, true);
17269           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17270           src = change_address (srcmem, HImode, tmp);
17271           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17272           dest = change_address (destmem, HImode, tmp);
17273           emit_move_insn (dest, src);
17274           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
17275                                      true, OPTAB_LIB_WIDEN);
17276           if (tmp != offset)
17277             emit_move_insn (offset, tmp);
17278           emit_label (label);
17279           LABEL_NUSES (label) = 1;
17280         }
17281       if (max_size > 1)
17282         {
17283           rtx label = ix86_expand_aligntest (count, 1, true);
17284           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17285           src = change_address (srcmem, QImode, tmp);
17286           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17287           dest = change_address (destmem, QImode, tmp);
17288           emit_move_insn (dest, src);
17289           emit_label (label);
17290           LABEL_NUSES (label) = 1;
17291         }
17292     }
17293 }
17294
17295 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17296 static void
17297 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
17298                                  rtx count, int max_size)
17299 {
17300   count =
17301     expand_simple_binop (counter_mode (count), AND, count,
17302                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
17303   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
17304                                  gen_lowpart (QImode, value), count, QImode,
17305                                  1, max_size / 2);
17306 }
17307
17308 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17309 static void
17310 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
17311 {
17312   rtx dest;
17313
17314   if (CONST_INT_P (count))
17315     {
17316       HOST_WIDE_INT countval = INTVAL (count);
17317       int offset = 0;
17318
17319       if ((countval & 0x10) && max_size > 16)
17320         {
17321           if (TARGET_64BIT)
17322             {
17323               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17324               emit_insn (gen_strset (destptr, dest, value));
17325               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
17326               emit_insn (gen_strset (destptr, dest, value));
17327             }
17328           else
17329             gcc_unreachable ();
17330           offset += 16;
17331         }
17332       if ((countval & 0x08) && max_size > 8)
17333         {
17334           if (TARGET_64BIT)
17335             {
17336               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17337               emit_insn (gen_strset (destptr, dest, value));
17338             }
17339           else
17340             {
17341               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17342               emit_insn (gen_strset (destptr, dest, value));
17343               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
17344               emit_insn (gen_strset (destptr, dest, value));
17345             }
17346           offset += 8;
17347         }
17348       if ((countval & 0x04) && max_size > 4)
17349         {
17350           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17351           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17352           offset += 4;
17353         }
17354       if ((countval & 0x02) && max_size > 2)
17355         {
17356           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
17357           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17358           offset += 2;
17359         }
17360       if ((countval & 0x01) && max_size > 1)
17361         {
17362           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
17363           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17364           offset += 1;
17365         }
17366       return;
17367     }
17368   if (max_size > 32)
17369     {
17370       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
17371       return;
17372     }
17373   if (max_size > 16)
17374     {
17375       rtx label = ix86_expand_aligntest (count, 16, true);
17376       if (TARGET_64BIT)
17377         {
17378           dest = change_address (destmem, DImode, destptr);
17379           emit_insn (gen_strset (destptr, dest, value));
17380           emit_insn (gen_strset (destptr, dest, value));
17381         }
17382       else
17383         {
17384           dest = change_address (destmem, SImode, destptr);
17385           emit_insn (gen_strset (destptr, dest, value));
17386           emit_insn (gen_strset (destptr, dest, value));
17387           emit_insn (gen_strset (destptr, dest, value));
17388           emit_insn (gen_strset (destptr, dest, value));
17389         }
17390       emit_label (label);
17391       LABEL_NUSES (label) = 1;
17392     }
17393   if (max_size > 8)
17394     {
17395       rtx label = ix86_expand_aligntest (count, 8, true);
17396       if (TARGET_64BIT)
17397         {
17398           dest = change_address (destmem, DImode, destptr);
17399           emit_insn (gen_strset (destptr, dest, value));
17400         }
17401       else
17402         {
17403           dest = change_address (destmem, SImode, destptr);
17404           emit_insn (gen_strset (destptr, dest, value));
17405           emit_insn (gen_strset (destptr, dest, value));
17406         }
17407       emit_label (label);
17408       LABEL_NUSES (label) = 1;
17409     }
17410   if (max_size > 4)
17411     {
17412       rtx label = ix86_expand_aligntest (count, 4, true);
17413       dest = change_address (destmem, SImode, destptr);
17414       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17415       emit_label (label);
17416       LABEL_NUSES (label) = 1;
17417     }
17418   if (max_size > 2)
17419     {
17420       rtx label = ix86_expand_aligntest (count, 2, true);
17421       dest = change_address (destmem, HImode, destptr);
17422       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17423       emit_label (label);
17424       LABEL_NUSES (label) = 1;
17425     }
17426   if (max_size > 1)
17427     {
17428       rtx label = ix86_expand_aligntest (count, 1, true);
17429       dest = change_address (destmem, QImode, destptr);
17430       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17431       emit_label (label);
17432       LABEL_NUSES (label) = 1;
17433     }
17434 }
17435
17436 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
17437    DESIRED_ALIGNMENT.  */
17438 static void
17439 expand_movmem_prologue (rtx destmem, rtx srcmem,
17440                         rtx destptr, rtx srcptr, rtx count,
17441                         int align, int desired_alignment)
17442 {
17443   if (align <= 1 && desired_alignment > 1)
17444     {
17445       rtx label = ix86_expand_aligntest (destptr, 1, false);
17446       srcmem = change_address (srcmem, QImode, srcptr);
17447       destmem = change_address (destmem, QImode, destptr);
17448       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17449       ix86_adjust_counter (count, 1);
17450       emit_label (label);
17451       LABEL_NUSES (label) = 1;
17452     }
17453   if (align <= 2 && desired_alignment > 2)
17454     {
17455       rtx label = ix86_expand_aligntest (destptr, 2, false);
17456       srcmem = change_address (srcmem, HImode, srcptr);
17457       destmem = change_address (destmem, HImode, destptr);
17458       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17459       ix86_adjust_counter (count, 2);
17460       emit_label (label);
17461       LABEL_NUSES (label) = 1;
17462     }
17463   if (align <= 4 && desired_alignment > 4)
17464     {
17465       rtx label = ix86_expand_aligntest (destptr, 4, false);
17466       srcmem = change_address (srcmem, SImode, srcptr);
17467       destmem = change_address (destmem, SImode, destptr);
17468       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17469       ix86_adjust_counter (count, 4);
17470       emit_label (label);
17471       LABEL_NUSES (label) = 1;
17472     }
17473   gcc_assert (desired_alignment <= 8);
17474 }
17475
17476 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
17477    ALIGN_BYTES is how many bytes need to be copied.  */
17478 static rtx
17479 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
17480                                  int desired_align, int align_bytes)
17481 {
17482   rtx src = *srcp;
17483   rtx src_size, dst_size;
17484   int off = 0;
17485   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
17486   if (src_align_bytes >= 0)
17487     src_align_bytes = desired_align - src_align_bytes;
17488   src_size = MEM_SIZE (src);
17489   dst_size = MEM_SIZE (dst);
17490   if (align_bytes & 1)
17491     {
17492       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17493       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
17494       off = 1;
17495       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17496     }
17497   if (align_bytes & 2)
17498     {
17499       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17500       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
17501       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17502         set_mem_align (dst, 2 * BITS_PER_UNIT);
17503       if (src_align_bytes >= 0
17504           && (src_align_bytes & 1) == (align_bytes & 1)
17505           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
17506         set_mem_align (src, 2 * BITS_PER_UNIT);
17507       off = 2;
17508       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17509     }
17510   if (align_bytes & 4)
17511     {
17512       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17513       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
17514       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17515         set_mem_align (dst, 4 * BITS_PER_UNIT);
17516       if (src_align_bytes >= 0)
17517         {
17518           unsigned int src_align = 0;
17519           if ((src_align_bytes & 3) == (align_bytes & 3))
17520             src_align = 4;
17521           else if ((src_align_bytes & 1) == (align_bytes & 1))
17522             src_align = 2;
17523           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17524             set_mem_align (src, src_align * BITS_PER_UNIT);
17525         }
17526       off = 4;
17527       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17528     }
17529   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17530   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
17531   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17532     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17533   if (src_align_bytes >= 0)
17534     {
17535       unsigned int src_align = 0;
17536       if ((src_align_bytes & 7) == (align_bytes & 7))
17537         src_align = 8;
17538       else if ((src_align_bytes & 3) == (align_bytes & 3))
17539         src_align = 4;
17540       else if ((src_align_bytes & 1) == (align_bytes & 1))
17541         src_align = 2;
17542       if (src_align > (unsigned int) desired_align)
17543         src_align = desired_align;
17544       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17545         set_mem_align (src, src_align * BITS_PER_UNIT);
17546     }
17547   if (dst_size)
17548     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17549   if (src_size)
17550     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
17551   *srcp = src;
17552   return dst;
17553 }
17554
17555 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
17556    DESIRED_ALIGNMENT.  */
17557 static void
17558 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
17559                         int align, int desired_alignment)
17560 {
17561   if (align <= 1 && desired_alignment > 1)
17562     {
17563       rtx label = ix86_expand_aligntest (destptr, 1, false);
17564       destmem = change_address (destmem, QImode, destptr);
17565       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
17566       ix86_adjust_counter (count, 1);
17567       emit_label (label);
17568       LABEL_NUSES (label) = 1;
17569     }
17570   if (align <= 2 && desired_alignment > 2)
17571     {
17572       rtx label = ix86_expand_aligntest (destptr, 2, false);
17573       destmem = change_address (destmem, HImode, destptr);
17574       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
17575       ix86_adjust_counter (count, 2);
17576       emit_label (label);
17577       LABEL_NUSES (label) = 1;
17578     }
17579   if (align <= 4 && desired_alignment > 4)
17580     {
17581       rtx label = ix86_expand_aligntest (destptr, 4, false);
17582       destmem = change_address (destmem, SImode, destptr);
17583       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
17584       ix86_adjust_counter (count, 4);
17585       emit_label (label);
17586       LABEL_NUSES (label) = 1;
17587     }
17588   gcc_assert (desired_alignment <= 8);
17589 }
17590
17591 /* Set enough from DST to align DST known to by aligned by ALIGN to
17592    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
17593 static rtx
17594 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
17595                                  int desired_align, int align_bytes)
17596 {
17597   int off = 0;
17598   rtx dst_size = MEM_SIZE (dst);
17599   if (align_bytes & 1)
17600     {
17601       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17602       off = 1;
17603       emit_insn (gen_strset (destreg, dst,
17604                              gen_lowpart (QImode, value)));
17605     }
17606   if (align_bytes & 2)
17607     {
17608       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17609       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17610         set_mem_align (dst, 2 * BITS_PER_UNIT);
17611       off = 2;
17612       emit_insn (gen_strset (destreg, dst,
17613                              gen_lowpart (HImode, value)));
17614     }
17615   if (align_bytes & 4)
17616     {
17617       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17618       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17619         set_mem_align (dst, 4 * BITS_PER_UNIT);
17620       off = 4;
17621       emit_insn (gen_strset (destreg, dst,
17622                              gen_lowpart (SImode, value)));
17623     }
17624   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17625   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17626     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17627   if (dst_size)
17628     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17629   return dst;
17630 }
17631
17632 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
17633 static enum stringop_alg
17634 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
17635             int *dynamic_check)
17636 {
17637   const struct stringop_algs * algs;
17638   bool optimize_for_speed;
17639   /* Algorithms using the rep prefix want at least edi and ecx;
17640      additionally, memset wants eax and memcpy wants esi.  Don't
17641      consider such algorithms if the user has appropriated those
17642      registers for their own purposes.  */
17643   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
17644                              || (memset
17645                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
17646
17647 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
17648                            || (alg != rep_prefix_1_byte         \
17649                                && alg != rep_prefix_4_byte      \
17650                                && alg != rep_prefix_8_byte))
17651   const struct processor_costs *cost;
17652   
17653   /* Even if the string operation call is cold, we still might spend a lot
17654      of time processing large blocks.  */
17655   if (optimize_function_for_size_p (cfun)
17656       || (optimize_insn_for_size_p ()
17657           && expected_size != -1 && expected_size < 256))
17658     optimize_for_speed = false;
17659   else
17660     optimize_for_speed = true;
17661
17662   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
17663
17664   *dynamic_check = -1;
17665   if (memset)
17666     algs = &cost->memset[TARGET_64BIT != 0];
17667   else
17668     algs = &cost->memcpy[TARGET_64BIT != 0];
17669   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
17670     return stringop_alg;
17671   /* rep; movq or rep; movl is the smallest variant.  */
17672   else if (!optimize_for_speed)
17673     {
17674       if (!count || (count & 3))
17675         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
17676       else
17677         return rep_prefix_usable ? rep_prefix_4_byte : loop;
17678     }
17679   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
17680    */
17681   else if (expected_size != -1 && expected_size < 4)
17682     return loop_1_byte;
17683   else if (expected_size != -1)
17684     {
17685       unsigned int i;
17686       enum stringop_alg alg = libcall;
17687       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
17688         {
17689           /* We get here if the algorithms that were not libcall-based
17690              were rep-prefix based and we are unable to use rep prefixes
17691              based on global register usage.  Break out of the loop and
17692              use the heuristic below.  */
17693           if (algs->size[i].max == 0)
17694             break;
17695           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
17696             {
17697               enum stringop_alg candidate = algs->size[i].alg;
17698
17699               if (candidate != libcall && ALG_USABLE_P (candidate))
17700                 alg = candidate;
17701               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
17702                  last non-libcall inline algorithm.  */
17703               if (TARGET_INLINE_ALL_STRINGOPS)
17704                 {
17705                   /* When the current size is best to be copied by a libcall,
17706                      but we are still forced to inline, run the heuristic below
17707                      that will pick code for medium sized blocks.  */
17708                   if (alg != libcall)
17709                     return alg;
17710                   break;
17711                 }
17712               else if (ALG_USABLE_P (candidate))
17713                 return candidate;
17714             }
17715         }
17716       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
17717     }
17718   /* When asked to inline the call anyway, try to pick meaningful choice.
17719      We look for maximal size of block that is faster to copy by hand and
17720      take blocks of at most of that size guessing that average size will
17721      be roughly half of the block.
17722
17723      If this turns out to be bad, we might simply specify the preferred
17724      choice in ix86_costs.  */
17725   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17726       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
17727     {
17728       int max = -1;
17729       enum stringop_alg alg;
17730       int i;
17731       bool any_alg_usable_p = true;
17732
17733       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
17734         {
17735           enum stringop_alg candidate = algs->size[i].alg;
17736           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
17737
17738           if (candidate != libcall && candidate
17739               && ALG_USABLE_P (candidate))
17740               max = algs->size[i].max;
17741         }
17742       /* If there aren't any usable algorithms, then recursing on
17743          smaller sizes isn't going to find anything.  Just return the
17744          simple byte-at-a-time copy loop.  */
17745       if (!any_alg_usable_p)
17746         {
17747           /* Pick something reasonable.  */
17748           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17749             *dynamic_check = 128;
17750           return loop_1_byte;
17751         }
17752       if (max == -1)
17753         max = 4096;
17754       alg = decide_alg (count, max / 2, memset, dynamic_check);
17755       gcc_assert (*dynamic_check == -1);
17756       gcc_assert (alg != libcall);
17757       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17758         *dynamic_check = max;
17759       return alg;
17760     }
17761   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
17762 #undef ALG_USABLE_P
17763 }
17764
17765 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
17766    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
17767 static int
17768 decide_alignment (int align,
17769                   enum stringop_alg alg,
17770                   int expected_size)
17771 {
17772   int desired_align = 0;
17773   switch (alg)
17774     {
17775       case no_stringop:
17776         gcc_unreachable ();
17777       case loop:
17778       case unrolled_loop:
17779         desired_align = GET_MODE_SIZE (Pmode);
17780         break;
17781       case rep_prefix_8_byte:
17782         desired_align = 8;
17783         break;
17784       case rep_prefix_4_byte:
17785         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
17786            copying whole cacheline at once.  */
17787         if (TARGET_PENTIUMPRO)
17788           desired_align = 8;
17789         else
17790           desired_align = 4;
17791         break;
17792       case rep_prefix_1_byte:
17793         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
17794            copying whole cacheline at once.  */
17795         if (TARGET_PENTIUMPRO)
17796           desired_align = 8;
17797         else
17798           desired_align = 1;
17799         break;
17800       case loop_1_byte:
17801         desired_align = 1;
17802         break;
17803       case libcall:
17804         return 0;
17805     }
17806
17807   if (optimize_size)
17808     desired_align = 1;
17809   if (desired_align < align)
17810     desired_align = align;
17811   if (expected_size != -1 && expected_size < 4)
17812     desired_align = align;
17813   return desired_align;
17814 }
17815
17816 /* Return the smallest power of 2 greater than VAL.  */
17817 static int
17818 smallest_pow2_greater_than (int val)
17819 {
17820   int ret = 1;
17821   while (ret <= val)
17822     ret <<= 1;
17823   return ret;
17824 }
17825
17826 /* Expand string move (memcpy) operation.  Use i386 string operations when
17827    profitable.  expand_setmem contains similar code.  The code depends upon
17828    architecture, block size and alignment, but always has the same
17829    overall structure:
17830
17831    1) Prologue guard: Conditional that jumps up to epilogues for small
17832       blocks that can be handled by epilogue alone.  This is faster but
17833       also needed for correctness, since prologue assume the block is larger
17834       than the desired alignment.
17835
17836       Optional dynamic check for size and libcall for large
17837       blocks is emitted here too, with -minline-stringops-dynamically.
17838
17839    2) Prologue: copy first few bytes in order to get destination aligned
17840       to DESIRED_ALIGN.  It is emitted only when ALIGN is less than
17841       DESIRED_ALIGN and and up to DESIRED_ALIGN - ALIGN bytes can be copied.
17842       We emit either a jump tree on power of two sized blocks, or a byte loop.
17843
17844    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
17845       with specified algorithm.
17846
17847    4) Epilogue: code copying tail of the block that is too small to be
17848       handled by main body (or up to size guarded by prologue guard).  */
17849
17850 int
17851 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
17852                     rtx expected_align_exp, rtx expected_size_exp)
17853 {
17854   rtx destreg;
17855   rtx srcreg;
17856   rtx label = NULL;
17857   rtx tmp;
17858   rtx jump_around_label = NULL;
17859   HOST_WIDE_INT align = 1;
17860   unsigned HOST_WIDE_INT count = 0;
17861   HOST_WIDE_INT expected_size = -1;
17862   int size_needed = 0, epilogue_size_needed;
17863   int desired_align = 0, align_bytes = 0;
17864   enum stringop_alg alg;
17865   int dynamic_check;
17866   bool need_zero_guard = false;
17867
17868   if (CONST_INT_P (align_exp))
17869     align = INTVAL (align_exp);
17870   /* i386 can do misaligned access on reasonably increased cost.  */
17871   if (CONST_INT_P (expected_align_exp)
17872       && INTVAL (expected_align_exp) > align)
17873     align = INTVAL (expected_align_exp);
17874   /* ALIGN is the minimum of destination and source alignment, but we care here
17875      just about destination alignment.  */
17876   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
17877     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
17878
17879   if (CONST_INT_P (count_exp))
17880     count = expected_size = INTVAL (count_exp);
17881   if (CONST_INT_P (expected_size_exp) && count == 0)
17882     expected_size = INTVAL (expected_size_exp);
17883
17884   /* Make sure we don't need to care about overflow later on.  */
17885   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
17886     return 0;
17887
17888   /* Step 0: Decide on preferred algorithm, desired alignment and
17889      size of chunks to be copied by main loop.  */
17890
17891   alg = decide_alg (count, expected_size, false, &dynamic_check);
17892   desired_align = decide_alignment (align, alg, expected_size);
17893
17894   if (!TARGET_ALIGN_STRINGOPS)
17895     align = desired_align;
17896
17897   if (alg == libcall)
17898     return 0;
17899   gcc_assert (alg != no_stringop);
17900   if (!count)
17901     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
17902   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
17903   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
17904   switch (alg)
17905     {
17906     case libcall:
17907     case no_stringop:
17908       gcc_unreachable ();
17909     case loop:
17910       need_zero_guard = true;
17911       size_needed = GET_MODE_SIZE (Pmode);
17912       break;
17913     case unrolled_loop:
17914       need_zero_guard = true;
17915       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
17916       break;
17917     case rep_prefix_8_byte:
17918       size_needed = 8;
17919       break;
17920     case rep_prefix_4_byte:
17921       size_needed = 4;
17922       break;
17923     case rep_prefix_1_byte:
17924       size_needed = 1;
17925       break;
17926     case loop_1_byte:
17927       need_zero_guard = true;
17928       size_needed = 1;
17929       break;
17930     }
17931
17932   epilogue_size_needed = size_needed;
17933
17934   /* Step 1: Prologue guard.  */
17935
17936   /* Alignment code needs count to be in register.  */
17937   if (CONST_INT_P (count_exp) && desired_align > align)
17938     {
17939       if (INTVAL (count_exp) > desired_align
17940           && INTVAL (count_exp) > size_needed)
17941         {
17942           align_bytes
17943             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
17944           if (align_bytes <= 0)
17945             align_bytes = 0;
17946           else
17947             align_bytes = desired_align - align_bytes;
17948         }
17949       if (align_bytes == 0)
17950         count_exp = force_reg (counter_mode (count_exp), count_exp);
17951     }
17952   gcc_assert (desired_align >= 1 && align >= 1);
17953
17954   /* Ensure that alignment prologue won't copy past end of block.  */
17955   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
17956     {
17957       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
17958       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
17959          Make sure it is power of 2.  */
17960       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
17961
17962       if (count)
17963         {
17964           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
17965             {
17966               /* If main algorithm works on QImode, no epilogue is needed.
17967                  For small sizes just don't align anything.  */
17968               if (size_needed == 1)
17969                 desired_align = align;
17970               else
17971                 goto epilogue;
17972             }
17973         }
17974       else
17975         {
17976           label = gen_label_rtx ();
17977           emit_cmp_and_jump_insns (count_exp,
17978                                    GEN_INT (epilogue_size_needed),
17979                                    LTU, 0, counter_mode (count_exp), 1, label);
17980           if (expected_size == -1 || expected_size < epilogue_size_needed)
17981             predict_jump (REG_BR_PROB_BASE * 60 / 100);
17982           else
17983             predict_jump (REG_BR_PROB_BASE * 20 / 100);
17984         }
17985     }
17986
17987   /* Emit code to decide on runtime whether library call or inline should be
17988      used.  */
17989   if (dynamic_check != -1)
17990     {
17991       if (CONST_INT_P (count_exp))
17992         {
17993           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
17994             {
17995               emit_block_move_via_libcall (dst, src, count_exp, false);
17996               count_exp = const0_rtx;
17997               goto epilogue;
17998             }
17999         }
18000       else
18001         {
18002           rtx hot_label = gen_label_rtx ();
18003           jump_around_label = gen_label_rtx ();
18004           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18005                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
18006           predict_jump (REG_BR_PROB_BASE * 90 / 100);
18007           emit_block_move_via_libcall (dst, src, count_exp, false);
18008           emit_jump (jump_around_label);
18009           emit_label (hot_label);
18010         }
18011     }
18012
18013   /* Step 2: Alignment prologue.  */
18014
18015   if (desired_align > align)
18016     {
18017       if (align_bytes == 0)
18018         {
18019           /* Except for the first move in epilogue, we no longer know
18020              constant offset in aliasing info.  It don't seems to worth
18021              the pain to maintain it for the first move, so throw away
18022              the info early.  */
18023           src = change_address (src, BLKmode, srcreg);
18024           dst = change_address (dst, BLKmode, destreg);
18025           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
18026                                   desired_align);
18027         }
18028       else
18029         {
18030           /* If we know how many bytes need to be stored before dst is
18031              sufficiently aligned, maintain aliasing info accurately.  */
18032           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
18033                                                  desired_align, align_bytes);
18034           count_exp = plus_constant (count_exp, -align_bytes);
18035           count -= align_bytes;
18036         }
18037       if (need_zero_guard
18038           && (count < (unsigned HOST_WIDE_INT) size_needed
18039               || (align_bytes == 0
18040                   && count < ((unsigned HOST_WIDE_INT) size_needed
18041                               + desired_align - align))))
18042         {
18043           /* It is possible that we copied enough so the main loop will not
18044              execute.  */
18045           gcc_assert (size_needed > 1);
18046           if (label == NULL_RTX)
18047             label = gen_label_rtx ();
18048           emit_cmp_and_jump_insns (count_exp,
18049                                    GEN_INT (size_needed),
18050                                    LTU, 0, counter_mode (count_exp), 1, label);
18051           if (expected_size == -1
18052               || expected_size < (desired_align - align) / 2 + size_needed)
18053             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18054           else
18055             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18056         }
18057     }
18058   if (label && size_needed == 1)
18059     {
18060       emit_label (label);
18061       LABEL_NUSES (label) = 1;
18062       label = NULL;
18063       epilogue_size_needed = 1;
18064     }
18065   else if (label == NULL_RTX)
18066     epilogue_size_needed = size_needed;
18067
18068   /* Step 3: Main loop.  */
18069
18070   switch (alg)
18071     {
18072     case libcall:
18073     case no_stringop:
18074       gcc_unreachable ();
18075     case loop_1_byte:
18076       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18077                                      count_exp, QImode, 1, expected_size);
18078       break;
18079     case loop:
18080       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18081                                      count_exp, Pmode, 1, expected_size);
18082       break;
18083     case unrolled_loop:
18084       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
18085          registers for 4 temporaries anyway.  */
18086       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18087                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
18088                                      expected_size);
18089       break;
18090     case rep_prefix_8_byte:
18091       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18092                                  DImode);
18093       break;
18094     case rep_prefix_4_byte:
18095       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18096                                  SImode);
18097       break;
18098     case rep_prefix_1_byte:
18099       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18100                                  QImode);
18101       break;
18102     }
18103   /* Adjust properly the offset of src and dest memory for aliasing.  */
18104   if (CONST_INT_P (count_exp))
18105     {
18106       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
18107                                           (count / size_needed) * size_needed);
18108       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18109                                           (count / size_needed) * size_needed);
18110     }
18111   else
18112     {
18113       src = change_address (src, BLKmode, srcreg);
18114       dst = change_address (dst, BLKmode, destreg);
18115     }
18116
18117   /* Step 4: Epilogue to copy the remaining bytes.  */
18118  epilogue:
18119   if (label)
18120     {
18121       /* When the main loop is done, COUNT_EXP might hold original count,
18122          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18123          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18124          bytes. Compensate if needed.  */
18125
18126       if (size_needed < epilogue_size_needed)
18127         {
18128           tmp =
18129             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18130                                  GEN_INT (size_needed - 1), count_exp, 1,
18131                                  OPTAB_DIRECT);
18132           if (tmp != count_exp)
18133             emit_move_insn (count_exp, tmp);
18134         }
18135       emit_label (label);
18136       LABEL_NUSES (label) = 1;
18137     }
18138
18139   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18140     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
18141                             epilogue_size_needed);
18142   if (jump_around_label)
18143     emit_label (jump_around_label);
18144   return 1;
18145 }
18146
18147 /* Helper function for memcpy.  For QImode value 0xXY produce
18148    0xXYXYXYXY of wide specified by MODE.  This is essentially
18149    a * 0x10101010, but we can do slightly better than
18150    synth_mult by unwinding the sequence by hand on CPUs with
18151    slow multiply.  */
18152 static rtx
18153 promote_duplicated_reg (enum machine_mode mode, rtx val)
18154 {
18155   enum machine_mode valmode = GET_MODE (val);
18156   rtx tmp;
18157   int nops = mode == DImode ? 3 : 2;
18158
18159   gcc_assert (mode == SImode || mode == DImode);
18160   if (val == const0_rtx)
18161     return copy_to_mode_reg (mode, const0_rtx);
18162   if (CONST_INT_P (val))
18163     {
18164       HOST_WIDE_INT v = INTVAL (val) & 255;
18165
18166       v |= v << 8;
18167       v |= v << 16;
18168       if (mode == DImode)
18169         v |= (v << 16) << 16;
18170       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
18171     }
18172
18173   if (valmode == VOIDmode)
18174     valmode = QImode;
18175   if (valmode != QImode)
18176     val = gen_lowpart (QImode, val);
18177   if (mode == QImode)
18178     return val;
18179   if (!TARGET_PARTIAL_REG_STALL)
18180     nops--;
18181   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
18182       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
18183       <= (ix86_cost->shift_const + ix86_cost->add) * nops
18184           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
18185     {
18186       rtx reg = convert_modes (mode, QImode, val, true);
18187       tmp = promote_duplicated_reg (mode, const1_rtx);
18188       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
18189                                   OPTAB_DIRECT);
18190     }
18191   else
18192     {
18193       rtx reg = convert_modes (mode, QImode, val, true);
18194
18195       if (!TARGET_PARTIAL_REG_STALL)
18196         if (mode == SImode)
18197           emit_insn (gen_movsi_insv_1 (reg, reg));
18198         else
18199           emit_insn (gen_movdi_insv_1_rex64 (reg, reg));
18200       else
18201         {
18202           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
18203                                      NULL, 1, OPTAB_DIRECT);
18204           reg =
18205             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18206         }
18207       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
18208                                  NULL, 1, OPTAB_DIRECT);
18209       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18210       if (mode == SImode)
18211         return reg;
18212       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
18213                                  NULL, 1, OPTAB_DIRECT);
18214       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18215       return reg;
18216     }
18217 }
18218
18219 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
18220    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
18221    alignment from ALIGN to DESIRED_ALIGN.  */
18222 static rtx
18223 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
18224 {
18225   rtx promoted_val;
18226
18227   if (TARGET_64BIT
18228       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
18229     promoted_val = promote_duplicated_reg (DImode, val);
18230   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
18231     promoted_val = promote_duplicated_reg (SImode, val);
18232   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
18233     promoted_val = promote_duplicated_reg (HImode, val);
18234   else
18235     promoted_val = val;
18236
18237   return promoted_val;
18238 }
18239
18240 /* Expand string clear operation (bzero).  Use i386 string operations when
18241    profitable.  See expand_movmem comment for explanation of individual
18242    steps performed.  */
18243 int
18244 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
18245                     rtx expected_align_exp, rtx expected_size_exp)
18246 {
18247   rtx destreg;
18248   rtx label = NULL;
18249   rtx tmp;
18250   rtx jump_around_label = NULL;
18251   HOST_WIDE_INT align = 1;
18252   unsigned HOST_WIDE_INT count = 0;
18253   HOST_WIDE_INT expected_size = -1;
18254   int size_needed = 0, epilogue_size_needed;
18255   int desired_align = 0, align_bytes = 0;
18256   enum stringop_alg alg;
18257   rtx promoted_val = NULL;
18258   bool force_loopy_epilogue = false;
18259   int dynamic_check;
18260   bool need_zero_guard = false;
18261
18262   if (CONST_INT_P (align_exp))
18263     align = INTVAL (align_exp);
18264   /* i386 can do misaligned access on reasonably increased cost.  */
18265   if (CONST_INT_P (expected_align_exp)
18266       && INTVAL (expected_align_exp) > align)
18267     align = INTVAL (expected_align_exp);
18268   if (CONST_INT_P (count_exp))
18269     count = expected_size = INTVAL (count_exp);
18270   if (CONST_INT_P (expected_size_exp) && count == 0)
18271     expected_size = INTVAL (expected_size_exp);
18272
18273   /* Make sure we don't need to care about overflow later on.  */
18274   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18275     return 0;
18276
18277   /* Step 0: Decide on preferred algorithm, desired alignment and
18278      size of chunks to be copied by main loop.  */
18279
18280   alg = decide_alg (count, expected_size, true, &dynamic_check);
18281   desired_align = decide_alignment (align, alg, expected_size);
18282
18283   if (!TARGET_ALIGN_STRINGOPS)
18284     align = desired_align;
18285
18286   if (alg == libcall)
18287     return 0;
18288   gcc_assert (alg != no_stringop);
18289   if (!count)
18290     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
18291   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18292   switch (alg)
18293     {
18294     case libcall:
18295     case no_stringop:
18296       gcc_unreachable ();
18297     case loop:
18298       need_zero_guard = true;
18299       size_needed = GET_MODE_SIZE (Pmode);
18300       break;
18301     case unrolled_loop:
18302       need_zero_guard = true;
18303       size_needed = GET_MODE_SIZE (Pmode) * 4;
18304       break;
18305     case rep_prefix_8_byte:
18306       size_needed = 8;
18307       break;
18308     case rep_prefix_4_byte:
18309       size_needed = 4;
18310       break;
18311     case rep_prefix_1_byte:
18312       size_needed = 1;
18313       break;
18314     case loop_1_byte:
18315       need_zero_guard = true;
18316       size_needed = 1;
18317       break;
18318     }
18319   epilogue_size_needed = size_needed;
18320
18321   /* Step 1: Prologue guard.  */
18322
18323   /* Alignment code needs count to be in register.  */
18324   if (CONST_INT_P (count_exp) && desired_align > align)
18325     {
18326       if (INTVAL (count_exp) > desired_align
18327           && INTVAL (count_exp) > size_needed)
18328         {
18329           align_bytes
18330             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18331           if (align_bytes <= 0)
18332             align_bytes = 0;
18333           else
18334             align_bytes = desired_align - align_bytes;
18335         }
18336       if (align_bytes == 0)
18337         {
18338           enum machine_mode mode = SImode;
18339           if (TARGET_64BIT && (count & ~0xffffffff))
18340             mode = DImode;
18341           count_exp = force_reg (mode, count_exp);
18342         }
18343     }
18344   /* Do the cheap promotion to allow better CSE across the
18345      main loop and epilogue (ie one load of the big constant in the
18346      front of all code.  */
18347   if (CONST_INT_P (val_exp))
18348     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18349                                                    desired_align, align);
18350   /* Ensure that alignment prologue won't copy past end of block.  */
18351   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18352     {
18353       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18354       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
18355          Make sure it is power of 2.  */
18356       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18357
18358       /* To improve performance of small blocks, we jump around the VAL
18359          promoting mode.  This mean that if the promoted VAL is not constant,
18360          we might not use it in the epilogue and have to use byte
18361          loop variant.  */
18362       if (epilogue_size_needed > 2 && !promoted_val)
18363         force_loopy_epilogue = true;
18364       if (count)
18365         {
18366           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18367             {
18368               /* If main algorithm works on QImode, no epilogue is needed.
18369                  For small sizes just don't align anything.  */
18370               if (size_needed == 1)
18371                 desired_align = align;
18372               else
18373                 goto epilogue;
18374             }
18375         }
18376       else
18377         {
18378           label = gen_label_rtx ();
18379           emit_cmp_and_jump_insns (count_exp,
18380                                    GEN_INT (epilogue_size_needed),
18381                                    LTU, 0, counter_mode (count_exp), 1, label);
18382           if (expected_size == -1 || expected_size <= epilogue_size_needed)
18383             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18384           else
18385             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18386         }
18387     }
18388   if (dynamic_check != -1)
18389     {
18390       rtx hot_label = gen_label_rtx ();
18391       jump_around_label = gen_label_rtx ();
18392       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18393                                LEU, 0, counter_mode (count_exp), 1, hot_label);
18394       predict_jump (REG_BR_PROB_BASE * 90 / 100);
18395       set_storage_via_libcall (dst, count_exp, val_exp, false);
18396       emit_jump (jump_around_label);
18397       emit_label (hot_label);
18398     }
18399
18400   /* Step 2: Alignment prologue.  */
18401
18402   /* Do the expensive promotion once we branched off the small blocks.  */
18403   if (!promoted_val)
18404     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18405                                                    desired_align, align);
18406   gcc_assert (desired_align >= 1 && align >= 1);
18407
18408   if (desired_align > align)
18409     {
18410       if (align_bytes == 0)
18411         {
18412           /* Except for the first move in epilogue, we no longer know
18413              constant offset in aliasing info.  It don't seems to worth
18414              the pain to maintain it for the first move, so throw away
18415              the info early.  */
18416           dst = change_address (dst, BLKmode, destreg);
18417           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
18418                                   desired_align);
18419         }
18420       else
18421         {
18422           /* If we know how many bytes need to be stored before dst is
18423              sufficiently aligned, maintain aliasing info accurately.  */
18424           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
18425                                                  desired_align, align_bytes);
18426           count_exp = plus_constant (count_exp, -align_bytes);
18427           count -= align_bytes;
18428         }
18429       if (need_zero_guard
18430           && (count < (unsigned HOST_WIDE_INT) size_needed
18431               || (align_bytes == 0
18432                   && count < ((unsigned HOST_WIDE_INT) size_needed
18433                               + desired_align - align))))
18434         {
18435           /* It is possible that we copied enough so the main loop will not
18436              execute.  */
18437           gcc_assert (size_needed > 1);
18438           if (label == NULL_RTX)
18439             label = gen_label_rtx ();
18440           emit_cmp_and_jump_insns (count_exp,
18441                                    GEN_INT (size_needed),
18442                                    LTU, 0, counter_mode (count_exp), 1, label);
18443           if (expected_size == -1
18444               || expected_size < (desired_align - align) / 2 + size_needed)
18445             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18446           else
18447             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18448         }
18449     }
18450   if (label && size_needed == 1)
18451     {
18452       emit_label (label);
18453       LABEL_NUSES (label) = 1;
18454       label = NULL;
18455       promoted_val = val_exp;
18456       epilogue_size_needed = 1;
18457     }
18458   else if (label == NULL_RTX)
18459     epilogue_size_needed = size_needed;
18460
18461   /* Step 3: Main loop.  */
18462
18463   switch (alg)
18464     {
18465     case libcall:
18466     case no_stringop:
18467       gcc_unreachable ();
18468     case loop_1_byte:
18469       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18470                                      count_exp, QImode, 1, expected_size);
18471       break;
18472     case loop:
18473       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18474                                      count_exp, Pmode, 1, expected_size);
18475       break;
18476     case unrolled_loop:
18477       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18478                                      count_exp, Pmode, 4, expected_size);
18479       break;
18480     case rep_prefix_8_byte:
18481       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18482                                   DImode, val_exp);
18483       break;
18484     case rep_prefix_4_byte:
18485       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18486                                   SImode, val_exp);
18487       break;
18488     case rep_prefix_1_byte:
18489       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18490                                   QImode, val_exp);
18491       break;
18492     }
18493   /* Adjust properly the offset of src and dest memory for aliasing.  */
18494   if (CONST_INT_P (count_exp))
18495     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18496                                         (count / size_needed) * size_needed);
18497   else
18498     dst = change_address (dst, BLKmode, destreg);
18499
18500   /* Step 4: Epilogue to copy the remaining bytes.  */
18501
18502   if (label)
18503     {
18504       /* When the main loop is done, COUNT_EXP might hold original count,
18505          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18506          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18507          bytes. Compensate if needed.  */
18508
18509       if (size_needed < epilogue_size_needed)
18510         {
18511           tmp =
18512             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18513                                  GEN_INT (size_needed - 1), count_exp, 1,
18514                                  OPTAB_DIRECT);
18515           if (tmp != count_exp)
18516             emit_move_insn (count_exp, tmp);
18517         }
18518       emit_label (label);
18519       LABEL_NUSES (label) = 1;
18520     }
18521  epilogue:
18522   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18523     {
18524       if (force_loopy_epilogue)
18525         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
18526                                          epilogue_size_needed);
18527       else
18528         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
18529                                 epilogue_size_needed);
18530     }
18531   if (jump_around_label)
18532     emit_label (jump_around_label);
18533   return 1;
18534 }
18535
18536 /* Expand the appropriate insns for doing strlen if not just doing
18537    repnz; scasb
18538
18539    out = result, initialized with the start address
18540    align_rtx = alignment of the address.
18541    scratch = scratch register, initialized with the startaddress when
18542         not aligned, otherwise undefined
18543
18544    This is just the body. It needs the initializations mentioned above and
18545    some address computing at the end.  These things are done in i386.md.  */
18546
18547 static void
18548 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
18549 {
18550   int align;
18551   rtx tmp;
18552   rtx align_2_label = NULL_RTX;
18553   rtx align_3_label = NULL_RTX;
18554   rtx align_4_label = gen_label_rtx ();
18555   rtx end_0_label = gen_label_rtx ();
18556   rtx mem;
18557   rtx tmpreg = gen_reg_rtx (SImode);
18558   rtx scratch = gen_reg_rtx (SImode);
18559   rtx cmp;
18560
18561   align = 0;
18562   if (CONST_INT_P (align_rtx))
18563     align = INTVAL (align_rtx);
18564
18565   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
18566
18567   /* Is there a known alignment and is it less than 4?  */
18568   if (align < 4)
18569     {
18570       rtx scratch1 = gen_reg_rtx (Pmode);
18571       emit_move_insn (scratch1, out);
18572       /* Is there a known alignment and is it not 2? */
18573       if (align != 2)
18574         {
18575           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
18576           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
18577
18578           /* Leave just the 3 lower bits.  */
18579           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
18580                                     NULL_RTX, 0, OPTAB_WIDEN);
18581
18582           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18583                                    Pmode, 1, align_4_label);
18584           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
18585                                    Pmode, 1, align_2_label);
18586           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
18587                                    Pmode, 1, align_3_label);
18588         }
18589       else
18590         {
18591           /* Since the alignment is 2, we have to check 2 or 0 bytes;
18592              check if is aligned to 4 - byte.  */
18593
18594           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
18595                                     NULL_RTX, 0, OPTAB_WIDEN);
18596
18597           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18598                                    Pmode, 1, align_4_label);
18599         }
18600
18601       mem = change_address (src, QImode, out);
18602
18603       /* Now compare the bytes.  */
18604
18605       /* Compare the first n unaligned byte on a byte per byte basis.  */
18606       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
18607                                QImode, 1, end_0_label);
18608
18609       /* Increment the address.  */
18610       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18611
18612       /* Not needed with an alignment of 2 */
18613       if (align != 2)
18614         {
18615           emit_label (align_2_label);
18616
18617           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18618                                    end_0_label);
18619
18620           emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18621
18622           emit_label (align_3_label);
18623         }
18624
18625       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18626                                end_0_label);
18627
18628       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18629     }
18630
18631   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
18632      align this loop.  It gives only huge programs, but does not help to
18633      speed up.  */
18634   emit_label (align_4_label);
18635
18636   mem = change_address (src, SImode, out);
18637   emit_move_insn (scratch, mem);
18638   emit_insn ((*ix86_gen_add3) (out, out, GEN_INT (4)));
18639
18640   /* This formula yields a nonzero result iff one of the bytes is zero.
18641      This saves three branches inside loop and many cycles.  */
18642
18643   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
18644   emit_insn (gen_one_cmplsi2 (scratch, scratch));
18645   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
18646   emit_insn (gen_andsi3 (tmpreg, tmpreg,
18647                          gen_int_mode (0x80808080, SImode)));
18648   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
18649                            align_4_label);
18650
18651   if (TARGET_CMOVE)
18652     {
18653        rtx reg = gen_reg_rtx (SImode);
18654        rtx reg2 = gen_reg_rtx (Pmode);
18655        emit_move_insn (reg, tmpreg);
18656        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
18657
18658        /* If zero is not in the first two bytes, move two bytes forward.  */
18659        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18660        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18661        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18662        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
18663                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
18664                                                      reg,
18665                                                      tmpreg)));
18666        /* Emit lea manually to avoid clobbering of flags.  */
18667        emit_insn (gen_rtx_SET (SImode, reg2,
18668                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
18669
18670        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18671        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18672        emit_insn (gen_rtx_SET (VOIDmode, out,
18673                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
18674                                                      reg2,
18675                                                      out)));
18676
18677     }
18678   else
18679     {
18680        rtx end_2_label = gen_label_rtx ();
18681        /* Is zero in the first two bytes? */
18682
18683        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18684        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18685        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
18686        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
18687                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
18688                             pc_rtx);
18689        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
18690        JUMP_LABEL (tmp) = end_2_label;
18691
18692        /* Not in the first two.  Move two bytes forward.  */
18693        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
18694        emit_insn ((*ix86_gen_add3) (out, out, const2_rtx));
18695
18696        emit_label (end_2_label);
18697
18698     }
18699
18700   /* Avoid branch in fixing the byte.  */
18701   tmpreg = gen_lowpart (QImode, tmpreg);
18702   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
18703   cmp = gen_rtx_LTU (Pmode, gen_rtx_REG (CCmode, FLAGS_REG), const0_rtx);
18704   emit_insn ((*ix86_gen_sub3_carry) (out, out, GEN_INT (3), cmp));
18705
18706   emit_label (end_0_label);
18707 }
18708
18709 /* Expand strlen.  */
18710
18711 int
18712 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
18713 {
18714   rtx addr, scratch1, scratch2, scratch3, scratch4;
18715
18716   /* The generic case of strlen expander is long.  Avoid it's
18717      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
18718
18719   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
18720       && !TARGET_INLINE_ALL_STRINGOPS
18721       && !optimize_insn_for_size_p ()
18722       && (!CONST_INT_P (align) || INTVAL (align) < 4))
18723     return 0;
18724
18725   addr = force_reg (Pmode, XEXP (src, 0));
18726   scratch1 = gen_reg_rtx (Pmode);
18727
18728   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
18729       && !optimize_insn_for_size_p ())
18730     {
18731       /* Well it seems that some optimizer does not combine a call like
18732          foo(strlen(bar), strlen(bar));
18733          when the move and the subtraction is done here.  It does calculate
18734          the length just once when these instructions are done inside of
18735          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
18736          often used and I use one fewer register for the lifetime of
18737          output_strlen_unroll() this is better.  */
18738
18739       emit_move_insn (out, addr);
18740
18741       ix86_expand_strlensi_unroll_1 (out, src, align);
18742
18743       /* strlensi_unroll_1 returns the address of the zero at the end of
18744          the string, like memchr(), so compute the length by subtracting
18745          the start address.  */
18746       emit_insn ((*ix86_gen_sub3) (out, out, addr));
18747     }
18748   else
18749     {
18750       rtx unspec;
18751
18752       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
18753       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
18754         return false;
18755
18756       scratch2 = gen_reg_rtx (Pmode);
18757       scratch3 = gen_reg_rtx (Pmode);
18758       scratch4 = force_reg (Pmode, constm1_rtx);
18759
18760       emit_move_insn (scratch3, addr);
18761       eoschar = force_reg (QImode, eoschar);
18762
18763       src = replace_equiv_address_nv (src, scratch3);
18764
18765       /* If .md starts supporting :P, this can be done in .md.  */
18766       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
18767                                                  scratch4), UNSPEC_SCAS);
18768       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
18769       emit_insn ((*ix86_gen_one_cmpl2) (scratch2, scratch1));
18770       emit_insn ((*ix86_gen_add3) (out, scratch2, constm1_rtx));
18771     }
18772   return 1;
18773 }
18774
18775 /* For given symbol (function) construct code to compute address of it's PLT
18776    entry in large x86-64 PIC model.  */
18777 rtx
18778 construct_plt_address (rtx symbol)
18779 {
18780   rtx tmp = gen_reg_rtx (Pmode);
18781   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
18782
18783   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
18784   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
18785
18786   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
18787   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
18788   return tmp;
18789 }
18790
18791 void
18792 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
18793                   rtx callarg2,
18794                   rtx pop, int sibcall)
18795 {
18796   rtx use = NULL, call;
18797
18798   if (pop == const0_rtx)
18799     pop = NULL;
18800   gcc_assert (!TARGET_64BIT || !pop);
18801
18802   if (TARGET_MACHO && !TARGET_64BIT)
18803     {
18804 #if TARGET_MACHO
18805       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
18806         fnaddr = machopic_indirect_call_target (fnaddr);
18807 #endif
18808     }
18809   else
18810     {
18811       /* Static functions and indirect calls don't need the pic register.  */
18812       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
18813           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
18814           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
18815         use_reg (&use, pic_offset_table_rtx);
18816     }
18817
18818   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
18819     {
18820       rtx al = gen_rtx_REG (QImode, AX_REG);
18821       emit_move_insn (al, callarg2);
18822       use_reg (&use, al);
18823     }
18824
18825   if (ix86_cmodel == CM_LARGE_PIC
18826       && GET_CODE (fnaddr) == MEM
18827       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
18828       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
18829     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
18830   else if (sibcall
18831            ? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
18832            : !call_insn_operand (XEXP (fnaddr, 0), Pmode))
18833     {
18834       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
18835       fnaddr = gen_rtx_MEM (QImode, fnaddr);
18836     }
18837
18838   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
18839   if (retval)
18840     call = gen_rtx_SET (VOIDmode, retval, call);
18841   if (pop)
18842     {
18843       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
18844       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
18845       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
18846     }
18847   if (TARGET_64BIT
18848       && ix86_cfun_abi () == MS_ABI
18849       && (!callarg2 || INTVAL (callarg2) != -2))
18850     {
18851       /* We need to represent that SI and DI registers are clobbered
18852          by SYSV calls.  */
18853       static int clobbered_registers[] = {
18854         XMM6_REG, XMM7_REG, XMM8_REG,
18855         XMM9_REG, XMM10_REG, XMM11_REG,
18856         XMM12_REG, XMM13_REG, XMM14_REG,
18857         XMM15_REG, SI_REG, DI_REG
18858       };
18859       unsigned int i;
18860       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
18861       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
18862                                    UNSPEC_MS_TO_SYSV_CALL);
18863
18864       vec[0] = call;
18865       vec[1] = unspec;
18866       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
18867         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
18868                                       ? TImode : DImode,
18869                                       gen_rtx_REG
18870                                         (SSE_REGNO_P (clobbered_registers[i])
18871                                                       ? TImode : DImode,
18872                                          clobbered_registers[i]));
18873
18874       call = gen_rtx_PARALLEL (VOIDmode,
18875                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
18876                                + 2, vec));
18877     }
18878
18879   call = emit_call_insn (call);
18880   if (use)
18881     CALL_INSN_FUNCTION_USAGE (call) = use;
18882 }
18883
18884 \f
18885 /* Clear stack slot assignments remembered from previous functions.
18886    This is called from INIT_EXPANDERS once before RTL is emitted for each
18887    function.  */
18888
18889 static struct machine_function *
18890 ix86_init_machine_status (void)
18891 {
18892   struct machine_function *f;
18893
18894   f = GGC_CNEW (struct machine_function);
18895   f->use_fast_prologue_epilogue_nregs = -1;
18896   f->tls_descriptor_call_expanded_p = 0;
18897   f->call_abi = DEFAULT_ABI;
18898
18899   return f;
18900 }
18901
18902 /* Return a MEM corresponding to a stack slot with mode MODE.
18903    Allocate a new slot if necessary.
18904
18905    The RTL for a function can have several slots available: N is
18906    which slot to use.  */
18907
18908 rtx
18909 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
18910 {
18911   struct stack_local_entry *s;
18912
18913   gcc_assert (n < MAX_386_STACK_LOCALS);
18914
18915   /* Virtual slot is valid only before vregs are instantiated.  */
18916   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
18917
18918   for (s = ix86_stack_locals; s; s = s->next)
18919     if (s->mode == mode && s->n == n)
18920       return copy_rtx (s->rtl);
18921
18922   s = (struct stack_local_entry *)
18923     ggc_alloc (sizeof (struct stack_local_entry));
18924   s->n = n;
18925   s->mode = mode;
18926   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
18927
18928   s->next = ix86_stack_locals;
18929   ix86_stack_locals = s;
18930   return s->rtl;
18931 }
18932
18933 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
18934
18935 static GTY(()) rtx ix86_tls_symbol;
18936 rtx
18937 ix86_tls_get_addr (void)
18938 {
18939
18940   if (!ix86_tls_symbol)
18941     {
18942       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
18943                                             (TARGET_ANY_GNU_TLS
18944                                              && !TARGET_64BIT)
18945                                             ? "___tls_get_addr"
18946                                             : "__tls_get_addr");
18947     }
18948
18949   return ix86_tls_symbol;
18950 }
18951
18952 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
18953
18954 static GTY(()) rtx ix86_tls_module_base_symbol;
18955 rtx
18956 ix86_tls_module_base (void)
18957 {
18958
18959   if (!ix86_tls_module_base_symbol)
18960     {
18961       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
18962                                                         "_TLS_MODULE_BASE_");
18963       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
18964         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
18965     }
18966
18967   return ix86_tls_module_base_symbol;
18968 }
18969 \f
18970 /* Calculate the length of the memory address in the instruction
18971    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
18972
18973 int
18974 memory_address_length (rtx addr)
18975 {
18976   struct ix86_address parts;
18977   rtx base, index, disp;
18978   int len;
18979   int ok;
18980
18981   if (GET_CODE (addr) == PRE_DEC
18982       || GET_CODE (addr) == POST_INC
18983       || GET_CODE (addr) == PRE_MODIFY
18984       || GET_CODE (addr) == POST_MODIFY)
18985     return 0;
18986
18987   ok = ix86_decompose_address (addr, &parts);
18988   gcc_assert (ok);
18989
18990   if (parts.base && GET_CODE (parts.base) == SUBREG)
18991     parts.base = SUBREG_REG (parts.base);
18992   if (parts.index && GET_CODE (parts.index) == SUBREG)
18993     parts.index = SUBREG_REG (parts.index);
18994
18995   base = parts.base;
18996   index = parts.index;
18997   disp = parts.disp;
18998   len = 0;
18999
19000   /* Rule of thumb:
19001        - esp as the base always wants an index,
19002        - ebp as the base always wants a displacement.  */
19003
19004   /* Register Indirect.  */
19005   if (base && !index && !disp)
19006     {
19007       /* esp (for its index) and ebp (for its displacement) need
19008          the two-byte modrm form.  */
19009       if (addr == stack_pointer_rtx
19010           || addr == arg_pointer_rtx
19011           || addr == frame_pointer_rtx
19012           || addr == hard_frame_pointer_rtx)
19013         len = 1;
19014     }
19015
19016   /* Direct Addressing.  */
19017   else if (disp && !base && !index)
19018     len = 4;
19019
19020   else
19021     {
19022       /* Find the length of the displacement constant.  */
19023       if (disp)
19024         {
19025           if (base && satisfies_constraint_K (disp))
19026             len = 1;
19027           else
19028             len = 4;
19029         }
19030       /* ebp always wants a displacement.  */
19031       else if (base == hard_frame_pointer_rtx)
19032         len = 1;
19033
19034       /* An index requires the two-byte modrm form....  */
19035       if (index
19036           /* ...like esp, which always wants an index.  */
19037           || base == stack_pointer_rtx
19038           || base == arg_pointer_rtx
19039           || base == frame_pointer_rtx)
19040         len += 1;
19041     }
19042
19043   return len;
19044 }
19045
19046 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
19047    is set, expect that insn have 8bit immediate alternative.  */
19048 int
19049 ix86_attr_length_immediate_default (rtx insn, int shortform)
19050 {
19051   int len = 0;
19052   int i;
19053   extract_insn_cached (insn);
19054   for (i = recog_data.n_operands - 1; i >= 0; --i)
19055     if (CONSTANT_P (recog_data.operand[i]))
19056       {
19057         gcc_assert (!len);
19058         if (shortform && satisfies_constraint_K (recog_data.operand[i]))
19059           len = 1;
19060         else
19061           {
19062             switch (get_attr_mode (insn))
19063               {
19064                 case MODE_QI:
19065                   len+=1;
19066                   break;
19067                 case MODE_HI:
19068                   len+=2;
19069                   break;
19070                 case MODE_SI:
19071                   len+=4;
19072                   break;
19073                 /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
19074                 case MODE_DI:
19075                   len+=4;
19076                   break;
19077                 default:
19078                   fatal_insn ("unknown insn mode", insn);
19079               }
19080           }
19081       }
19082   return len;
19083 }
19084 /* Compute default value for "length_address" attribute.  */
19085 int
19086 ix86_attr_length_address_default (rtx insn)
19087 {
19088   int i;
19089
19090   if (get_attr_type (insn) == TYPE_LEA)
19091     {
19092       rtx set = PATTERN (insn);
19093
19094       if (GET_CODE (set) == PARALLEL)
19095         set = XVECEXP (set, 0, 0);
19096
19097       gcc_assert (GET_CODE (set) == SET);
19098
19099       return memory_address_length (SET_SRC (set));
19100     }
19101
19102   extract_insn_cached (insn);
19103   for (i = recog_data.n_operands - 1; i >= 0; --i)
19104     if (MEM_P (recog_data.operand[i]))
19105       {
19106         return memory_address_length (XEXP (recog_data.operand[i], 0));
19107         break;
19108       }
19109   return 0;
19110 }
19111
19112 /* Compute default value for "length_vex" attribute. It includes
19113    2 or 3 byte VEX prefix and 1 opcode byte.  */
19114
19115 int
19116 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
19117                               int has_vex_w)
19118 {
19119   int i;
19120
19121   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
19122      byte VEX prefix.  */
19123   if (!has_0f_opcode || has_vex_w)
19124     return 3 + 1;
19125
19126  /* We can always use 2 byte VEX prefix in 32bit.  */
19127   if (!TARGET_64BIT)
19128     return 2 + 1;
19129
19130   extract_insn_cached (insn);
19131
19132   for (i = recog_data.n_operands - 1; i >= 0; --i)
19133     if (REG_P (recog_data.operand[i]))
19134       {
19135         /* REX.W bit uses 3 byte VEX prefix.  */
19136         if (GET_MODE (recog_data.operand[i]) == DImode)
19137           return 3 + 1;
19138       }
19139     else
19140       {
19141         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
19142         if (MEM_P (recog_data.operand[i])
19143             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
19144           return 3 + 1;
19145       }
19146
19147   return 2 + 1;
19148 }
19149 \f
19150 /* Return the maximum number of instructions a cpu can issue.  */
19151
19152 static int
19153 ix86_issue_rate (void)
19154 {
19155   switch (ix86_tune)
19156     {
19157     case PROCESSOR_PENTIUM:
19158     case PROCESSOR_K6:
19159       return 2;
19160
19161     case PROCESSOR_PENTIUMPRO:
19162     case PROCESSOR_PENTIUM4:
19163     case PROCESSOR_ATHLON:
19164     case PROCESSOR_K8:
19165     case PROCESSOR_AMDFAM10:
19166     case PROCESSOR_NOCONA:
19167     case PROCESSOR_GENERIC32:
19168     case PROCESSOR_GENERIC64:
19169       return 3;
19170
19171     case PROCESSOR_CORE2:
19172       return 4;
19173
19174     default:
19175       return 1;
19176     }
19177 }
19178
19179 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
19180    by DEP_INSN and nothing set by DEP_INSN.  */
19181
19182 static int
19183 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19184 {
19185   rtx set, set2;
19186
19187   /* Simplify the test for uninteresting insns.  */
19188   if (insn_type != TYPE_SETCC
19189       && insn_type != TYPE_ICMOV
19190       && insn_type != TYPE_FCMOV
19191       && insn_type != TYPE_IBR)
19192     return 0;
19193
19194   if ((set = single_set (dep_insn)) != 0)
19195     {
19196       set = SET_DEST (set);
19197       set2 = NULL_RTX;
19198     }
19199   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
19200            && XVECLEN (PATTERN (dep_insn), 0) == 2
19201            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
19202            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
19203     {
19204       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19205       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19206     }
19207   else
19208     return 0;
19209
19210   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
19211     return 0;
19212
19213   /* This test is true if the dependent insn reads the flags but
19214      not any other potentially set register.  */
19215   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
19216     return 0;
19217
19218   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
19219     return 0;
19220
19221   return 1;
19222 }
19223
19224 /* A subroutine of ix86_adjust_cost -- return true iff INSN has a memory
19225    address with operands set by DEP_INSN.  */
19226
19227 static int
19228 ix86_agi_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19229 {
19230   rtx addr;
19231
19232   if (insn_type == TYPE_LEA
19233       && TARGET_PENTIUM)
19234     {
19235       addr = PATTERN (insn);
19236
19237       if (GET_CODE (addr) == PARALLEL)
19238         addr = XVECEXP (addr, 0, 0);
19239
19240       gcc_assert (GET_CODE (addr) == SET);
19241
19242       addr = SET_SRC (addr);
19243     }
19244   else
19245     {
19246       int i;
19247       extract_insn_cached (insn);
19248       for (i = recog_data.n_operands - 1; i >= 0; --i)
19249         if (MEM_P (recog_data.operand[i]))
19250           {
19251             addr = XEXP (recog_data.operand[i], 0);
19252             goto found;
19253           }
19254       return 0;
19255     found:;
19256     }
19257
19258   return modified_in_p (addr, dep_insn);
19259 }
19260
19261 static int
19262 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
19263 {
19264   enum attr_type insn_type, dep_insn_type;
19265   enum attr_memory memory;
19266   rtx set, set2;
19267   int dep_insn_code_number;
19268
19269   /* Anti and output dependencies have zero cost on all CPUs.  */
19270   if (REG_NOTE_KIND (link) != 0)
19271     return 0;
19272
19273   dep_insn_code_number = recog_memoized (dep_insn);
19274
19275   /* If we can't recognize the insns, we can't really do anything.  */
19276   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
19277     return cost;
19278
19279   insn_type = get_attr_type (insn);
19280   dep_insn_type = get_attr_type (dep_insn);
19281
19282   switch (ix86_tune)
19283     {
19284     case PROCESSOR_PENTIUM:
19285       /* Address Generation Interlock adds a cycle of latency.  */
19286       if (ix86_agi_dependent (insn, dep_insn, insn_type))
19287         cost += 1;
19288
19289       /* ??? Compares pair with jump/setcc.  */
19290       if (ix86_flags_dependent (insn, dep_insn, insn_type))
19291         cost = 0;
19292
19293       /* Floating point stores require value to be ready one cycle earlier.  */
19294       if (insn_type == TYPE_FMOV
19295           && get_attr_memory (insn) == MEMORY_STORE
19296           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19297         cost += 1;
19298       break;
19299
19300     case PROCESSOR_PENTIUMPRO:
19301       memory = get_attr_memory (insn);
19302
19303       /* INT->FP conversion is expensive.  */
19304       if (get_attr_fp_int_src (dep_insn))
19305         cost += 5;
19306
19307       /* There is one cycle extra latency between an FP op and a store.  */
19308       if (insn_type == TYPE_FMOV
19309           && (set = single_set (dep_insn)) != NULL_RTX
19310           && (set2 = single_set (insn)) != NULL_RTX
19311           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
19312           && MEM_P (SET_DEST (set2)))
19313         cost += 1;
19314
19315       /* Show ability of reorder buffer to hide latency of load by executing
19316          in parallel with previous instruction in case
19317          previous instruction is not needed to compute the address.  */
19318       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19319           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19320         {
19321           /* Claim moves to take one cycle, as core can issue one load
19322              at time and the next load can start cycle later.  */
19323           if (dep_insn_type == TYPE_IMOV
19324               || dep_insn_type == TYPE_FMOV)
19325             cost = 1;
19326           else if (cost > 1)
19327             cost--;
19328         }
19329       break;
19330
19331     case PROCESSOR_K6:
19332       memory = get_attr_memory (insn);
19333
19334       /* The esp dependency is resolved before the instruction is really
19335          finished.  */
19336       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
19337           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
19338         return 1;
19339
19340       /* INT->FP conversion is expensive.  */
19341       if (get_attr_fp_int_src (dep_insn))
19342         cost += 5;
19343
19344       /* Show ability of reorder buffer to hide latency of load by executing
19345          in parallel with previous instruction in case
19346          previous instruction is not needed to compute the address.  */
19347       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19348           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19349         {
19350           /* Claim moves to take one cycle, as core can issue one load
19351              at time and the next load can start cycle later.  */
19352           if (dep_insn_type == TYPE_IMOV
19353               || dep_insn_type == TYPE_FMOV)
19354             cost = 1;
19355           else if (cost > 2)
19356             cost -= 2;
19357           else
19358             cost = 1;
19359         }
19360       break;
19361
19362     case PROCESSOR_ATHLON:
19363     case PROCESSOR_K8:
19364     case PROCESSOR_AMDFAM10:
19365     case PROCESSOR_GENERIC32:
19366     case PROCESSOR_GENERIC64:
19367       memory = get_attr_memory (insn);
19368
19369       /* Show ability of reorder buffer to hide latency of load by executing
19370          in parallel with previous instruction in case
19371          previous instruction is not needed to compute the address.  */
19372       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19373           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19374         {
19375           enum attr_unit unit = get_attr_unit (insn);
19376           int loadcost = 3;
19377
19378           /* Because of the difference between the length of integer and
19379              floating unit pipeline preparation stages, the memory operands
19380              for floating point are cheaper.
19381
19382              ??? For Athlon it the difference is most probably 2.  */
19383           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
19384             loadcost = 3;
19385           else
19386             loadcost = TARGET_ATHLON ? 2 : 0;
19387
19388           if (cost >= loadcost)
19389             cost -= loadcost;
19390           else
19391             cost = 0;
19392         }
19393
19394     default:
19395       break;
19396     }
19397
19398   return cost;
19399 }
19400
19401 /* How many alternative schedules to try.  This should be as wide as the
19402    scheduling freedom in the DFA, but no wider.  Making this value too
19403    large results extra work for the scheduler.  */
19404
19405 static int
19406 ia32_multipass_dfa_lookahead (void)
19407 {
19408   switch (ix86_tune)
19409     {
19410     case PROCESSOR_PENTIUM:
19411       return 2;
19412
19413     case PROCESSOR_PENTIUMPRO:
19414     case PROCESSOR_K6:
19415       return 1;
19416
19417     default:
19418       return 0;
19419     }
19420 }
19421
19422 \f
19423 /* Compute the alignment given to a constant that is being placed in memory.
19424    EXP is the constant and ALIGN is the alignment that the object would
19425    ordinarily have.
19426    The value of this function is used instead of that alignment to align
19427    the object.  */
19428
19429 int
19430 ix86_constant_alignment (tree exp, int align)
19431 {
19432   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
19433       || TREE_CODE (exp) == INTEGER_CST)
19434     {
19435       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
19436         return 64;
19437       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
19438         return 128;
19439     }
19440   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
19441            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
19442     return BITS_PER_WORD;
19443
19444   return align;
19445 }
19446
19447 /* Compute the alignment for a static variable.
19448    TYPE is the data type, and ALIGN is the alignment that
19449    the object would ordinarily have.  The value of this function is used
19450    instead of that alignment to align the object.  */
19451
19452 int
19453 ix86_data_alignment (tree type, int align)
19454 {
19455   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
19456
19457   if (AGGREGATE_TYPE_P (type)
19458       && TYPE_SIZE (type)
19459       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19460       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
19461           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
19462       && align < max_align)
19463     align = max_align;
19464
19465   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19466      to 16byte boundary.  */
19467   if (TARGET_64BIT)
19468     {
19469       if (AGGREGATE_TYPE_P (type)
19470            && TYPE_SIZE (type)
19471            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19472            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
19473                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19474         return 128;
19475     }
19476
19477   if (TREE_CODE (type) == ARRAY_TYPE)
19478     {
19479       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19480         return 64;
19481       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19482         return 128;
19483     }
19484   else if (TREE_CODE (type) == COMPLEX_TYPE)
19485     {
19486
19487       if (TYPE_MODE (type) == DCmode && align < 64)
19488         return 64;
19489       if ((TYPE_MODE (type) == XCmode
19490            || TYPE_MODE (type) == TCmode) && align < 128)
19491         return 128;
19492     }
19493   else if ((TREE_CODE (type) == RECORD_TYPE
19494             || TREE_CODE (type) == UNION_TYPE
19495             || TREE_CODE (type) == QUAL_UNION_TYPE)
19496            && TYPE_FIELDS (type))
19497     {
19498       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19499         return 64;
19500       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19501         return 128;
19502     }
19503   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19504            || TREE_CODE (type) == INTEGER_TYPE)
19505     {
19506       if (TYPE_MODE (type) == DFmode && align < 64)
19507         return 64;
19508       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19509         return 128;
19510     }
19511
19512   return align;
19513 }
19514
19515 /* Compute the alignment for a local variable or a stack slot.  EXP is
19516    the data type or decl itself, MODE is the widest mode available and
19517    ALIGN is the alignment that the object would ordinarily have.  The
19518    value of this macro is used instead of that alignment to align the
19519    object.  */
19520
19521 unsigned int
19522 ix86_local_alignment (tree exp, enum machine_mode mode,
19523                       unsigned int align)
19524 {
19525   tree type, decl;
19526
19527   if (exp && DECL_P (exp))
19528     {
19529       type = TREE_TYPE (exp);
19530       decl = exp;
19531     }
19532   else
19533     {
19534       type = exp;
19535       decl = NULL;
19536     }
19537
19538   /* Don't do dynamic stack realignment for long long objects with
19539      -mpreferred-stack-boundary=2.  */
19540   if (!TARGET_64BIT
19541       && align == 64
19542       && ix86_preferred_stack_boundary < 64
19543       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
19544       && (!type || !TYPE_USER_ALIGN (type))
19545       && (!decl || !DECL_USER_ALIGN (decl)))
19546     align = 32;
19547
19548   /* If TYPE is NULL, we are allocating a stack slot for caller-save
19549      register in MODE.  We will return the largest alignment of XF
19550      and DF.  */
19551   if (!type)
19552     {
19553       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
19554         align = GET_MODE_ALIGNMENT (DFmode);
19555       return align;
19556     }
19557
19558   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19559      to 16byte boundary.  */
19560   if (TARGET_64BIT)
19561     {
19562       if (AGGREGATE_TYPE_P (type)
19563            && TYPE_SIZE (type)
19564            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19565            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
19566                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19567         return 128;
19568     }
19569   if (TREE_CODE (type) == ARRAY_TYPE)
19570     {
19571       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19572         return 64;
19573       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19574         return 128;
19575     }
19576   else if (TREE_CODE (type) == COMPLEX_TYPE)
19577     {
19578       if (TYPE_MODE (type) == DCmode && align < 64)
19579         return 64;
19580       if ((TYPE_MODE (type) == XCmode
19581            || TYPE_MODE (type) == TCmode) && align < 128)
19582         return 128;
19583     }
19584   else if ((TREE_CODE (type) == RECORD_TYPE
19585             || TREE_CODE (type) == UNION_TYPE
19586             || TREE_CODE (type) == QUAL_UNION_TYPE)
19587            && TYPE_FIELDS (type))
19588     {
19589       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19590         return 64;
19591       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19592         return 128;
19593     }
19594   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19595            || TREE_CODE (type) == INTEGER_TYPE)
19596     {
19597
19598       if (TYPE_MODE (type) == DFmode && align < 64)
19599         return 64;
19600       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19601         return 128;
19602     }
19603   return align;
19604 }
19605
19606 /* Compute the minimum required alignment for dynamic stack realignment
19607    purposes for a local variable, parameter or a stack slot.  EXP is
19608    the data type or decl itself, MODE is its mode and ALIGN is the
19609    alignment that the object would ordinarily have.  */
19610
19611 unsigned int
19612 ix86_minimum_alignment (tree exp, enum machine_mode mode,
19613                         unsigned int align)
19614 {
19615   tree type, decl;
19616
19617   if (TARGET_64BIT || align != 64 || ix86_preferred_stack_boundary >= 64)
19618     return align;
19619
19620   if (exp && DECL_P (exp))
19621     {
19622       type = TREE_TYPE (exp);
19623       decl = exp;
19624     }
19625   else
19626     {
19627       type = exp;
19628       decl = NULL;
19629     }
19630
19631   /* Don't do dynamic stack realignment for long long objects with
19632      -mpreferred-stack-boundary=2.  */
19633   if ((mode == DImode || (type && TYPE_MODE (type) == DImode))
19634       && (!type || !TYPE_USER_ALIGN (type))
19635       && (!decl || !DECL_USER_ALIGN (decl)))
19636     return 32;
19637
19638   return align;
19639 }
19640 \f
19641 /* Emit RTL insns to initialize the variable parts of a trampoline.
19642    FNADDR is an RTX for the address of the function's pure code.
19643    CXT is an RTX for the static chain value for the function.  */
19644 void
19645 x86_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
19646 {
19647   if (!TARGET_64BIT)
19648     {
19649       /* Compute offset from the end of the jmp to the target function.  */
19650       rtx disp = expand_binop (SImode, sub_optab, fnaddr,
19651                                plus_constant (tramp, 10),
19652                                NULL_RTX, 1, OPTAB_DIRECT);
19653       emit_move_insn (gen_rtx_MEM (QImode, tramp),
19654                       gen_int_mode (0xb9, QImode));
19655       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 1)), cxt);
19656       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, 5)),
19657                       gen_int_mode (0xe9, QImode));
19658       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 6)), disp);
19659     }
19660   else
19661     {
19662       int offset = 0;
19663       /* Try to load address using shorter movl instead of movabs.
19664          We may want to support movq for kernel mode, but kernel does not use
19665          trampolines at the moment.  */
19666       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
19667         {
19668           fnaddr = copy_to_mode_reg (DImode, fnaddr);
19669           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19670                           gen_int_mode (0xbb41, HImode));
19671           emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, offset + 2)),
19672                           gen_lowpart (SImode, fnaddr));
19673           offset += 6;
19674         }
19675       else
19676         {
19677           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19678                           gen_int_mode (0xbb49, HImode));
19679           emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19680                           fnaddr);
19681           offset += 10;
19682         }
19683       /* Load static chain using movabs to r10.  */
19684       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19685                       gen_int_mode (0xba49, HImode));
19686       emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19687                       cxt);
19688       offset += 10;
19689       /* Jump to the r11 */
19690       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19691                       gen_int_mode (0xff49, HImode));
19692       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, offset+2)),
19693                       gen_int_mode (0xe3, QImode));
19694       offset += 3;
19695       gcc_assert (offset <= TRAMPOLINE_SIZE);
19696     }
19697
19698 #ifdef ENABLE_EXECUTE_STACK
19699   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
19700                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
19701 #endif
19702 }
19703 \f
19704 /* Codes for all the SSE/MMX builtins.  */
19705 enum ix86_builtins
19706 {
19707   IX86_BUILTIN_ADDPS,
19708   IX86_BUILTIN_ADDSS,
19709   IX86_BUILTIN_DIVPS,
19710   IX86_BUILTIN_DIVSS,
19711   IX86_BUILTIN_MULPS,
19712   IX86_BUILTIN_MULSS,
19713   IX86_BUILTIN_SUBPS,
19714   IX86_BUILTIN_SUBSS,
19715
19716   IX86_BUILTIN_CMPEQPS,
19717   IX86_BUILTIN_CMPLTPS,
19718   IX86_BUILTIN_CMPLEPS,
19719   IX86_BUILTIN_CMPGTPS,
19720   IX86_BUILTIN_CMPGEPS,
19721   IX86_BUILTIN_CMPNEQPS,
19722   IX86_BUILTIN_CMPNLTPS,
19723   IX86_BUILTIN_CMPNLEPS,
19724   IX86_BUILTIN_CMPNGTPS,
19725   IX86_BUILTIN_CMPNGEPS,
19726   IX86_BUILTIN_CMPORDPS,
19727   IX86_BUILTIN_CMPUNORDPS,
19728   IX86_BUILTIN_CMPEQSS,
19729   IX86_BUILTIN_CMPLTSS,
19730   IX86_BUILTIN_CMPLESS,
19731   IX86_BUILTIN_CMPNEQSS,
19732   IX86_BUILTIN_CMPNLTSS,
19733   IX86_BUILTIN_CMPNLESS,
19734   IX86_BUILTIN_CMPNGTSS,
19735   IX86_BUILTIN_CMPNGESS,
19736   IX86_BUILTIN_CMPORDSS,
19737   IX86_BUILTIN_CMPUNORDSS,
19738
19739   IX86_BUILTIN_COMIEQSS,
19740   IX86_BUILTIN_COMILTSS,
19741   IX86_BUILTIN_COMILESS,
19742   IX86_BUILTIN_COMIGTSS,
19743   IX86_BUILTIN_COMIGESS,
19744   IX86_BUILTIN_COMINEQSS,
19745   IX86_BUILTIN_UCOMIEQSS,
19746   IX86_BUILTIN_UCOMILTSS,
19747   IX86_BUILTIN_UCOMILESS,
19748   IX86_BUILTIN_UCOMIGTSS,
19749   IX86_BUILTIN_UCOMIGESS,
19750   IX86_BUILTIN_UCOMINEQSS,
19751
19752   IX86_BUILTIN_CVTPI2PS,
19753   IX86_BUILTIN_CVTPS2PI,
19754   IX86_BUILTIN_CVTSI2SS,
19755   IX86_BUILTIN_CVTSI642SS,
19756   IX86_BUILTIN_CVTSS2SI,
19757   IX86_BUILTIN_CVTSS2SI64,
19758   IX86_BUILTIN_CVTTPS2PI,
19759   IX86_BUILTIN_CVTTSS2SI,
19760   IX86_BUILTIN_CVTTSS2SI64,
19761
19762   IX86_BUILTIN_MAXPS,
19763   IX86_BUILTIN_MAXSS,
19764   IX86_BUILTIN_MINPS,
19765   IX86_BUILTIN_MINSS,
19766
19767   IX86_BUILTIN_LOADUPS,
19768   IX86_BUILTIN_STOREUPS,
19769   IX86_BUILTIN_MOVSS,
19770
19771   IX86_BUILTIN_MOVHLPS,
19772   IX86_BUILTIN_MOVLHPS,
19773   IX86_BUILTIN_LOADHPS,
19774   IX86_BUILTIN_LOADLPS,
19775   IX86_BUILTIN_STOREHPS,
19776   IX86_BUILTIN_STORELPS,
19777
19778   IX86_BUILTIN_MASKMOVQ,
19779   IX86_BUILTIN_MOVMSKPS,
19780   IX86_BUILTIN_PMOVMSKB,
19781
19782   IX86_BUILTIN_MOVNTPS,
19783   IX86_BUILTIN_MOVNTQ,
19784
19785   IX86_BUILTIN_LOADDQU,
19786   IX86_BUILTIN_STOREDQU,
19787
19788   IX86_BUILTIN_PACKSSWB,
19789   IX86_BUILTIN_PACKSSDW,
19790   IX86_BUILTIN_PACKUSWB,
19791
19792   IX86_BUILTIN_PADDB,
19793   IX86_BUILTIN_PADDW,
19794   IX86_BUILTIN_PADDD,
19795   IX86_BUILTIN_PADDQ,
19796   IX86_BUILTIN_PADDSB,
19797   IX86_BUILTIN_PADDSW,
19798   IX86_BUILTIN_PADDUSB,
19799   IX86_BUILTIN_PADDUSW,
19800   IX86_BUILTIN_PSUBB,
19801   IX86_BUILTIN_PSUBW,
19802   IX86_BUILTIN_PSUBD,
19803   IX86_BUILTIN_PSUBQ,
19804   IX86_BUILTIN_PSUBSB,
19805   IX86_BUILTIN_PSUBSW,
19806   IX86_BUILTIN_PSUBUSB,
19807   IX86_BUILTIN_PSUBUSW,
19808
19809   IX86_BUILTIN_PAND,
19810   IX86_BUILTIN_PANDN,
19811   IX86_BUILTIN_POR,
19812   IX86_BUILTIN_PXOR,
19813
19814   IX86_BUILTIN_PAVGB,
19815   IX86_BUILTIN_PAVGW,
19816
19817   IX86_BUILTIN_PCMPEQB,
19818   IX86_BUILTIN_PCMPEQW,
19819   IX86_BUILTIN_PCMPEQD,
19820   IX86_BUILTIN_PCMPGTB,
19821   IX86_BUILTIN_PCMPGTW,
19822   IX86_BUILTIN_PCMPGTD,
19823
19824   IX86_BUILTIN_PMADDWD,
19825
19826   IX86_BUILTIN_PMAXSW,
19827   IX86_BUILTIN_PMAXUB,
19828   IX86_BUILTIN_PMINSW,
19829   IX86_BUILTIN_PMINUB,
19830
19831   IX86_BUILTIN_PMULHUW,
19832   IX86_BUILTIN_PMULHW,
19833   IX86_BUILTIN_PMULLW,
19834
19835   IX86_BUILTIN_PSADBW,
19836   IX86_BUILTIN_PSHUFW,
19837
19838   IX86_BUILTIN_PSLLW,
19839   IX86_BUILTIN_PSLLD,
19840   IX86_BUILTIN_PSLLQ,
19841   IX86_BUILTIN_PSRAW,
19842   IX86_BUILTIN_PSRAD,
19843   IX86_BUILTIN_PSRLW,
19844   IX86_BUILTIN_PSRLD,
19845   IX86_BUILTIN_PSRLQ,
19846   IX86_BUILTIN_PSLLWI,
19847   IX86_BUILTIN_PSLLDI,
19848   IX86_BUILTIN_PSLLQI,
19849   IX86_BUILTIN_PSRAWI,
19850   IX86_BUILTIN_PSRADI,
19851   IX86_BUILTIN_PSRLWI,
19852   IX86_BUILTIN_PSRLDI,
19853   IX86_BUILTIN_PSRLQI,
19854
19855   IX86_BUILTIN_PUNPCKHBW,
19856   IX86_BUILTIN_PUNPCKHWD,
19857   IX86_BUILTIN_PUNPCKHDQ,
19858   IX86_BUILTIN_PUNPCKLBW,
19859   IX86_BUILTIN_PUNPCKLWD,
19860   IX86_BUILTIN_PUNPCKLDQ,
19861
19862   IX86_BUILTIN_SHUFPS,
19863
19864   IX86_BUILTIN_RCPPS,
19865   IX86_BUILTIN_RCPSS,
19866   IX86_BUILTIN_RSQRTPS,
19867   IX86_BUILTIN_RSQRTPS_NR,
19868   IX86_BUILTIN_RSQRTSS,
19869   IX86_BUILTIN_RSQRTF,
19870   IX86_BUILTIN_SQRTPS,
19871   IX86_BUILTIN_SQRTPS_NR,
19872   IX86_BUILTIN_SQRTSS,
19873
19874   IX86_BUILTIN_UNPCKHPS,
19875   IX86_BUILTIN_UNPCKLPS,
19876
19877   IX86_BUILTIN_ANDPS,
19878   IX86_BUILTIN_ANDNPS,
19879   IX86_BUILTIN_ORPS,
19880   IX86_BUILTIN_XORPS,
19881
19882   IX86_BUILTIN_EMMS,
19883   IX86_BUILTIN_LDMXCSR,
19884   IX86_BUILTIN_STMXCSR,
19885   IX86_BUILTIN_SFENCE,
19886
19887   /* 3DNow! Original */
19888   IX86_BUILTIN_FEMMS,
19889   IX86_BUILTIN_PAVGUSB,
19890   IX86_BUILTIN_PF2ID,
19891   IX86_BUILTIN_PFACC,
19892   IX86_BUILTIN_PFADD,
19893   IX86_BUILTIN_PFCMPEQ,
19894   IX86_BUILTIN_PFCMPGE,
19895   IX86_BUILTIN_PFCMPGT,
19896   IX86_BUILTIN_PFMAX,
19897   IX86_BUILTIN_PFMIN,
19898   IX86_BUILTIN_PFMUL,
19899   IX86_BUILTIN_PFRCP,
19900   IX86_BUILTIN_PFRCPIT1,
19901   IX86_BUILTIN_PFRCPIT2,
19902   IX86_BUILTIN_PFRSQIT1,
19903   IX86_BUILTIN_PFRSQRT,
19904   IX86_BUILTIN_PFSUB,
19905   IX86_BUILTIN_PFSUBR,
19906   IX86_BUILTIN_PI2FD,
19907   IX86_BUILTIN_PMULHRW,
19908
19909   /* 3DNow! Athlon Extensions */
19910   IX86_BUILTIN_PF2IW,
19911   IX86_BUILTIN_PFNACC,
19912   IX86_BUILTIN_PFPNACC,
19913   IX86_BUILTIN_PI2FW,
19914   IX86_BUILTIN_PSWAPDSI,
19915   IX86_BUILTIN_PSWAPDSF,
19916
19917   /* SSE2 */
19918   IX86_BUILTIN_ADDPD,
19919   IX86_BUILTIN_ADDSD,
19920   IX86_BUILTIN_DIVPD,
19921   IX86_BUILTIN_DIVSD,
19922   IX86_BUILTIN_MULPD,
19923   IX86_BUILTIN_MULSD,
19924   IX86_BUILTIN_SUBPD,
19925   IX86_BUILTIN_SUBSD,
19926
19927   IX86_BUILTIN_CMPEQPD,
19928   IX86_BUILTIN_CMPLTPD,
19929   IX86_BUILTIN_CMPLEPD,
19930   IX86_BUILTIN_CMPGTPD,
19931   IX86_BUILTIN_CMPGEPD,
19932   IX86_BUILTIN_CMPNEQPD,
19933   IX86_BUILTIN_CMPNLTPD,
19934   IX86_BUILTIN_CMPNLEPD,
19935   IX86_BUILTIN_CMPNGTPD,
19936   IX86_BUILTIN_CMPNGEPD,
19937   IX86_BUILTIN_CMPORDPD,
19938   IX86_BUILTIN_CMPUNORDPD,
19939   IX86_BUILTIN_CMPEQSD,
19940   IX86_BUILTIN_CMPLTSD,
19941   IX86_BUILTIN_CMPLESD,
19942   IX86_BUILTIN_CMPNEQSD,
19943   IX86_BUILTIN_CMPNLTSD,
19944   IX86_BUILTIN_CMPNLESD,
19945   IX86_BUILTIN_CMPORDSD,
19946   IX86_BUILTIN_CMPUNORDSD,
19947
19948   IX86_BUILTIN_COMIEQSD,
19949   IX86_BUILTIN_COMILTSD,
19950   IX86_BUILTIN_COMILESD,
19951   IX86_BUILTIN_COMIGTSD,
19952   IX86_BUILTIN_COMIGESD,
19953   IX86_BUILTIN_COMINEQSD,
19954   IX86_BUILTIN_UCOMIEQSD,
19955   IX86_BUILTIN_UCOMILTSD,
19956   IX86_BUILTIN_UCOMILESD,
19957   IX86_BUILTIN_UCOMIGTSD,
19958   IX86_BUILTIN_UCOMIGESD,
19959   IX86_BUILTIN_UCOMINEQSD,
19960
19961   IX86_BUILTIN_MAXPD,
19962   IX86_BUILTIN_MAXSD,
19963   IX86_BUILTIN_MINPD,
19964   IX86_BUILTIN_MINSD,
19965
19966   IX86_BUILTIN_ANDPD,
19967   IX86_BUILTIN_ANDNPD,
19968   IX86_BUILTIN_ORPD,
19969   IX86_BUILTIN_XORPD,
19970
19971   IX86_BUILTIN_SQRTPD,
19972   IX86_BUILTIN_SQRTSD,
19973
19974   IX86_BUILTIN_UNPCKHPD,
19975   IX86_BUILTIN_UNPCKLPD,
19976
19977   IX86_BUILTIN_SHUFPD,
19978
19979   IX86_BUILTIN_LOADUPD,
19980   IX86_BUILTIN_STOREUPD,
19981   IX86_BUILTIN_MOVSD,
19982
19983   IX86_BUILTIN_LOADHPD,
19984   IX86_BUILTIN_LOADLPD,
19985
19986   IX86_BUILTIN_CVTDQ2PD,
19987   IX86_BUILTIN_CVTDQ2PS,
19988
19989   IX86_BUILTIN_CVTPD2DQ,
19990   IX86_BUILTIN_CVTPD2PI,
19991   IX86_BUILTIN_CVTPD2PS,
19992   IX86_BUILTIN_CVTTPD2DQ,
19993   IX86_BUILTIN_CVTTPD2PI,
19994
19995   IX86_BUILTIN_CVTPI2PD,
19996   IX86_BUILTIN_CVTSI2SD,
19997   IX86_BUILTIN_CVTSI642SD,
19998
19999   IX86_BUILTIN_CVTSD2SI,
20000   IX86_BUILTIN_CVTSD2SI64,
20001   IX86_BUILTIN_CVTSD2SS,
20002   IX86_BUILTIN_CVTSS2SD,
20003   IX86_BUILTIN_CVTTSD2SI,
20004   IX86_BUILTIN_CVTTSD2SI64,
20005
20006   IX86_BUILTIN_CVTPS2DQ,
20007   IX86_BUILTIN_CVTPS2PD,
20008   IX86_BUILTIN_CVTTPS2DQ,
20009
20010   IX86_BUILTIN_MOVNTI,
20011   IX86_BUILTIN_MOVNTPD,
20012   IX86_BUILTIN_MOVNTDQ,
20013
20014   IX86_BUILTIN_MOVQ128,
20015
20016   /* SSE2 MMX */
20017   IX86_BUILTIN_MASKMOVDQU,
20018   IX86_BUILTIN_MOVMSKPD,
20019   IX86_BUILTIN_PMOVMSKB128,
20020
20021   IX86_BUILTIN_PACKSSWB128,
20022   IX86_BUILTIN_PACKSSDW128,
20023   IX86_BUILTIN_PACKUSWB128,
20024
20025   IX86_BUILTIN_PADDB128,
20026   IX86_BUILTIN_PADDW128,
20027   IX86_BUILTIN_PADDD128,
20028   IX86_BUILTIN_PADDQ128,
20029   IX86_BUILTIN_PADDSB128,
20030   IX86_BUILTIN_PADDSW128,
20031   IX86_BUILTIN_PADDUSB128,
20032   IX86_BUILTIN_PADDUSW128,
20033   IX86_BUILTIN_PSUBB128,
20034   IX86_BUILTIN_PSUBW128,
20035   IX86_BUILTIN_PSUBD128,
20036   IX86_BUILTIN_PSUBQ128,
20037   IX86_BUILTIN_PSUBSB128,
20038   IX86_BUILTIN_PSUBSW128,
20039   IX86_BUILTIN_PSUBUSB128,
20040   IX86_BUILTIN_PSUBUSW128,
20041
20042   IX86_BUILTIN_PAND128,
20043   IX86_BUILTIN_PANDN128,
20044   IX86_BUILTIN_POR128,
20045   IX86_BUILTIN_PXOR128,
20046
20047   IX86_BUILTIN_PAVGB128,
20048   IX86_BUILTIN_PAVGW128,
20049
20050   IX86_BUILTIN_PCMPEQB128,
20051   IX86_BUILTIN_PCMPEQW128,
20052   IX86_BUILTIN_PCMPEQD128,
20053   IX86_BUILTIN_PCMPGTB128,
20054   IX86_BUILTIN_PCMPGTW128,
20055   IX86_BUILTIN_PCMPGTD128,
20056
20057   IX86_BUILTIN_PMADDWD128,
20058
20059   IX86_BUILTIN_PMAXSW128,
20060   IX86_BUILTIN_PMAXUB128,
20061   IX86_BUILTIN_PMINSW128,
20062   IX86_BUILTIN_PMINUB128,
20063
20064   IX86_BUILTIN_PMULUDQ,
20065   IX86_BUILTIN_PMULUDQ128,
20066   IX86_BUILTIN_PMULHUW128,
20067   IX86_BUILTIN_PMULHW128,
20068   IX86_BUILTIN_PMULLW128,
20069
20070   IX86_BUILTIN_PSADBW128,
20071   IX86_BUILTIN_PSHUFHW,
20072   IX86_BUILTIN_PSHUFLW,
20073   IX86_BUILTIN_PSHUFD,
20074
20075   IX86_BUILTIN_PSLLDQI128,
20076   IX86_BUILTIN_PSLLWI128,
20077   IX86_BUILTIN_PSLLDI128,
20078   IX86_BUILTIN_PSLLQI128,
20079   IX86_BUILTIN_PSRAWI128,
20080   IX86_BUILTIN_PSRADI128,
20081   IX86_BUILTIN_PSRLDQI128,
20082   IX86_BUILTIN_PSRLWI128,
20083   IX86_BUILTIN_PSRLDI128,
20084   IX86_BUILTIN_PSRLQI128,
20085
20086   IX86_BUILTIN_PSLLDQ128,
20087   IX86_BUILTIN_PSLLW128,
20088   IX86_BUILTIN_PSLLD128,
20089   IX86_BUILTIN_PSLLQ128,
20090   IX86_BUILTIN_PSRAW128,
20091   IX86_BUILTIN_PSRAD128,
20092   IX86_BUILTIN_PSRLW128,
20093   IX86_BUILTIN_PSRLD128,
20094   IX86_BUILTIN_PSRLQ128,
20095
20096   IX86_BUILTIN_PUNPCKHBW128,
20097   IX86_BUILTIN_PUNPCKHWD128,
20098   IX86_BUILTIN_PUNPCKHDQ128,
20099   IX86_BUILTIN_PUNPCKHQDQ128,
20100   IX86_BUILTIN_PUNPCKLBW128,
20101   IX86_BUILTIN_PUNPCKLWD128,
20102   IX86_BUILTIN_PUNPCKLDQ128,
20103   IX86_BUILTIN_PUNPCKLQDQ128,
20104
20105   IX86_BUILTIN_CLFLUSH,
20106   IX86_BUILTIN_MFENCE,
20107   IX86_BUILTIN_LFENCE,
20108
20109   /* SSE3.  */
20110   IX86_BUILTIN_ADDSUBPS,
20111   IX86_BUILTIN_HADDPS,
20112   IX86_BUILTIN_HSUBPS,
20113   IX86_BUILTIN_MOVSHDUP,
20114   IX86_BUILTIN_MOVSLDUP,
20115   IX86_BUILTIN_ADDSUBPD,
20116   IX86_BUILTIN_HADDPD,
20117   IX86_BUILTIN_HSUBPD,
20118   IX86_BUILTIN_LDDQU,
20119
20120   IX86_BUILTIN_MONITOR,
20121   IX86_BUILTIN_MWAIT,
20122
20123   /* SSSE3.  */
20124   IX86_BUILTIN_PHADDW,
20125   IX86_BUILTIN_PHADDD,
20126   IX86_BUILTIN_PHADDSW,
20127   IX86_BUILTIN_PHSUBW,
20128   IX86_BUILTIN_PHSUBD,
20129   IX86_BUILTIN_PHSUBSW,
20130   IX86_BUILTIN_PMADDUBSW,
20131   IX86_BUILTIN_PMULHRSW,
20132   IX86_BUILTIN_PSHUFB,
20133   IX86_BUILTIN_PSIGNB,
20134   IX86_BUILTIN_PSIGNW,
20135   IX86_BUILTIN_PSIGND,
20136   IX86_BUILTIN_PALIGNR,
20137   IX86_BUILTIN_PABSB,
20138   IX86_BUILTIN_PABSW,
20139   IX86_BUILTIN_PABSD,
20140
20141   IX86_BUILTIN_PHADDW128,
20142   IX86_BUILTIN_PHADDD128,
20143   IX86_BUILTIN_PHADDSW128,
20144   IX86_BUILTIN_PHSUBW128,
20145   IX86_BUILTIN_PHSUBD128,
20146   IX86_BUILTIN_PHSUBSW128,
20147   IX86_BUILTIN_PMADDUBSW128,
20148   IX86_BUILTIN_PMULHRSW128,
20149   IX86_BUILTIN_PSHUFB128,
20150   IX86_BUILTIN_PSIGNB128,
20151   IX86_BUILTIN_PSIGNW128,
20152   IX86_BUILTIN_PSIGND128,
20153   IX86_BUILTIN_PALIGNR128,
20154   IX86_BUILTIN_PABSB128,
20155   IX86_BUILTIN_PABSW128,
20156   IX86_BUILTIN_PABSD128,
20157
20158   /* AMDFAM10 - SSE4A New Instructions.  */
20159   IX86_BUILTIN_MOVNTSD,
20160   IX86_BUILTIN_MOVNTSS,
20161   IX86_BUILTIN_EXTRQI,
20162   IX86_BUILTIN_EXTRQ,
20163   IX86_BUILTIN_INSERTQI,
20164   IX86_BUILTIN_INSERTQ,
20165
20166   /* SSE4.1.  */
20167   IX86_BUILTIN_BLENDPD,
20168   IX86_BUILTIN_BLENDPS,
20169   IX86_BUILTIN_BLENDVPD,
20170   IX86_BUILTIN_BLENDVPS,
20171   IX86_BUILTIN_PBLENDVB128,
20172   IX86_BUILTIN_PBLENDW128,
20173
20174   IX86_BUILTIN_DPPD,
20175   IX86_BUILTIN_DPPS,
20176
20177   IX86_BUILTIN_INSERTPS128,
20178
20179   IX86_BUILTIN_MOVNTDQA,
20180   IX86_BUILTIN_MPSADBW128,
20181   IX86_BUILTIN_PACKUSDW128,
20182   IX86_BUILTIN_PCMPEQQ,
20183   IX86_BUILTIN_PHMINPOSUW128,
20184
20185   IX86_BUILTIN_PMAXSB128,
20186   IX86_BUILTIN_PMAXSD128,
20187   IX86_BUILTIN_PMAXUD128,
20188   IX86_BUILTIN_PMAXUW128,
20189
20190   IX86_BUILTIN_PMINSB128,
20191   IX86_BUILTIN_PMINSD128,
20192   IX86_BUILTIN_PMINUD128,
20193   IX86_BUILTIN_PMINUW128,
20194
20195   IX86_BUILTIN_PMOVSXBW128,
20196   IX86_BUILTIN_PMOVSXBD128,
20197   IX86_BUILTIN_PMOVSXBQ128,
20198   IX86_BUILTIN_PMOVSXWD128,
20199   IX86_BUILTIN_PMOVSXWQ128,
20200   IX86_BUILTIN_PMOVSXDQ128,
20201
20202   IX86_BUILTIN_PMOVZXBW128,
20203   IX86_BUILTIN_PMOVZXBD128,
20204   IX86_BUILTIN_PMOVZXBQ128,
20205   IX86_BUILTIN_PMOVZXWD128,
20206   IX86_BUILTIN_PMOVZXWQ128,
20207   IX86_BUILTIN_PMOVZXDQ128,
20208
20209   IX86_BUILTIN_PMULDQ128,
20210   IX86_BUILTIN_PMULLD128,
20211
20212   IX86_BUILTIN_ROUNDPD,
20213   IX86_BUILTIN_ROUNDPS,
20214   IX86_BUILTIN_ROUNDSD,
20215   IX86_BUILTIN_ROUNDSS,
20216
20217   IX86_BUILTIN_PTESTZ,
20218   IX86_BUILTIN_PTESTC,
20219   IX86_BUILTIN_PTESTNZC,
20220
20221   IX86_BUILTIN_VEC_INIT_V2SI,
20222   IX86_BUILTIN_VEC_INIT_V4HI,
20223   IX86_BUILTIN_VEC_INIT_V8QI,
20224   IX86_BUILTIN_VEC_EXT_V2DF,
20225   IX86_BUILTIN_VEC_EXT_V2DI,
20226   IX86_BUILTIN_VEC_EXT_V4SF,
20227   IX86_BUILTIN_VEC_EXT_V4SI,
20228   IX86_BUILTIN_VEC_EXT_V8HI,
20229   IX86_BUILTIN_VEC_EXT_V2SI,
20230   IX86_BUILTIN_VEC_EXT_V4HI,
20231   IX86_BUILTIN_VEC_EXT_V16QI,
20232   IX86_BUILTIN_VEC_SET_V2DI,
20233   IX86_BUILTIN_VEC_SET_V4SF,
20234   IX86_BUILTIN_VEC_SET_V4SI,
20235   IX86_BUILTIN_VEC_SET_V8HI,
20236   IX86_BUILTIN_VEC_SET_V4HI,
20237   IX86_BUILTIN_VEC_SET_V16QI,
20238
20239   IX86_BUILTIN_VEC_PACK_SFIX,
20240
20241   /* SSE4.2.  */
20242   IX86_BUILTIN_CRC32QI,
20243   IX86_BUILTIN_CRC32HI,
20244   IX86_BUILTIN_CRC32SI,
20245   IX86_BUILTIN_CRC32DI,
20246
20247   IX86_BUILTIN_PCMPESTRI128,
20248   IX86_BUILTIN_PCMPESTRM128,
20249   IX86_BUILTIN_PCMPESTRA128,
20250   IX86_BUILTIN_PCMPESTRC128,
20251   IX86_BUILTIN_PCMPESTRO128,
20252   IX86_BUILTIN_PCMPESTRS128,
20253   IX86_BUILTIN_PCMPESTRZ128,
20254   IX86_BUILTIN_PCMPISTRI128,
20255   IX86_BUILTIN_PCMPISTRM128,
20256   IX86_BUILTIN_PCMPISTRA128,
20257   IX86_BUILTIN_PCMPISTRC128,
20258   IX86_BUILTIN_PCMPISTRO128,
20259   IX86_BUILTIN_PCMPISTRS128,
20260   IX86_BUILTIN_PCMPISTRZ128,
20261
20262   IX86_BUILTIN_PCMPGTQ,
20263
20264   /* AES instructions */
20265   IX86_BUILTIN_AESENC128,
20266   IX86_BUILTIN_AESENCLAST128,
20267   IX86_BUILTIN_AESDEC128,
20268   IX86_BUILTIN_AESDECLAST128,
20269   IX86_BUILTIN_AESIMC128,
20270   IX86_BUILTIN_AESKEYGENASSIST128,
20271
20272   /* PCLMUL instruction */
20273   IX86_BUILTIN_PCLMULQDQ128,
20274
20275   /* AVX */
20276   IX86_BUILTIN_ADDPD256,
20277   IX86_BUILTIN_ADDPS256,
20278   IX86_BUILTIN_ADDSUBPD256,
20279   IX86_BUILTIN_ADDSUBPS256,
20280   IX86_BUILTIN_ANDPD256,
20281   IX86_BUILTIN_ANDPS256,
20282   IX86_BUILTIN_ANDNPD256,
20283   IX86_BUILTIN_ANDNPS256,
20284   IX86_BUILTIN_BLENDPD256,
20285   IX86_BUILTIN_BLENDPS256,
20286   IX86_BUILTIN_BLENDVPD256,
20287   IX86_BUILTIN_BLENDVPS256,
20288   IX86_BUILTIN_DIVPD256,
20289   IX86_BUILTIN_DIVPS256,
20290   IX86_BUILTIN_DPPS256,
20291   IX86_BUILTIN_HADDPD256,
20292   IX86_BUILTIN_HADDPS256,
20293   IX86_BUILTIN_HSUBPD256,
20294   IX86_BUILTIN_HSUBPS256,
20295   IX86_BUILTIN_MAXPD256,
20296   IX86_BUILTIN_MAXPS256,
20297   IX86_BUILTIN_MINPD256,
20298   IX86_BUILTIN_MINPS256,
20299   IX86_BUILTIN_MULPD256,
20300   IX86_BUILTIN_MULPS256,
20301   IX86_BUILTIN_ORPD256,
20302   IX86_BUILTIN_ORPS256,
20303   IX86_BUILTIN_SHUFPD256,
20304   IX86_BUILTIN_SHUFPS256,
20305   IX86_BUILTIN_SUBPD256,
20306   IX86_BUILTIN_SUBPS256,
20307   IX86_BUILTIN_XORPD256,
20308   IX86_BUILTIN_XORPS256,
20309   IX86_BUILTIN_CMPSD,
20310   IX86_BUILTIN_CMPSS,
20311   IX86_BUILTIN_CMPPD,
20312   IX86_BUILTIN_CMPPS,
20313   IX86_BUILTIN_CMPPD256,
20314   IX86_BUILTIN_CMPPS256,
20315   IX86_BUILTIN_CVTDQ2PD256,
20316   IX86_BUILTIN_CVTDQ2PS256,
20317   IX86_BUILTIN_CVTPD2PS256,
20318   IX86_BUILTIN_CVTPS2DQ256,
20319   IX86_BUILTIN_CVTPS2PD256,
20320   IX86_BUILTIN_CVTTPD2DQ256,
20321   IX86_BUILTIN_CVTPD2DQ256,
20322   IX86_BUILTIN_CVTTPS2DQ256,
20323   IX86_BUILTIN_EXTRACTF128PD256,
20324   IX86_BUILTIN_EXTRACTF128PS256,
20325   IX86_BUILTIN_EXTRACTF128SI256,
20326   IX86_BUILTIN_VZEROALL,
20327   IX86_BUILTIN_VZEROUPPER,
20328   IX86_BUILTIN_VZEROUPPER_REX64,
20329   IX86_BUILTIN_VPERMILVARPD,
20330   IX86_BUILTIN_VPERMILVARPS,
20331   IX86_BUILTIN_VPERMILVARPD256,
20332   IX86_BUILTIN_VPERMILVARPS256,
20333   IX86_BUILTIN_VPERMILPD,
20334   IX86_BUILTIN_VPERMILPS,
20335   IX86_BUILTIN_VPERMILPD256,
20336   IX86_BUILTIN_VPERMILPS256,
20337   IX86_BUILTIN_VPERM2F128PD256,
20338   IX86_BUILTIN_VPERM2F128PS256,
20339   IX86_BUILTIN_VPERM2F128SI256,
20340   IX86_BUILTIN_VBROADCASTSS,
20341   IX86_BUILTIN_VBROADCASTSD256,
20342   IX86_BUILTIN_VBROADCASTSS256,
20343   IX86_BUILTIN_VBROADCASTPD256,
20344   IX86_BUILTIN_VBROADCASTPS256,
20345   IX86_BUILTIN_VINSERTF128PD256,
20346   IX86_BUILTIN_VINSERTF128PS256,
20347   IX86_BUILTIN_VINSERTF128SI256,
20348   IX86_BUILTIN_LOADUPD256,
20349   IX86_BUILTIN_LOADUPS256,
20350   IX86_BUILTIN_STOREUPD256,
20351   IX86_BUILTIN_STOREUPS256,
20352   IX86_BUILTIN_LDDQU256,
20353   IX86_BUILTIN_MOVNTDQ256,
20354   IX86_BUILTIN_MOVNTPD256,
20355   IX86_BUILTIN_MOVNTPS256,
20356   IX86_BUILTIN_LOADDQU256,
20357   IX86_BUILTIN_STOREDQU256,
20358   IX86_BUILTIN_MASKLOADPD,
20359   IX86_BUILTIN_MASKLOADPS,
20360   IX86_BUILTIN_MASKSTOREPD,
20361   IX86_BUILTIN_MASKSTOREPS,
20362   IX86_BUILTIN_MASKLOADPD256,
20363   IX86_BUILTIN_MASKLOADPS256,
20364   IX86_BUILTIN_MASKSTOREPD256,
20365   IX86_BUILTIN_MASKSTOREPS256,
20366   IX86_BUILTIN_MOVSHDUP256,
20367   IX86_BUILTIN_MOVSLDUP256,
20368   IX86_BUILTIN_MOVDDUP256,
20369
20370   IX86_BUILTIN_SQRTPD256,
20371   IX86_BUILTIN_SQRTPS256,
20372   IX86_BUILTIN_SQRTPS_NR256,
20373   IX86_BUILTIN_RSQRTPS256,
20374   IX86_BUILTIN_RSQRTPS_NR256,
20375
20376   IX86_BUILTIN_RCPPS256,
20377
20378   IX86_BUILTIN_ROUNDPD256,
20379   IX86_BUILTIN_ROUNDPS256,
20380
20381   IX86_BUILTIN_UNPCKHPD256,
20382   IX86_BUILTIN_UNPCKLPD256,
20383   IX86_BUILTIN_UNPCKHPS256,
20384   IX86_BUILTIN_UNPCKLPS256,
20385
20386   IX86_BUILTIN_SI256_SI,
20387   IX86_BUILTIN_PS256_PS,
20388   IX86_BUILTIN_PD256_PD,
20389   IX86_BUILTIN_SI_SI256,
20390   IX86_BUILTIN_PS_PS256,
20391   IX86_BUILTIN_PD_PD256,
20392
20393   IX86_BUILTIN_VTESTZPD,
20394   IX86_BUILTIN_VTESTCPD,
20395   IX86_BUILTIN_VTESTNZCPD,
20396   IX86_BUILTIN_VTESTZPS,
20397   IX86_BUILTIN_VTESTCPS,
20398   IX86_BUILTIN_VTESTNZCPS,
20399   IX86_BUILTIN_VTESTZPD256,
20400   IX86_BUILTIN_VTESTCPD256,
20401   IX86_BUILTIN_VTESTNZCPD256,
20402   IX86_BUILTIN_VTESTZPS256,
20403   IX86_BUILTIN_VTESTCPS256,
20404   IX86_BUILTIN_VTESTNZCPS256,
20405   IX86_BUILTIN_PTESTZ256,
20406   IX86_BUILTIN_PTESTC256,
20407   IX86_BUILTIN_PTESTNZC256,
20408
20409   IX86_BUILTIN_MOVMSKPD256,
20410   IX86_BUILTIN_MOVMSKPS256,
20411
20412   /* TFmode support builtins.  */
20413   IX86_BUILTIN_INFQ,
20414   IX86_BUILTIN_FABSQ,
20415   IX86_BUILTIN_COPYSIGNQ,
20416
20417   /* SSE5 instructions */
20418   IX86_BUILTIN_FMADDSS,
20419   IX86_BUILTIN_FMADDSD,
20420   IX86_BUILTIN_FMADDPS,
20421   IX86_BUILTIN_FMADDPD,
20422   IX86_BUILTIN_FMSUBSS,
20423   IX86_BUILTIN_FMSUBSD,
20424   IX86_BUILTIN_FMSUBPS,
20425   IX86_BUILTIN_FMSUBPD,
20426   IX86_BUILTIN_FNMADDSS,
20427   IX86_BUILTIN_FNMADDSD,
20428   IX86_BUILTIN_FNMADDPS,
20429   IX86_BUILTIN_FNMADDPD,
20430   IX86_BUILTIN_FNMSUBSS,
20431   IX86_BUILTIN_FNMSUBSD,
20432   IX86_BUILTIN_FNMSUBPS,
20433   IX86_BUILTIN_FNMSUBPD,
20434   IX86_BUILTIN_PCMOV,
20435   IX86_BUILTIN_PCMOV_V2DI,
20436   IX86_BUILTIN_PCMOV_V4SI,
20437   IX86_BUILTIN_PCMOV_V8HI,
20438   IX86_BUILTIN_PCMOV_V16QI,
20439   IX86_BUILTIN_PCMOV_V4SF,
20440   IX86_BUILTIN_PCMOV_V2DF,
20441   IX86_BUILTIN_PPERM,
20442   IX86_BUILTIN_PERMPS,
20443   IX86_BUILTIN_PERMPD,
20444   IX86_BUILTIN_PMACSSWW,
20445   IX86_BUILTIN_PMACSWW,
20446   IX86_BUILTIN_PMACSSWD,
20447   IX86_BUILTIN_PMACSWD,
20448   IX86_BUILTIN_PMACSSDD,
20449   IX86_BUILTIN_PMACSDD,
20450   IX86_BUILTIN_PMACSSDQL,
20451   IX86_BUILTIN_PMACSSDQH,
20452   IX86_BUILTIN_PMACSDQL,
20453   IX86_BUILTIN_PMACSDQH,
20454   IX86_BUILTIN_PMADCSSWD,
20455   IX86_BUILTIN_PMADCSWD,
20456   IX86_BUILTIN_PHADDBW,
20457   IX86_BUILTIN_PHADDBD,
20458   IX86_BUILTIN_PHADDBQ,
20459   IX86_BUILTIN_PHADDWD,
20460   IX86_BUILTIN_PHADDWQ,
20461   IX86_BUILTIN_PHADDDQ,
20462   IX86_BUILTIN_PHADDUBW,
20463   IX86_BUILTIN_PHADDUBD,
20464   IX86_BUILTIN_PHADDUBQ,
20465   IX86_BUILTIN_PHADDUWD,
20466   IX86_BUILTIN_PHADDUWQ,
20467   IX86_BUILTIN_PHADDUDQ,
20468   IX86_BUILTIN_PHSUBBW,
20469   IX86_BUILTIN_PHSUBWD,
20470   IX86_BUILTIN_PHSUBDQ,
20471   IX86_BUILTIN_PROTB,
20472   IX86_BUILTIN_PROTW,
20473   IX86_BUILTIN_PROTD,
20474   IX86_BUILTIN_PROTQ,
20475   IX86_BUILTIN_PROTB_IMM,
20476   IX86_BUILTIN_PROTW_IMM,
20477   IX86_BUILTIN_PROTD_IMM,
20478   IX86_BUILTIN_PROTQ_IMM,
20479   IX86_BUILTIN_PSHLB,
20480   IX86_BUILTIN_PSHLW,
20481   IX86_BUILTIN_PSHLD,
20482   IX86_BUILTIN_PSHLQ,
20483   IX86_BUILTIN_PSHAB,
20484   IX86_BUILTIN_PSHAW,
20485   IX86_BUILTIN_PSHAD,
20486   IX86_BUILTIN_PSHAQ,
20487   IX86_BUILTIN_FRCZSS,
20488   IX86_BUILTIN_FRCZSD,
20489   IX86_BUILTIN_FRCZPS,
20490   IX86_BUILTIN_FRCZPD,
20491   IX86_BUILTIN_CVTPH2PS,
20492   IX86_BUILTIN_CVTPS2PH,
20493
20494   IX86_BUILTIN_COMEQSS,
20495   IX86_BUILTIN_COMNESS,
20496   IX86_BUILTIN_COMLTSS,
20497   IX86_BUILTIN_COMLESS,
20498   IX86_BUILTIN_COMGTSS,
20499   IX86_BUILTIN_COMGESS,
20500   IX86_BUILTIN_COMUEQSS,
20501   IX86_BUILTIN_COMUNESS,
20502   IX86_BUILTIN_COMULTSS,
20503   IX86_BUILTIN_COMULESS,
20504   IX86_BUILTIN_COMUGTSS,
20505   IX86_BUILTIN_COMUGESS,
20506   IX86_BUILTIN_COMORDSS,
20507   IX86_BUILTIN_COMUNORDSS,
20508   IX86_BUILTIN_COMFALSESS,
20509   IX86_BUILTIN_COMTRUESS,
20510
20511   IX86_BUILTIN_COMEQSD,
20512   IX86_BUILTIN_COMNESD,
20513   IX86_BUILTIN_COMLTSD,
20514   IX86_BUILTIN_COMLESD,
20515   IX86_BUILTIN_COMGTSD,
20516   IX86_BUILTIN_COMGESD,
20517   IX86_BUILTIN_COMUEQSD,
20518   IX86_BUILTIN_COMUNESD,
20519   IX86_BUILTIN_COMULTSD,
20520   IX86_BUILTIN_COMULESD,
20521   IX86_BUILTIN_COMUGTSD,
20522   IX86_BUILTIN_COMUGESD,
20523   IX86_BUILTIN_COMORDSD,
20524   IX86_BUILTIN_COMUNORDSD,
20525   IX86_BUILTIN_COMFALSESD,
20526   IX86_BUILTIN_COMTRUESD,
20527
20528   IX86_BUILTIN_COMEQPS,
20529   IX86_BUILTIN_COMNEPS,
20530   IX86_BUILTIN_COMLTPS,
20531   IX86_BUILTIN_COMLEPS,
20532   IX86_BUILTIN_COMGTPS,
20533   IX86_BUILTIN_COMGEPS,
20534   IX86_BUILTIN_COMUEQPS,
20535   IX86_BUILTIN_COMUNEPS,
20536   IX86_BUILTIN_COMULTPS,
20537   IX86_BUILTIN_COMULEPS,
20538   IX86_BUILTIN_COMUGTPS,
20539   IX86_BUILTIN_COMUGEPS,
20540   IX86_BUILTIN_COMORDPS,
20541   IX86_BUILTIN_COMUNORDPS,
20542   IX86_BUILTIN_COMFALSEPS,
20543   IX86_BUILTIN_COMTRUEPS,
20544
20545   IX86_BUILTIN_COMEQPD,
20546   IX86_BUILTIN_COMNEPD,
20547   IX86_BUILTIN_COMLTPD,
20548   IX86_BUILTIN_COMLEPD,
20549   IX86_BUILTIN_COMGTPD,
20550   IX86_BUILTIN_COMGEPD,
20551   IX86_BUILTIN_COMUEQPD,
20552   IX86_BUILTIN_COMUNEPD,
20553   IX86_BUILTIN_COMULTPD,
20554   IX86_BUILTIN_COMULEPD,
20555   IX86_BUILTIN_COMUGTPD,
20556   IX86_BUILTIN_COMUGEPD,
20557   IX86_BUILTIN_COMORDPD,
20558   IX86_BUILTIN_COMUNORDPD,
20559   IX86_BUILTIN_COMFALSEPD,
20560   IX86_BUILTIN_COMTRUEPD,
20561
20562   IX86_BUILTIN_PCOMEQUB,
20563   IX86_BUILTIN_PCOMNEUB,
20564   IX86_BUILTIN_PCOMLTUB,
20565   IX86_BUILTIN_PCOMLEUB,
20566   IX86_BUILTIN_PCOMGTUB,
20567   IX86_BUILTIN_PCOMGEUB,
20568   IX86_BUILTIN_PCOMFALSEUB,
20569   IX86_BUILTIN_PCOMTRUEUB,
20570   IX86_BUILTIN_PCOMEQUW,
20571   IX86_BUILTIN_PCOMNEUW,
20572   IX86_BUILTIN_PCOMLTUW,
20573   IX86_BUILTIN_PCOMLEUW,
20574   IX86_BUILTIN_PCOMGTUW,
20575   IX86_BUILTIN_PCOMGEUW,
20576   IX86_BUILTIN_PCOMFALSEUW,
20577   IX86_BUILTIN_PCOMTRUEUW,
20578   IX86_BUILTIN_PCOMEQUD,
20579   IX86_BUILTIN_PCOMNEUD,
20580   IX86_BUILTIN_PCOMLTUD,
20581   IX86_BUILTIN_PCOMLEUD,
20582   IX86_BUILTIN_PCOMGTUD,
20583   IX86_BUILTIN_PCOMGEUD,
20584   IX86_BUILTIN_PCOMFALSEUD,
20585   IX86_BUILTIN_PCOMTRUEUD,
20586   IX86_BUILTIN_PCOMEQUQ,
20587   IX86_BUILTIN_PCOMNEUQ,
20588   IX86_BUILTIN_PCOMLTUQ,
20589   IX86_BUILTIN_PCOMLEUQ,
20590   IX86_BUILTIN_PCOMGTUQ,
20591   IX86_BUILTIN_PCOMGEUQ,
20592   IX86_BUILTIN_PCOMFALSEUQ,
20593   IX86_BUILTIN_PCOMTRUEUQ,
20594
20595   IX86_BUILTIN_PCOMEQB,
20596   IX86_BUILTIN_PCOMNEB,
20597   IX86_BUILTIN_PCOMLTB,
20598   IX86_BUILTIN_PCOMLEB,
20599   IX86_BUILTIN_PCOMGTB,
20600   IX86_BUILTIN_PCOMGEB,
20601   IX86_BUILTIN_PCOMFALSEB,
20602   IX86_BUILTIN_PCOMTRUEB,
20603   IX86_BUILTIN_PCOMEQW,
20604   IX86_BUILTIN_PCOMNEW,
20605   IX86_BUILTIN_PCOMLTW,
20606   IX86_BUILTIN_PCOMLEW,
20607   IX86_BUILTIN_PCOMGTW,
20608   IX86_BUILTIN_PCOMGEW,
20609   IX86_BUILTIN_PCOMFALSEW,
20610   IX86_BUILTIN_PCOMTRUEW,
20611   IX86_BUILTIN_PCOMEQD,
20612   IX86_BUILTIN_PCOMNED,
20613   IX86_BUILTIN_PCOMLTD,
20614   IX86_BUILTIN_PCOMLED,
20615   IX86_BUILTIN_PCOMGTD,
20616   IX86_BUILTIN_PCOMGED,
20617   IX86_BUILTIN_PCOMFALSED,
20618   IX86_BUILTIN_PCOMTRUED,
20619   IX86_BUILTIN_PCOMEQQ,
20620   IX86_BUILTIN_PCOMNEQ,
20621   IX86_BUILTIN_PCOMLTQ,
20622   IX86_BUILTIN_PCOMLEQ,
20623   IX86_BUILTIN_PCOMGTQ,
20624   IX86_BUILTIN_PCOMGEQ,
20625   IX86_BUILTIN_PCOMFALSEQ,
20626   IX86_BUILTIN_PCOMTRUEQ,
20627
20628   IX86_BUILTIN_MAX
20629 };
20630
20631 /* Table for the ix86 builtin decls.  */
20632 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
20633
20634 /* Table of all of the builtin functions that are possible with different ISA's
20635    but are waiting to be built until a function is declared to use that
20636    ISA.  */
20637 struct builtin_isa GTY(())
20638 {
20639   tree type;                    /* builtin type to use in the declaration */
20640   const char *name;             /* function name */
20641   int isa;                      /* isa_flags this builtin is defined for */
20642   bool const_p;                 /* true if the declaration is constant */
20643 };
20644
20645 static GTY(()) struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
20646
20647
20648 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
20649  * of which isa_flags to use in the ix86_builtins_isa array.  Stores the
20650  * function decl in the ix86_builtins array.  Returns the function decl or
20651  * NULL_TREE, if the builtin was not added.
20652  *
20653  * If the front end has a special hook for builtin functions, delay adding
20654  * builtin functions that aren't in the current ISA until the ISA is changed
20655  * with function specific optimization.  Doing so, can save about 300K for the
20656  * default compiler.  When the builtin is expanded, check at that time whether
20657  * it is valid.
20658  *
20659  * If the front end doesn't have a special hook, record all builtins, even if
20660  * it isn't an instruction set in the current ISA in case the user uses
20661  * function specific options for a different ISA, so that we don't get scope
20662  * errors if a builtin is added in the middle of a function scope.  */
20663
20664 static inline tree
20665 def_builtin (int mask, const char *name, tree type, enum ix86_builtins code)
20666 {
20667   tree decl = NULL_TREE;
20668
20669   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
20670     {
20671       ix86_builtins_isa[(int) code].isa = mask;
20672
20673       mask &= ~OPTION_MASK_ISA_64BIT;
20674       if ((mask & ix86_isa_flags) != 0
20675           || (lang_hooks.builtin_function
20676               == lang_hooks.builtin_function_ext_scope))
20677
20678         {
20679           decl = add_builtin_function (name, type, code, BUILT_IN_MD, NULL,
20680                                        NULL_TREE);
20681           ix86_builtins[(int) code] = decl;
20682           ix86_builtins_isa[(int) code].type = NULL_TREE;
20683         }
20684       else
20685         {
20686           ix86_builtins[(int) code] = NULL_TREE;
20687           ix86_builtins_isa[(int) code].const_p = false;
20688           ix86_builtins_isa[(int) code].type = type;
20689           ix86_builtins_isa[(int) code].name = name;
20690         }
20691     }
20692
20693   return decl;
20694 }
20695
20696 /* Like def_builtin, but also marks the function decl "const".  */
20697
20698 static inline tree
20699 def_builtin_const (int mask, const char *name, tree type,
20700                    enum ix86_builtins code)
20701 {
20702   tree decl = def_builtin (mask, name, type, code);
20703   if (decl)
20704     TREE_READONLY (decl) = 1;
20705   else
20706     ix86_builtins_isa[(int) code].const_p = true;
20707
20708   return decl;
20709 }
20710
20711 /* Add any new builtin functions for a given ISA that may not have been
20712    declared.  This saves a bit of space compared to adding all of the
20713    declarations to the tree, even if we didn't use them.  */
20714
20715 static void
20716 ix86_add_new_builtins (int isa)
20717 {
20718   int i;
20719   tree decl;
20720
20721   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
20722     {
20723       if ((ix86_builtins_isa[i].isa & isa) != 0
20724           && ix86_builtins_isa[i].type != NULL_TREE)
20725         {
20726           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
20727                                                  ix86_builtins_isa[i].type,
20728                                                  i, BUILT_IN_MD, NULL,
20729                                                  NULL_TREE);
20730
20731           ix86_builtins[i] = decl;
20732           ix86_builtins_isa[i].type = NULL_TREE;
20733           if (ix86_builtins_isa[i].const_p)
20734             TREE_READONLY (decl) = 1;
20735         }
20736     }
20737 }
20738
20739 /* Bits for builtin_description.flag.  */
20740
20741 /* Set when we don't support the comparison natively, and should
20742    swap_comparison in order to support it.  */
20743 #define BUILTIN_DESC_SWAP_OPERANDS      1
20744
20745 struct builtin_description
20746 {
20747   const unsigned int mask;
20748   const enum insn_code icode;
20749   const char *const name;
20750   const enum ix86_builtins code;
20751   const enum rtx_code comparison;
20752   const int flag;
20753 };
20754
20755 static const struct builtin_description bdesc_comi[] =
20756 {
20757   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
20758   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
20759   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
20760   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
20761   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
20762   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
20763   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
20764   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
20765   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
20766   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
20767   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
20768   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
20769   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
20770   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
20771   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
20772   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
20773   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
20774   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
20775   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
20776   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
20777   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
20778   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
20779   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
20780   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
20781 };
20782
20783 static const struct builtin_description bdesc_pcmpestr[] =
20784 {
20785   /* SSE4.2 */
20786   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
20787   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
20788   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
20789   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
20790   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
20791   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
20792   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
20793 };
20794
20795 static const struct builtin_description bdesc_pcmpistr[] =
20796 {
20797   /* SSE4.2 */
20798   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
20799   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
20800   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
20801   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
20802   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
20803   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
20804   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
20805 };
20806
20807 /* Special builtin types */
20808 enum ix86_special_builtin_type
20809 {
20810   SPECIAL_FTYPE_UNKNOWN,
20811   VOID_FTYPE_VOID,
20812   V32QI_FTYPE_PCCHAR,
20813   V16QI_FTYPE_PCCHAR,
20814   V8SF_FTYPE_PCV4SF,
20815   V8SF_FTYPE_PCFLOAT,
20816   V4DF_FTYPE_PCV2DF,
20817   V4DF_FTYPE_PCDOUBLE,
20818   V4SF_FTYPE_PCFLOAT,
20819   V2DF_FTYPE_PCDOUBLE,
20820   V8SF_FTYPE_PCV8SF_V8SI,
20821   V4DF_FTYPE_PCV4DF_V4DI,
20822   V4SF_FTYPE_V4SF_PCV2SF,
20823   V4SF_FTYPE_PCV4SF_V4SI,
20824   V2DF_FTYPE_V2DF_PCDOUBLE,
20825   V2DF_FTYPE_PCV2DF_V2DI,
20826   V2DI_FTYPE_PV2DI,
20827   VOID_FTYPE_PV2SF_V4SF,
20828   VOID_FTYPE_PV4DI_V4DI,
20829   VOID_FTYPE_PV2DI_V2DI,
20830   VOID_FTYPE_PCHAR_V32QI,
20831   VOID_FTYPE_PCHAR_V16QI,
20832   VOID_FTYPE_PFLOAT_V8SF,
20833   VOID_FTYPE_PFLOAT_V4SF,
20834   VOID_FTYPE_PDOUBLE_V4DF,
20835   VOID_FTYPE_PDOUBLE_V2DF,
20836   VOID_FTYPE_PDI_DI,
20837   VOID_FTYPE_PINT_INT,
20838   VOID_FTYPE_PV8SF_V8SI_V8SF,
20839   VOID_FTYPE_PV4DF_V4DI_V4DF,
20840   VOID_FTYPE_PV4SF_V4SI_V4SF,
20841   VOID_FTYPE_PV2DF_V2DI_V2DF
20842 };
20843
20844 /* Builtin types */
20845 enum ix86_builtin_type
20846 {
20847   FTYPE_UNKNOWN,
20848   FLOAT128_FTYPE_FLOAT128,
20849   FLOAT_FTYPE_FLOAT,
20850   FLOAT128_FTYPE_FLOAT128_FLOAT128,
20851   INT_FTYPE_V8SF_V8SF_PTEST,
20852   INT_FTYPE_V4DI_V4DI_PTEST,
20853   INT_FTYPE_V4DF_V4DF_PTEST,
20854   INT_FTYPE_V4SF_V4SF_PTEST,
20855   INT_FTYPE_V2DI_V2DI_PTEST,
20856   INT_FTYPE_V2DF_V2DF_PTEST,
20857   INT64_FTYPE_V4SF,
20858   INT64_FTYPE_V2DF,
20859   INT_FTYPE_V16QI,
20860   INT_FTYPE_V8QI,
20861   INT_FTYPE_V8SF,
20862   INT_FTYPE_V4DF,
20863   INT_FTYPE_V4SF,
20864   INT_FTYPE_V2DF,
20865   V16QI_FTYPE_V16QI,
20866   V8SI_FTYPE_V8SF,
20867   V8SI_FTYPE_V4SI,
20868   V8HI_FTYPE_V8HI,
20869   V8HI_FTYPE_V16QI,
20870   V8QI_FTYPE_V8QI,
20871   V8SF_FTYPE_V8SF,
20872   V8SF_FTYPE_V8SI,
20873   V8SF_FTYPE_V4SF,
20874   V4SI_FTYPE_V4SI,
20875   V4SI_FTYPE_V16QI,
20876   V4SI_FTYPE_V8SI,
20877   V4SI_FTYPE_V8HI,
20878   V4SI_FTYPE_V4DF,
20879   V4SI_FTYPE_V4SF,
20880   V4SI_FTYPE_V2DF,
20881   V4HI_FTYPE_V4HI,
20882   V4DF_FTYPE_V4DF,
20883   V4DF_FTYPE_V4SI,
20884   V4DF_FTYPE_V4SF,
20885   V4DF_FTYPE_V2DF,
20886   V4SF_FTYPE_V4DF,
20887   V4SF_FTYPE_V4SF,
20888   V4SF_FTYPE_V4SF_VEC_MERGE,
20889   V4SF_FTYPE_V8SF,
20890   V4SF_FTYPE_V4SI,
20891   V4SF_FTYPE_V2DF,
20892   V2DI_FTYPE_V2DI,
20893   V2DI_FTYPE_V16QI,
20894   V2DI_FTYPE_V8HI,
20895   V2DI_FTYPE_V4SI,
20896   V2DF_FTYPE_V2DF,
20897   V2DF_FTYPE_V2DF_VEC_MERGE,
20898   V2DF_FTYPE_V4SI,
20899   V2DF_FTYPE_V4DF,
20900   V2DF_FTYPE_V4SF,
20901   V2DF_FTYPE_V2SI,
20902   V2SI_FTYPE_V2SI,
20903   V2SI_FTYPE_V4SF,
20904   V2SI_FTYPE_V2SF,
20905   V2SI_FTYPE_V2DF,
20906   V2SF_FTYPE_V2SF,
20907   V2SF_FTYPE_V2SI,
20908   V16QI_FTYPE_V16QI_V16QI,
20909   V16QI_FTYPE_V8HI_V8HI,
20910   V8QI_FTYPE_V8QI_V8QI,
20911   V8QI_FTYPE_V4HI_V4HI,
20912   V8HI_FTYPE_V8HI_V8HI,
20913   V8HI_FTYPE_V8HI_V8HI_COUNT,
20914   V8HI_FTYPE_V16QI_V16QI,
20915   V8HI_FTYPE_V4SI_V4SI,
20916   V8HI_FTYPE_V8HI_SI_COUNT,
20917   V8SF_FTYPE_V8SF_V8SF,
20918   V8SF_FTYPE_V8SF_V8SI,
20919   V4SI_FTYPE_V4SI_V4SI,
20920   V4SI_FTYPE_V4SI_V4SI_COUNT,
20921   V4SI_FTYPE_V8HI_V8HI,
20922   V4SI_FTYPE_V4SF_V4SF,
20923   V4SI_FTYPE_V2DF_V2DF,
20924   V4SI_FTYPE_V4SI_SI_COUNT,
20925   V4HI_FTYPE_V4HI_V4HI,
20926   V4HI_FTYPE_V4HI_V4HI_COUNT,
20927   V4HI_FTYPE_V8QI_V8QI,
20928   V4HI_FTYPE_V2SI_V2SI,
20929   V4HI_FTYPE_V4HI_SI_COUNT,
20930   V4DF_FTYPE_V4DF_V4DF,
20931   V4DF_FTYPE_V4DF_V4DI,
20932   V4SF_FTYPE_V4SF_V4SF,
20933   V4SF_FTYPE_V4SF_V4SF_SWAP,
20934   V4SF_FTYPE_V4SF_V4SI,
20935   V4SF_FTYPE_V4SF_V2SI,
20936   V4SF_FTYPE_V4SF_V2DF,
20937   V4SF_FTYPE_V4SF_DI,
20938   V4SF_FTYPE_V4SF_SI,
20939   V2DI_FTYPE_V2DI_V2DI,
20940   V2DI_FTYPE_V2DI_V2DI_COUNT,
20941   V2DI_FTYPE_V16QI_V16QI,
20942   V2DI_FTYPE_V4SI_V4SI,
20943   V2DI_FTYPE_V2DI_V16QI,
20944   V2DI_FTYPE_V2DF_V2DF,
20945   V2DI_FTYPE_V2DI_SI_COUNT,
20946   V2SI_FTYPE_V2SI_V2SI,
20947   V2SI_FTYPE_V2SI_V2SI_COUNT,
20948   V2SI_FTYPE_V4HI_V4HI,
20949   V2SI_FTYPE_V2SF_V2SF,
20950   V2SI_FTYPE_V2SI_SI_COUNT,
20951   V2DF_FTYPE_V2DF_V2DF,
20952   V2DF_FTYPE_V2DF_V2DF_SWAP,
20953   V2DF_FTYPE_V2DF_V4SF,
20954   V2DF_FTYPE_V2DF_V2DI,
20955   V2DF_FTYPE_V2DF_DI,
20956   V2DF_FTYPE_V2DF_SI,
20957   V2SF_FTYPE_V2SF_V2SF,
20958   V1DI_FTYPE_V1DI_V1DI,
20959   V1DI_FTYPE_V1DI_V1DI_COUNT,
20960   V1DI_FTYPE_V8QI_V8QI,
20961   V1DI_FTYPE_V2SI_V2SI,
20962   V1DI_FTYPE_V1DI_SI_COUNT,
20963   UINT64_FTYPE_UINT64_UINT64,
20964   UINT_FTYPE_UINT_UINT,
20965   UINT_FTYPE_UINT_USHORT,
20966   UINT_FTYPE_UINT_UCHAR,
20967   V8HI_FTYPE_V8HI_INT,
20968   V4SI_FTYPE_V4SI_INT,
20969   V4HI_FTYPE_V4HI_INT,
20970   V8SF_FTYPE_V8SF_INT,
20971   V4SI_FTYPE_V8SI_INT,
20972   V4SF_FTYPE_V8SF_INT,
20973   V2DF_FTYPE_V4DF_INT,
20974   V4DF_FTYPE_V4DF_INT,
20975   V4SF_FTYPE_V4SF_INT,
20976   V2DI_FTYPE_V2DI_INT,
20977   V2DI2TI_FTYPE_V2DI_INT,
20978   V2DF_FTYPE_V2DF_INT,
20979   V16QI_FTYPE_V16QI_V16QI_V16QI,
20980   V8SF_FTYPE_V8SF_V8SF_V8SF,
20981   V4DF_FTYPE_V4DF_V4DF_V4DF,
20982   V4SF_FTYPE_V4SF_V4SF_V4SF,
20983   V2DF_FTYPE_V2DF_V2DF_V2DF,
20984   V16QI_FTYPE_V16QI_V16QI_INT,
20985   V8SI_FTYPE_V8SI_V8SI_INT,
20986   V8SI_FTYPE_V8SI_V4SI_INT,
20987   V8HI_FTYPE_V8HI_V8HI_INT,
20988   V8SF_FTYPE_V8SF_V8SF_INT,
20989   V8SF_FTYPE_V8SF_V4SF_INT,
20990   V4SI_FTYPE_V4SI_V4SI_INT,
20991   V4DF_FTYPE_V4DF_V4DF_INT,
20992   V4DF_FTYPE_V4DF_V2DF_INT,
20993   V4SF_FTYPE_V4SF_V4SF_INT,
20994   V2DI_FTYPE_V2DI_V2DI_INT,
20995   V2DI2TI_FTYPE_V2DI_V2DI_INT,
20996   V1DI2DI_FTYPE_V1DI_V1DI_INT,
20997   V2DF_FTYPE_V2DF_V2DF_INT,
20998   V2DI_FTYPE_V2DI_UINT_UINT,
20999   V2DI_FTYPE_V2DI_V2DI_UINT_UINT
21000 };
21001
21002 /* Special builtins with variable number of arguments.  */
21003 static const struct builtin_description bdesc_special_args[] =
21004 {
21005   /* MMX */
21006   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21007
21008   /* 3DNow! */
21009   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21010
21011   /* SSE */
21012   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21013   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21014   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21015
21016   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21017   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21018   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21019   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21020
21021   /* SSE or 3DNow!A  */
21022   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21023   { 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 },
21024
21025   /* SSE2 */
21026   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21027   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21028   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21029   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
21030   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21031   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
21032   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
21033   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
21034   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21035
21036   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21037   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21038
21039   /* SSE3 */
21040   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21041
21042   /* SSE4.1 */
21043   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
21044
21045   /* SSE4A */
21046   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21047   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21048
21049   /* AVX */
21050   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
21051   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, 0, IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
21052   { OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_64BIT, CODE_FOR_avx_vzeroupper_rex64, 0, IX86_BUILTIN_VZEROUPPER_REX64, UNKNOWN, (int) VOID_FTYPE_VOID },
21053
21054   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21055   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastsd256, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21056   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss256, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21057   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_pd256, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
21058   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_ps256, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
21059
21060   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21061   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21062   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21063   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21064   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21065   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
21066   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21067
21068   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
21069   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21070   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21071
21072   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DI },
21073   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SI },
21074   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DI },
21075   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SI },
21076   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DI_V2DF },
21077   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SI_V4SF },
21078   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DI_V4DF },
21079   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SI_V8SF },
21080 };
21081
21082 /* Builtins with variable number of arguments.  */
21083 static const struct builtin_description bdesc_args[] =
21084 {
21085   /* MMX */
21086   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21087   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21088   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21089   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21090   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21091   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21092
21093   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21094   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21095   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21096   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21097   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21098   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21099   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21100   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21101
21102   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21103   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21104
21105   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21106   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21107   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21108   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21109
21110   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21111   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21112   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21113   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21114   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21115   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21116
21117   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21118   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21119   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21120   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21121   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
21122   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
21123
21124   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21125   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
21126   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21127
21128   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
21129
21130   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21131   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21132   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21133   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21134   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21135   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21136
21137   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21138   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21139   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21140   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21141   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21142   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21143
21144   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21145   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21146   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21147   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21148
21149   /* 3DNow! */
21150   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21151   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21152   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21153   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21154
21155   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21156   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21157   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21158   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21159   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21160   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21161   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21162   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21163   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21164   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21165   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21166   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21167   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21168   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21169   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21170
21171   /* 3DNow!A */
21172   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21173   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21174   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21175   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21176   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21177   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21178
21179   /* SSE */
21180   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
21181   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21182   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21183   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21184   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21185   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21186   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21187   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21188   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21189   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21190   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21191   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21192
21193   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21194
21195   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21196   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21197   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21198   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21199   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21200   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21201   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21202   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21203
21204   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21205   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21206   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21207   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21208   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21209   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21210   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21211   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21212   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21213   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21214   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
21215   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21216   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21217   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21218   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21219   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21220   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21221   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21222   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21223   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21224   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21225   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21226
21227   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21228   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21229   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21230   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21231
21232   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21233   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21234   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21235   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21236
21237   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21238   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21239   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21240   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpckhps, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21241   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpcklps, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21242
21243   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
21244   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
21245   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
21246
21247   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
21248
21249   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21250   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21251   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21252
21253   /* SSE MMX or 3Dnow!A */
21254   { 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 },
21255   { 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 },
21256   { 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 },
21257
21258   { 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 },
21259   { 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 },
21260   { 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 },
21261   { 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 },
21262
21263   { 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 },
21264   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
21265
21266   { 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 },
21267
21268   /* SSE2 */
21269   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21270
21271   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
21272   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
21273   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
21274   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
21275   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21276
21277   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21278   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21279   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
21280   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21281   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21282
21283   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
21284
21285   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21286   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21287   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21288   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21289
21290   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21291   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
21292   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21293
21294   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21295   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21296   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21297   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21298   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21299   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21300   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21301   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21302
21303   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21304   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21305   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21306   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21307   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
21308   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21309   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21310   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21311   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21312   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21313   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21314   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21315   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21316   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21317   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21318   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21319   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21320   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21321   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21322   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21323
21324   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21325   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21326   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21327   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21328
21329   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21330   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21331   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21332   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21333
21334   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21335   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpckhpd_exp, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21336   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpcklpd_exp, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21337
21338   { 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 },
21339
21340   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21341   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21342   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21343   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21344   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21345   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21346   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21347   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21348
21349   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21350   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21351   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21352   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21353   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21354   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21355   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21356   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21357
21358   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21359   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
21360
21361   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21362   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21363   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21364   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21365
21366   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21367   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21368
21369   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21370   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21371   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21372   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21373   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21374   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21375
21376   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21377   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21378   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21379   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21380
21381   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhbw, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21382   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhwd, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
21383   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhdq, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
21384   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhqdq, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21385   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklbw, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21386   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklwd, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21387   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckldq, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21388   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklqdq, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21389
21390   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21391   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21392   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21393
21394   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21395   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
21396
21397   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
21398   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21399
21400   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
21401
21402   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
21403   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
21404   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
21405   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
21406
21407   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21408   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21409   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21410   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21411   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21412   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21413   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21414
21415   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21416   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21417   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21418   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21419   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21420   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21421   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21422
21423   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21424   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21425   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21426   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21427
21428   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
21429   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21430   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21431
21432   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
21433
21434   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
21435   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
21436
21437   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21438
21439   /* SSE2 MMX */
21440   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21441   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21442
21443   /* SSE3 */
21444   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
21445   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21446
21447   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21448   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21449   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21450   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21451   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21452   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21453
21454   /* SSSE3 */
21455   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
21456   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
21457   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21458   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
21459   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
21460   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21461
21462   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21463   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21464   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21465   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21466   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21467   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21468   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21469   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21470   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21471   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21472   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21473   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21474   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
21475   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
21476   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21477   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21478   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21479   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21480   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21481   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21482   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21483   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21484   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21485   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21486
21487   /* SSSE3.  */
21488   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_V2DI_INT },
21489   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI2DI_FTYPE_V1DI_V1DI_INT },
21490
21491   /* SSE4.1 */
21492   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21493   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21494   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
21495   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
21496   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21497   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21498   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21499   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
21500   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
21501   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
21502
21503   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21504   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21505   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21506   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21507   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21508   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21509   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21510   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21511   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21512   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21513   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21514   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21515   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21516
21517   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21518   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21519   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21520   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21521   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21522   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21523   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21524   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21525   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21526   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21527   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21528   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21529
21530   /* SSE4.1 and SSE5 */
21531   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21532   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21533   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21534   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21535
21536   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21537   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21538   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21539
21540   /* SSE4.2 */
21541   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21542   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32qi, "__builtin_ia32_crc32qi", IX86_BUILTIN_CRC32QI, UNKNOWN, (int) UINT_FTYPE_UINT_UCHAR },
21543   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32hi, "__builtin_ia32_crc32hi", IX86_BUILTIN_CRC32HI, UNKNOWN, (int) UINT_FTYPE_UINT_USHORT },
21544   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32si, "__builtin_ia32_crc32si", IX86_BUILTIN_CRC32SI, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
21545   { 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 },
21546
21547   /* SSE4A */
21548   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
21549   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
21550   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
21551   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21552
21553   /* AES */
21554   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
21555   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21556
21557   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21558   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21559   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21560   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21561
21562   /* PCLMUL */
21563   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
21564
21565   /* AVX */
21566   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21567   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21568   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21569   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21570   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21571   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21572   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21573   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21574   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21575   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21576   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21577   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21578   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21579   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21580   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21581   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21582   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21583   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21584   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21585   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21586   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21587   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21588   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21589   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21590   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21591   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21592
21593   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
21594   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
21595   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
21596   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
21597
21598   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21599   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21600   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
21601   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
21602   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21603   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21604   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21605   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpsdv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21606   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpssv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21607   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21608   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21609   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21610   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21611   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
21612   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
21613   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
21614   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
21615   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
21616   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
21617   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21618   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
21619   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21620   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21621   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21622   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21623   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21624   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
21625   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21626   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21627   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21628   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21629   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
21630   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
21631   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
21632
21633   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21634   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21635   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21636
21637   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21638   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21639   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21640   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21641   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21642
21643   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21644
21645   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21646   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21647
21648   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21649   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21650   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21651   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21652
21653   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
21654   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
21655   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
21656   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si_si256, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
21657   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps_ps256, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
21658   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd_pd256, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
21659
21660   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21661   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21662   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21663   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21664   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21665   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21666   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21667   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21668   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21669   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21670   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21671   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21672   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21673   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21674   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21675
21676   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
21677   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
21678 };
21679
21680 /* SSE5 */
21681 enum multi_arg_type {
21682   MULTI_ARG_UNKNOWN,
21683   MULTI_ARG_3_SF,
21684   MULTI_ARG_3_DF,
21685   MULTI_ARG_3_DI,
21686   MULTI_ARG_3_SI,
21687   MULTI_ARG_3_SI_DI,
21688   MULTI_ARG_3_HI,
21689   MULTI_ARG_3_HI_SI,
21690   MULTI_ARG_3_QI,
21691   MULTI_ARG_3_PERMPS,
21692   MULTI_ARG_3_PERMPD,
21693   MULTI_ARG_2_SF,
21694   MULTI_ARG_2_DF,
21695   MULTI_ARG_2_DI,
21696   MULTI_ARG_2_SI,
21697   MULTI_ARG_2_HI,
21698   MULTI_ARG_2_QI,
21699   MULTI_ARG_2_DI_IMM,
21700   MULTI_ARG_2_SI_IMM,
21701   MULTI_ARG_2_HI_IMM,
21702   MULTI_ARG_2_QI_IMM,
21703   MULTI_ARG_2_SF_CMP,
21704   MULTI_ARG_2_DF_CMP,
21705   MULTI_ARG_2_DI_CMP,
21706   MULTI_ARG_2_SI_CMP,
21707   MULTI_ARG_2_HI_CMP,
21708   MULTI_ARG_2_QI_CMP,
21709   MULTI_ARG_2_DI_TF,
21710   MULTI_ARG_2_SI_TF,
21711   MULTI_ARG_2_HI_TF,
21712   MULTI_ARG_2_QI_TF,
21713   MULTI_ARG_2_SF_TF,
21714   MULTI_ARG_2_DF_TF,
21715   MULTI_ARG_1_SF,
21716   MULTI_ARG_1_DF,
21717   MULTI_ARG_1_DI,
21718   MULTI_ARG_1_SI,
21719   MULTI_ARG_1_HI,
21720   MULTI_ARG_1_QI,
21721   MULTI_ARG_1_SI_DI,
21722   MULTI_ARG_1_HI_DI,
21723   MULTI_ARG_1_HI_SI,
21724   MULTI_ARG_1_QI_DI,
21725   MULTI_ARG_1_QI_SI,
21726   MULTI_ARG_1_QI_HI,
21727   MULTI_ARG_1_PH2PS,
21728   MULTI_ARG_1_PS2PH
21729 };
21730
21731 static const struct builtin_description bdesc_multi_arg[] =
21732 {
21733   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv4sf4,     "__builtin_ia32_fmaddss",    IX86_BUILTIN_FMADDSS,    0,            (int)MULTI_ARG_3_SF },
21734   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv2df4,     "__builtin_ia32_fmaddsd",    IX86_BUILTIN_FMADDSD,    0,            (int)MULTI_ARG_3_DF },
21735   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv4sf4,       "__builtin_ia32_fmaddps",    IX86_BUILTIN_FMADDPS,    0,            (int)MULTI_ARG_3_SF },
21736   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv2df4,       "__builtin_ia32_fmaddpd",    IX86_BUILTIN_FMADDPD,    0,            (int)MULTI_ARG_3_DF },
21737   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv4sf4,     "__builtin_ia32_fmsubss",    IX86_BUILTIN_FMSUBSS,    0,            (int)MULTI_ARG_3_SF },
21738   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv2df4,     "__builtin_ia32_fmsubsd",    IX86_BUILTIN_FMSUBSD,    0,            (int)MULTI_ARG_3_DF },
21739   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv4sf4,       "__builtin_ia32_fmsubps",    IX86_BUILTIN_FMSUBPS,    0,            (int)MULTI_ARG_3_SF },
21740   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv2df4,       "__builtin_ia32_fmsubpd",    IX86_BUILTIN_FMSUBPD,    0,            (int)MULTI_ARG_3_DF },
21741   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv4sf4,    "__builtin_ia32_fnmaddss",   IX86_BUILTIN_FNMADDSS,   0,            (int)MULTI_ARG_3_SF },
21742   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv2df4,    "__builtin_ia32_fnmaddsd",   IX86_BUILTIN_FNMADDSD,   0,            (int)MULTI_ARG_3_DF },
21743   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv4sf4,      "__builtin_ia32_fnmaddps",   IX86_BUILTIN_FNMADDPS,   0,            (int)MULTI_ARG_3_SF },
21744   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv2df4,      "__builtin_ia32_fnmaddpd",   IX86_BUILTIN_FNMADDPD,   0,            (int)MULTI_ARG_3_DF },
21745   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv4sf4,    "__builtin_ia32_fnmsubss",   IX86_BUILTIN_FNMSUBSS,   0,            (int)MULTI_ARG_3_SF },
21746   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv2df4,    "__builtin_ia32_fnmsubsd",   IX86_BUILTIN_FNMSUBSD,   0,            (int)MULTI_ARG_3_DF },
21747   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv4sf4,      "__builtin_ia32_fnmsubps",   IX86_BUILTIN_FNMSUBPS,   0,            (int)MULTI_ARG_3_SF },
21748   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv2df4,      "__builtin_ia32_fnmsubpd",   IX86_BUILTIN_FNMSUBPD,   0,            (int)MULTI_ARG_3_DF },
21749   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov",      IX86_BUILTIN_PCMOV,      0,            (int)MULTI_ARG_3_DI },
21750   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov_v2di", IX86_BUILTIN_PCMOV_V2DI, 0,            (int)MULTI_ARG_3_DI },
21751   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4si,        "__builtin_ia32_pcmov_v4si", IX86_BUILTIN_PCMOV_V4SI, 0,            (int)MULTI_ARG_3_SI },
21752   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v8hi,        "__builtin_ia32_pcmov_v8hi", IX86_BUILTIN_PCMOV_V8HI, 0,            (int)MULTI_ARG_3_HI },
21753   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v16qi,       "__builtin_ia32_pcmov_v16qi",IX86_BUILTIN_PCMOV_V16QI,0,            (int)MULTI_ARG_3_QI },
21754   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2df,        "__builtin_ia32_pcmov_v2df", IX86_BUILTIN_PCMOV_V2DF, 0,            (int)MULTI_ARG_3_DF },
21755   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4sf,        "__builtin_ia32_pcmov_v4sf", IX86_BUILTIN_PCMOV_V4SF, 0,            (int)MULTI_ARG_3_SF },
21756   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pperm,             "__builtin_ia32_pperm",      IX86_BUILTIN_PPERM,      0,            (int)MULTI_ARG_3_QI },
21757   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv4sf,          "__builtin_ia32_permps",     IX86_BUILTIN_PERMPS,     0,            (int)MULTI_ARG_3_PERMPS },
21758   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv2df,          "__builtin_ia32_permpd",     IX86_BUILTIN_PERMPD,     0,            (int)MULTI_ARG_3_PERMPD },
21759   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssww,          "__builtin_ia32_pmacssww",   IX86_BUILTIN_PMACSSWW,   0,            (int)MULTI_ARG_3_HI },
21760   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsww,           "__builtin_ia32_pmacsww",    IX86_BUILTIN_PMACSWW,    0,            (int)MULTI_ARG_3_HI },
21761   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsswd,          "__builtin_ia32_pmacsswd",   IX86_BUILTIN_PMACSSWD,   0,            (int)MULTI_ARG_3_HI_SI },
21762   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacswd,           "__builtin_ia32_pmacswd",    IX86_BUILTIN_PMACSWD,    0,            (int)MULTI_ARG_3_HI_SI },
21763   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdd,          "__builtin_ia32_pmacssdd",   IX86_BUILTIN_PMACSSDD,   0,            (int)MULTI_ARG_3_SI },
21764   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdd,           "__builtin_ia32_pmacsdd",    IX86_BUILTIN_PMACSDD,    0,            (int)MULTI_ARG_3_SI },
21765   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdql,         "__builtin_ia32_pmacssdql",  IX86_BUILTIN_PMACSSDQL,  0,            (int)MULTI_ARG_3_SI_DI },
21766   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdqh,         "__builtin_ia32_pmacssdqh",  IX86_BUILTIN_PMACSSDQH,  0,            (int)MULTI_ARG_3_SI_DI },
21767   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdql,          "__builtin_ia32_pmacsdql",   IX86_BUILTIN_PMACSDQL,   0,            (int)MULTI_ARG_3_SI_DI },
21768   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdqh,          "__builtin_ia32_pmacsdqh",   IX86_BUILTIN_PMACSDQH,   0,            (int)MULTI_ARG_3_SI_DI },
21769   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcsswd,         "__builtin_ia32_pmadcsswd",  IX86_BUILTIN_PMADCSSWD,  0,            (int)MULTI_ARG_3_HI_SI },
21770   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcswd,          "__builtin_ia32_pmadcswd",   IX86_BUILTIN_PMADCSWD,   0,            (int)MULTI_ARG_3_HI_SI },
21771   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv2di3,        "__builtin_ia32_protq",      IX86_BUILTIN_PROTQ,      0,            (int)MULTI_ARG_2_DI },
21772   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv4si3,        "__builtin_ia32_protd",      IX86_BUILTIN_PROTD,      0,            (int)MULTI_ARG_2_SI },
21773   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv8hi3,        "__builtin_ia32_protw",      IX86_BUILTIN_PROTW,      0,            (int)MULTI_ARG_2_HI },
21774   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv16qi3,       "__builtin_ia32_protb",      IX86_BUILTIN_PROTB,      0,            (int)MULTI_ARG_2_QI },
21775   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv2di3,         "__builtin_ia32_protqi",     IX86_BUILTIN_PROTQ_IMM,  0,            (int)MULTI_ARG_2_DI_IMM },
21776   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv4si3,         "__builtin_ia32_protdi",     IX86_BUILTIN_PROTD_IMM,  0,            (int)MULTI_ARG_2_SI_IMM },
21777   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv8hi3,         "__builtin_ia32_protwi",     IX86_BUILTIN_PROTW_IMM,  0,            (int)MULTI_ARG_2_HI_IMM },
21778   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv16qi3,        "__builtin_ia32_protbi",     IX86_BUILTIN_PROTB_IMM,  0,            (int)MULTI_ARG_2_QI_IMM },
21779   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv2di3,         "__builtin_ia32_pshaq",      IX86_BUILTIN_PSHAQ,      0,            (int)MULTI_ARG_2_DI },
21780   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv4si3,         "__builtin_ia32_pshad",      IX86_BUILTIN_PSHAD,      0,            (int)MULTI_ARG_2_SI },
21781   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv8hi3,         "__builtin_ia32_pshaw",      IX86_BUILTIN_PSHAW,      0,            (int)MULTI_ARG_2_HI },
21782   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv16qi3,        "__builtin_ia32_pshab",      IX86_BUILTIN_PSHAB,      0,            (int)MULTI_ARG_2_QI },
21783   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv2di3,         "__builtin_ia32_pshlq",      IX86_BUILTIN_PSHLQ,      0,            (int)MULTI_ARG_2_DI },
21784   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv4si3,         "__builtin_ia32_pshld",      IX86_BUILTIN_PSHLD,      0,            (int)MULTI_ARG_2_SI },
21785   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv8hi3,         "__builtin_ia32_pshlw",      IX86_BUILTIN_PSHLW,      0,            (int)MULTI_ARG_2_HI },
21786   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv16qi3,        "__builtin_ia32_pshlb",      IX86_BUILTIN_PSHLB,      0,            (int)MULTI_ARG_2_QI },
21787   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv4sf2,       "__builtin_ia32_frczss",     IX86_BUILTIN_FRCZSS,     0,            (int)MULTI_ARG_2_SF },
21788   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv2df2,       "__builtin_ia32_frczsd",     IX86_BUILTIN_FRCZSD,     0,            (int)MULTI_ARG_2_DF },
21789   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv4sf2,         "__builtin_ia32_frczps",     IX86_BUILTIN_FRCZPS,     0,            (int)MULTI_ARG_1_SF },
21790   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv2df2,         "__builtin_ia32_frczpd",     IX86_BUILTIN_FRCZPD,     0,            (int)MULTI_ARG_1_DF },
21791   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtph2ps,          "__builtin_ia32_cvtph2ps",   IX86_BUILTIN_CVTPH2PS,   0,            (int)MULTI_ARG_1_PH2PS },
21792   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtps2ph,          "__builtin_ia32_cvtps2ph",   IX86_BUILTIN_CVTPS2PH,   0,            (int)MULTI_ARG_1_PS2PH },
21793   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbw,           "__builtin_ia32_phaddbw",    IX86_BUILTIN_PHADDBW,    0,            (int)MULTI_ARG_1_QI_HI },
21794   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbd,           "__builtin_ia32_phaddbd",    IX86_BUILTIN_PHADDBD,    0,            (int)MULTI_ARG_1_QI_SI },
21795   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbq,           "__builtin_ia32_phaddbq",    IX86_BUILTIN_PHADDBQ,    0,            (int)MULTI_ARG_1_QI_DI },
21796   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwd,           "__builtin_ia32_phaddwd",    IX86_BUILTIN_PHADDWD,    0,            (int)MULTI_ARG_1_HI_SI },
21797   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwq,           "__builtin_ia32_phaddwq",    IX86_BUILTIN_PHADDWQ,    0,            (int)MULTI_ARG_1_HI_DI },
21798   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadddq,           "__builtin_ia32_phadddq",    IX86_BUILTIN_PHADDDQ,    0,            (int)MULTI_ARG_1_SI_DI },
21799   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubw,          "__builtin_ia32_phaddubw",   IX86_BUILTIN_PHADDUBW,   0,            (int)MULTI_ARG_1_QI_HI },
21800   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubd,          "__builtin_ia32_phaddubd",   IX86_BUILTIN_PHADDUBD,   0,            (int)MULTI_ARG_1_QI_SI },
21801   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubq,          "__builtin_ia32_phaddubq",   IX86_BUILTIN_PHADDUBQ,   0,            (int)MULTI_ARG_1_QI_DI },
21802   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwd,          "__builtin_ia32_phadduwd",   IX86_BUILTIN_PHADDUWD,   0,            (int)MULTI_ARG_1_HI_SI },
21803   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwq,          "__builtin_ia32_phadduwq",   IX86_BUILTIN_PHADDUWQ,   0,            (int)MULTI_ARG_1_HI_DI },
21804   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddudq,          "__builtin_ia32_phaddudq",   IX86_BUILTIN_PHADDUDQ,   0,            (int)MULTI_ARG_1_SI_DI },
21805   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubbw,           "__builtin_ia32_phsubbw",    IX86_BUILTIN_PHSUBBW,    0,            (int)MULTI_ARG_1_QI_HI },
21806   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubwd,           "__builtin_ia32_phsubwd",    IX86_BUILTIN_PHSUBWD,    0,            (int)MULTI_ARG_1_HI_SI },
21807   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubdq,           "__builtin_ia32_phsubdq",    IX86_BUILTIN_PHSUBDQ,    0,            (int)MULTI_ARG_1_SI_DI },
21808
21809   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comeqss",    IX86_BUILTIN_COMEQSS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
21810   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comness",    IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21811   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comneqss",   IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21812   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comltss",    IX86_BUILTIN_COMLTSS,    LT,           (int)MULTI_ARG_2_SF_CMP },
21813   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comless",    IX86_BUILTIN_COMLESS,    LE,           (int)MULTI_ARG_2_SF_CMP },
21814   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgtss",    IX86_BUILTIN_COMGTSS,    GT,           (int)MULTI_ARG_2_SF_CMP },
21815   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgess",    IX86_BUILTIN_COMGESS,    GE,           (int)MULTI_ARG_2_SF_CMP },
21816   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comueqss",   IX86_BUILTIN_COMUEQSS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
21817   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuness",   IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21818   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuneqss",  IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21819   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunltss",  IX86_BUILTIN_COMULTSS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
21820   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunless",  IX86_BUILTIN_COMULESS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
21821   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungtss",  IX86_BUILTIN_COMUGTSS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
21822   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungess",  IX86_BUILTIN_COMUGESS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
21823   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comordss",   IX86_BUILTIN_COMORDSS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
21824   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunordss", IX86_BUILTIN_COMUNORDSS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
21825
21826   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comeqsd",    IX86_BUILTIN_COMEQSD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
21827   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comnesd",    IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21828   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comneqsd",   IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21829   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comltsd",    IX86_BUILTIN_COMLTSD,    LT,           (int)MULTI_ARG_2_DF_CMP },
21830   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comlesd",    IX86_BUILTIN_COMLESD,    LE,           (int)MULTI_ARG_2_DF_CMP },
21831   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgtsd",    IX86_BUILTIN_COMGTSD,    GT,           (int)MULTI_ARG_2_DF_CMP },
21832   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgesd",    IX86_BUILTIN_COMGESD,    GE,           (int)MULTI_ARG_2_DF_CMP },
21833   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comueqsd",   IX86_BUILTIN_COMUEQSD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
21834   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunesd",   IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21835   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comuneqsd",  IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21836   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunltsd",  IX86_BUILTIN_COMULTSD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
21837   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunlesd",  IX86_BUILTIN_COMULESD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
21838   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungtsd",  IX86_BUILTIN_COMUGTSD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
21839   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungesd",  IX86_BUILTIN_COMUGESD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
21840   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comordsd",   IX86_BUILTIN_COMORDSD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
21841   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunordsd", IX86_BUILTIN_COMUNORDSD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
21842
21843   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comeqps",    IX86_BUILTIN_COMEQPS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
21844   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneps",    IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21845   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneqps",   IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21846   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comltps",    IX86_BUILTIN_COMLTPS,    LT,           (int)MULTI_ARG_2_SF_CMP },
21847   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comleps",    IX86_BUILTIN_COMLEPS,    LE,           (int)MULTI_ARG_2_SF_CMP },
21848   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgtps",    IX86_BUILTIN_COMGTPS,    GT,           (int)MULTI_ARG_2_SF_CMP },
21849   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgeps",    IX86_BUILTIN_COMGEPS,    GE,           (int)MULTI_ARG_2_SF_CMP },
21850   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comueqps",   IX86_BUILTIN_COMUEQPS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
21851   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneps",   IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21852   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneqps",  IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21853   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunltps",  IX86_BUILTIN_COMULTPS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
21854   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunleps",  IX86_BUILTIN_COMULEPS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
21855   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungtps",  IX86_BUILTIN_COMUGTPS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
21856   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungeps",  IX86_BUILTIN_COMUGEPS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
21857   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comordps",   IX86_BUILTIN_COMORDPS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
21858   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunordps", IX86_BUILTIN_COMUNORDPS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
21859
21860   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comeqpd",    IX86_BUILTIN_COMEQPD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
21861   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comnepd",    IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21862   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comneqpd",   IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21863   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comltpd",    IX86_BUILTIN_COMLTPD,    LT,           (int)MULTI_ARG_2_DF_CMP },
21864   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comlepd",    IX86_BUILTIN_COMLEPD,    LE,           (int)MULTI_ARG_2_DF_CMP },
21865   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgtpd",    IX86_BUILTIN_COMGTPD,    GT,           (int)MULTI_ARG_2_DF_CMP },
21866   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgepd",    IX86_BUILTIN_COMGEPD,    GE,           (int)MULTI_ARG_2_DF_CMP },
21867   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comueqpd",   IX86_BUILTIN_COMUEQPD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
21868   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunepd",   IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21869   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comuneqpd",  IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21870   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunltpd",  IX86_BUILTIN_COMULTPD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
21871   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunlepd",  IX86_BUILTIN_COMULEPD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
21872   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungtpd",  IX86_BUILTIN_COMUGTPD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
21873   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungepd",  IX86_BUILTIN_COMUGEPD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
21874   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comordpd",   IX86_BUILTIN_COMORDPD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
21875   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunordpd", IX86_BUILTIN_COMUNORDPD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
21876
21877   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomeqb",    IX86_BUILTIN_PCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
21878   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneb",    IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
21879   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneqb",   IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
21880   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomltb",    IX86_BUILTIN_PCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
21881   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomleb",    IX86_BUILTIN_PCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
21882   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgtb",    IX86_BUILTIN_PCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
21883   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgeb",    IX86_BUILTIN_PCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
21884
21885   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomeqw",    IX86_BUILTIN_PCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
21886   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomnew",    IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
21887   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomneqw",   IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
21888   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomltw",    IX86_BUILTIN_PCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
21889   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomlew",    IX86_BUILTIN_PCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
21890   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgtw",    IX86_BUILTIN_PCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
21891   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgew",    IX86_BUILTIN_PCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
21892
21893   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomeqd",    IX86_BUILTIN_PCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
21894   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomned",    IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
21895   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomneqd",   IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
21896   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomltd",    IX86_BUILTIN_PCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
21897   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomled",    IX86_BUILTIN_PCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
21898   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomgtd",    IX86_BUILTIN_PCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
21899   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomged",    IX86_BUILTIN_PCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
21900
21901   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomeqq",    IX86_BUILTIN_PCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
21902   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneq",    IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
21903   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneqq",   IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
21904   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomltq",    IX86_BUILTIN_PCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
21905   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomleq",    IX86_BUILTIN_PCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
21906   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgtq",    IX86_BUILTIN_PCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
21907   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgeq",    IX86_BUILTIN_PCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
21908
21909   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomequb",   IX86_BUILTIN_PCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
21910   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomneub",   IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
21911   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomnequb",  IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
21912   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomltub",   IX86_BUILTIN_PCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
21913   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomleub",   IX86_BUILTIN_PCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
21914   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgtub",   IX86_BUILTIN_PCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
21915   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgeub",   IX86_BUILTIN_PCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
21916
21917   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomequw",   IX86_BUILTIN_PCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
21918   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomneuw",   IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
21919   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomnequw",  IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
21920   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomltuw",   IX86_BUILTIN_PCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
21921   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomleuw",   IX86_BUILTIN_PCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
21922   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgtuw",   IX86_BUILTIN_PCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
21923   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgeuw",   IX86_BUILTIN_PCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
21924
21925   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomequd",   IX86_BUILTIN_PCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
21926   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomneud",   IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
21927   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomnequd",  IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
21928   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomltud",   IX86_BUILTIN_PCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
21929   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomleud",   IX86_BUILTIN_PCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
21930   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgtud",   IX86_BUILTIN_PCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
21931   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgeud",   IX86_BUILTIN_PCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
21932
21933   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomequq",   IX86_BUILTIN_PCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
21934   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomneuq",   IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
21935   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomnequq",  IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
21936   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomltuq",   IX86_BUILTIN_PCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
21937   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomleuq",   IX86_BUILTIN_PCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
21938   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgtuq",   IX86_BUILTIN_PCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
21939   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgeuq",   IX86_BUILTIN_PCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
21940
21941   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalsess", IX86_BUILTIN_COMFALSESS, COM_FALSE_S,  (int)MULTI_ARG_2_SF_TF },
21942   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtruess",  IX86_BUILTIN_COMTRUESS,  COM_TRUE_S,   (int)MULTI_ARG_2_SF_TF },
21943   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalseps", IX86_BUILTIN_COMFALSEPS, COM_FALSE_P,  (int)MULTI_ARG_2_SF_TF },
21944   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtrueps",  IX86_BUILTIN_COMTRUEPS,  COM_TRUE_P,   (int)MULTI_ARG_2_SF_TF },
21945   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsesd", IX86_BUILTIN_COMFALSESD, COM_FALSE_S,  (int)MULTI_ARG_2_DF_TF },
21946   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruesd",  IX86_BUILTIN_COMTRUESD,  COM_TRUE_S,   (int)MULTI_ARG_2_DF_TF },
21947   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsepd", IX86_BUILTIN_COMFALSEPD, COM_FALSE_P,  (int)MULTI_ARG_2_DF_TF },
21948   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruepd",  IX86_BUILTIN_COMTRUEPD,  COM_TRUE_P,   (int)MULTI_ARG_2_DF_TF },
21949
21950   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseb", IX86_BUILTIN_PCOMFALSEB, PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
21951   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalsew", IX86_BUILTIN_PCOMFALSEW, PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
21952   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalsed", IX86_BUILTIN_PCOMFALSED, PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
21953   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseq", IX86_BUILTIN_PCOMFALSEQ, PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
21954   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseub",IX86_BUILTIN_PCOMFALSEUB,PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
21955   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalseuw",IX86_BUILTIN_PCOMFALSEUW,PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
21956   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalseud",IX86_BUILTIN_PCOMFALSEUD,PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
21957   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseuq",IX86_BUILTIN_PCOMFALSEUQ,PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
21958
21959   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueb",  IX86_BUILTIN_PCOMTRUEB,  PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
21960   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtruew",  IX86_BUILTIN_PCOMTRUEW,  PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
21961   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrued",  IX86_BUILTIN_PCOMTRUED,  PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
21962   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueq",  IX86_BUILTIN_PCOMTRUEQ,  PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
21963   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueub", IX86_BUILTIN_PCOMTRUEUB, PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
21964   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtrueuw", IX86_BUILTIN_PCOMTRUEUW, PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
21965   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrueud", IX86_BUILTIN_PCOMTRUEUD, PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
21966   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueuq", IX86_BUILTIN_PCOMTRUEUQ, PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
21967 };
21968
21969 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
21970    in the current target ISA to allow the user to compile particular modules
21971    with different target specific options that differ from the command line
21972    options.  */
21973 static void
21974 ix86_init_mmx_sse_builtins (void)
21975 {
21976   const struct builtin_description * d;
21977   size_t i;
21978
21979   tree V16QI_type_node = build_vector_type_for_mode (char_type_node, V16QImode);
21980   tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
21981   tree V1DI_type_node
21982     = build_vector_type_for_mode (long_long_integer_type_node, V1DImode);
21983   tree V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
21984   tree V2DI_type_node
21985     = build_vector_type_for_mode (long_long_integer_type_node, V2DImode);
21986   tree V2DF_type_node = build_vector_type_for_mode (double_type_node, V2DFmode);
21987   tree V4SF_type_node = build_vector_type_for_mode (float_type_node, V4SFmode);
21988   tree V4SI_type_node = build_vector_type_for_mode (intSI_type_node, V4SImode);
21989   tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
21990   tree V8QI_type_node = build_vector_type_for_mode (char_type_node, V8QImode);
21991   tree V8HI_type_node = build_vector_type_for_mode (intHI_type_node, V8HImode);
21992
21993   tree pchar_type_node = build_pointer_type (char_type_node);
21994   tree pcchar_type_node
21995     = build_pointer_type (build_type_variant (char_type_node, 1, 0));
21996   tree pfloat_type_node = build_pointer_type (float_type_node);
21997   tree pcfloat_type_node
21998     = build_pointer_type (build_type_variant (float_type_node, 1, 0));
21999   tree pv2sf_type_node = build_pointer_type (V2SF_type_node);
22000   tree pcv2sf_type_node
22001     = build_pointer_type (build_type_variant (V2SF_type_node, 1, 0));
22002   tree pv2di_type_node = build_pointer_type (V2DI_type_node);
22003   tree pdi_type_node = build_pointer_type (long_long_unsigned_type_node);
22004
22005   /* Comparisons.  */
22006   tree int_ftype_v4sf_v4sf
22007     = build_function_type_list (integer_type_node,
22008                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22009   tree v4si_ftype_v4sf_v4sf
22010     = build_function_type_list (V4SI_type_node,
22011                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22012   /* MMX/SSE/integer conversions.  */
22013   tree int_ftype_v4sf
22014     = build_function_type_list (integer_type_node,
22015                                 V4SF_type_node, NULL_TREE);
22016   tree int64_ftype_v4sf
22017     = build_function_type_list (long_long_integer_type_node,
22018                                 V4SF_type_node, NULL_TREE);
22019   tree int_ftype_v8qi
22020     = build_function_type_list (integer_type_node, V8QI_type_node, NULL_TREE);
22021   tree v4sf_ftype_v4sf_int
22022     = build_function_type_list (V4SF_type_node,
22023                                 V4SF_type_node, integer_type_node, NULL_TREE);
22024   tree v4sf_ftype_v4sf_int64
22025     = build_function_type_list (V4SF_type_node,
22026                                 V4SF_type_node, long_long_integer_type_node,
22027                                 NULL_TREE);
22028   tree v4sf_ftype_v4sf_v2si
22029     = build_function_type_list (V4SF_type_node,
22030                                 V4SF_type_node, V2SI_type_node, NULL_TREE);
22031
22032   /* Miscellaneous.  */
22033   tree v8qi_ftype_v4hi_v4hi
22034     = build_function_type_list (V8QI_type_node,
22035                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22036   tree v4hi_ftype_v2si_v2si
22037     = build_function_type_list (V4HI_type_node,
22038                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22039   tree v4sf_ftype_v4sf_v4sf_int
22040     = build_function_type_list (V4SF_type_node,
22041                                 V4SF_type_node, V4SF_type_node,
22042                                 integer_type_node, NULL_TREE);
22043   tree v2si_ftype_v4hi_v4hi
22044     = build_function_type_list (V2SI_type_node,
22045                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22046   tree v4hi_ftype_v4hi_int
22047     = build_function_type_list (V4HI_type_node,
22048                                 V4HI_type_node, integer_type_node, NULL_TREE);
22049   tree v2si_ftype_v2si_int
22050     = build_function_type_list (V2SI_type_node,
22051                                 V2SI_type_node, integer_type_node, NULL_TREE);
22052   tree v1di_ftype_v1di_int
22053     = build_function_type_list (V1DI_type_node,
22054                                 V1DI_type_node, integer_type_node, NULL_TREE);
22055
22056   tree void_ftype_void
22057     = build_function_type (void_type_node, void_list_node);
22058   tree void_ftype_unsigned
22059     = build_function_type_list (void_type_node, unsigned_type_node, NULL_TREE);
22060   tree void_ftype_unsigned_unsigned
22061     = build_function_type_list (void_type_node, unsigned_type_node,
22062                                 unsigned_type_node, NULL_TREE);
22063   tree void_ftype_pcvoid_unsigned_unsigned
22064     = build_function_type_list (void_type_node, const_ptr_type_node,
22065                                 unsigned_type_node, unsigned_type_node,
22066                                 NULL_TREE);
22067   tree unsigned_ftype_void
22068     = build_function_type (unsigned_type_node, void_list_node);
22069   tree v2si_ftype_v4sf
22070     = build_function_type_list (V2SI_type_node, V4SF_type_node, NULL_TREE);
22071   /* Loads/stores.  */
22072   tree void_ftype_v8qi_v8qi_pchar
22073     = build_function_type_list (void_type_node,
22074                                 V8QI_type_node, V8QI_type_node,
22075                                 pchar_type_node, NULL_TREE);
22076   tree v4sf_ftype_pcfloat
22077     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
22078   tree v4sf_ftype_v4sf_pcv2sf
22079     = build_function_type_list (V4SF_type_node,
22080                                 V4SF_type_node, pcv2sf_type_node, NULL_TREE);
22081   tree void_ftype_pv2sf_v4sf
22082     = build_function_type_list (void_type_node,
22083                                 pv2sf_type_node, V4SF_type_node, NULL_TREE);
22084   tree void_ftype_pfloat_v4sf
22085     = build_function_type_list (void_type_node,
22086                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
22087   tree void_ftype_pdi_di
22088     = build_function_type_list (void_type_node,
22089                                 pdi_type_node, long_long_unsigned_type_node,
22090                                 NULL_TREE);
22091   tree void_ftype_pv2di_v2di
22092     = build_function_type_list (void_type_node,
22093                                 pv2di_type_node, V2DI_type_node, NULL_TREE);
22094   /* Normal vector unops.  */
22095   tree v4sf_ftype_v4sf
22096     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
22097   tree v16qi_ftype_v16qi
22098     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
22099   tree v8hi_ftype_v8hi
22100     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
22101   tree v4si_ftype_v4si
22102     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
22103   tree v8qi_ftype_v8qi
22104     = build_function_type_list (V8QI_type_node, V8QI_type_node, NULL_TREE);
22105   tree v4hi_ftype_v4hi
22106     = build_function_type_list (V4HI_type_node, V4HI_type_node, NULL_TREE);
22107
22108   /* Normal vector binops.  */
22109   tree v4sf_ftype_v4sf_v4sf
22110     = build_function_type_list (V4SF_type_node,
22111                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22112   tree v8qi_ftype_v8qi_v8qi
22113     = build_function_type_list (V8QI_type_node,
22114                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22115   tree v4hi_ftype_v4hi_v4hi
22116     = build_function_type_list (V4HI_type_node,
22117                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22118   tree v2si_ftype_v2si_v2si
22119     = build_function_type_list (V2SI_type_node,
22120                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22121   tree v1di_ftype_v1di_v1di
22122     = build_function_type_list (V1DI_type_node,
22123                                 V1DI_type_node, V1DI_type_node, NULL_TREE);
22124   tree v1di_ftype_v1di_v1di_int
22125     = build_function_type_list (V1DI_type_node,
22126                                 V1DI_type_node, V1DI_type_node,
22127                                 integer_type_node, NULL_TREE);
22128   tree v2si_ftype_v2sf
22129     = build_function_type_list (V2SI_type_node, V2SF_type_node, NULL_TREE);
22130   tree v2sf_ftype_v2si
22131     = build_function_type_list (V2SF_type_node, V2SI_type_node, NULL_TREE);
22132   tree v2si_ftype_v2si
22133     = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
22134   tree v2sf_ftype_v2sf
22135     = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
22136   tree v2sf_ftype_v2sf_v2sf
22137     = build_function_type_list (V2SF_type_node,
22138                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
22139   tree v2si_ftype_v2sf_v2sf
22140     = build_function_type_list (V2SI_type_node,
22141                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
22142   tree pint_type_node    = build_pointer_type (integer_type_node);
22143   tree pdouble_type_node = build_pointer_type (double_type_node);
22144   tree pcdouble_type_node = build_pointer_type (
22145                                 build_type_variant (double_type_node, 1, 0));
22146   tree int_ftype_v2df_v2df
22147     = build_function_type_list (integer_type_node,
22148                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22149
22150   tree void_ftype_pcvoid
22151     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
22152   tree v4sf_ftype_v4si
22153     = build_function_type_list (V4SF_type_node, V4SI_type_node, NULL_TREE);
22154   tree v4si_ftype_v4sf
22155     = build_function_type_list (V4SI_type_node, V4SF_type_node, NULL_TREE);
22156   tree v2df_ftype_v4si
22157     = build_function_type_list (V2DF_type_node, V4SI_type_node, NULL_TREE);
22158   tree v4si_ftype_v2df
22159     = build_function_type_list (V4SI_type_node, V2DF_type_node, NULL_TREE);
22160   tree v4si_ftype_v2df_v2df
22161     = build_function_type_list (V4SI_type_node,
22162                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22163   tree v2si_ftype_v2df
22164     = build_function_type_list (V2SI_type_node, V2DF_type_node, NULL_TREE);
22165   tree v4sf_ftype_v2df
22166     = build_function_type_list (V4SF_type_node, V2DF_type_node, NULL_TREE);
22167   tree v2df_ftype_v2si
22168     = build_function_type_list (V2DF_type_node, V2SI_type_node, NULL_TREE);
22169   tree v2df_ftype_v4sf
22170     = build_function_type_list (V2DF_type_node, V4SF_type_node, NULL_TREE);
22171   tree int_ftype_v2df
22172     = build_function_type_list (integer_type_node, V2DF_type_node, NULL_TREE);
22173   tree int64_ftype_v2df
22174     = build_function_type_list (long_long_integer_type_node,
22175                                 V2DF_type_node, NULL_TREE);
22176   tree v2df_ftype_v2df_int
22177     = build_function_type_list (V2DF_type_node,
22178                                 V2DF_type_node, integer_type_node, NULL_TREE);
22179   tree v2df_ftype_v2df_int64
22180     = build_function_type_list (V2DF_type_node,
22181                                 V2DF_type_node, long_long_integer_type_node,
22182                                 NULL_TREE);
22183   tree v4sf_ftype_v4sf_v2df
22184     = build_function_type_list (V4SF_type_node,
22185                                 V4SF_type_node, V2DF_type_node, NULL_TREE);
22186   tree v2df_ftype_v2df_v4sf
22187     = build_function_type_list (V2DF_type_node,
22188                                 V2DF_type_node, V4SF_type_node, NULL_TREE);
22189   tree v2df_ftype_v2df_v2df_int
22190     = build_function_type_list (V2DF_type_node,
22191                                 V2DF_type_node, V2DF_type_node,
22192                                 integer_type_node,
22193                                 NULL_TREE);
22194   tree v2df_ftype_v2df_pcdouble
22195     = build_function_type_list (V2DF_type_node,
22196                                 V2DF_type_node, pcdouble_type_node, NULL_TREE);
22197   tree void_ftype_pdouble_v2df
22198     = build_function_type_list (void_type_node,
22199                                 pdouble_type_node, V2DF_type_node, NULL_TREE);
22200   tree void_ftype_pint_int
22201     = build_function_type_list (void_type_node,
22202                                 pint_type_node, integer_type_node, NULL_TREE);
22203   tree void_ftype_v16qi_v16qi_pchar
22204     = build_function_type_list (void_type_node,
22205                                 V16QI_type_node, V16QI_type_node,
22206                                 pchar_type_node, NULL_TREE);
22207   tree v2df_ftype_pcdouble
22208     = build_function_type_list (V2DF_type_node, pcdouble_type_node, NULL_TREE);
22209   tree v2df_ftype_v2df_v2df
22210     = build_function_type_list (V2DF_type_node,
22211                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22212   tree v16qi_ftype_v16qi_v16qi
22213     = build_function_type_list (V16QI_type_node,
22214                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22215   tree v8hi_ftype_v8hi_v8hi
22216     = build_function_type_list (V8HI_type_node,
22217                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22218   tree v4si_ftype_v4si_v4si
22219     = build_function_type_list (V4SI_type_node,
22220                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22221   tree v2di_ftype_v2di_v2di
22222     = build_function_type_list (V2DI_type_node,
22223                                 V2DI_type_node, V2DI_type_node, NULL_TREE);
22224   tree v2di_ftype_v2df_v2df
22225     = build_function_type_list (V2DI_type_node,
22226                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22227   tree v2df_ftype_v2df
22228     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
22229   tree v2di_ftype_v2di_int
22230     = build_function_type_list (V2DI_type_node,
22231                                 V2DI_type_node, integer_type_node, NULL_TREE);
22232   tree v2di_ftype_v2di_v2di_int
22233     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22234                                 V2DI_type_node, integer_type_node, NULL_TREE);
22235   tree v4si_ftype_v4si_int
22236     = build_function_type_list (V4SI_type_node,
22237                                 V4SI_type_node, integer_type_node, NULL_TREE);
22238   tree v8hi_ftype_v8hi_int
22239     = build_function_type_list (V8HI_type_node,
22240                                 V8HI_type_node, integer_type_node, NULL_TREE);
22241   tree v4si_ftype_v8hi_v8hi
22242     = build_function_type_list (V4SI_type_node,
22243                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22244   tree v1di_ftype_v8qi_v8qi
22245     = build_function_type_list (V1DI_type_node,
22246                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22247   tree v1di_ftype_v2si_v2si
22248     = build_function_type_list (V1DI_type_node,
22249                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22250   tree v2di_ftype_v16qi_v16qi
22251     = build_function_type_list (V2DI_type_node,
22252                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22253   tree v2di_ftype_v4si_v4si
22254     = build_function_type_list (V2DI_type_node,
22255                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22256   tree int_ftype_v16qi
22257     = build_function_type_list (integer_type_node, V16QI_type_node, NULL_TREE);
22258   tree v16qi_ftype_pcchar
22259     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
22260   tree void_ftype_pchar_v16qi
22261     = build_function_type_list (void_type_node,
22262                                 pchar_type_node, V16QI_type_node, NULL_TREE);
22263
22264   tree v2di_ftype_v2di_unsigned_unsigned
22265     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22266                                 unsigned_type_node, unsigned_type_node,
22267                                 NULL_TREE);
22268   tree v2di_ftype_v2di_v2di_unsigned_unsigned
22269     = build_function_type_list (V2DI_type_node, V2DI_type_node, V2DI_type_node,
22270                                 unsigned_type_node, unsigned_type_node,
22271                                 NULL_TREE);
22272   tree v2di_ftype_v2di_v16qi
22273     = build_function_type_list (V2DI_type_node, V2DI_type_node, V16QI_type_node,
22274                                 NULL_TREE);
22275   tree v2df_ftype_v2df_v2df_v2df
22276     = build_function_type_list (V2DF_type_node,
22277                                 V2DF_type_node, V2DF_type_node,
22278                                 V2DF_type_node, NULL_TREE);
22279   tree v4sf_ftype_v4sf_v4sf_v4sf
22280     = build_function_type_list (V4SF_type_node,
22281                                 V4SF_type_node, V4SF_type_node,
22282                                 V4SF_type_node, NULL_TREE);
22283   tree v8hi_ftype_v16qi
22284     = build_function_type_list (V8HI_type_node, V16QI_type_node,
22285                                 NULL_TREE);
22286   tree v4si_ftype_v16qi
22287     = build_function_type_list (V4SI_type_node, V16QI_type_node,
22288                                 NULL_TREE);
22289   tree v2di_ftype_v16qi
22290     = build_function_type_list (V2DI_type_node, V16QI_type_node,
22291                                 NULL_TREE);
22292   tree v4si_ftype_v8hi
22293     = build_function_type_list (V4SI_type_node, V8HI_type_node,
22294                                 NULL_TREE);
22295   tree v2di_ftype_v8hi
22296     = build_function_type_list (V2DI_type_node, V8HI_type_node,
22297                                 NULL_TREE);
22298   tree v2di_ftype_v4si
22299     = build_function_type_list (V2DI_type_node, V4SI_type_node,
22300                                 NULL_TREE);
22301   tree v2di_ftype_pv2di
22302     = build_function_type_list (V2DI_type_node, pv2di_type_node,
22303                                 NULL_TREE);
22304   tree v16qi_ftype_v16qi_v16qi_int
22305     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22306                                 V16QI_type_node, integer_type_node,
22307                                 NULL_TREE);
22308   tree v16qi_ftype_v16qi_v16qi_v16qi
22309     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22310                                 V16QI_type_node, V16QI_type_node,
22311                                 NULL_TREE);
22312   tree v8hi_ftype_v8hi_v8hi_int
22313     = build_function_type_list (V8HI_type_node, V8HI_type_node,
22314                                 V8HI_type_node, integer_type_node,
22315                                 NULL_TREE);
22316   tree v4si_ftype_v4si_v4si_int
22317     = build_function_type_list (V4SI_type_node, V4SI_type_node,
22318                                 V4SI_type_node, integer_type_node,
22319                                 NULL_TREE);
22320   tree int_ftype_v2di_v2di
22321     = build_function_type_list (integer_type_node,
22322                                 V2DI_type_node, V2DI_type_node,
22323                                 NULL_TREE);
22324   tree int_ftype_v16qi_int_v16qi_int_int
22325     = build_function_type_list (integer_type_node,
22326                                 V16QI_type_node,
22327                                 integer_type_node,
22328                                 V16QI_type_node,
22329                                 integer_type_node,
22330                                 integer_type_node,
22331                                 NULL_TREE);
22332   tree v16qi_ftype_v16qi_int_v16qi_int_int
22333     = build_function_type_list (V16QI_type_node,
22334                                 V16QI_type_node,
22335                                 integer_type_node,
22336                                 V16QI_type_node,
22337                                 integer_type_node,
22338                                 integer_type_node,
22339                                 NULL_TREE);
22340   tree int_ftype_v16qi_v16qi_int
22341     = build_function_type_list (integer_type_node,
22342                                 V16QI_type_node,
22343                                 V16QI_type_node,
22344                                 integer_type_node,
22345                                 NULL_TREE);
22346
22347   /* SSE5 instructions */
22348   tree v2di_ftype_v2di_v2di_v2di
22349     = build_function_type_list (V2DI_type_node,
22350                                 V2DI_type_node,
22351                                 V2DI_type_node,
22352                                 V2DI_type_node,
22353                                 NULL_TREE);
22354
22355   tree v4si_ftype_v4si_v4si_v4si
22356     = build_function_type_list (V4SI_type_node,
22357                                 V4SI_type_node,
22358                                 V4SI_type_node,
22359                                 V4SI_type_node,
22360                                 NULL_TREE);
22361
22362   tree v4si_ftype_v4si_v4si_v2di
22363     = build_function_type_list (V4SI_type_node,
22364                                 V4SI_type_node,
22365                                 V4SI_type_node,
22366                                 V2DI_type_node,
22367                                 NULL_TREE);
22368
22369   tree v8hi_ftype_v8hi_v8hi_v8hi
22370     = build_function_type_list (V8HI_type_node,
22371                                 V8HI_type_node,
22372                                 V8HI_type_node,
22373                                 V8HI_type_node,
22374                                 NULL_TREE);
22375
22376   tree v8hi_ftype_v8hi_v8hi_v4si
22377     = build_function_type_list (V8HI_type_node,
22378                                 V8HI_type_node,
22379                                 V8HI_type_node,
22380                                 V4SI_type_node,
22381                                 NULL_TREE);
22382
22383   tree v2df_ftype_v2df_v2df_v16qi
22384     = build_function_type_list (V2DF_type_node,
22385                                 V2DF_type_node,
22386                                 V2DF_type_node,
22387                                 V16QI_type_node,
22388                                 NULL_TREE);
22389
22390   tree v4sf_ftype_v4sf_v4sf_v16qi
22391     = build_function_type_list (V4SF_type_node,
22392                                 V4SF_type_node,
22393                                 V4SF_type_node,
22394                                 V16QI_type_node,
22395                                 NULL_TREE);
22396
22397   tree v2di_ftype_v2di_si
22398     = build_function_type_list (V2DI_type_node,
22399                                 V2DI_type_node,
22400                                 integer_type_node,
22401                                 NULL_TREE);
22402
22403   tree v4si_ftype_v4si_si
22404     = build_function_type_list (V4SI_type_node,
22405                                 V4SI_type_node,
22406                                 integer_type_node,
22407                                 NULL_TREE);
22408
22409   tree v8hi_ftype_v8hi_si
22410     = build_function_type_list (V8HI_type_node,
22411                                 V8HI_type_node,
22412                                 integer_type_node,
22413                                 NULL_TREE);
22414
22415   tree v16qi_ftype_v16qi_si
22416     = build_function_type_list (V16QI_type_node,
22417                                 V16QI_type_node,
22418                                 integer_type_node,
22419                                 NULL_TREE);
22420   tree v4sf_ftype_v4hi
22421     = build_function_type_list (V4SF_type_node,
22422                                 V4HI_type_node,
22423                                 NULL_TREE);
22424
22425   tree v4hi_ftype_v4sf
22426     = build_function_type_list (V4HI_type_node,
22427                                 V4SF_type_node,
22428                                 NULL_TREE);
22429
22430   tree v2di_ftype_v2di
22431     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
22432
22433   tree v16qi_ftype_v8hi_v8hi
22434     = build_function_type_list (V16QI_type_node,
22435                                 V8HI_type_node, V8HI_type_node,
22436                                 NULL_TREE);
22437   tree v8hi_ftype_v4si_v4si
22438     = build_function_type_list (V8HI_type_node,
22439                                 V4SI_type_node, V4SI_type_node,
22440                                 NULL_TREE);
22441   tree v8hi_ftype_v16qi_v16qi 
22442     = build_function_type_list (V8HI_type_node,
22443                                 V16QI_type_node, V16QI_type_node,
22444                                 NULL_TREE);
22445   tree v4hi_ftype_v8qi_v8qi 
22446     = build_function_type_list (V4HI_type_node,
22447                                 V8QI_type_node, V8QI_type_node,
22448                                 NULL_TREE);
22449   tree unsigned_ftype_unsigned_uchar
22450     = build_function_type_list (unsigned_type_node,
22451                                 unsigned_type_node,
22452                                 unsigned_char_type_node,
22453                                 NULL_TREE);
22454   tree unsigned_ftype_unsigned_ushort
22455     = build_function_type_list (unsigned_type_node,
22456                                 unsigned_type_node,
22457                                 short_unsigned_type_node,
22458                                 NULL_TREE);
22459   tree unsigned_ftype_unsigned_unsigned
22460     = build_function_type_list (unsigned_type_node,
22461                                 unsigned_type_node,
22462                                 unsigned_type_node,
22463                                 NULL_TREE);
22464   tree uint64_ftype_uint64_uint64
22465     = build_function_type_list (long_long_unsigned_type_node,
22466                                 long_long_unsigned_type_node,
22467                                 long_long_unsigned_type_node,
22468                                 NULL_TREE);
22469   tree float_ftype_float
22470     = build_function_type_list (float_type_node,
22471                                 float_type_node,
22472                                 NULL_TREE);
22473
22474   /* AVX builtins  */
22475   tree V32QI_type_node = build_vector_type_for_mode (char_type_node,
22476                                                      V32QImode);
22477   tree V8SI_type_node = build_vector_type_for_mode (intSI_type_node,
22478                                                     V8SImode);
22479   tree V8SF_type_node = build_vector_type_for_mode (float_type_node,
22480                                                     V8SFmode);
22481   tree V4DI_type_node = build_vector_type_for_mode (long_long_integer_type_node,
22482                                                     V4DImode);
22483   tree V4DF_type_node = build_vector_type_for_mode (double_type_node,
22484                                                     V4DFmode);
22485   tree v8sf_ftype_v8sf
22486     = build_function_type_list (V8SF_type_node,
22487                                 V8SF_type_node,
22488                                 NULL_TREE);
22489   tree v8si_ftype_v8sf
22490     = build_function_type_list (V8SI_type_node,
22491                                 V8SF_type_node,
22492                                 NULL_TREE);
22493   tree v8sf_ftype_v8si
22494     = build_function_type_list (V8SF_type_node,
22495                                 V8SI_type_node,
22496                                 NULL_TREE);
22497   tree v4si_ftype_v4df
22498     = build_function_type_list (V4SI_type_node,
22499                                 V4DF_type_node,
22500                                 NULL_TREE);
22501   tree v4df_ftype_v4df
22502     = build_function_type_list (V4DF_type_node,
22503                                 V4DF_type_node,
22504                                 NULL_TREE);
22505   tree v4df_ftype_v4si
22506     = build_function_type_list (V4DF_type_node,
22507                                 V4SI_type_node,
22508                                 NULL_TREE);
22509   tree v4df_ftype_v4sf
22510     = build_function_type_list (V4DF_type_node,
22511                                 V4SF_type_node,
22512                                 NULL_TREE);
22513   tree v4sf_ftype_v4df
22514     = build_function_type_list (V4SF_type_node,
22515                                 V4DF_type_node,
22516                                 NULL_TREE);
22517   tree v8sf_ftype_v8sf_v8sf
22518     = build_function_type_list (V8SF_type_node,
22519                                 V8SF_type_node, V8SF_type_node,
22520                                 NULL_TREE);
22521   tree v4df_ftype_v4df_v4df
22522     = build_function_type_list (V4DF_type_node,
22523                                 V4DF_type_node, V4DF_type_node,
22524                                 NULL_TREE);
22525   tree v8sf_ftype_v8sf_int
22526     = build_function_type_list (V8SF_type_node,
22527                                 V8SF_type_node, integer_type_node,
22528                                 NULL_TREE);
22529   tree v4si_ftype_v8si_int
22530     = build_function_type_list (V4SI_type_node,
22531                                 V8SI_type_node, integer_type_node,
22532                                 NULL_TREE);
22533   tree v4df_ftype_v4df_int
22534     = build_function_type_list (V4DF_type_node,
22535                                 V4DF_type_node, integer_type_node,
22536                                 NULL_TREE);
22537   tree v4sf_ftype_v8sf_int
22538     = build_function_type_list (V4SF_type_node,
22539                                 V8SF_type_node, integer_type_node,
22540                                 NULL_TREE);
22541   tree v2df_ftype_v4df_int
22542     = build_function_type_list (V2DF_type_node,
22543                                 V4DF_type_node, integer_type_node,
22544                                 NULL_TREE);
22545   tree v8sf_ftype_v8sf_v8sf_int
22546     = build_function_type_list (V8SF_type_node,
22547                                 V8SF_type_node, V8SF_type_node,
22548                                 integer_type_node,
22549                                 NULL_TREE);
22550   tree v8sf_ftype_v8sf_v8sf_v8sf
22551     = build_function_type_list (V8SF_type_node,
22552                                 V8SF_type_node, V8SF_type_node,
22553                                 V8SF_type_node,
22554                                 NULL_TREE);
22555   tree v4df_ftype_v4df_v4df_v4df
22556     = build_function_type_list (V4DF_type_node,
22557                                 V4DF_type_node, V4DF_type_node,
22558                                 V4DF_type_node,
22559                                 NULL_TREE);
22560   tree v8si_ftype_v8si_v8si_int
22561     = build_function_type_list (V8SI_type_node,
22562                                 V8SI_type_node, V8SI_type_node,
22563                                 integer_type_node,
22564                                 NULL_TREE);
22565   tree v4df_ftype_v4df_v4df_int
22566     = build_function_type_list (V4DF_type_node,
22567                                 V4DF_type_node, V4DF_type_node,
22568                                 integer_type_node,
22569                                 NULL_TREE);
22570   tree v8sf_ftype_pcfloat
22571     = build_function_type_list (V8SF_type_node,
22572                                 pcfloat_type_node,
22573                                 NULL_TREE);
22574   tree v4df_ftype_pcdouble
22575     = build_function_type_list (V4DF_type_node,
22576                                 pcdouble_type_node,
22577                                 NULL_TREE);
22578   tree pcv4sf_type_node
22579     = build_pointer_type (build_type_variant (V4SF_type_node, 1, 0));
22580   tree pcv2df_type_node
22581     = build_pointer_type (build_type_variant (V2DF_type_node, 1, 0));
22582   tree v8sf_ftype_pcv4sf
22583     = build_function_type_list (V8SF_type_node,
22584                                 pcv4sf_type_node,
22585                                 NULL_TREE);
22586   tree v4df_ftype_pcv2df
22587     = build_function_type_list (V4DF_type_node,
22588                                 pcv2df_type_node,
22589                                 NULL_TREE);
22590   tree v32qi_ftype_pcchar
22591     = build_function_type_list (V32QI_type_node,
22592                                 pcchar_type_node,
22593                                 NULL_TREE);
22594   tree void_ftype_pchar_v32qi
22595     = build_function_type_list (void_type_node,
22596                                 pchar_type_node, V32QI_type_node,
22597                                 NULL_TREE);
22598   tree v8si_ftype_v8si_v4si_int
22599     = build_function_type_list (V8SI_type_node,
22600                                 V8SI_type_node, V4SI_type_node,
22601                                 integer_type_node,
22602                                 NULL_TREE);
22603   tree pv4di_type_node = build_pointer_type (V4DI_type_node);
22604   tree void_ftype_pv4di_v4di
22605     = build_function_type_list (void_type_node,
22606                                 pv4di_type_node, V4DI_type_node,
22607                                 NULL_TREE);
22608   tree v8sf_ftype_v8sf_v4sf_int
22609     = build_function_type_list (V8SF_type_node,
22610                                 V8SF_type_node, V4SF_type_node,
22611                                 integer_type_node,
22612                                 NULL_TREE);
22613   tree v4df_ftype_v4df_v2df_int
22614     = build_function_type_list (V4DF_type_node,
22615                                 V4DF_type_node, V2DF_type_node,
22616                                 integer_type_node,
22617                                 NULL_TREE);
22618   tree void_ftype_pfloat_v8sf
22619     = build_function_type_list (void_type_node,
22620                                 pfloat_type_node, V8SF_type_node,
22621                                 NULL_TREE);
22622   tree void_ftype_pdouble_v4df
22623     = build_function_type_list (void_type_node,
22624                                 pdouble_type_node, V4DF_type_node,
22625                                 NULL_TREE);
22626   tree pv8sf_type_node = build_pointer_type (V8SF_type_node);
22627   tree pv4sf_type_node = build_pointer_type (V4SF_type_node);
22628   tree pv4df_type_node = build_pointer_type (V4DF_type_node);
22629   tree pv2df_type_node = build_pointer_type (V2DF_type_node);
22630   tree pcv8sf_type_node
22631     = build_pointer_type (build_type_variant (V8SF_type_node, 1, 0));
22632   tree pcv4df_type_node
22633     = build_pointer_type (build_type_variant (V4DF_type_node, 1, 0));
22634   tree v8sf_ftype_pcv8sf_v8si
22635     = build_function_type_list (V8SF_type_node,
22636                                 pcv8sf_type_node, V8SI_type_node,
22637                                 NULL_TREE);
22638   tree v4df_ftype_pcv4df_v4di
22639     = build_function_type_list (V4DF_type_node,
22640                                 pcv4df_type_node, V4DI_type_node,
22641                                 NULL_TREE);
22642   tree v4sf_ftype_pcv4sf_v4si
22643     = build_function_type_list (V4SF_type_node,
22644                                 pcv4sf_type_node, V4SI_type_node,
22645                                 NULL_TREE);
22646   tree v2df_ftype_pcv2df_v2di
22647     = build_function_type_list (V2DF_type_node,
22648                                 pcv2df_type_node, V2DI_type_node,
22649                                 NULL_TREE);
22650   tree void_ftype_pv8sf_v8si_v8sf
22651     = build_function_type_list (void_type_node,
22652                                 pv8sf_type_node, V8SI_type_node,
22653                                 V8SF_type_node,
22654                                 NULL_TREE);
22655   tree void_ftype_pv4df_v4di_v4df
22656     = build_function_type_list (void_type_node,
22657                                 pv4df_type_node, V4DI_type_node,
22658                                 V4DF_type_node,
22659                                 NULL_TREE);
22660   tree void_ftype_pv4sf_v4si_v4sf
22661     = build_function_type_list (void_type_node,
22662                                 pv4sf_type_node, V4SI_type_node,
22663                                 V4SF_type_node,
22664                                 NULL_TREE);
22665   tree void_ftype_pv2df_v2di_v2df
22666     = build_function_type_list (void_type_node,
22667                                 pv2df_type_node, V2DI_type_node,
22668                                 V2DF_type_node,
22669                                 NULL_TREE);
22670   tree v4df_ftype_v2df
22671     = build_function_type_list (V4DF_type_node,
22672                                 V2DF_type_node,
22673                                 NULL_TREE);
22674   tree v8sf_ftype_v4sf
22675     = build_function_type_list (V8SF_type_node,
22676                                 V4SF_type_node,
22677                                 NULL_TREE);
22678   tree v8si_ftype_v4si
22679     = build_function_type_list (V8SI_type_node,
22680                                 V4SI_type_node,
22681                                 NULL_TREE);
22682   tree v2df_ftype_v4df
22683     = build_function_type_list (V2DF_type_node,
22684                                 V4DF_type_node,
22685                                 NULL_TREE);
22686   tree v4sf_ftype_v8sf
22687     = build_function_type_list (V4SF_type_node,
22688                                 V8SF_type_node,
22689                                 NULL_TREE);
22690   tree v4si_ftype_v8si
22691     = build_function_type_list (V4SI_type_node,
22692                                 V8SI_type_node,
22693                                 NULL_TREE);
22694   tree int_ftype_v4df
22695     = build_function_type_list (integer_type_node,
22696                                 V4DF_type_node,
22697                                 NULL_TREE);
22698   tree int_ftype_v8sf
22699     = build_function_type_list (integer_type_node,
22700                                 V8SF_type_node,
22701                                 NULL_TREE);
22702   tree int_ftype_v8sf_v8sf
22703     = build_function_type_list (integer_type_node,
22704                                 V8SF_type_node, V8SF_type_node,
22705                                 NULL_TREE);
22706   tree int_ftype_v4di_v4di
22707     = build_function_type_list (integer_type_node,
22708                                 V4DI_type_node, V4DI_type_node,
22709                                 NULL_TREE);
22710   tree int_ftype_v4df_v4df
22711     = build_function_type_list (integer_type_node,
22712                                 V4DF_type_node, V4DF_type_node,
22713                                 NULL_TREE);
22714   tree v8sf_ftype_v8sf_v8si
22715     = build_function_type_list (V8SF_type_node,
22716                                 V8SF_type_node, V8SI_type_node,
22717                                 NULL_TREE);
22718   tree v4df_ftype_v4df_v4di
22719     = build_function_type_list (V4DF_type_node,
22720                                 V4DF_type_node, V4DI_type_node,
22721                                 NULL_TREE);
22722   tree v4sf_ftype_v4sf_v4si
22723     = build_function_type_list (V4SF_type_node,
22724                                 V4SF_type_node, V4SI_type_node, NULL_TREE);
22725   tree v2df_ftype_v2df_v2di
22726     = build_function_type_list (V2DF_type_node,
22727                                 V2DF_type_node, V2DI_type_node, NULL_TREE);
22728
22729   tree ftype;
22730
22731   /* Add all special builtins with variable number of operands.  */
22732   for (i = 0, d = bdesc_special_args;
22733        i < ARRAY_SIZE (bdesc_special_args);
22734        i++, d++)
22735     {
22736       tree type;
22737
22738       if (d->name == 0)
22739         continue;
22740
22741       switch ((enum ix86_special_builtin_type) d->flag)
22742         {
22743         case VOID_FTYPE_VOID:
22744           type = void_ftype_void;
22745           break;
22746         case V32QI_FTYPE_PCCHAR:
22747           type = v32qi_ftype_pcchar;
22748           break;
22749         case V16QI_FTYPE_PCCHAR:
22750           type = v16qi_ftype_pcchar;
22751           break;
22752         case V8SF_FTYPE_PCV4SF:
22753           type = v8sf_ftype_pcv4sf;
22754           break;
22755         case V8SF_FTYPE_PCFLOAT:
22756           type = v8sf_ftype_pcfloat;
22757           break;
22758         case V4DF_FTYPE_PCV2DF:
22759           type = v4df_ftype_pcv2df;
22760           break;
22761         case V4DF_FTYPE_PCDOUBLE:
22762           type = v4df_ftype_pcdouble;
22763           break;
22764         case V4SF_FTYPE_PCFLOAT:
22765           type = v4sf_ftype_pcfloat;
22766           break;
22767         case V2DI_FTYPE_PV2DI:
22768           type = v2di_ftype_pv2di;
22769           break;
22770         case V2DF_FTYPE_PCDOUBLE:
22771           type = v2df_ftype_pcdouble;
22772           break;
22773         case V8SF_FTYPE_PCV8SF_V8SI:
22774           type = v8sf_ftype_pcv8sf_v8si;
22775           break;
22776         case V4DF_FTYPE_PCV4DF_V4DI:
22777           type = v4df_ftype_pcv4df_v4di;
22778           break;
22779         case V4SF_FTYPE_V4SF_PCV2SF:
22780           type = v4sf_ftype_v4sf_pcv2sf;
22781           break;
22782         case V4SF_FTYPE_PCV4SF_V4SI:
22783           type = v4sf_ftype_pcv4sf_v4si;
22784           break;
22785         case V2DF_FTYPE_V2DF_PCDOUBLE:
22786           type = v2df_ftype_v2df_pcdouble;
22787           break;
22788         case V2DF_FTYPE_PCV2DF_V2DI:
22789           type = v2df_ftype_pcv2df_v2di;
22790           break;
22791         case VOID_FTYPE_PV2SF_V4SF:
22792           type = void_ftype_pv2sf_v4sf;
22793           break;
22794         case VOID_FTYPE_PV4DI_V4DI:
22795           type = void_ftype_pv4di_v4di;
22796           break;
22797         case VOID_FTYPE_PV2DI_V2DI:
22798           type = void_ftype_pv2di_v2di;
22799           break;
22800         case VOID_FTYPE_PCHAR_V32QI:
22801           type = void_ftype_pchar_v32qi;
22802           break;
22803         case VOID_FTYPE_PCHAR_V16QI:
22804           type = void_ftype_pchar_v16qi;
22805           break;
22806         case VOID_FTYPE_PFLOAT_V8SF:
22807           type = void_ftype_pfloat_v8sf;
22808           break;
22809         case VOID_FTYPE_PFLOAT_V4SF:
22810           type = void_ftype_pfloat_v4sf;
22811           break;
22812         case VOID_FTYPE_PDOUBLE_V4DF:
22813           type = void_ftype_pdouble_v4df;
22814           break;
22815         case VOID_FTYPE_PDOUBLE_V2DF:
22816           type = void_ftype_pdouble_v2df;
22817           break;
22818         case VOID_FTYPE_PDI_DI:
22819           type = void_ftype_pdi_di;
22820           break;
22821         case VOID_FTYPE_PINT_INT:
22822           type = void_ftype_pint_int;
22823           break;
22824         case VOID_FTYPE_PV8SF_V8SI_V8SF:
22825           type = void_ftype_pv8sf_v8si_v8sf;
22826           break;
22827         case VOID_FTYPE_PV4DF_V4DI_V4DF:
22828           type = void_ftype_pv4df_v4di_v4df;
22829           break;
22830         case VOID_FTYPE_PV4SF_V4SI_V4SF:
22831           type = void_ftype_pv4sf_v4si_v4sf;
22832           break;
22833         case VOID_FTYPE_PV2DF_V2DI_V2DF:
22834           type = void_ftype_pv2df_v2di_v2df;
22835           break;
22836         default:
22837           gcc_unreachable ();
22838         }
22839
22840       def_builtin (d->mask, d->name, type, d->code);
22841     }
22842
22843   /* Add all builtins with variable number of operands.  */
22844   for (i = 0, d = bdesc_args;
22845        i < ARRAY_SIZE (bdesc_args);
22846        i++, d++)
22847     {
22848       tree type;
22849
22850       if (d->name == 0)
22851         continue;
22852
22853       switch ((enum ix86_builtin_type) d->flag)
22854         {
22855         case FLOAT_FTYPE_FLOAT:
22856           type = float_ftype_float;
22857           break;
22858         case INT_FTYPE_V8SF_V8SF_PTEST:
22859           type = int_ftype_v8sf_v8sf;
22860           break;
22861         case INT_FTYPE_V4DI_V4DI_PTEST:
22862           type = int_ftype_v4di_v4di;
22863           break;
22864         case INT_FTYPE_V4DF_V4DF_PTEST:
22865           type = int_ftype_v4df_v4df;
22866           break;
22867         case INT_FTYPE_V4SF_V4SF_PTEST:
22868           type = int_ftype_v4sf_v4sf;
22869           break;
22870         case INT_FTYPE_V2DI_V2DI_PTEST:
22871           type = int_ftype_v2di_v2di;
22872           break;
22873         case INT_FTYPE_V2DF_V2DF_PTEST:
22874           type = int_ftype_v2df_v2df;
22875           break;
22876         case INT64_FTYPE_V4SF:
22877           type = int64_ftype_v4sf;
22878           break;
22879         case INT64_FTYPE_V2DF:
22880           type = int64_ftype_v2df;
22881           break;
22882         case INT_FTYPE_V16QI:
22883           type = int_ftype_v16qi;
22884           break;
22885         case INT_FTYPE_V8QI:
22886           type = int_ftype_v8qi;
22887           break;
22888         case INT_FTYPE_V8SF:
22889           type = int_ftype_v8sf;
22890           break;
22891         case INT_FTYPE_V4DF:
22892           type = int_ftype_v4df;
22893           break;
22894         case INT_FTYPE_V4SF:
22895           type = int_ftype_v4sf;
22896           break;
22897         case INT_FTYPE_V2DF:
22898           type = int_ftype_v2df;
22899           break;
22900         case V16QI_FTYPE_V16QI:
22901           type = v16qi_ftype_v16qi;
22902           break;
22903         case V8SI_FTYPE_V8SF:
22904           type = v8si_ftype_v8sf;
22905           break;
22906         case V8SI_FTYPE_V4SI:
22907           type = v8si_ftype_v4si;
22908           break;
22909         case V8HI_FTYPE_V8HI:
22910           type = v8hi_ftype_v8hi;
22911           break;
22912         case V8HI_FTYPE_V16QI:
22913           type = v8hi_ftype_v16qi;
22914           break;
22915         case V8QI_FTYPE_V8QI:
22916           type = v8qi_ftype_v8qi;
22917           break;
22918         case V8SF_FTYPE_V8SF:
22919           type = v8sf_ftype_v8sf;
22920           break;
22921         case V8SF_FTYPE_V8SI:
22922           type = v8sf_ftype_v8si;
22923           break;
22924         case V8SF_FTYPE_V4SF:
22925           type = v8sf_ftype_v4sf;
22926           break;
22927         case V4SI_FTYPE_V4DF:
22928           type = v4si_ftype_v4df;
22929           break;
22930         case V4SI_FTYPE_V4SI:
22931           type = v4si_ftype_v4si;
22932           break;
22933         case V4SI_FTYPE_V16QI:
22934           type = v4si_ftype_v16qi;
22935           break;
22936         case V4SI_FTYPE_V8SI:
22937           type = v4si_ftype_v8si;
22938           break;
22939         case V4SI_FTYPE_V8HI:
22940           type = v4si_ftype_v8hi;
22941           break;
22942         case V4SI_FTYPE_V4SF:
22943           type = v4si_ftype_v4sf;
22944           break;
22945         case V4SI_FTYPE_V2DF:
22946           type = v4si_ftype_v2df;
22947           break;
22948         case V4HI_FTYPE_V4HI:
22949           type = v4hi_ftype_v4hi;
22950           break;
22951         case V4DF_FTYPE_V4DF:
22952           type = v4df_ftype_v4df;
22953           break;
22954         case V4DF_FTYPE_V4SI:
22955           type = v4df_ftype_v4si;
22956           break;
22957         case V4DF_FTYPE_V4SF:
22958           type = v4df_ftype_v4sf;
22959           break;
22960         case V4DF_FTYPE_V2DF:
22961           type = v4df_ftype_v2df;
22962           break;
22963         case V4SF_FTYPE_V4SF:
22964         case V4SF_FTYPE_V4SF_VEC_MERGE:
22965           type = v4sf_ftype_v4sf;
22966           break;
22967         case V4SF_FTYPE_V8SF:
22968           type = v4sf_ftype_v8sf;
22969           break;
22970         case V4SF_FTYPE_V4SI:
22971           type = v4sf_ftype_v4si;
22972           break;
22973         case V4SF_FTYPE_V4DF:
22974           type = v4sf_ftype_v4df;
22975           break;
22976         case V4SF_FTYPE_V2DF:
22977           type = v4sf_ftype_v2df;
22978           break;
22979         case V2DI_FTYPE_V2DI:
22980           type = v2di_ftype_v2di;
22981           break;
22982         case V2DI_FTYPE_V16QI:
22983           type = v2di_ftype_v16qi;
22984           break;
22985         case V2DI_FTYPE_V8HI:
22986           type = v2di_ftype_v8hi;
22987           break;
22988         case V2DI_FTYPE_V4SI:
22989           type = v2di_ftype_v4si;
22990           break;
22991         case V2SI_FTYPE_V2SI:
22992           type = v2si_ftype_v2si;
22993           break;
22994         case V2SI_FTYPE_V4SF:
22995           type = v2si_ftype_v4sf;
22996           break;
22997         case V2SI_FTYPE_V2DF:
22998           type = v2si_ftype_v2df;
22999           break;
23000         case V2SI_FTYPE_V2SF:
23001           type = v2si_ftype_v2sf;
23002           break;
23003         case V2DF_FTYPE_V4DF:
23004           type = v2df_ftype_v4df;
23005           break;
23006         case V2DF_FTYPE_V4SF:
23007           type = v2df_ftype_v4sf;
23008           break;
23009         case V2DF_FTYPE_V2DF:
23010         case V2DF_FTYPE_V2DF_VEC_MERGE:
23011           type = v2df_ftype_v2df;
23012           break;
23013         case V2DF_FTYPE_V2SI:
23014           type = v2df_ftype_v2si;
23015           break;
23016         case V2DF_FTYPE_V4SI:
23017           type = v2df_ftype_v4si;
23018           break;
23019         case V2SF_FTYPE_V2SF:
23020           type = v2sf_ftype_v2sf;
23021           break;
23022         case V2SF_FTYPE_V2SI:
23023           type = v2sf_ftype_v2si;
23024           break;
23025         case V16QI_FTYPE_V16QI_V16QI:
23026           type = v16qi_ftype_v16qi_v16qi;
23027           break;
23028         case V16QI_FTYPE_V8HI_V8HI:
23029           type = v16qi_ftype_v8hi_v8hi;
23030           break;
23031         case V8QI_FTYPE_V8QI_V8QI:
23032           type = v8qi_ftype_v8qi_v8qi;
23033           break;
23034         case V8QI_FTYPE_V4HI_V4HI:
23035           type = v8qi_ftype_v4hi_v4hi;
23036           break;
23037         case V8HI_FTYPE_V8HI_V8HI:
23038         case V8HI_FTYPE_V8HI_V8HI_COUNT:
23039           type = v8hi_ftype_v8hi_v8hi;
23040           break;
23041         case V8HI_FTYPE_V16QI_V16QI:
23042           type = v8hi_ftype_v16qi_v16qi;
23043           break;
23044         case V8HI_FTYPE_V4SI_V4SI:
23045           type = v8hi_ftype_v4si_v4si;
23046           break;
23047         case V8HI_FTYPE_V8HI_SI_COUNT:
23048           type = v8hi_ftype_v8hi_int;
23049           break;
23050         case V8SF_FTYPE_V8SF_V8SF:
23051           type = v8sf_ftype_v8sf_v8sf;
23052           break;
23053         case V8SF_FTYPE_V8SF_V8SI:
23054           type = v8sf_ftype_v8sf_v8si;
23055           break;
23056         case V4SI_FTYPE_V4SI_V4SI:
23057         case V4SI_FTYPE_V4SI_V4SI_COUNT:
23058           type = v4si_ftype_v4si_v4si;
23059           break;
23060         case V4SI_FTYPE_V8HI_V8HI:
23061           type = v4si_ftype_v8hi_v8hi;
23062           break;
23063         case V4SI_FTYPE_V4SF_V4SF:
23064           type = v4si_ftype_v4sf_v4sf;
23065           break;
23066         case V4SI_FTYPE_V2DF_V2DF:
23067           type = v4si_ftype_v2df_v2df;
23068           break;
23069         case V4SI_FTYPE_V4SI_SI_COUNT:
23070           type = v4si_ftype_v4si_int;
23071           break;
23072         case V4HI_FTYPE_V4HI_V4HI:
23073         case V4HI_FTYPE_V4HI_V4HI_COUNT:
23074           type = v4hi_ftype_v4hi_v4hi;
23075           break;
23076         case V4HI_FTYPE_V8QI_V8QI:
23077           type = v4hi_ftype_v8qi_v8qi;
23078           break;
23079         case V4HI_FTYPE_V2SI_V2SI:
23080           type = v4hi_ftype_v2si_v2si;
23081           break;
23082         case V4HI_FTYPE_V4HI_SI_COUNT:
23083           type = v4hi_ftype_v4hi_int;
23084           break;
23085         case V4DF_FTYPE_V4DF_V4DF:
23086           type = v4df_ftype_v4df_v4df;
23087           break;
23088         case V4DF_FTYPE_V4DF_V4DI:
23089           type = v4df_ftype_v4df_v4di;
23090           break;
23091         case V4SF_FTYPE_V4SF_V4SF:
23092         case V4SF_FTYPE_V4SF_V4SF_SWAP:
23093           type = v4sf_ftype_v4sf_v4sf;
23094           break;
23095         case V4SF_FTYPE_V4SF_V4SI:
23096           type = v4sf_ftype_v4sf_v4si;
23097           break;
23098         case V4SF_FTYPE_V4SF_V2SI:
23099           type = v4sf_ftype_v4sf_v2si;
23100           break;
23101         case V4SF_FTYPE_V4SF_V2DF:
23102           type = v4sf_ftype_v4sf_v2df;
23103           break;
23104         case V4SF_FTYPE_V4SF_DI:
23105           type = v4sf_ftype_v4sf_int64;
23106           break;
23107         case V4SF_FTYPE_V4SF_SI:
23108           type = v4sf_ftype_v4sf_int;
23109           break;
23110         case V2DI_FTYPE_V2DI_V2DI:
23111         case V2DI_FTYPE_V2DI_V2DI_COUNT:
23112           type = v2di_ftype_v2di_v2di;
23113           break;
23114         case V2DI_FTYPE_V16QI_V16QI:
23115           type = v2di_ftype_v16qi_v16qi;
23116           break;
23117         case V2DI_FTYPE_V4SI_V4SI:
23118           type = v2di_ftype_v4si_v4si;
23119           break;
23120         case V2DI_FTYPE_V2DI_V16QI:
23121           type = v2di_ftype_v2di_v16qi;
23122           break;
23123         case V2DI_FTYPE_V2DF_V2DF:
23124           type = v2di_ftype_v2df_v2df;
23125           break;
23126         case V2DI_FTYPE_V2DI_SI_COUNT:
23127           type = v2di_ftype_v2di_int;
23128           break;
23129         case V2SI_FTYPE_V2SI_V2SI:
23130         case V2SI_FTYPE_V2SI_V2SI_COUNT:
23131           type = v2si_ftype_v2si_v2si;
23132           break;
23133         case V2SI_FTYPE_V4HI_V4HI:
23134           type = v2si_ftype_v4hi_v4hi;
23135           break;
23136         case V2SI_FTYPE_V2SF_V2SF:
23137           type = v2si_ftype_v2sf_v2sf;
23138           break;
23139         case V2SI_FTYPE_V2SI_SI_COUNT:
23140           type = v2si_ftype_v2si_int;
23141           break;
23142         case V2DF_FTYPE_V2DF_V2DF:
23143         case V2DF_FTYPE_V2DF_V2DF_SWAP:
23144           type = v2df_ftype_v2df_v2df;
23145           break;
23146         case V2DF_FTYPE_V2DF_V4SF:
23147           type = v2df_ftype_v2df_v4sf;
23148           break;
23149         case V2DF_FTYPE_V2DF_V2DI:
23150           type = v2df_ftype_v2df_v2di;
23151           break;
23152         case V2DF_FTYPE_V2DF_DI:
23153           type = v2df_ftype_v2df_int64;
23154           break;
23155         case V2DF_FTYPE_V2DF_SI:
23156           type = v2df_ftype_v2df_int;
23157           break;
23158         case V2SF_FTYPE_V2SF_V2SF:
23159           type = v2sf_ftype_v2sf_v2sf;
23160           break;
23161         case V1DI_FTYPE_V1DI_V1DI:
23162         case V1DI_FTYPE_V1DI_V1DI_COUNT:
23163           type = v1di_ftype_v1di_v1di;
23164           break;
23165         case V1DI_FTYPE_V8QI_V8QI:
23166           type = v1di_ftype_v8qi_v8qi;
23167           break;
23168         case V1DI_FTYPE_V2SI_V2SI:
23169           type = v1di_ftype_v2si_v2si;
23170           break;
23171         case V1DI_FTYPE_V1DI_SI_COUNT:
23172           type = v1di_ftype_v1di_int;
23173           break;
23174         case UINT64_FTYPE_UINT64_UINT64:
23175           type = uint64_ftype_uint64_uint64;
23176           break;
23177         case UINT_FTYPE_UINT_UINT:
23178           type = unsigned_ftype_unsigned_unsigned;
23179           break;
23180         case UINT_FTYPE_UINT_USHORT:
23181           type = unsigned_ftype_unsigned_ushort;
23182           break;
23183         case UINT_FTYPE_UINT_UCHAR:
23184           type = unsigned_ftype_unsigned_uchar;
23185           break;
23186         case V8HI_FTYPE_V8HI_INT:
23187           type = v8hi_ftype_v8hi_int;
23188           break;
23189         case V8SF_FTYPE_V8SF_INT:
23190           type = v8sf_ftype_v8sf_int;
23191           break;
23192         case V4SI_FTYPE_V4SI_INT:
23193           type = v4si_ftype_v4si_int;
23194           break;
23195         case V4SI_FTYPE_V8SI_INT:
23196           type = v4si_ftype_v8si_int;
23197           break;
23198         case V4HI_FTYPE_V4HI_INT:
23199           type = v4hi_ftype_v4hi_int;
23200           break;
23201         case V4DF_FTYPE_V4DF_INT:
23202           type = v4df_ftype_v4df_int;
23203           break;
23204         case V4SF_FTYPE_V4SF_INT:
23205           type = v4sf_ftype_v4sf_int;
23206           break;
23207         case V4SF_FTYPE_V8SF_INT:
23208           type = v4sf_ftype_v8sf_int;
23209           break;
23210         case V2DI_FTYPE_V2DI_INT:
23211         case V2DI2TI_FTYPE_V2DI_INT:
23212           type = v2di_ftype_v2di_int;
23213           break;
23214         case V2DF_FTYPE_V2DF_INT:
23215           type = v2df_ftype_v2df_int;
23216           break;
23217         case V2DF_FTYPE_V4DF_INT:
23218           type = v2df_ftype_v4df_int;
23219           break;
23220         case V16QI_FTYPE_V16QI_V16QI_V16QI:
23221           type = v16qi_ftype_v16qi_v16qi_v16qi;
23222           break;
23223         case V8SF_FTYPE_V8SF_V8SF_V8SF:
23224           type = v8sf_ftype_v8sf_v8sf_v8sf;
23225           break;
23226         case V4DF_FTYPE_V4DF_V4DF_V4DF:
23227           type = v4df_ftype_v4df_v4df_v4df;
23228           break;
23229         case V4SF_FTYPE_V4SF_V4SF_V4SF:
23230           type = v4sf_ftype_v4sf_v4sf_v4sf;
23231           break;
23232         case V2DF_FTYPE_V2DF_V2DF_V2DF:
23233           type = v2df_ftype_v2df_v2df_v2df;
23234           break;
23235         case V16QI_FTYPE_V16QI_V16QI_INT:
23236           type = v16qi_ftype_v16qi_v16qi_int;
23237           break;
23238         case V8SI_FTYPE_V8SI_V8SI_INT:
23239           type = v8si_ftype_v8si_v8si_int;
23240           break;
23241         case V8SI_FTYPE_V8SI_V4SI_INT:
23242           type = v8si_ftype_v8si_v4si_int;
23243           break;
23244         case V8HI_FTYPE_V8HI_V8HI_INT:
23245           type = v8hi_ftype_v8hi_v8hi_int;
23246           break;
23247         case V8SF_FTYPE_V8SF_V8SF_INT:
23248           type = v8sf_ftype_v8sf_v8sf_int;
23249           break;
23250         case V8SF_FTYPE_V8SF_V4SF_INT:
23251           type = v8sf_ftype_v8sf_v4sf_int;
23252           break;
23253         case V4SI_FTYPE_V4SI_V4SI_INT:
23254           type = v4si_ftype_v4si_v4si_int;
23255           break;
23256         case V4DF_FTYPE_V4DF_V4DF_INT:
23257           type = v4df_ftype_v4df_v4df_int;
23258           break;
23259         case V4DF_FTYPE_V4DF_V2DF_INT:
23260           type = v4df_ftype_v4df_v2df_int;
23261           break;
23262         case V4SF_FTYPE_V4SF_V4SF_INT:
23263           type = v4sf_ftype_v4sf_v4sf_int;
23264           break;
23265         case V2DI_FTYPE_V2DI_V2DI_INT:
23266         case V2DI2TI_FTYPE_V2DI_V2DI_INT:
23267           type = v2di_ftype_v2di_v2di_int;
23268           break;
23269         case V2DF_FTYPE_V2DF_V2DF_INT:
23270           type = v2df_ftype_v2df_v2df_int;
23271           break;
23272         case V2DI_FTYPE_V2DI_UINT_UINT:
23273           type = v2di_ftype_v2di_unsigned_unsigned;
23274           break;
23275         case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
23276           type = v2di_ftype_v2di_v2di_unsigned_unsigned;
23277           break;
23278         case V1DI2DI_FTYPE_V1DI_V1DI_INT:
23279           type = v1di_ftype_v1di_v1di_int;
23280           break;
23281         default:
23282           gcc_unreachable ();
23283         }
23284
23285       def_builtin_const (d->mask, d->name, type, d->code);
23286     }
23287
23288   /* pcmpestr[im] insns.  */
23289   for (i = 0, d = bdesc_pcmpestr;
23290        i < ARRAY_SIZE (bdesc_pcmpestr);
23291        i++, d++)
23292     {
23293       if (d->code == IX86_BUILTIN_PCMPESTRM128)
23294         ftype = v16qi_ftype_v16qi_int_v16qi_int_int;
23295       else
23296         ftype = int_ftype_v16qi_int_v16qi_int_int;
23297       def_builtin_const (d->mask, d->name, ftype, d->code);
23298     }
23299
23300   /* pcmpistr[im] insns.  */
23301   for (i = 0, d = bdesc_pcmpistr;
23302        i < ARRAY_SIZE (bdesc_pcmpistr);
23303        i++, d++)
23304     {
23305       if (d->code == IX86_BUILTIN_PCMPISTRM128)
23306         ftype = v16qi_ftype_v16qi_v16qi_int;
23307       else
23308         ftype = int_ftype_v16qi_v16qi_int;
23309       def_builtin_const (d->mask, d->name, ftype, d->code);
23310     }
23311
23312   /* comi/ucomi insns.  */
23313   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
23314     if (d->mask == OPTION_MASK_ISA_SSE2)
23315       def_builtin_const (d->mask, d->name, int_ftype_v2df_v2df, d->code);
23316     else
23317       def_builtin_const (d->mask, d->name, int_ftype_v4sf_v4sf, d->code);
23318
23319   /* SSE */
23320   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr", void_ftype_unsigned, IX86_BUILTIN_LDMXCSR);
23321   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr", unsigned_ftype_void, IX86_BUILTIN_STMXCSR);
23322
23323   /* SSE or 3DNow!A */
23324   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_maskmovq", void_ftype_v8qi_v8qi_pchar, IX86_BUILTIN_MASKMOVQ);
23325
23326   /* SSE2 */
23327   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu", void_ftype_v16qi_v16qi_pchar, IX86_BUILTIN_MASKMOVDQU);
23328
23329   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush", void_ftype_pcvoid, IX86_BUILTIN_CLFLUSH);
23330   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence", void_ftype_void, IX86_BUILTIN_MFENCE);
23331
23332   /* SSE3.  */
23333   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor", void_ftype_pcvoid_unsigned_unsigned, IX86_BUILTIN_MONITOR);
23334   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait", void_ftype_unsigned_unsigned, IX86_BUILTIN_MWAIT);
23335
23336   /* AES */
23337   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENC128);
23338   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENCLAST128);
23339   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDEC128);
23340   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDECLAST128);
23341   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128", v2di_ftype_v2di, IX86_BUILTIN_AESIMC128);
23342   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128", v2di_ftype_v2di_int, IX86_BUILTIN_AESKEYGENASSIST128);
23343
23344   /* PCLMUL */
23345   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128", v2di_ftype_v2di_v2di_int, IX86_BUILTIN_PCLMULQDQ128);
23346
23347   /* AVX */
23348   def_builtin (OPTION_MASK_ISA_AVX, "__builtin_ia32_vzeroupper", void_ftype_void,
23349                TARGET_64BIT ? IX86_BUILTIN_VZEROUPPER_REX64 : IX86_BUILTIN_VZEROUPPER);
23350
23351   /* Access to the vec_init patterns.  */
23352   ftype = build_function_type_list (V2SI_type_node, integer_type_node,
23353                                     integer_type_node, NULL_TREE);
23354   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si", ftype, IX86_BUILTIN_VEC_INIT_V2SI);
23355
23356   ftype = build_function_type_list (V4HI_type_node, short_integer_type_node,
23357                                     short_integer_type_node,
23358                                     short_integer_type_node,
23359                                     short_integer_type_node, NULL_TREE);
23360   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi", ftype, IX86_BUILTIN_VEC_INIT_V4HI);
23361
23362   ftype = build_function_type_list (V8QI_type_node, char_type_node,
23363                                     char_type_node, char_type_node,
23364                                     char_type_node, char_type_node,
23365                                     char_type_node, char_type_node,
23366                                     char_type_node, NULL_TREE);
23367   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi", ftype, IX86_BUILTIN_VEC_INIT_V8QI);
23368
23369   /* Access to the vec_extract patterns.  */
23370   ftype = build_function_type_list (double_type_node, V2DF_type_node,
23371                                     integer_type_node, NULL_TREE);
23372   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df", ftype, IX86_BUILTIN_VEC_EXT_V2DF);
23373
23374   ftype = build_function_type_list (long_long_integer_type_node,
23375                                     V2DI_type_node, integer_type_node,
23376                                     NULL_TREE);
23377   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di", ftype, IX86_BUILTIN_VEC_EXT_V2DI);
23378
23379   ftype = build_function_type_list (float_type_node, V4SF_type_node,
23380                                     integer_type_node, NULL_TREE);
23381   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf", ftype, IX86_BUILTIN_VEC_EXT_V4SF);
23382
23383   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
23384                                     integer_type_node, NULL_TREE);
23385   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si", ftype, IX86_BUILTIN_VEC_EXT_V4SI);
23386
23387   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
23388                                     integer_type_node, NULL_TREE);
23389   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi", ftype, IX86_BUILTIN_VEC_EXT_V8HI);
23390
23391   ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
23392                                     integer_type_node, NULL_TREE);
23393   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_ext_v4hi", ftype, IX86_BUILTIN_VEC_EXT_V4HI);
23394
23395   ftype = build_function_type_list (intSI_type_node, V2SI_type_node,
23396                                     integer_type_node, NULL_TREE);
23397   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si", ftype, IX86_BUILTIN_VEC_EXT_V2SI);
23398
23399   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
23400                                     integer_type_node, NULL_TREE);
23401   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi", ftype, IX86_BUILTIN_VEC_EXT_V16QI);
23402
23403   /* Access to the vec_set patterns.  */
23404   ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
23405                                     intDI_type_node,
23406                                     integer_type_node, NULL_TREE);
23407   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT, "__builtin_ia32_vec_set_v2di", ftype, IX86_BUILTIN_VEC_SET_V2DI);
23408
23409   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
23410                                     float_type_node,
23411                                     integer_type_node, NULL_TREE);
23412   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf", ftype, IX86_BUILTIN_VEC_SET_V4SF);
23413
23414   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
23415                                     intSI_type_node,
23416                                     integer_type_node, NULL_TREE);
23417   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si", ftype, IX86_BUILTIN_VEC_SET_V4SI);
23418
23419   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
23420                                     intHI_type_node,
23421                                     integer_type_node, NULL_TREE);
23422   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi", ftype, IX86_BUILTIN_VEC_SET_V8HI);
23423
23424   ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
23425                                     intHI_type_node,
23426                                     integer_type_node, NULL_TREE);
23427   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_set_v4hi", ftype, IX86_BUILTIN_VEC_SET_V4HI);
23428
23429   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
23430                                     intQI_type_node,
23431                                     integer_type_node, NULL_TREE);
23432   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi", ftype, IX86_BUILTIN_VEC_SET_V16QI);
23433
23434   /* Add SSE5 multi-arg argument instructions */
23435   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
23436     {
23437       tree mtype = NULL_TREE;
23438
23439       if (d->name == 0)
23440         continue;
23441
23442       switch ((enum multi_arg_type)d->flag)
23443         {
23444         case MULTI_ARG_3_SF:     mtype = v4sf_ftype_v4sf_v4sf_v4sf;     break;
23445         case MULTI_ARG_3_DF:     mtype = v2df_ftype_v2df_v2df_v2df;     break;
23446         case MULTI_ARG_3_DI:     mtype = v2di_ftype_v2di_v2di_v2di;     break;
23447         case MULTI_ARG_3_SI:     mtype = v4si_ftype_v4si_v4si_v4si;     break;
23448         case MULTI_ARG_3_SI_DI:  mtype = v4si_ftype_v4si_v4si_v2di;     break;
23449         case MULTI_ARG_3_HI:     mtype = v8hi_ftype_v8hi_v8hi_v8hi;     break;
23450         case MULTI_ARG_3_HI_SI:  mtype = v8hi_ftype_v8hi_v8hi_v4si;     break;
23451         case MULTI_ARG_3_QI:     mtype = v16qi_ftype_v16qi_v16qi_v16qi; break;
23452         case MULTI_ARG_3_PERMPS: mtype = v4sf_ftype_v4sf_v4sf_v16qi;    break;
23453         case MULTI_ARG_3_PERMPD: mtype = v2df_ftype_v2df_v2df_v16qi;    break;
23454         case MULTI_ARG_2_SF:     mtype = v4sf_ftype_v4sf_v4sf;          break;
23455         case MULTI_ARG_2_DF:     mtype = v2df_ftype_v2df_v2df;          break;
23456         case MULTI_ARG_2_DI:     mtype = v2di_ftype_v2di_v2di;          break;
23457         case MULTI_ARG_2_SI:     mtype = v4si_ftype_v4si_v4si;          break;
23458         case MULTI_ARG_2_HI:     mtype = v8hi_ftype_v8hi_v8hi;          break;
23459         case MULTI_ARG_2_QI:     mtype = v16qi_ftype_v16qi_v16qi;       break;
23460         case MULTI_ARG_2_DI_IMM: mtype = v2di_ftype_v2di_si;            break;
23461         case MULTI_ARG_2_SI_IMM: mtype = v4si_ftype_v4si_si;            break;
23462         case MULTI_ARG_2_HI_IMM: mtype = v8hi_ftype_v8hi_si;            break;
23463         case MULTI_ARG_2_QI_IMM: mtype = v16qi_ftype_v16qi_si;          break;
23464         case MULTI_ARG_2_SF_CMP: mtype = v4sf_ftype_v4sf_v4sf;          break;
23465         case MULTI_ARG_2_DF_CMP: mtype = v2df_ftype_v2df_v2df;          break;
23466         case MULTI_ARG_2_DI_CMP: mtype = v2di_ftype_v2di_v2di;          break;
23467         case MULTI_ARG_2_SI_CMP: mtype = v4si_ftype_v4si_v4si;          break;
23468         case MULTI_ARG_2_HI_CMP: mtype = v8hi_ftype_v8hi_v8hi;          break;
23469         case MULTI_ARG_2_QI_CMP: mtype = v16qi_ftype_v16qi_v16qi;       break;
23470         case MULTI_ARG_2_SF_TF:  mtype = v4sf_ftype_v4sf_v4sf;          break;
23471         case MULTI_ARG_2_DF_TF:  mtype = v2df_ftype_v2df_v2df;          break;
23472         case MULTI_ARG_2_DI_TF:  mtype = v2di_ftype_v2di_v2di;          break;
23473         case MULTI_ARG_2_SI_TF:  mtype = v4si_ftype_v4si_v4si;          break;
23474         case MULTI_ARG_2_HI_TF:  mtype = v8hi_ftype_v8hi_v8hi;          break;
23475         case MULTI_ARG_2_QI_TF:  mtype = v16qi_ftype_v16qi_v16qi;       break;
23476         case MULTI_ARG_1_SF:     mtype = v4sf_ftype_v4sf;               break;
23477         case MULTI_ARG_1_DF:     mtype = v2df_ftype_v2df;               break;
23478         case MULTI_ARG_1_DI:     mtype = v2di_ftype_v2di;               break;
23479         case MULTI_ARG_1_SI:     mtype = v4si_ftype_v4si;               break;
23480         case MULTI_ARG_1_HI:     mtype = v8hi_ftype_v8hi;               break;
23481         case MULTI_ARG_1_QI:     mtype = v16qi_ftype_v16qi;             break;
23482         case MULTI_ARG_1_SI_DI:  mtype = v2di_ftype_v4si;               break;
23483         case MULTI_ARG_1_HI_DI:  mtype = v2di_ftype_v8hi;               break;
23484         case MULTI_ARG_1_HI_SI:  mtype = v4si_ftype_v8hi;               break;
23485         case MULTI_ARG_1_QI_DI:  mtype = v2di_ftype_v16qi;              break;
23486         case MULTI_ARG_1_QI_SI:  mtype = v4si_ftype_v16qi;              break;
23487         case MULTI_ARG_1_QI_HI:  mtype = v8hi_ftype_v16qi;              break;
23488         case MULTI_ARG_1_PH2PS:  mtype = v4sf_ftype_v4hi;               break;
23489         case MULTI_ARG_1_PS2PH:  mtype = v4hi_ftype_v4sf;               break;
23490         case MULTI_ARG_UNKNOWN:
23491         default:
23492           gcc_unreachable ();
23493         }
23494
23495       if (mtype)
23496         def_builtin_const (d->mask, d->name, mtype, d->code);
23497     }
23498 }
23499
23500 /* Internal method for ix86_init_builtins.  */
23501
23502 static void
23503 ix86_init_builtins_va_builtins_abi (void)
23504 {
23505   tree ms_va_ref, sysv_va_ref;
23506   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
23507   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
23508   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
23509   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
23510
23511   if (!TARGET_64BIT)
23512     return;
23513   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
23514   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
23515   ms_va_ref = build_reference_type (ms_va_list_type_node);
23516   sysv_va_ref =
23517     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
23518
23519   fnvoid_va_end_ms =
23520     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23521   fnvoid_va_start_ms =
23522     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23523   fnvoid_va_end_sysv =
23524     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
23525   fnvoid_va_start_sysv =
23526     build_varargs_function_type_list (void_type_node, sysv_va_ref,
23527                                        NULL_TREE);
23528   fnvoid_va_copy_ms =
23529     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
23530                               NULL_TREE);
23531   fnvoid_va_copy_sysv =
23532     build_function_type_list (void_type_node, sysv_va_ref,
23533                               sysv_va_ref, NULL_TREE);
23534
23535   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
23536                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
23537   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
23538                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
23539   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
23540                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
23541   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
23542                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23543   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
23544                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23545   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
23546                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23547 }
23548
23549 static void
23550 ix86_init_builtins (void)
23551 {
23552   tree float128_type_node = make_node (REAL_TYPE);
23553   tree ftype, decl;
23554
23555   /* The __float80 type.  */
23556   if (TYPE_MODE (long_double_type_node) == XFmode)
23557     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
23558                                                "__float80");
23559   else
23560     {
23561       /* The __float80 type.  */
23562       tree float80_type_node = make_node (REAL_TYPE);
23563
23564       TYPE_PRECISION (float80_type_node) = 80;
23565       layout_type (float80_type_node);
23566       (*lang_hooks.types.register_builtin_type) (float80_type_node,
23567                                                  "__float80");
23568     }
23569
23570   /* The __float128 type.  */
23571   TYPE_PRECISION (float128_type_node) = 128;
23572   layout_type (float128_type_node);
23573   (*lang_hooks.types.register_builtin_type) (float128_type_node,
23574                                              "__float128");
23575
23576   /* TFmode support builtins.  */
23577   ftype = build_function_type (float128_type_node, void_list_node);
23578   decl = add_builtin_function ("__builtin_infq", ftype,
23579                                IX86_BUILTIN_INFQ, BUILT_IN_MD,
23580                                NULL, NULL_TREE);
23581   ix86_builtins[(int) IX86_BUILTIN_INFQ] = decl;
23582
23583   /* We will expand them to normal call if SSE2 isn't available since
23584      they are used by libgcc. */
23585   ftype = build_function_type_list (float128_type_node,
23586                                     float128_type_node,
23587                                     NULL_TREE);
23588   decl = add_builtin_function ("__builtin_fabsq", ftype,
23589                                IX86_BUILTIN_FABSQ, BUILT_IN_MD,
23590                                "__fabstf2", NULL_TREE);
23591   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = decl;
23592   TREE_READONLY (decl) = 1;
23593
23594   ftype = build_function_type_list (float128_type_node,
23595                                     float128_type_node,
23596                                     float128_type_node,
23597                                     NULL_TREE);
23598   decl = add_builtin_function ("__builtin_copysignq", ftype,
23599                                IX86_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
23600                                "__copysigntf3", NULL_TREE);
23601   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = decl;
23602   TREE_READONLY (decl) = 1;
23603
23604   ix86_init_mmx_sse_builtins ();
23605   if (TARGET_64BIT)
23606     ix86_init_builtins_va_builtins_abi ();
23607 }
23608
23609 /* Errors in the source file can cause expand_expr to return const0_rtx
23610    where we expect a vector.  To avoid crashing, use one of the vector
23611    clear instructions.  */
23612 static rtx
23613 safe_vector_operand (rtx x, enum machine_mode mode)
23614 {
23615   if (x == const0_rtx)
23616     x = CONST0_RTX (mode);
23617   return x;
23618 }
23619
23620 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
23621
23622 static rtx
23623 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
23624 {
23625   rtx pat;
23626   tree arg0 = CALL_EXPR_ARG (exp, 0);
23627   tree arg1 = CALL_EXPR_ARG (exp, 1);
23628   rtx op0 = expand_normal (arg0);
23629   rtx op1 = expand_normal (arg1);
23630   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23631   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
23632   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
23633
23634   if (VECTOR_MODE_P (mode0))
23635     op0 = safe_vector_operand (op0, mode0);
23636   if (VECTOR_MODE_P (mode1))
23637     op1 = safe_vector_operand (op1, mode1);
23638
23639   if (optimize || !target
23640       || GET_MODE (target) != tmode
23641       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23642     target = gen_reg_rtx (tmode);
23643
23644   if (GET_MODE (op1) == SImode && mode1 == TImode)
23645     {
23646       rtx x = gen_reg_rtx (V4SImode);
23647       emit_insn (gen_sse2_loadd (x, op1));
23648       op1 = gen_lowpart (TImode, x);
23649     }
23650
23651   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
23652     op0 = copy_to_mode_reg (mode0, op0);
23653   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
23654     op1 = copy_to_mode_reg (mode1, op1);
23655
23656   pat = GEN_FCN (icode) (target, op0, op1);
23657   if (! pat)
23658     return 0;
23659
23660   emit_insn (pat);
23661
23662   return target;
23663 }
23664
23665 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
23666
23667 static rtx
23668 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
23669                                enum multi_arg_type m_type,
23670                                enum insn_code sub_code)
23671 {
23672   rtx pat;
23673   int i;
23674   int nargs;
23675   bool comparison_p = false;
23676   bool tf_p = false;
23677   bool last_arg_constant = false;
23678   int num_memory = 0;
23679   struct {
23680     rtx op;
23681     enum machine_mode mode;
23682   } args[4];
23683
23684   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23685
23686   switch (m_type)
23687     {
23688     case MULTI_ARG_3_SF:
23689     case MULTI_ARG_3_DF:
23690     case MULTI_ARG_3_DI:
23691     case MULTI_ARG_3_SI:
23692     case MULTI_ARG_3_SI_DI:
23693     case MULTI_ARG_3_HI:
23694     case MULTI_ARG_3_HI_SI:
23695     case MULTI_ARG_3_QI:
23696     case MULTI_ARG_3_PERMPS:
23697     case MULTI_ARG_3_PERMPD:
23698       nargs = 3;
23699       break;
23700
23701     case MULTI_ARG_2_SF:
23702     case MULTI_ARG_2_DF:
23703     case MULTI_ARG_2_DI:
23704     case MULTI_ARG_2_SI:
23705     case MULTI_ARG_2_HI:
23706     case MULTI_ARG_2_QI:
23707       nargs = 2;
23708       break;
23709
23710     case MULTI_ARG_2_DI_IMM:
23711     case MULTI_ARG_2_SI_IMM:
23712     case MULTI_ARG_2_HI_IMM:
23713     case MULTI_ARG_2_QI_IMM:
23714       nargs = 2;
23715       last_arg_constant = true;
23716       break;
23717
23718     case MULTI_ARG_1_SF:
23719     case MULTI_ARG_1_DF:
23720     case MULTI_ARG_1_DI:
23721     case MULTI_ARG_1_SI:
23722     case MULTI_ARG_1_HI:
23723     case MULTI_ARG_1_QI:
23724     case MULTI_ARG_1_SI_DI:
23725     case MULTI_ARG_1_HI_DI:
23726     case MULTI_ARG_1_HI_SI:
23727     case MULTI_ARG_1_QI_DI:
23728     case MULTI_ARG_1_QI_SI:
23729     case MULTI_ARG_1_QI_HI:
23730     case MULTI_ARG_1_PH2PS:
23731     case MULTI_ARG_1_PS2PH:
23732       nargs = 1;
23733       break;
23734
23735     case MULTI_ARG_2_SF_CMP:
23736     case MULTI_ARG_2_DF_CMP:
23737     case MULTI_ARG_2_DI_CMP:
23738     case MULTI_ARG_2_SI_CMP:
23739     case MULTI_ARG_2_HI_CMP:
23740     case MULTI_ARG_2_QI_CMP:
23741       nargs = 2;
23742       comparison_p = true;
23743       break;
23744
23745     case MULTI_ARG_2_SF_TF:
23746     case MULTI_ARG_2_DF_TF:
23747     case MULTI_ARG_2_DI_TF:
23748     case MULTI_ARG_2_SI_TF:
23749     case MULTI_ARG_2_HI_TF:
23750     case MULTI_ARG_2_QI_TF:
23751       nargs = 2;
23752       tf_p = true;
23753       break;
23754
23755     case MULTI_ARG_UNKNOWN:
23756     default:
23757       gcc_unreachable ();
23758     }
23759
23760   if (optimize || !target
23761       || GET_MODE (target) != tmode
23762       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23763     target = gen_reg_rtx (tmode);
23764
23765   gcc_assert (nargs <= 4);
23766
23767   for (i = 0; i < nargs; i++)
23768     {
23769       tree arg = CALL_EXPR_ARG (exp, i);
23770       rtx op = expand_normal (arg);
23771       int adjust = (comparison_p) ? 1 : 0;
23772       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
23773
23774       if (last_arg_constant && i == nargs-1)
23775         {
23776           if (GET_CODE (op) != CONST_INT)
23777             {
23778               error ("last argument must be an immediate");
23779               return gen_reg_rtx (tmode);
23780             }
23781         }
23782       else
23783         {
23784           if (VECTOR_MODE_P (mode))
23785             op = safe_vector_operand (op, mode);
23786
23787           /* If we aren't optimizing, only allow one memory operand to be
23788              generated.  */
23789           if (memory_operand (op, mode))
23790             num_memory++;
23791
23792           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
23793
23794           if (optimize
23795               || ! (*insn_data[icode].operand[i+adjust+1].predicate) (op, mode)
23796               || num_memory > 1)
23797             op = force_reg (mode, op);
23798         }
23799
23800       args[i].op = op;
23801       args[i].mode = mode;
23802     }
23803
23804   switch (nargs)
23805     {
23806     case 1:
23807       pat = GEN_FCN (icode) (target, args[0].op);
23808       break;
23809
23810     case 2:
23811       if (tf_p)
23812         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
23813                                GEN_INT ((int)sub_code));
23814       else if (! comparison_p)
23815         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
23816       else
23817         {
23818           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
23819                                        args[0].op,
23820                                        args[1].op);
23821
23822           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
23823         }
23824       break;
23825
23826     case 3:
23827       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
23828       break;
23829
23830     default:
23831       gcc_unreachable ();
23832     }
23833
23834   if (! pat)
23835     return 0;
23836
23837   emit_insn (pat);
23838   return target;
23839 }
23840
23841 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
23842    insns with vec_merge.  */
23843
23844 static rtx
23845 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
23846                                     rtx target)
23847 {
23848   rtx pat;
23849   tree arg0 = CALL_EXPR_ARG (exp, 0);
23850   rtx op1, op0 = expand_normal (arg0);
23851   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23852   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
23853
23854   if (optimize || !target
23855       || GET_MODE (target) != tmode
23856       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23857     target = gen_reg_rtx (tmode);
23858
23859   if (VECTOR_MODE_P (mode0))
23860     op0 = safe_vector_operand (op0, mode0);
23861
23862   if ((optimize && !register_operand (op0, mode0))
23863       || ! (*insn_data[icode].operand[1].predicate) (op0, mode0))
23864     op0 = copy_to_mode_reg (mode0, op0);
23865
23866   op1 = op0;
23867   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
23868     op1 = copy_to_mode_reg (mode0, op1);
23869
23870   pat = GEN_FCN (icode) (target, op0, op1);
23871   if (! pat)
23872     return 0;
23873   emit_insn (pat);
23874   return target;
23875 }
23876
23877 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
23878
23879 static rtx
23880 ix86_expand_sse_compare (const struct builtin_description *d,
23881                          tree exp, rtx target, bool swap)
23882 {
23883   rtx pat;
23884   tree arg0 = CALL_EXPR_ARG (exp, 0);
23885   tree arg1 = CALL_EXPR_ARG (exp, 1);
23886   rtx op0 = expand_normal (arg0);
23887   rtx op1 = expand_normal (arg1);
23888   rtx op2;
23889   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
23890   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
23891   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
23892   enum rtx_code comparison = d->comparison;
23893
23894   if (VECTOR_MODE_P (mode0))
23895     op0 = safe_vector_operand (op0, mode0);
23896   if (VECTOR_MODE_P (mode1))
23897     op1 = safe_vector_operand (op1, mode1);
23898
23899   /* Swap operands if we have a comparison that isn't available in
23900      hardware.  */
23901   if (swap)
23902     {
23903       rtx tmp = gen_reg_rtx (mode1);
23904       emit_move_insn (tmp, op1);
23905       op1 = op0;
23906       op0 = tmp;
23907     }
23908
23909   if (optimize || !target
23910       || GET_MODE (target) != tmode
23911       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
23912     target = gen_reg_rtx (tmode);
23913
23914   if ((optimize && !register_operand (op0, mode0))
23915       || ! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
23916     op0 = copy_to_mode_reg (mode0, op0);
23917   if ((optimize && !register_operand (op1, mode1))
23918       || ! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
23919     op1 = copy_to_mode_reg (mode1, op1);
23920
23921   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
23922   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
23923   if (! pat)
23924     return 0;
23925   emit_insn (pat);
23926   return target;
23927 }
23928
23929 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
23930
23931 static rtx
23932 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
23933                       rtx target)
23934 {
23935   rtx pat;
23936   tree arg0 = CALL_EXPR_ARG (exp, 0);
23937   tree arg1 = CALL_EXPR_ARG (exp, 1);
23938   rtx op0 = expand_normal (arg0);
23939   rtx op1 = expand_normal (arg1);
23940   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23941   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23942   enum rtx_code comparison = d->comparison;
23943
23944   if (VECTOR_MODE_P (mode0))
23945     op0 = safe_vector_operand (op0, mode0);
23946   if (VECTOR_MODE_P (mode1))
23947     op1 = safe_vector_operand (op1, mode1);
23948
23949   /* Swap operands if we have a comparison that isn't available in
23950      hardware.  */
23951   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
23952     {
23953       rtx tmp = op1;
23954       op1 = op0;
23955       op0 = tmp;
23956     }
23957
23958   target = gen_reg_rtx (SImode);
23959   emit_move_insn (target, const0_rtx);
23960   target = gen_rtx_SUBREG (QImode, target, 0);
23961
23962   if ((optimize && !register_operand (op0, mode0))
23963       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
23964     op0 = copy_to_mode_reg (mode0, op0);
23965   if ((optimize && !register_operand (op1, mode1))
23966       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
23967     op1 = copy_to_mode_reg (mode1, op1);
23968
23969   pat = GEN_FCN (d->icode) (op0, op1);
23970   if (! pat)
23971     return 0;
23972   emit_insn (pat);
23973   emit_insn (gen_rtx_SET (VOIDmode,
23974                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23975                           gen_rtx_fmt_ee (comparison, QImode,
23976                                           SET_DEST (pat),
23977                                           const0_rtx)));
23978
23979   return SUBREG_REG (target);
23980 }
23981
23982 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
23983
23984 static rtx
23985 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
23986                        rtx target)
23987 {
23988   rtx pat;
23989   tree arg0 = CALL_EXPR_ARG (exp, 0);
23990   tree arg1 = CALL_EXPR_ARG (exp, 1);
23991   rtx op0 = expand_normal (arg0);
23992   rtx op1 = expand_normal (arg1);
23993   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23994   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23995   enum rtx_code comparison = d->comparison;
23996
23997   if (VECTOR_MODE_P (mode0))
23998     op0 = safe_vector_operand (op0, mode0);
23999   if (VECTOR_MODE_P (mode1))
24000     op1 = safe_vector_operand (op1, mode1);
24001
24002   target = gen_reg_rtx (SImode);
24003   emit_move_insn (target, const0_rtx);
24004   target = gen_rtx_SUBREG (QImode, target, 0);
24005
24006   if ((optimize && !register_operand (op0, mode0))
24007       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
24008     op0 = copy_to_mode_reg (mode0, op0);
24009   if ((optimize && !register_operand (op1, mode1))
24010       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
24011     op1 = copy_to_mode_reg (mode1, op1);
24012
24013   pat = GEN_FCN (d->icode) (op0, op1);
24014   if (! pat)
24015     return 0;
24016   emit_insn (pat);
24017   emit_insn (gen_rtx_SET (VOIDmode,
24018                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24019                           gen_rtx_fmt_ee (comparison, QImode,
24020                                           SET_DEST (pat),
24021                                           const0_rtx)));
24022
24023   return SUBREG_REG (target);
24024 }
24025
24026 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
24027
24028 static rtx
24029 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
24030                           tree exp, rtx target)
24031 {
24032   rtx pat;
24033   tree arg0 = CALL_EXPR_ARG (exp, 0);
24034   tree arg1 = CALL_EXPR_ARG (exp, 1);
24035   tree arg2 = CALL_EXPR_ARG (exp, 2);
24036   tree arg3 = CALL_EXPR_ARG (exp, 3);
24037   tree arg4 = CALL_EXPR_ARG (exp, 4);
24038   rtx scratch0, scratch1;
24039   rtx op0 = expand_normal (arg0);
24040   rtx op1 = expand_normal (arg1);
24041   rtx op2 = expand_normal (arg2);
24042   rtx op3 = expand_normal (arg3);
24043   rtx op4 = expand_normal (arg4);
24044   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
24045
24046   tmode0 = insn_data[d->icode].operand[0].mode;
24047   tmode1 = insn_data[d->icode].operand[1].mode;
24048   modev2 = insn_data[d->icode].operand[2].mode;
24049   modei3 = insn_data[d->icode].operand[3].mode;
24050   modev4 = insn_data[d->icode].operand[4].mode;
24051   modei5 = insn_data[d->icode].operand[5].mode;
24052   modeimm = insn_data[d->icode].operand[6].mode;
24053
24054   if (VECTOR_MODE_P (modev2))
24055     op0 = safe_vector_operand (op0, modev2);
24056   if (VECTOR_MODE_P (modev4))
24057     op2 = safe_vector_operand (op2, modev4);
24058
24059   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
24060     op0 = copy_to_mode_reg (modev2, op0);
24061   if (! (*insn_data[d->icode].operand[3].predicate) (op1, modei3))
24062     op1 = copy_to_mode_reg (modei3, op1);
24063   if ((optimize && !register_operand (op2, modev4))
24064       || !(*insn_data[d->icode].operand[4].predicate) (op2, modev4))
24065     op2 = copy_to_mode_reg (modev4, op2);
24066   if (! (*insn_data[d->icode].operand[5].predicate) (op3, modei5))
24067     op3 = copy_to_mode_reg (modei5, op3);
24068
24069   if (! (*insn_data[d->icode].operand[6].predicate) (op4, modeimm))
24070     {
24071       error ("the fifth argument must be a 8-bit immediate");
24072       return const0_rtx;
24073     }
24074
24075   if (d->code == IX86_BUILTIN_PCMPESTRI128)
24076     {
24077       if (optimize || !target
24078           || GET_MODE (target) != tmode0
24079           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
24080         target = gen_reg_rtx (tmode0);
24081
24082       scratch1 = gen_reg_rtx (tmode1);
24083
24084       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
24085     }
24086   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
24087     {
24088       if (optimize || !target
24089           || GET_MODE (target) != tmode1
24090           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
24091         target = gen_reg_rtx (tmode1);
24092
24093       scratch0 = gen_reg_rtx (tmode0);
24094
24095       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
24096     }
24097   else
24098     {
24099       gcc_assert (d->flag);
24100
24101       scratch0 = gen_reg_rtx (tmode0);
24102       scratch1 = gen_reg_rtx (tmode1);
24103
24104       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
24105     }
24106
24107   if (! pat)
24108     return 0;
24109
24110   emit_insn (pat);
24111
24112   if (d->flag)
24113     {
24114       target = gen_reg_rtx (SImode);
24115       emit_move_insn (target, const0_rtx);
24116       target = gen_rtx_SUBREG (QImode, target, 0);
24117
24118       emit_insn
24119         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24120                       gen_rtx_fmt_ee (EQ, QImode,
24121                                       gen_rtx_REG ((enum machine_mode) d->flag,
24122                                                    FLAGS_REG),
24123                                       const0_rtx)));
24124       return SUBREG_REG (target);
24125     }
24126   else
24127     return target;
24128 }
24129
24130
24131 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
24132
24133 static rtx
24134 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
24135                           tree exp, rtx target)
24136 {
24137   rtx pat;
24138   tree arg0 = CALL_EXPR_ARG (exp, 0);
24139   tree arg1 = CALL_EXPR_ARG (exp, 1);
24140   tree arg2 = CALL_EXPR_ARG (exp, 2);
24141   rtx scratch0, scratch1;
24142   rtx op0 = expand_normal (arg0);
24143   rtx op1 = expand_normal (arg1);
24144   rtx op2 = expand_normal (arg2);
24145   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
24146
24147   tmode0 = insn_data[d->icode].operand[0].mode;
24148   tmode1 = insn_data[d->icode].operand[1].mode;
24149   modev2 = insn_data[d->icode].operand[2].mode;
24150   modev3 = insn_data[d->icode].operand[3].mode;
24151   modeimm = insn_data[d->icode].operand[4].mode;
24152
24153   if (VECTOR_MODE_P (modev2))
24154     op0 = safe_vector_operand (op0, modev2);
24155   if (VECTOR_MODE_P (modev3))
24156     op1 = safe_vector_operand (op1, modev3);
24157
24158   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
24159     op0 = copy_to_mode_reg (modev2, op0);
24160   if ((optimize && !register_operand (op1, modev3))
24161       || !(*insn_data[d->icode].operand[3].predicate) (op1, modev3))
24162     op1 = copy_to_mode_reg (modev3, op1);
24163
24164   if (! (*insn_data[d->icode].operand[4].predicate) (op2, modeimm))
24165     {
24166       error ("the third argument must be a 8-bit immediate");
24167       return const0_rtx;
24168     }
24169
24170   if (d->code == IX86_BUILTIN_PCMPISTRI128)
24171     {
24172       if (optimize || !target
24173           || GET_MODE (target) != tmode0
24174           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
24175         target = gen_reg_rtx (tmode0);
24176
24177       scratch1 = gen_reg_rtx (tmode1);
24178
24179       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
24180     }
24181   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
24182     {
24183       if (optimize || !target
24184           || GET_MODE (target) != tmode1
24185           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
24186         target = gen_reg_rtx (tmode1);
24187
24188       scratch0 = gen_reg_rtx (tmode0);
24189
24190       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
24191     }
24192   else
24193     {
24194       gcc_assert (d->flag);
24195
24196       scratch0 = gen_reg_rtx (tmode0);
24197       scratch1 = gen_reg_rtx (tmode1);
24198
24199       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
24200     }
24201
24202   if (! pat)
24203     return 0;
24204
24205   emit_insn (pat);
24206
24207   if (d->flag)
24208     {
24209       target = gen_reg_rtx (SImode);
24210       emit_move_insn (target, const0_rtx);
24211       target = gen_rtx_SUBREG (QImode, target, 0);
24212
24213       emit_insn
24214         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24215                       gen_rtx_fmt_ee (EQ, QImode,
24216                                       gen_rtx_REG ((enum machine_mode) d->flag,
24217                                                    FLAGS_REG),
24218                                       const0_rtx)));
24219       return SUBREG_REG (target);
24220     }
24221   else
24222     return target;
24223 }
24224
24225 /* Subroutine of ix86_expand_builtin to take care of insns with
24226    variable number of operands.  */
24227
24228 static rtx
24229 ix86_expand_args_builtin (const struct builtin_description *d,
24230                           tree exp, rtx target)
24231 {
24232   rtx pat, real_target;
24233   unsigned int i, nargs;
24234   unsigned int nargs_constant = 0;
24235   int num_memory = 0;
24236   struct
24237     {
24238       rtx op;
24239       enum machine_mode mode;
24240     } args[4];
24241   bool last_arg_count = false;
24242   enum insn_code icode = d->icode;
24243   const struct insn_data *insn_p = &insn_data[icode];
24244   enum machine_mode tmode = insn_p->operand[0].mode;
24245   enum machine_mode rmode = VOIDmode;
24246   bool swap = false;
24247   enum rtx_code comparison = d->comparison;
24248
24249   switch ((enum ix86_builtin_type) d->flag)
24250     {
24251     case INT_FTYPE_V8SF_V8SF_PTEST:
24252     case INT_FTYPE_V4DI_V4DI_PTEST:
24253     case INT_FTYPE_V4DF_V4DF_PTEST:
24254     case INT_FTYPE_V4SF_V4SF_PTEST:
24255     case INT_FTYPE_V2DI_V2DI_PTEST:
24256     case INT_FTYPE_V2DF_V2DF_PTEST:
24257       return ix86_expand_sse_ptest (d, exp, target);
24258     case FLOAT128_FTYPE_FLOAT128:
24259     case FLOAT_FTYPE_FLOAT:
24260     case INT64_FTYPE_V4SF:
24261     case INT64_FTYPE_V2DF:
24262     case INT_FTYPE_V16QI:
24263     case INT_FTYPE_V8QI:
24264     case INT_FTYPE_V8SF:
24265     case INT_FTYPE_V4DF:
24266     case INT_FTYPE_V4SF:
24267     case INT_FTYPE_V2DF:
24268     case V16QI_FTYPE_V16QI:
24269     case V8SI_FTYPE_V8SF:
24270     case V8SI_FTYPE_V4SI:
24271     case V8HI_FTYPE_V8HI:
24272     case V8HI_FTYPE_V16QI:
24273     case V8QI_FTYPE_V8QI:
24274     case V8SF_FTYPE_V8SF:
24275     case V8SF_FTYPE_V8SI:
24276     case V8SF_FTYPE_V4SF:
24277     case V4SI_FTYPE_V4SI:
24278     case V4SI_FTYPE_V16QI:
24279     case V4SI_FTYPE_V4SF:
24280     case V4SI_FTYPE_V8SI:
24281     case V4SI_FTYPE_V8HI:
24282     case V4SI_FTYPE_V4DF:
24283     case V4SI_FTYPE_V2DF:
24284     case V4HI_FTYPE_V4HI:
24285     case V4DF_FTYPE_V4DF:
24286     case V4DF_FTYPE_V4SI:
24287     case V4DF_FTYPE_V4SF:
24288     case V4DF_FTYPE_V2DF:
24289     case V4SF_FTYPE_V4SF:
24290     case V4SF_FTYPE_V4SI:
24291     case V4SF_FTYPE_V8SF:
24292     case V4SF_FTYPE_V4DF:
24293     case V4SF_FTYPE_V2DF:
24294     case V2DI_FTYPE_V2DI:
24295     case V2DI_FTYPE_V16QI:
24296     case V2DI_FTYPE_V8HI:
24297     case V2DI_FTYPE_V4SI:
24298     case V2DF_FTYPE_V2DF:
24299     case V2DF_FTYPE_V4SI:
24300     case V2DF_FTYPE_V4DF:
24301     case V2DF_FTYPE_V4SF:
24302     case V2DF_FTYPE_V2SI:
24303     case V2SI_FTYPE_V2SI:
24304     case V2SI_FTYPE_V4SF:
24305     case V2SI_FTYPE_V2SF:
24306     case V2SI_FTYPE_V2DF:
24307     case V2SF_FTYPE_V2SF:
24308     case V2SF_FTYPE_V2SI:
24309       nargs = 1;
24310       break;
24311     case V4SF_FTYPE_V4SF_VEC_MERGE:
24312     case V2DF_FTYPE_V2DF_VEC_MERGE:
24313       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
24314     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
24315     case V16QI_FTYPE_V16QI_V16QI:
24316     case V16QI_FTYPE_V8HI_V8HI:
24317     case V8QI_FTYPE_V8QI_V8QI:
24318     case V8QI_FTYPE_V4HI_V4HI:
24319     case V8HI_FTYPE_V8HI_V8HI:
24320     case V8HI_FTYPE_V16QI_V16QI:
24321     case V8HI_FTYPE_V4SI_V4SI:
24322     case V8SF_FTYPE_V8SF_V8SF:
24323     case V8SF_FTYPE_V8SF_V8SI:
24324     case V4SI_FTYPE_V4SI_V4SI:
24325     case V4SI_FTYPE_V8HI_V8HI:
24326     case V4SI_FTYPE_V4SF_V4SF:
24327     case V4SI_FTYPE_V2DF_V2DF:
24328     case V4HI_FTYPE_V4HI_V4HI:
24329     case V4HI_FTYPE_V8QI_V8QI:
24330     case V4HI_FTYPE_V2SI_V2SI:
24331     case V4DF_FTYPE_V4DF_V4DF:
24332     case V4DF_FTYPE_V4DF_V4DI:
24333     case V4SF_FTYPE_V4SF_V4SF:
24334     case V4SF_FTYPE_V4SF_V4SI:
24335     case V4SF_FTYPE_V4SF_V2SI:
24336     case V4SF_FTYPE_V4SF_V2DF:
24337     case V4SF_FTYPE_V4SF_DI:
24338     case V4SF_FTYPE_V4SF_SI:
24339     case V2DI_FTYPE_V2DI_V2DI:
24340     case V2DI_FTYPE_V16QI_V16QI:
24341     case V2DI_FTYPE_V4SI_V4SI:
24342     case V2DI_FTYPE_V2DI_V16QI:
24343     case V2DI_FTYPE_V2DF_V2DF:
24344     case V2SI_FTYPE_V2SI_V2SI:
24345     case V2SI_FTYPE_V4HI_V4HI:
24346     case V2SI_FTYPE_V2SF_V2SF:
24347     case V2DF_FTYPE_V2DF_V2DF:
24348     case V2DF_FTYPE_V2DF_V4SF:
24349     case V2DF_FTYPE_V2DF_V2DI:
24350     case V2DF_FTYPE_V2DF_DI:
24351     case V2DF_FTYPE_V2DF_SI:
24352     case V2SF_FTYPE_V2SF_V2SF:
24353     case V1DI_FTYPE_V1DI_V1DI:
24354     case V1DI_FTYPE_V8QI_V8QI:
24355     case V1DI_FTYPE_V2SI_V2SI:
24356       if (comparison == UNKNOWN)
24357         return ix86_expand_binop_builtin (icode, exp, target);
24358       nargs = 2;
24359       break;
24360     case V4SF_FTYPE_V4SF_V4SF_SWAP:
24361     case V2DF_FTYPE_V2DF_V2DF_SWAP:
24362       gcc_assert (comparison != UNKNOWN);
24363       nargs = 2;
24364       swap = true;
24365       break;
24366     case V8HI_FTYPE_V8HI_V8HI_COUNT:
24367     case V8HI_FTYPE_V8HI_SI_COUNT:
24368     case V4SI_FTYPE_V4SI_V4SI_COUNT:
24369     case V4SI_FTYPE_V4SI_SI_COUNT:
24370     case V4HI_FTYPE_V4HI_V4HI_COUNT:
24371     case V4HI_FTYPE_V4HI_SI_COUNT:
24372     case V2DI_FTYPE_V2DI_V2DI_COUNT:
24373     case V2DI_FTYPE_V2DI_SI_COUNT:
24374     case V2SI_FTYPE_V2SI_V2SI_COUNT:
24375     case V2SI_FTYPE_V2SI_SI_COUNT:
24376     case V1DI_FTYPE_V1DI_V1DI_COUNT:
24377     case V1DI_FTYPE_V1DI_SI_COUNT:
24378       nargs = 2;
24379       last_arg_count = true;
24380       break;
24381     case UINT64_FTYPE_UINT64_UINT64:
24382     case UINT_FTYPE_UINT_UINT:
24383     case UINT_FTYPE_UINT_USHORT:
24384     case UINT_FTYPE_UINT_UCHAR:
24385       nargs = 2;
24386       break;
24387     case V2DI2TI_FTYPE_V2DI_INT:
24388       nargs = 2;
24389       rmode = V2DImode;
24390       nargs_constant = 1;
24391       break;
24392     case V8HI_FTYPE_V8HI_INT:
24393     case V8SF_FTYPE_V8SF_INT:
24394     case V4SI_FTYPE_V4SI_INT:
24395     case V4SI_FTYPE_V8SI_INT:
24396     case V4HI_FTYPE_V4HI_INT:
24397     case V4DF_FTYPE_V4DF_INT:
24398     case V4SF_FTYPE_V4SF_INT:
24399     case V4SF_FTYPE_V8SF_INT:
24400     case V2DI_FTYPE_V2DI_INT:
24401     case V2DF_FTYPE_V2DF_INT:
24402     case V2DF_FTYPE_V4DF_INT:
24403       nargs = 2;
24404       nargs_constant = 1;
24405       break;
24406     case V16QI_FTYPE_V16QI_V16QI_V16QI:
24407     case V8SF_FTYPE_V8SF_V8SF_V8SF:
24408     case V4DF_FTYPE_V4DF_V4DF_V4DF:
24409     case V4SF_FTYPE_V4SF_V4SF_V4SF:
24410     case V2DF_FTYPE_V2DF_V2DF_V2DF:
24411       nargs = 3;
24412       break;
24413     case V16QI_FTYPE_V16QI_V16QI_INT:
24414     case V8HI_FTYPE_V8HI_V8HI_INT:
24415     case V8SI_FTYPE_V8SI_V8SI_INT:
24416     case V8SI_FTYPE_V8SI_V4SI_INT:
24417     case V8SF_FTYPE_V8SF_V8SF_INT: 
24418     case V8SF_FTYPE_V8SF_V4SF_INT: 
24419     case V4SI_FTYPE_V4SI_V4SI_INT:
24420     case V4DF_FTYPE_V4DF_V4DF_INT:
24421     case V4DF_FTYPE_V4DF_V2DF_INT:
24422     case V4SF_FTYPE_V4SF_V4SF_INT:
24423     case V2DI_FTYPE_V2DI_V2DI_INT:
24424     case V2DF_FTYPE_V2DF_V2DF_INT:
24425       nargs = 3;
24426       nargs_constant = 1;
24427       break;
24428     case V2DI2TI_FTYPE_V2DI_V2DI_INT:
24429       nargs = 3;
24430       rmode = V2DImode;
24431       nargs_constant = 1;
24432       break;
24433     case V1DI2DI_FTYPE_V1DI_V1DI_INT:
24434       nargs = 3;
24435       rmode = DImode;
24436       nargs_constant = 1;
24437       break;
24438     case V2DI_FTYPE_V2DI_UINT_UINT:
24439       nargs = 3;
24440       nargs_constant = 2;
24441       break;
24442     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
24443       nargs = 4;
24444       nargs_constant = 2;
24445       break;
24446     default:
24447       gcc_unreachable ();
24448     }
24449
24450   gcc_assert (nargs <= ARRAY_SIZE (args));
24451
24452   if (comparison != UNKNOWN)
24453     {
24454       gcc_assert (nargs == 2);
24455       return ix86_expand_sse_compare (d, exp, target, swap);
24456     }
24457
24458   if (rmode == VOIDmode || rmode == tmode)
24459     {
24460       if (optimize
24461           || target == 0
24462           || GET_MODE (target) != tmode
24463           || ! (*insn_p->operand[0].predicate) (target, tmode))
24464         target = gen_reg_rtx (tmode);
24465       real_target = target;
24466     }
24467   else
24468     {
24469       target = gen_reg_rtx (rmode);
24470       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
24471     }
24472
24473   for (i = 0; i < nargs; i++)
24474     {
24475       tree arg = CALL_EXPR_ARG (exp, i);
24476       rtx op = expand_normal (arg);
24477       enum machine_mode mode = insn_p->operand[i + 1].mode;
24478       bool match = (*insn_p->operand[i + 1].predicate) (op, mode);
24479
24480       if (last_arg_count && (i + 1) == nargs)
24481         {
24482           /* SIMD shift insns take either an 8-bit immediate or
24483              register as count.  But builtin functions take int as
24484              count.  If count doesn't match, we put it in register.  */
24485           if (!match)
24486             {
24487               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
24488               if (!(*insn_p->operand[i + 1].predicate) (op, mode))
24489                 op = copy_to_reg (op);
24490             }
24491         }
24492       else if ((nargs - i) <= nargs_constant)
24493         {
24494           if (!match)
24495             switch (icode)
24496               {
24497               case CODE_FOR_sse4_1_roundpd:
24498               case CODE_FOR_sse4_1_roundps:
24499               case CODE_FOR_sse4_1_roundsd:
24500               case CODE_FOR_sse4_1_roundss:
24501               case CODE_FOR_sse4_1_blendps:
24502               case CODE_FOR_avx_blendpd256:
24503               case CODE_FOR_avx_vpermilv4df:
24504               case CODE_FOR_avx_roundpd256:
24505               case CODE_FOR_avx_roundps256:
24506                 error ("the last argument must be a 4-bit immediate");
24507                 return const0_rtx;
24508
24509               case CODE_FOR_sse4_1_blendpd:
24510               case CODE_FOR_avx_vpermilv2df:
24511                 error ("the last argument must be a 2-bit immediate");
24512                 return const0_rtx;
24513
24514               case CODE_FOR_avx_vextractf128v4df:
24515               case CODE_FOR_avx_vextractf128v8sf:
24516               case CODE_FOR_avx_vextractf128v8si:
24517               case CODE_FOR_avx_vinsertf128v4df:
24518               case CODE_FOR_avx_vinsertf128v8sf:
24519               case CODE_FOR_avx_vinsertf128v8si:
24520                 error ("the last argument must be a 1-bit immediate");
24521                 return const0_rtx;
24522
24523               case CODE_FOR_avx_cmpsdv2df3:
24524               case CODE_FOR_avx_cmpssv4sf3:
24525               case CODE_FOR_avx_cmppdv2df3:
24526               case CODE_FOR_avx_cmppsv4sf3:
24527               case CODE_FOR_avx_cmppdv4df3:
24528               case CODE_FOR_avx_cmppsv8sf3:
24529                 error ("the last argument must be a 5-bit immediate");
24530                 return const0_rtx;
24531
24532              default:
24533                 switch (nargs_constant)
24534                   {
24535                   case 2:
24536                     if ((nargs - i) == nargs_constant)
24537                       {
24538                         error ("the next to last argument must be an 8-bit immediate");
24539                         break;
24540                       }
24541                   case 1:
24542                     error ("the last argument must be an 8-bit immediate");
24543                     break;
24544                   default:
24545                     gcc_unreachable ();
24546                   }
24547                 return const0_rtx;
24548               }
24549         }
24550       else
24551         {
24552           if (VECTOR_MODE_P (mode))
24553             op = safe_vector_operand (op, mode);
24554
24555           /* If we aren't optimizing, only allow one memory operand to
24556              be generated.  */
24557           if (memory_operand (op, mode))
24558             num_memory++;
24559
24560           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
24561             {
24562               if (optimize || !match || num_memory > 1)
24563                 op = copy_to_mode_reg (mode, op);
24564             }
24565           else
24566             {
24567               op = copy_to_reg (op);
24568               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
24569             }
24570         }
24571
24572       args[i].op = op;
24573       args[i].mode = mode;
24574     }
24575
24576   switch (nargs)
24577     {
24578     case 1:
24579       pat = GEN_FCN (icode) (real_target, args[0].op);
24580       break;
24581     case 2:
24582       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
24583       break;
24584     case 3:
24585       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24586                              args[2].op);
24587       break;
24588     case 4:
24589       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24590                              args[2].op, args[3].op);
24591       break;
24592     default:
24593       gcc_unreachable ();
24594     }
24595
24596   if (! pat)
24597     return 0;
24598
24599   emit_insn (pat);
24600   return target;
24601 }
24602
24603 /* Subroutine of ix86_expand_builtin to take care of special insns
24604    with variable number of operands.  */
24605
24606 static rtx
24607 ix86_expand_special_args_builtin (const struct builtin_description *d,
24608                                     tree exp, rtx target)
24609 {
24610   tree arg;
24611   rtx pat, op;
24612   unsigned int i, nargs, arg_adjust, memory;
24613   struct
24614     {
24615       rtx op;
24616       enum machine_mode mode;
24617     } args[2];
24618   enum insn_code icode = d->icode;
24619   bool last_arg_constant = false;
24620   const struct insn_data *insn_p = &insn_data[icode];
24621   enum machine_mode tmode = insn_p->operand[0].mode;
24622   enum { load, store } klass;
24623
24624   switch ((enum ix86_special_builtin_type) d->flag)
24625     {
24626     case VOID_FTYPE_VOID:
24627       emit_insn (GEN_FCN (icode) (target));
24628       return 0;
24629     case V2DI_FTYPE_PV2DI:
24630     case V32QI_FTYPE_PCCHAR:
24631     case V16QI_FTYPE_PCCHAR:
24632     case V8SF_FTYPE_PCV4SF:
24633     case V8SF_FTYPE_PCFLOAT:
24634     case V4SF_FTYPE_PCFLOAT:
24635     case V4DF_FTYPE_PCV2DF:
24636     case V4DF_FTYPE_PCDOUBLE:
24637     case V2DF_FTYPE_PCDOUBLE:
24638       nargs = 1;
24639       klass = load;
24640       memory = 0;
24641       break;
24642     case VOID_FTYPE_PV2SF_V4SF:
24643     case VOID_FTYPE_PV4DI_V4DI:
24644     case VOID_FTYPE_PV2DI_V2DI:
24645     case VOID_FTYPE_PCHAR_V32QI:
24646     case VOID_FTYPE_PCHAR_V16QI:
24647     case VOID_FTYPE_PFLOAT_V8SF:
24648     case VOID_FTYPE_PFLOAT_V4SF:
24649     case VOID_FTYPE_PDOUBLE_V4DF:
24650     case VOID_FTYPE_PDOUBLE_V2DF:
24651     case VOID_FTYPE_PDI_DI:
24652     case VOID_FTYPE_PINT_INT:
24653       nargs = 1;
24654       klass = store;
24655       /* Reserve memory operand for target.  */
24656       memory = ARRAY_SIZE (args);
24657       break;
24658     case V4SF_FTYPE_V4SF_PCV2SF:
24659     case V2DF_FTYPE_V2DF_PCDOUBLE:
24660       nargs = 2;
24661       klass = load;
24662       memory = 1;
24663       break;
24664     case V8SF_FTYPE_PCV8SF_V8SI:
24665     case V4DF_FTYPE_PCV4DF_V4DI:
24666     case V4SF_FTYPE_PCV4SF_V4SI:
24667     case V2DF_FTYPE_PCV2DF_V2DI:
24668       nargs = 2;
24669       klass = load;
24670       memory = 0;
24671       break;
24672     case VOID_FTYPE_PV8SF_V8SI_V8SF:
24673     case VOID_FTYPE_PV4DF_V4DI_V4DF:
24674     case VOID_FTYPE_PV4SF_V4SI_V4SF:
24675     case VOID_FTYPE_PV2DF_V2DI_V2DF:
24676       nargs = 2;
24677       klass = store;
24678       /* Reserve memory operand for target.  */
24679       memory = ARRAY_SIZE (args);
24680       break;
24681     default:
24682       gcc_unreachable ();
24683     }
24684
24685   gcc_assert (nargs <= ARRAY_SIZE (args));
24686
24687   if (klass == store)
24688     {
24689       arg = CALL_EXPR_ARG (exp, 0);
24690       op = expand_normal (arg);
24691       gcc_assert (target == 0);
24692       target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
24693       arg_adjust = 1;
24694     }
24695   else
24696     {
24697       arg_adjust = 0;
24698       if (optimize
24699           || target == 0
24700           || GET_MODE (target) != tmode
24701           || ! (*insn_p->operand[0].predicate) (target, tmode))
24702         target = gen_reg_rtx (tmode);
24703     }
24704
24705   for (i = 0; i < nargs; i++)
24706     {
24707       enum machine_mode mode = insn_p->operand[i + 1].mode;
24708       bool match;
24709
24710       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
24711       op = expand_normal (arg);
24712       match = (*insn_p->operand[i + 1].predicate) (op, mode);
24713
24714       if (last_arg_constant && (i + 1) == nargs)
24715         {
24716           if (!match)
24717             switch (icode)
24718               {
24719              default:
24720                 error ("the last argument must be an 8-bit immediate");
24721                 return const0_rtx;
24722               }
24723         }
24724       else
24725         {
24726           if (i == memory)
24727             {
24728               /* This must be the memory operand.  */
24729               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
24730               gcc_assert (GET_MODE (op) == mode
24731                           || GET_MODE (op) == VOIDmode);
24732             }
24733           else
24734             {
24735               /* This must be register.  */
24736               if (VECTOR_MODE_P (mode))
24737                 op = safe_vector_operand (op, mode);
24738
24739               gcc_assert (GET_MODE (op) == mode
24740                           || GET_MODE (op) == VOIDmode);
24741               op = copy_to_mode_reg (mode, op);
24742             }
24743         }
24744
24745       args[i].op = op;
24746       args[i].mode = mode;
24747     }
24748
24749   switch (nargs)
24750     {
24751     case 1:
24752       pat = GEN_FCN (icode) (target, args[0].op);
24753       break;
24754     case 2:
24755       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
24756       break;
24757     default:
24758       gcc_unreachable ();
24759     }
24760
24761   if (! pat)
24762     return 0;
24763   emit_insn (pat);
24764   return klass == store ? 0 : target;
24765 }
24766
24767 /* Return the integer constant in ARG.  Constrain it to be in the range
24768    of the subparts of VEC_TYPE; issue an error if not.  */
24769
24770 static int
24771 get_element_number (tree vec_type, tree arg)
24772 {
24773   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
24774
24775   if (!host_integerp (arg, 1)
24776       || (elt = tree_low_cst (arg, 1), elt > max))
24777     {
24778       error ("selector must be an integer constant in the range 0..%wi", max);
24779       return 0;
24780     }
24781
24782   return elt;
24783 }
24784
24785 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24786    ix86_expand_vector_init.  We DO have language-level syntax for this, in
24787    the form of  (type){ init-list }.  Except that since we can't place emms
24788    instructions from inside the compiler, we can't allow the use of MMX
24789    registers unless the user explicitly asks for it.  So we do *not* define
24790    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
24791    we have builtins invoked by mmintrin.h that gives us license to emit
24792    these sorts of instructions.  */
24793
24794 static rtx
24795 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
24796 {
24797   enum machine_mode tmode = TYPE_MODE (type);
24798   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
24799   int i, n_elt = GET_MODE_NUNITS (tmode);
24800   rtvec v = rtvec_alloc (n_elt);
24801
24802   gcc_assert (VECTOR_MODE_P (tmode));
24803   gcc_assert (call_expr_nargs (exp) == n_elt);
24804
24805   for (i = 0; i < n_elt; ++i)
24806     {
24807       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
24808       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
24809     }
24810
24811   if (!target || !register_operand (target, tmode))
24812     target = gen_reg_rtx (tmode);
24813
24814   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
24815   return target;
24816 }
24817
24818 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24819    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
24820    had a language-level syntax for referencing vector elements.  */
24821
24822 static rtx
24823 ix86_expand_vec_ext_builtin (tree exp, rtx target)
24824 {
24825   enum machine_mode tmode, mode0;
24826   tree arg0, arg1;
24827   int elt;
24828   rtx op0;
24829
24830   arg0 = CALL_EXPR_ARG (exp, 0);
24831   arg1 = CALL_EXPR_ARG (exp, 1);
24832
24833   op0 = expand_normal (arg0);
24834   elt = get_element_number (TREE_TYPE (arg0), arg1);
24835
24836   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
24837   mode0 = TYPE_MODE (TREE_TYPE (arg0));
24838   gcc_assert (VECTOR_MODE_P (mode0));
24839
24840   op0 = force_reg (mode0, op0);
24841
24842   if (optimize || !target || !register_operand (target, tmode))
24843     target = gen_reg_rtx (tmode);
24844
24845   ix86_expand_vector_extract (true, target, op0, elt);
24846
24847   return target;
24848 }
24849
24850 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24851    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
24852    a language-level syntax for referencing vector elements.  */
24853
24854 static rtx
24855 ix86_expand_vec_set_builtin (tree exp)
24856 {
24857   enum machine_mode tmode, mode1;
24858   tree arg0, arg1, arg2;
24859   int elt;
24860   rtx op0, op1, target;
24861
24862   arg0 = CALL_EXPR_ARG (exp, 0);
24863   arg1 = CALL_EXPR_ARG (exp, 1);
24864   arg2 = CALL_EXPR_ARG (exp, 2);
24865
24866   tmode = TYPE_MODE (TREE_TYPE (arg0));
24867   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
24868   gcc_assert (VECTOR_MODE_P (tmode));
24869
24870   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
24871   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
24872   elt = get_element_number (TREE_TYPE (arg0), arg2);
24873
24874   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
24875     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
24876
24877   op0 = force_reg (tmode, op0);
24878   op1 = force_reg (mode1, op1);
24879
24880   /* OP0 is the source of these builtin functions and shouldn't be
24881      modified.  Create a copy, use it and return it as target.  */
24882   target = gen_reg_rtx (tmode);
24883   emit_move_insn (target, op0);
24884   ix86_expand_vector_set (true, target, op1, elt);
24885
24886   return target;
24887 }
24888
24889 /* Expand an expression EXP that calls a built-in function,
24890    with result going to TARGET if that's convenient
24891    (and in mode MODE if that's convenient).
24892    SUBTARGET may be used as the target for computing one of EXP's operands.
24893    IGNORE is nonzero if the value is to be ignored.  */
24894
24895 static rtx
24896 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
24897                      enum machine_mode mode ATTRIBUTE_UNUSED,
24898                      int ignore ATTRIBUTE_UNUSED)
24899 {
24900   const struct builtin_description *d;
24901   size_t i;
24902   enum insn_code icode;
24903   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
24904   tree arg0, arg1, arg2;
24905   rtx op0, op1, op2, pat;
24906   enum machine_mode mode0, mode1, mode2;
24907   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
24908
24909   /* Determine whether the builtin function is available under the current ISA.
24910      Originally the builtin was not created if it wasn't applicable to the
24911      current ISA based on the command line switches.  With function specific
24912      options, we need to check in the context of the function making the call
24913      whether it is supported.  */
24914   if (ix86_builtins_isa[fcode].isa
24915       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
24916     {
24917       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
24918                                        NULL, NULL, false);
24919
24920       if (!opts)
24921         error ("%qE needs unknown isa option", fndecl);
24922       else
24923         {
24924           gcc_assert (opts != NULL);
24925           error ("%qE needs isa option %s", fndecl, opts);
24926           free (opts);
24927         }
24928       return const0_rtx;
24929     }
24930
24931   switch (fcode)
24932     {
24933     case IX86_BUILTIN_MASKMOVQ:
24934     case IX86_BUILTIN_MASKMOVDQU:
24935       icode = (fcode == IX86_BUILTIN_MASKMOVQ
24936                ? CODE_FOR_mmx_maskmovq
24937                : CODE_FOR_sse2_maskmovdqu);
24938       /* Note the arg order is different from the operand order.  */
24939       arg1 = CALL_EXPR_ARG (exp, 0);
24940       arg2 = CALL_EXPR_ARG (exp, 1);
24941       arg0 = CALL_EXPR_ARG (exp, 2);
24942       op0 = expand_normal (arg0);
24943       op1 = expand_normal (arg1);
24944       op2 = expand_normal (arg2);
24945       mode0 = insn_data[icode].operand[0].mode;
24946       mode1 = insn_data[icode].operand[1].mode;
24947       mode2 = insn_data[icode].operand[2].mode;
24948
24949       op0 = force_reg (Pmode, op0);
24950       op0 = gen_rtx_MEM (mode1, op0);
24951
24952       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
24953         op0 = copy_to_mode_reg (mode0, op0);
24954       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
24955         op1 = copy_to_mode_reg (mode1, op1);
24956       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
24957         op2 = copy_to_mode_reg (mode2, op2);
24958       pat = GEN_FCN (icode) (op0, op1, op2);
24959       if (! pat)
24960         return 0;
24961       emit_insn (pat);
24962       return 0;
24963
24964     case IX86_BUILTIN_LDMXCSR:
24965       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
24966       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24967       emit_move_insn (target, op0);
24968       emit_insn (gen_sse_ldmxcsr (target));
24969       return 0;
24970
24971     case IX86_BUILTIN_STMXCSR:
24972       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24973       emit_insn (gen_sse_stmxcsr (target));
24974       return copy_to_mode_reg (SImode, target);
24975
24976     case IX86_BUILTIN_CLFLUSH:
24977         arg0 = CALL_EXPR_ARG (exp, 0);
24978         op0 = expand_normal (arg0);
24979         icode = CODE_FOR_sse2_clflush;
24980         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
24981             op0 = copy_to_mode_reg (Pmode, op0);
24982
24983         emit_insn (gen_sse2_clflush (op0));
24984         return 0;
24985
24986     case IX86_BUILTIN_MONITOR:
24987       arg0 = CALL_EXPR_ARG (exp, 0);
24988       arg1 = CALL_EXPR_ARG (exp, 1);
24989       arg2 = CALL_EXPR_ARG (exp, 2);
24990       op0 = expand_normal (arg0);
24991       op1 = expand_normal (arg1);
24992       op2 = expand_normal (arg2);
24993       if (!REG_P (op0))
24994         op0 = copy_to_mode_reg (Pmode, op0);
24995       if (!REG_P (op1))
24996         op1 = copy_to_mode_reg (SImode, op1);
24997       if (!REG_P (op2))
24998         op2 = copy_to_mode_reg (SImode, op2);
24999       emit_insn ((*ix86_gen_monitor) (op0, op1, op2));
25000       return 0;
25001
25002     case IX86_BUILTIN_MWAIT:
25003       arg0 = CALL_EXPR_ARG (exp, 0);
25004       arg1 = CALL_EXPR_ARG (exp, 1);
25005       op0 = expand_normal (arg0);
25006       op1 = expand_normal (arg1);
25007       if (!REG_P (op0))
25008         op0 = copy_to_mode_reg (SImode, op0);
25009       if (!REG_P (op1))
25010         op1 = copy_to_mode_reg (SImode, op1);
25011       emit_insn (gen_sse3_mwait (op0, op1));
25012       return 0;
25013
25014     case IX86_BUILTIN_VEC_INIT_V2SI:
25015     case IX86_BUILTIN_VEC_INIT_V4HI:
25016     case IX86_BUILTIN_VEC_INIT_V8QI:
25017       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
25018
25019     case IX86_BUILTIN_VEC_EXT_V2DF:
25020     case IX86_BUILTIN_VEC_EXT_V2DI:
25021     case IX86_BUILTIN_VEC_EXT_V4SF:
25022     case IX86_BUILTIN_VEC_EXT_V4SI:
25023     case IX86_BUILTIN_VEC_EXT_V8HI:
25024     case IX86_BUILTIN_VEC_EXT_V2SI:
25025     case IX86_BUILTIN_VEC_EXT_V4HI:
25026     case IX86_BUILTIN_VEC_EXT_V16QI:
25027       return ix86_expand_vec_ext_builtin (exp, target);
25028
25029     case IX86_BUILTIN_VEC_SET_V2DI:
25030     case IX86_BUILTIN_VEC_SET_V4SF:
25031     case IX86_BUILTIN_VEC_SET_V4SI:
25032     case IX86_BUILTIN_VEC_SET_V8HI:
25033     case IX86_BUILTIN_VEC_SET_V4HI:
25034     case IX86_BUILTIN_VEC_SET_V16QI:
25035       return ix86_expand_vec_set_builtin (exp);
25036
25037     case IX86_BUILTIN_INFQ:
25038       {
25039         REAL_VALUE_TYPE inf;
25040         rtx tmp;
25041
25042         real_inf (&inf);
25043         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
25044
25045         tmp = validize_mem (force_const_mem (mode, tmp));
25046
25047         if (target == 0)
25048           target = gen_reg_rtx (mode);
25049
25050         emit_move_insn (target, tmp);
25051         return target;
25052       }
25053
25054     default:
25055       break;
25056     }
25057
25058   for (i = 0, d = bdesc_special_args;
25059        i < ARRAY_SIZE (bdesc_special_args);
25060        i++, d++)
25061     if (d->code == fcode)
25062       return ix86_expand_special_args_builtin (d, exp, target);
25063
25064   for (i = 0, d = bdesc_args;
25065        i < ARRAY_SIZE (bdesc_args);
25066        i++, d++)
25067     if (d->code == fcode)
25068       switch (fcode)
25069         {
25070         case IX86_BUILTIN_FABSQ:
25071         case IX86_BUILTIN_COPYSIGNQ:
25072           if (!TARGET_SSE2)
25073             /* Emit a normal call if SSE2 isn't available.  */
25074             return expand_call (exp, target, ignore);
25075         default:
25076           return ix86_expand_args_builtin (d, exp, target);
25077         }
25078
25079   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
25080     if (d->code == fcode)
25081       return ix86_expand_sse_comi (d, exp, target);
25082
25083   for (i = 0, d = bdesc_pcmpestr;
25084        i < ARRAY_SIZE (bdesc_pcmpestr);
25085        i++, d++)
25086     if (d->code == fcode)
25087       return ix86_expand_sse_pcmpestr (d, exp, target);
25088
25089   for (i = 0, d = bdesc_pcmpistr;
25090        i < ARRAY_SIZE (bdesc_pcmpistr);
25091        i++, d++)
25092     if (d->code == fcode)
25093       return ix86_expand_sse_pcmpistr (d, exp, target);
25094
25095   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
25096     if (d->code == fcode)
25097       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
25098                                             (enum multi_arg_type)d->flag,
25099                                             d->comparison);
25100
25101   gcc_unreachable ();
25102 }
25103
25104 /* Returns a function decl for a vectorized version of the builtin function
25105    with builtin function code FN and the result vector type TYPE, or NULL_TREE
25106    if it is not available.  */
25107
25108 static tree
25109 ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
25110                                   tree type_in)
25111 {
25112   enum machine_mode in_mode, out_mode;
25113   int in_n, out_n;
25114
25115   if (TREE_CODE (type_out) != VECTOR_TYPE
25116       || TREE_CODE (type_in) != VECTOR_TYPE)
25117     return NULL_TREE;
25118
25119   out_mode = TYPE_MODE (TREE_TYPE (type_out));
25120   out_n = TYPE_VECTOR_SUBPARTS (type_out);
25121   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25122   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25123
25124   switch (fn)
25125     {
25126     case BUILT_IN_SQRT:
25127       if (out_mode == DFmode && out_n == 2
25128           && in_mode == DFmode && in_n == 2)
25129         return ix86_builtins[IX86_BUILTIN_SQRTPD];
25130       break;
25131
25132     case BUILT_IN_SQRTF:
25133       if (out_mode == SFmode && out_n == 4
25134           && in_mode == SFmode && in_n == 4)
25135         return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
25136       break;
25137
25138     case BUILT_IN_LRINT:
25139       if (out_mode == SImode && out_n == 4
25140           && in_mode == DFmode && in_n == 2)
25141         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
25142       break;
25143
25144     case BUILT_IN_LRINTF:
25145       if (out_mode == SImode && out_n == 4
25146           && in_mode == SFmode && in_n == 4)
25147         return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
25148       break;
25149
25150     default:
25151       ;
25152     }
25153
25154   /* Dispatch to a handler for a vectorization library.  */
25155   if (ix86_veclib_handler)
25156     return (*ix86_veclib_handler)(fn, type_out, type_in);
25157
25158   return NULL_TREE;
25159 }
25160
25161 /* Handler for an SVML-style interface to
25162    a library with vectorized intrinsics.  */
25163
25164 static tree
25165 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
25166 {
25167   char name[20];
25168   tree fntype, new_fndecl, args;
25169   unsigned arity;
25170   const char *bname;
25171   enum machine_mode el_mode, in_mode;
25172   int n, in_n;
25173
25174   /* The SVML is suitable for unsafe math only.  */
25175   if (!flag_unsafe_math_optimizations)
25176     return NULL_TREE;
25177
25178   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25179   n = TYPE_VECTOR_SUBPARTS (type_out);
25180   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25181   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25182   if (el_mode != in_mode
25183       || n != in_n)
25184     return NULL_TREE;
25185
25186   switch (fn)
25187     {
25188     case BUILT_IN_EXP:
25189     case BUILT_IN_LOG:
25190     case BUILT_IN_LOG10:
25191     case BUILT_IN_POW:
25192     case BUILT_IN_TANH:
25193     case BUILT_IN_TAN:
25194     case BUILT_IN_ATAN:
25195     case BUILT_IN_ATAN2:
25196     case BUILT_IN_ATANH:
25197     case BUILT_IN_CBRT:
25198     case BUILT_IN_SINH:
25199     case BUILT_IN_SIN:
25200     case BUILT_IN_ASINH:
25201     case BUILT_IN_ASIN:
25202     case BUILT_IN_COSH:
25203     case BUILT_IN_COS:
25204     case BUILT_IN_ACOSH:
25205     case BUILT_IN_ACOS:
25206       if (el_mode != DFmode || n != 2)
25207         return NULL_TREE;
25208       break;
25209
25210     case BUILT_IN_EXPF:
25211     case BUILT_IN_LOGF:
25212     case BUILT_IN_LOG10F:
25213     case BUILT_IN_POWF:
25214     case BUILT_IN_TANHF:
25215     case BUILT_IN_TANF:
25216     case BUILT_IN_ATANF:
25217     case BUILT_IN_ATAN2F:
25218     case BUILT_IN_ATANHF:
25219     case BUILT_IN_CBRTF:
25220     case BUILT_IN_SINHF:
25221     case BUILT_IN_SINF:
25222     case BUILT_IN_ASINHF:
25223     case BUILT_IN_ASINF:
25224     case BUILT_IN_COSHF:
25225     case BUILT_IN_COSF:
25226     case BUILT_IN_ACOSHF:
25227     case BUILT_IN_ACOSF:
25228       if (el_mode != SFmode || n != 4)
25229         return NULL_TREE;
25230       break;
25231
25232     default:
25233       return NULL_TREE;
25234     }
25235
25236   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25237
25238   if (fn == BUILT_IN_LOGF)
25239     strcpy (name, "vmlsLn4");
25240   else if (fn == BUILT_IN_LOG)
25241     strcpy (name, "vmldLn2");
25242   else if (n == 4)
25243     {
25244       sprintf (name, "vmls%s", bname+10);
25245       name[strlen (name)-1] = '4';
25246     }
25247   else
25248     sprintf (name, "vmld%s2", bname+10);
25249
25250   /* Convert to uppercase. */
25251   name[4] &= ~0x20;
25252
25253   arity = 0;
25254   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25255        args = TREE_CHAIN (args))
25256     arity++;
25257
25258   if (arity == 1)
25259     fntype = build_function_type_list (type_out, type_in, NULL);
25260   else
25261     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25262
25263   /* Build a function declaration for the vectorized function.  */
25264   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25265   TREE_PUBLIC (new_fndecl) = 1;
25266   DECL_EXTERNAL (new_fndecl) = 1;
25267   DECL_IS_NOVOPS (new_fndecl) = 1;
25268   TREE_READONLY (new_fndecl) = 1;
25269
25270   return new_fndecl;
25271 }
25272
25273 /* Handler for an ACML-style interface to
25274    a library with vectorized intrinsics.  */
25275
25276 static tree
25277 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
25278 {
25279   char name[20] = "__vr.._";
25280   tree fntype, new_fndecl, args;
25281   unsigned arity;
25282   const char *bname;
25283   enum machine_mode el_mode, in_mode;
25284   int n, in_n;
25285
25286   /* The ACML is 64bits only and suitable for unsafe math only as
25287      it does not correctly support parts of IEEE with the required
25288      precision such as denormals.  */
25289   if (!TARGET_64BIT
25290       || !flag_unsafe_math_optimizations)
25291     return NULL_TREE;
25292
25293   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25294   n = TYPE_VECTOR_SUBPARTS (type_out);
25295   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25296   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25297   if (el_mode != in_mode
25298       || n != in_n)
25299     return NULL_TREE;
25300
25301   switch (fn)
25302     {
25303     case BUILT_IN_SIN:
25304     case BUILT_IN_COS:
25305     case BUILT_IN_EXP:
25306     case BUILT_IN_LOG:
25307     case BUILT_IN_LOG2:
25308     case BUILT_IN_LOG10:
25309       name[4] = 'd';
25310       name[5] = '2';
25311       if (el_mode != DFmode
25312           || n != 2)
25313         return NULL_TREE;
25314       break;
25315
25316     case BUILT_IN_SINF:
25317     case BUILT_IN_COSF:
25318     case BUILT_IN_EXPF:
25319     case BUILT_IN_POWF:
25320     case BUILT_IN_LOGF:
25321     case BUILT_IN_LOG2F:
25322     case BUILT_IN_LOG10F:
25323       name[4] = 's';
25324       name[5] = '4';
25325       if (el_mode != SFmode
25326           || n != 4)
25327         return NULL_TREE;
25328       break;
25329
25330     default:
25331       return NULL_TREE;
25332     }
25333
25334   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25335   sprintf (name + 7, "%s", bname+10);
25336
25337   arity = 0;
25338   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25339        args = TREE_CHAIN (args))
25340     arity++;
25341
25342   if (arity == 1)
25343     fntype = build_function_type_list (type_out, type_in, NULL);
25344   else
25345     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25346
25347   /* Build a function declaration for the vectorized function.  */
25348   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25349   TREE_PUBLIC (new_fndecl) = 1;
25350   DECL_EXTERNAL (new_fndecl) = 1;
25351   DECL_IS_NOVOPS (new_fndecl) = 1;
25352   TREE_READONLY (new_fndecl) = 1;
25353
25354   return new_fndecl;
25355 }
25356
25357
25358 /* Returns a decl of a function that implements conversion of an integer vector
25359    into a floating-point vector, or vice-versa. TYPE is the type of the integer
25360    side of the conversion.
25361    Return NULL_TREE if it is not available.  */
25362
25363 static tree
25364 ix86_vectorize_builtin_conversion (unsigned int code, tree type)
25365 {
25366   if (!TARGET_SSE2 || TREE_CODE (type) != VECTOR_TYPE
25367       /* There are only conversions from/to signed integers.  */
25368       || TYPE_UNSIGNED (TREE_TYPE (type)))
25369     return NULL_TREE;
25370
25371   switch (code)
25372     {
25373     case FLOAT_EXPR:
25374       switch (TYPE_MODE (type))
25375         {
25376         case V4SImode:
25377           return ix86_builtins[IX86_BUILTIN_CVTDQ2PS];
25378         default:
25379           return NULL_TREE;
25380         }
25381
25382     case FIX_TRUNC_EXPR:
25383       switch (TYPE_MODE (type))
25384         {
25385         case V4SImode:
25386           return ix86_builtins[IX86_BUILTIN_CVTTPS2DQ];
25387         default:
25388           return NULL_TREE;
25389         }
25390     default:
25391       return NULL_TREE;
25392
25393     }
25394 }
25395
25396 /* Returns a code for a target-specific builtin that implements
25397    reciprocal of the function, or NULL_TREE if not available.  */
25398
25399 static tree
25400 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
25401                          bool sqrt ATTRIBUTE_UNUSED)
25402 {
25403   if (! (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
25404          && flag_finite_math_only && !flag_trapping_math
25405          && flag_unsafe_math_optimizations))
25406     return NULL_TREE;
25407
25408   if (md_fn)
25409     /* Machine dependent builtins.  */
25410     switch (fn)
25411       {
25412         /* Vectorized version of sqrt to rsqrt conversion.  */
25413       case IX86_BUILTIN_SQRTPS_NR:
25414         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
25415
25416       default:
25417         return NULL_TREE;
25418       }
25419   else
25420     /* Normal builtins.  */
25421     switch (fn)
25422       {
25423         /* Sqrt to rsqrt conversion.  */
25424       case BUILT_IN_SQRTF:
25425         return ix86_builtins[IX86_BUILTIN_RSQRTF];
25426
25427       default:
25428         return NULL_TREE;
25429       }
25430 }
25431
25432 /* Store OPERAND to the memory after reload is completed.  This means
25433    that we can't easily use assign_stack_local.  */
25434 rtx
25435 ix86_force_to_memory (enum machine_mode mode, rtx operand)
25436 {
25437   rtx result;
25438
25439   gcc_assert (reload_completed);
25440   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE)
25441     {
25442       result = gen_rtx_MEM (mode,
25443                             gen_rtx_PLUS (Pmode,
25444                                           stack_pointer_rtx,
25445                                           GEN_INT (-RED_ZONE_SIZE)));
25446       emit_move_insn (result, operand);
25447     }
25448   else if ((TARGET_64BIT_MS_ABI || !TARGET_RED_ZONE) && TARGET_64BIT)
25449     {
25450       switch (mode)
25451         {
25452         case HImode:
25453         case SImode:
25454           operand = gen_lowpart (DImode, operand);
25455           /* FALLTHRU */
25456         case DImode:
25457           emit_insn (
25458                       gen_rtx_SET (VOIDmode,
25459                                    gen_rtx_MEM (DImode,
25460                                                 gen_rtx_PRE_DEC (DImode,
25461                                                         stack_pointer_rtx)),
25462                                    operand));
25463           break;
25464         default:
25465           gcc_unreachable ();
25466         }
25467       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25468     }
25469   else
25470     {
25471       switch (mode)
25472         {
25473         case DImode:
25474           {
25475             rtx operands[2];
25476             split_di (&operand, 1, operands, operands + 1);
25477             emit_insn (
25478                         gen_rtx_SET (VOIDmode,
25479                                      gen_rtx_MEM (SImode,
25480                                                   gen_rtx_PRE_DEC (Pmode,
25481                                                         stack_pointer_rtx)),
25482                                      operands[1]));
25483             emit_insn (
25484                         gen_rtx_SET (VOIDmode,
25485                                      gen_rtx_MEM (SImode,
25486                                                   gen_rtx_PRE_DEC (Pmode,
25487                                                         stack_pointer_rtx)),
25488                                      operands[0]));
25489           }
25490           break;
25491         case HImode:
25492           /* Store HImodes as SImodes.  */
25493           operand = gen_lowpart (SImode, operand);
25494           /* FALLTHRU */
25495         case SImode:
25496           emit_insn (
25497                       gen_rtx_SET (VOIDmode,
25498                                    gen_rtx_MEM (GET_MODE (operand),
25499                                                 gen_rtx_PRE_DEC (SImode,
25500                                                         stack_pointer_rtx)),
25501                                    operand));
25502           break;
25503         default:
25504           gcc_unreachable ();
25505         }
25506       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25507     }
25508   return result;
25509 }
25510
25511 /* Free operand from the memory.  */
25512 void
25513 ix86_free_from_memory (enum machine_mode mode)
25514 {
25515   if (!TARGET_RED_ZONE || TARGET_64BIT_MS_ABI)
25516     {
25517       int size;
25518
25519       if (mode == DImode || TARGET_64BIT)
25520         size = 8;
25521       else
25522         size = 4;
25523       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
25524          to pop or add instruction if registers are available.  */
25525       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
25526                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
25527                                             GEN_INT (size))));
25528     }
25529 }
25530
25531 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
25532    QImode must go into class Q_REGS.
25533    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
25534    movdf to do mem-to-mem moves through integer regs.  */
25535 enum reg_class
25536 ix86_preferred_reload_class (rtx x, enum reg_class regclass)
25537 {
25538   enum machine_mode mode = GET_MODE (x);
25539
25540   /* We're only allowed to return a subclass of CLASS.  Many of the
25541      following checks fail for NO_REGS, so eliminate that early.  */
25542   if (regclass == NO_REGS)
25543     return NO_REGS;
25544
25545   /* All classes can load zeros.  */
25546   if (x == CONST0_RTX (mode))
25547     return regclass;
25548
25549   /* Force constants into memory if we are loading a (nonzero) constant into
25550      an MMX or SSE register.  This is because there are no MMX/SSE instructions
25551      to load from a constant.  */
25552   if (CONSTANT_P (x)
25553       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
25554     return NO_REGS;
25555
25556   /* Prefer SSE regs only, if we can use them for math.  */
25557   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
25558     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
25559
25560   /* Floating-point constants need more complex checks.  */
25561   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
25562     {
25563       /* General regs can load everything.  */
25564       if (reg_class_subset_p (regclass, GENERAL_REGS))
25565         return regclass;
25566
25567       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
25568          zero above.  We only want to wind up preferring 80387 registers if
25569          we plan on doing computation with them.  */
25570       if (TARGET_80387
25571           && standard_80387_constant_p (x))
25572         {
25573           /* Limit class to non-sse.  */
25574           if (regclass == FLOAT_SSE_REGS)
25575             return FLOAT_REGS;
25576           if (regclass == FP_TOP_SSE_REGS)
25577             return FP_TOP_REG;
25578           if (regclass == FP_SECOND_SSE_REGS)
25579             return FP_SECOND_REG;
25580           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
25581             return regclass;
25582         }
25583
25584       return NO_REGS;
25585     }
25586
25587   /* Generally when we see PLUS here, it's the function invariant
25588      (plus soft-fp const_int).  Which can only be computed into general
25589      regs.  */
25590   if (GET_CODE (x) == PLUS)
25591     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
25592
25593   /* QImode constants are easy to load, but non-constant QImode data
25594      must go into Q_REGS.  */
25595   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
25596     {
25597       if (reg_class_subset_p (regclass, Q_REGS))
25598         return regclass;
25599       if (reg_class_subset_p (Q_REGS, regclass))
25600         return Q_REGS;
25601       return NO_REGS;
25602     }
25603
25604   return regclass;
25605 }
25606
25607 /* Discourage putting floating-point values in SSE registers unless
25608    SSE math is being used, and likewise for the 387 registers.  */
25609 enum reg_class
25610 ix86_preferred_output_reload_class (rtx x, enum reg_class regclass)
25611 {
25612   enum machine_mode mode = GET_MODE (x);
25613
25614   /* Restrict the output reload class to the register bank that we are doing
25615      math on.  If we would like not to return a subset of CLASS, reject this
25616      alternative: if reload cannot do this, it will still use its choice.  */
25617   mode = GET_MODE (x);
25618   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
25619     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
25620
25621   if (X87_FLOAT_MODE_P (mode))
25622     {
25623       if (regclass == FP_TOP_SSE_REGS)
25624         return FP_TOP_REG;
25625       else if (regclass == FP_SECOND_SSE_REGS)
25626         return FP_SECOND_REG;
25627       else
25628         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
25629     }
25630
25631   return regclass;
25632 }
25633
25634 static enum reg_class
25635 ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
25636                        enum machine_mode mode,
25637                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
25638 {
25639   /* QImode spills from non-QI registers require
25640      intermediate register on 32bit targets.  */
25641   if (!TARGET_64BIT
25642       && !in_p && mode == QImode
25643       && (rclass == GENERAL_REGS
25644           || rclass == LEGACY_REGS
25645           || rclass == INDEX_REGS))
25646     {
25647       int regno;
25648
25649       if (REG_P (x))
25650         regno = REGNO (x);
25651       else
25652         regno = -1;
25653
25654       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
25655         regno = true_regnum (x);
25656
25657       /* Return Q_REGS if the operand is in memory.  */
25658       if (regno == -1)
25659         return Q_REGS;
25660     }
25661
25662   /* This condition handles corner case where an expression involving
25663      pointers gets vectorized.  We're trying to use the address of a
25664      stack slot as a vector initializer.  
25665
25666      (set (reg:V2DI 74 [ vect_cst_.2 ])
25667           (vec_duplicate:V2DI (reg/f:DI 20 frame)))
25668
25669      Eventually frame gets turned into sp+offset like this:
25670
25671      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
25672           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
25673                                        (const_int 392 [0x188]))))
25674
25675      That later gets turned into:
25676
25677      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
25678           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
25679             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))))
25680
25681      We'll have the following reload recorded:
25682
25683      Reload 0: reload_in (DI) =
25684            (plus:DI (reg/f:DI 7 sp)
25685             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))
25686      reload_out (V2DI) = (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
25687      SSE_REGS, RELOAD_OTHER (opnum = 0), can't combine
25688      reload_in_reg: (plus:DI (reg/f:DI 7 sp) (const_int 392 [0x188]))
25689      reload_out_reg: (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
25690      reload_reg_rtx: (reg:V2DI 22 xmm1)
25691
25692      Which isn't going to work since SSE instructions can't handle scalar
25693      additions.  Returning GENERAL_REGS forces the addition into integer
25694      register and reload can handle subsequent reloads without problems.  */
25695
25696   if (in_p && GET_CODE (x) == PLUS
25697       && SSE_CLASS_P (rclass)
25698       && SCALAR_INT_MODE_P (mode))
25699     return GENERAL_REGS;
25700
25701   return NO_REGS;
25702 }
25703
25704 /* If we are copying between general and FP registers, we need a memory
25705    location. The same is true for SSE and MMX registers.
25706
25707    To optimize register_move_cost performance, allow inline variant.
25708
25709    The macro can't work reliably when one of the CLASSES is class containing
25710    registers from multiple units (SSE, MMX, integer).  We avoid this by never
25711    combining those units in single alternative in the machine description.
25712    Ensure that this constraint holds to avoid unexpected surprises.
25713
25714    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
25715    enforce these sanity checks.  */
25716
25717 static inline int
25718 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25719                               enum machine_mode mode, int strict)
25720 {
25721   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
25722       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
25723       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
25724       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
25725       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
25726       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
25727     {
25728       gcc_assert (!strict);
25729       return true;
25730     }
25731
25732   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
25733     return true;
25734
25735   /* ??? This is a lie.  We do have moves between mmx/general, and for
25736      mmx/sse2.  But by saying we need secondary memory we discourage the
25737      register allocator from using the mmx registers unless needed.  */
25738   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
25739     return true;
25740
25741   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25742     {
25743       /* SSE1 doesn't have any direct moves from other classes.  */
25744       if (!TARGET_SSE2)
25745         return true;
25746
25747       /* If the target says that inter-unit moves are more expensive
25748          than moving through memory, then don't generate them.  */
25749       if (!TARGET_INTER_UNIT_MOVES)
25750         return true;
25751
25752       /* Between SSE and general, we have moves no larger than word size.  */
25753       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
25754         return true;
25755     }
25756
25757   return false;
25758 }
25759
25760 int
25761 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25762                               enum machine_mode mode, int strict)
25763 {
25764   return inline_secondary_memory_needed (class1, class2, mode, strict);
25765 }
25766
25767 /* Return true if the registers in CLASS cannot represent the change from
25768    modes FROM to TO.  */
25769
25770 bool
25771 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
25772                                enum reg_class regclass)
25773 {
25774   if (from == to)
25775     return false;
25776
25777   /* x87 registers can't do subreg at all, as all values are reformatted
25778      to extended precision.  */
25779   if (MAYBE_FLOAT_CLASS_P (regclass))
25780     return true;
25781
25782   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
25783     {
25784       /* Vector registers do not support QI or HImode loads.  If we don't
25785          disallow a change to these modes, reload will assume it's ok to
25786          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
25787          the vec_dupv4hi pattern.  */
25788       if (GET_MODE_SIZE (from) < 4)
25789         return true;
25790
25791       /* Vector registers do not support subreg with nonzero offsets, which
25792          are otherwise valid for integer registers.  Since we can't see
25793          whether we have a nonzero offset from here, prohibit all
25794          nonparadoxical subregs changing size.  */
25795       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
25796         return true;
25797     }
25798
25799   return false;
25800 }
25801
25802 /* Return the cost of moving data of mode M between a
25803    register and memory.  A value of 2 is the default; this cost is
25804    relative to those in `REGISTER_MOVE_COST'.
25805
25806    This function is used extensively by register_move_cost that is used to
25807    build tables at startup.  Make it inline in this case.
25808    When IN is 2, return maximum of in and out move cost.
25809
25810    If moving between registers and memory is more expensive than
25811    between two registers, you should define this macro to express the
25812    relative cost.
25813
25814    Model also increased moving costs of QImode registers in non
25815    Q_REGS classes.
25816  */
25817 static inline int
25818 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
25819                          int in)
25820 {
25821   int cost;
25822   if (FLOAT_CLASS_P (regclass))
25823     {
25824       int index;
25825       switch (mode)
25826         {
25827           case SFmode:
25828             index = 0;
25829             break;
25830           case DFmode:
25831             index = 1;
25832             break;
25833           case XFmode:
25834             index = 2;
25835             break;
25836           default:
25837             return 100;
25838         }
25839       if (in == 2)
25840         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
25841       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
25842     }
25843   if (SSE_CLASS_P (regclass))
25844     {
25845       int index;
25846       switch (GET_MODE_SIZE (mode))
25847         {
25848           case 4:
25849             index = 0;
25850             break;
25851           case 8:
25852             index = 1;
25853             break;
25854           case 16:
25855             index = 2;
25856             break;
25857           default:
25858             return 100;
25859         }
25860       if (in == 2)
25861         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
25862       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
25863     }
25864   if (MMX_CLASS_P (regclass))
25865     {
25866       int index;
25867       switch (GET_MODE_SIZE (mode))
25868         {
25869           case 4:
25870             index = 0;
25871             break;
25872           case 8:
25873             index = 1;
25874             break;
25875           default:
25876             return 100;
25877         }
25878       if (in)
25879         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
25880       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
25881     }
25882   switch (GET_MODE_SIZE (mode))
25883     {
25884       case 1:
25885         if (Q_CLASS_P (regclass) || TARGET_64BIT)
25886           {
25887             if (!in)
25888               return ix86_cost->int_store[0];
25889             if (TARGET_PARTIAL_REG_DEPENDENCY
25890                 && optimize_function_for_speed_p (cfun))
25891               cost = ix86_cost->movzbl_load;
25892             else
25893               cost = ix86_cost->int_load[0];
25894             if (in == 2)
25895               return MAX (cost, ix86_cost->int_store[0]);
25896             return cost;
25897           }
25898         else
25899           {
25900            if (in == 2)
25901              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
25902            if (in)
25903              return ix86_cost->movzbl_load;
25904            else
25905              return ix86_cost->int_store[0] + 4;
25906           }
25907         break;
25908       case 2:
25909         if (in == 2)
25910           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
25911         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
25912       default:
25913         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
25914         if (mode == TFmode)
25915           mode = XFmode;
25916         if (in == 2)
25917           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
25918         else if (in)
25919           cost = ix86_cost->int_load[2];
25920         else
25921           cost = ix86_cost->int_store[2];
25922         return (cost * (((int) GET_MODE_SIZE (mode)
25923                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
25924     }
25925 }
25926
25927 int
25928 ix86_memory_move_cost (enum machine_mode mode, enum reg_class regclass, int in)
25929 {
25930   return inline_memory_move_cost (mode, regclass, in);
25931 }
25932
25933
25934 /* Return the cost of moving data from a register in class CLASS1 to
25935    one in class CLASS2.
25936
25937    It is not required that the cost always equal 2 when FROM is the same as TO;
25938    on some machines it is expensive to move between registers if they are not
25939    general registers.  */
25940
25941 int
25942 ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
25943                          enum reg_class class2)
25944 {
25945   /* In case we require secondary memory, compute cost of the store followed
25946      by load.  In order to avoid bad register allocation choices, we need
25947      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
25948
25949   if (inline_secondary_memory_needed (class1, class2, mode, 0))
25950     {
25951       int cost = 1;
25952
25953       cost += inline_memory_move_cost (mode, class1, 2);
25954       cost += inline_memory_move_cost (mode, class2, 2);
25955
25956       /* In case of copying from general_purpose_register we may emit multiple
25957          stores followed by single load causing memory size mismatch stall.
25958          Count this as arbitrarily high cost of 20.  */
25959       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
25960         cost += 20;
25961
25962       /* In the case of FP/MMX moves, the registers actually overlap, and we
25963          have to switch modes in order to treat them differently.  */
25964       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
25965           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
25966         cost += 20;
25967
25968       return cost;
25969     }
25970
25971   /* Moves between SSE/MMX and integer unit are expensive.  */
25972   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
25973       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25974
25975     /* ??? By keeping returned value relatively high, we limit the number
25976        of moves between integer and MMX/SSE registers for all targets.
25977        Additionally, high value prevents problem with x86_modes_tieable_p(),
25978        where integer modes in MMX/SSE registers are not tieable
25979        because of missing QImode and HImode moves to, from or between
25980        MMX/SSE registers.  */
25981     return MAX (8, ix86_cost->mmxsse_to_integer);
25982
25983   if (MAYBE_FLOAT_CLASS_P (class1))
25984     return ix86_cost->fp_move;
25985   if (MAYBE_SSE_CLASS_P (class1))
25986     return ix86_cost->sse_move;
25987   if (MAYBE_MMX_CLASS_P (class1))
25988     return ix86_cost->mmx_move;
25989   return 2;
25990 }
25991
25992 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
25993
25994 bool
25995 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
25996 {
25997   /* Flags and only flags can only hold CCmode values.  */
25998   if (CC_REGNO_P (regno))
25999     return GET_MODE_CLASS (mode) == MODE_CC;
26000   if (GET_MODE_CLASS (mode) == MODE_CC
26001       || GET_MODE_CLASS (mode) == MODE_RANDOM
26002       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
26003     return 0;
26004   if (FP_REGNO_P (regno))
26005     return VALID_FP_MODE_P (mode);
26006   if (SSE_REGNO_P (regno))
26007     {
26008       /* We implement the move patterns for all vector modes into and
26009          out of SSE registers, even when no operation instructions
26010          are available.  OImode move is available only when AVX is
26011          enabled.  */
26012       return ((TARGET_AVX && mode == OImode)
26013               || VALID_AVX256_REG_MODE (mode)
26014               || VALID_SSE_REG_MODE (mode)
26015               || VALID_SSE2_REG_MODE (mode)
26016               || VALID_MMX_REG_MODE (mode)
26017               || VALID_MMX_REG_MODE_3DNOW (mode));
26018     }
26019   if (MMX_REGNO_P (regno))
26020     {
26021       /* We implement the move patterns for 3DNOW modes even in MMX mode,
26022          so if the register is available at all, then we can move data of
26023          the given mode into or out of it.  */
26024       return (VALID_MMX_REG_MODE (mode)
26025               || VALID_MMX_REG_MODE_3DNOW (mode));
26026     }
26027
26028   if (mode == QImode)
26029     {
26030       /* Take care for QImode values - they can be in non-QI regs,
26031          but then they do cause partial register stalls.  */
26032       if (regno <= BX_REG || TARGET_64BIT)
26033         return 1;
26034       if (!TARGET_PARTIAL_REG_STALL)
26035         return 1;
26036       return reload_in_progress || reload_completed;
26037     }
26038   /* We handle both integer and floats in the general purpose registers.  */
26039   else if (VALID_INT_MODE_P (mode))
26040     return 1;
26041   else if (VALID_FP_MODE_P (mode))
26042     return 1;
26043   else if (VALID_DFP_MODE_P (mode))
26044     return 1;
26045   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
26046      on to use that value in smaller contexts, this can easily force a
26047      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
26048      supporting DImode, allow it.  */
26049   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
26050     return 1;
26051
26052   return 0;
26053 }
26054
26055 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
26056    tieable integer mode.  */
26057
26058 static bool
26059 ix86_tieable_integer_mode_p (enum machine_mode mode)
26060 {
26061   switch (mode)
26062     {
26063     case HImode:
26064     case SImode:
26065       return true;
26066
26067     case QImode:
26068       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
26069
26070     case DImode:
26071       return TARGET_64BIT;
26072
26073     default:
26074       return false;
26075     }
26076 }
26077
26078 /* Return true if MODE1 is accessible in a register that can hold MODE2
26079    without copying.  That is, all register classes that can hold MODE2
26080    can also hold MODE1.  */
26081
26082 bool
26083 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
26084 {
26085   if (mode1 == mode2)
26086     return true;
26087
26088   if (ix86_tieable_integer_mode_p (mode1)
26089       && ix86_tieable_integer_mode_p (mode2))
26090     return true;
26091
26092   /* MODE2 being XFmode implies fp stack or general regs, which means we
26093      can tie any smaller floating point modes to it.  Note that we do not
26094      tie this with TFmode.  */
26095   if (mode2 == XFmode)
26096     return mode1 == SFmode || mode1 == DFmode;
26097
26098   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
26099      that we can tie it with SFmode.  */
26100   if (mode2 == DFmode)
26101     return mode1 == SFmode;
26102
26103   /* If MODE2 is only appropriate for an SSE register, then tie with
26104      any other mode acceptable to SSE registers.  */
26105   if (GET_MODE_SIZE (mode2) == 16
26106       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
26107     return (GET_MODE_SIZE (mode1) == 16
26108             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
26109
26110   /* If MODE2 is appropriate for an MMX register, then tie
26111      with any other mode acceptable to MMX registers.  */
26112   if (GET_MODE_SIZE (mode2) == 8
26113       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
26114     return (GET_MODE_SIZE (mode1) == 8
26115             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
26116
26117   return false;
26118 }
26119
26120 /* Compute a (partial) cost for rtx X.  Return true if the complete
26121    cost has been computed, and false if subexpressions should be
26122    scanned.  In either case, *TOTAL contains the cost result.  */
26123
26124 static bool
26125 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
26126 {
26127   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
26128   enum machine_mode mode = GET_MODE (x);
26129   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
26130
26131   switch (code)
26132     {
26133     case CONST_INT:
26134     case CONST:
26135     case LABEL_REF:
26136     case SYMBOL_REF:
26137       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
26138         *total = 3;
26139       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
26140         *total = 2;
26141       else if (flag_pic && SYMBOLIC_CONST (x)
26142                && (!TARGET_64BIT
26143                    || (!GET_CODE (x) != LABEL_REF
26144                        && (GET_CODE (x) != SYMBOL_REF
26145                            || !SYMBOL_REF_LOCAL_P (x)))))
26146         *total = 1;
26147       else
26148         *total = 0;
26149       return true;
26150
26151     case CONST_DOUBLE:
26152       if (mode == VOIDmode)
26153         *total = 0;
26154       else
26155         switch (standard_80387_constant_p (x))
26156           {
26157           case 1: /* 0.0 */
26158             *total = 1;
26159             break;
26160           default: /* Other constants */
26161             *total = 2;
26162             break;
26163           case 0:
26164           case -1:
26165             /* Start with (MEM (SYMBOL_REF)), since that's where
26166                it'll probably end up.  Add a penalty for size.  */
26167             *total = (COSTS_N_INSNS (1)
26168                       + (flag_pic != 0 && !TARGET_64BIT)
26169                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
26170             break;
26171           }
26172       return true;
26173
26174     case ZERO_EXTEND:
26175       /* The zero extensions is often completely free on x86_64, so make
26176          it as cheap as possible.  */
26177       if (TARGET_64BIT && mode == DImode
26178           && GET_MODE (XEXP (x, 0)) == SImode)
26179         *total = 1;
26180       else if (TARGET_ZERO_EXTEND_WITH_AND)
26181         *total = cost->add;
26182       else
26183         *total = cost->movzx;
26184       return false;
26185
26186     case SIGN_EXTEND:
26187       *total = cost->movsx;
26188       return false;
26189
26190     case ASHIFT:
26191       if (CONST_INT_P (XEXP (x, 1))
26192           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
26193         {
26194           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
26195           if (value == 1)
26196             {
26197               *total = cost->add;
26198               return false;
26199             }
26200           if ((value == 2 || value == 3)
26201               && cost->lea <= cost->shift_const)
26202             {
26203               *total = cost->lea;
26204               return false;
26205             }
26206         }
26207       /* FALLTHRU */
26208
26209     case ROTATE:
26210     case ASHIFTRT:
26211     case LSHIFTRT:
26212     case ROTATERT:
26213       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
26214         {
26215           if (CONST_INT_P (XEXP (x, 1)))
26216             {
26217               if (INTVAL (XEXP (x, 1)) > 32)
26218                 *total = cost->shift_const + COSTS_N_INSNS (2);
26219               else
26220                 *total = cost->shift_const * 2;
26221             }
26222           else
26223             {
26224               if (GET_CODE (XEXP (x, 1)) == AND)
26225                 *total = cost->shift_var * 2;
26226               else
26227                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
26228             }
26229         }
26230       else
26231         {
26232           if (CONST_INT_P (XEXP (x, 1)))
26233             *total = cost->shift_const;
26234           else
26235             *total = cost->shift_var;
26236         }
26237       return false;
26238
26239     case MULT:
26240       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26241         {
26242           /* ??? SSE scalar cost should be used here.  */
26243           *total = cost->fmul;
26244           return false;
26245         }
26246       else if (X87_FLOAT_MODE_P (mode))
26247         {
26248           *total = cost->fmul;
26249           return false;
26250         }
26251       else if (FLOAT_MODE_P (mode))
26252         {
26253           /* ??? SSE vector cost should be used here.  */
26254           *total = cost->fmul;
26255           return false;
26256         }
26257       else
26258         {
26259           rtx op0 = XEXP (x, 0);
26260           rtx op1 = XEXP (x, 1);
26261           int nbits;
26262           if (CONST_INT_P (XEXP (x, 1)))
26263             {
26264               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
26265               for (nbits = 0; value != 0; value &= value - 1)
26266                 nbits++;
26267             }
26268           else
26269             /* This is arbitrary.  */
26270             nbits = 7;
26271
26272           /* Compute costs correctly for widening multiplication.  */
26273           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
26274               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
26275                  == GET_MODE_SIZE (mode))
26276             {
26277               int is_mulwiden = 0;
26278               enum machine_mode inner_mode = GET_MODE (op0);
26279
26280               if (GET_CODE (op0) == GET_CODE (op1))
26281                 is_mulwiden = 1, op1 = XEXP (op1, 0);
26282               else if (CONST_INT_P (op1))
26283                 {
26284                   if (GET_CODE (op0) == SIGN_EXTEND)
26285                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
26286                                   == INTVAL (op1);
26287                   else
26288                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
26289                 }
26290
26291               if (is_mulwiden)
26292                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
26293             }
26294
26295           *total = (cost->mult_init[MODE_INDEX (mode)]
26296                     + nbits * cost->mult_bit
26297                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
26298
26299           return true;
26300         }
26301
26302     case DIV:
26303     case UDIV:
26304     case MOD:
26305     case UMOD:
26306       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26307         /* ??? SSE cost should be used here.  */
26308         *total = cost->fdiv;
26309       else if (X87_FLOAT_MODE_P (mode))
26310         *total = cost->fdiv;
26311       else if (FLOAT_MODE_P (mode))
26312         /* ??? SSE vector cost should be used here.  */
26313         *total = cost->fdiv;
26314       else
26315         *total = cost->divide[MODE_INDEX (mode)];
26316       return false;
26317
26318     case PLUS:
26319       if (GET_MODE_CLASS (mode) == MODE_INT
26320                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
26321         {
26322           if (GET_CODE (XEXP (x, 0)) == PLUS
26323               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
26324               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
26325               && CONSTANT_P (XEXP (x, 1)))
26326             {
26327               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
26328               if (val == 2 || val == 4 || val == 8)
26329                 {
26330                   *total = cost->lea;
26331                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26332                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
26333                                       outer_code, speed);
26334                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26335                   return true;
26336                 }
26337             }
26338           else if (GET_CODE (XEXP (x, 0)) == MULT
26339                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
26340             {
26341               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
26342               if (val == 2 || val == 4 || val == 8)
26343                 {
26344                   *total = cost->lea;
26345                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26346                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26347                   return true;
26348                 }
26349             }
26350           else if (GET_CODE (XEXP (x, 0)) == PLUS)
26351             {
26352               *total = cost->lea;
26353               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26354               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26355               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26356               return true;
26357             }
26358         }
26359       /* FALLTHRU */
26360
26361     case MINUS:
26362       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26363         {
26364           /* ??? SSE cost should be used here.  */
26365           *total = cost->fadd;
26366           return false;
26367         }
26368       else if (X87_FLOAT_MODE_P (mode))
26369         {
26370           *total = cost->fadd;
26371           return false;
26372         }
26373       else if (FLOAT_MODE_P (mode))
26374         {
26375           /* ??? SSE vector cost should be used here.  */
26376           *total = cost->fadd;
26377           return false;
26378         }
26379       /* FALLTHRU */
26380
26381     case AND:
26382     case IOR:
26383     case XOR:
26384       if (!TARGET_64BIT && mode == DImode)
26385         {
26386           *total = (cost->add * 2
26387                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
26388                        << (GET_MODE (XEXP (x, 0)) != DImode))
26389                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
26390                        << (GET_MODE (XEXP (x, 1)) != DImode)));
26391           return true;
26392         }
26393       /* FALLTHRU */
26394
26395     case NEG:
26396       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26397         {
26398           /* ??? SSE cost should be used here.  */
26399           *total = cost->fchs;
26400           return false;
26401         }
26402       else if (X87_FLOAT_MODE_P (mode))
26403         {
26404           *total = cost->fchs;
26405           return false;
26406         }
26407       else if (FLOAT_MODE_P (mode))
26408         {
26409           /* ??? SSE vector cost should be used here.  */
26410           *total = cost->fchs;
26411           return false;
26412         }
26413       /* FALLTHRU */
26414
26415     case NOT:
26416       if (!TARGET_64BIT && mode == DImode)
26417         *total = cost->add * 2;
26418       else
26419         *total = cost->add;
26420       return false;
26421
26422     case COMPARE:
26423       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
26424           && XEXP (XEXP (x, 0), 1) == const1_rtx
26425           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
26426           && XEXP (x, 1) == const0_rtx)
26427         {
26428           /* This kind of construct is implemented using test[bwl].
26429              Treat it as if we had an AND.  */
26430           *total = (cost->add
26431                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
26432                     + rtx_cost (const1_rtx, outer_code, speed));
26433           return true;
26434         }
26435       return false;
26436
26437     case FLOAT_EXTEND:
26438       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
26439         *total = 0;
26440       return false;
26441
26442     case ABS:
26443       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26444         /* ??? SSE cost should be used here.  */
26445         *total = cost->fabs;
26446       else if (X87_FLOAT_MODE_P (mode))
26447         *total = cost->fabs;
26448       else if (FLOAT_MODE_P (mode))
26449         /* ??? SSE vector cost should be used here.  */
26450         *total = cost->fabs;
26451       return false;
26452
26453     case SQRT:
26454       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26455         /* ??? SSE cost should be used here.  */
26456         *total = cost->fsqrt;
26457       else if (X87_FLOAT_MODE_P (mode))
26458         *total = cost->fsqrt;
26459       else if (FLOAT_MODE_P (mode))
26460         /* ??? SSE vector cost should be used here.  */
26461         *total = cost->fsqrt;
26462       return false;
26463
26464     case UNSPEC:
26465       if (XINT (x, 1) == UNSPEC_TP)
26466         *total = 0;
26467       return false;
26468
26469     default:
26470       return false;
26471     }
26472 }
26473
26474 #if TARGET_MACHO
26475
26476 static int current_machopic_label_num;
26477
26478 /* Given a symbol name and its associated stub, write out the
26479    definition of the stub.  */
26480
26481 void
26482 machopic_output_stub (FILE *file, const char *symb, const char *stub)
26483 {
26484   unsigned int length;
26485   char *binder_name, *symbol_name, lazy_ptr_name[32];
26486   int label = ++current_machopic_label_num;
26487
26488   /* For 64-bit we shouldn't get here.  */
26489   gcc_assert (!TARGET_64BIT);
26490
26491   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
26492   symb = (*targetm.strip_name_encoding) (symb);
26493
26494   length = strlen (stub);
26495   binder_name = XALLOCAVEC (char, length + 32);
26496   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
26497
26498   length = strlen (symb);
26499   symbol_name = XALLOCAVEC (char, length + 32);
26500   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
26501
26502   sprintf (lazy_ptr_name, "L%d$lz", label);
26503
26504   if (MACHOPIC_PURE)
26505     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
26506   else
26507     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
26508
26509   fprintf (file, "%s:\n", stub);
26510   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26511
26512   if (MACHOPIC_PURE)
26513     {
26514       fprintf (file, "\tcall\tLPC$%d\nLPC$%d:\tpopl\t%%eax\n", label, label);
26515       fprintf (file, "\tmovl\t%s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
26516       fprintf (file, "\tjmp\t*%%edx\n");
26517     }
26518   else
26519     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
26520
26521   fprintf (file, "%s:\n", binder_name);
26522
26523   if (MACHOPIC_PURE)
26524     {
26525       fprintf (file, "\tlea\t%s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
26526       fprintf (file, "\tpushl\t%%eax\n");
26527     }
26528   else
26529     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
26530
26531   fprintf (file, "\tjmp\tdyld_stub_binding_helper\n");
26532
26533   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
26534   fprintf (file, "%s:\n", lazy_ptr_name);
26535   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26536   fprintf (file, "\t.long %s\n", binder_name);
26537 }
26538
26539 void
26540 darwin_x86_file_end (void)
26541 {
26542   darwin_file_end ();
26543   ix86_file_end ();
26544 }
26545 #endif /* TARGET_MACHO */
26546
26547 /* Order the registers for register allocator.  */
26548
26549 void
26550 x86_order_regs_for_local_alloc (void)
26551 {
26552    int pos = 0;
26553    int i;
26554
26555    /* First allocate the local general purpose registers.  */
26556    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26557      if (GENERAL_REGNO_P (i) && call_used_regs[i])
26558         reg_alloc_order [pos++] = i;
26559
26560    /* Global general purpose registers.  */
26561    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26562      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
26563         reg_alloc_order [pos++] = i;
26564
26565    /* x87 registers come first in case we are doing FP math
26566       using them.  */
26567    if (!TARGET_SSE_MATH)
26568      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26569        reg_alloc_order [pos++] = i;
26570
26571    /* SSE registers.  */
26572    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
26573      reg_alloc_order [pos++] = i;
26574    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
26575      reg_alloc_order [pos++] = i;
26576
26577    /* x87 registers.  */
26578    if (TARGET_SSE_MATH)
26579      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26580        reg_alloc_order [pos++] = i;
26581
26582    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
26583      reg_alloc_order [pos++] = i;
26584
26585    /* Initialize the rest of array as we do not allocate some registers
26586       at all.  */
26587    while (pos < FIRST_PSEUDO_REGISTER)
26588      reg_alloc_order [pos++] = 0;
26589 }
26590
26591 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
26592    struct attribute_spec.handler.  */
26593 static tree
26594 ix86_handle_abi_attribute (tree *node, tree name,
26595                               tree args ATTRIBUTE_UNUSED,
26596                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26597 {
26598   if (TREE_CODE (*node) != FUNCTION_TYPE
26599       && TREE_CODE (*node) != METHOD_TYPE
26600       && TREE_CODE (*node) != FIELD_DECL
26601       && TREE_CODE (*node) != TYPE_DECL)
26602     {
26603       warning (OPT_Wattributes, "%qs attribute only applies to functions",
26604                IDENTIFIER_POINTER (name));
26605       *no_add_attrs = true;
26606       return NULL_TREE;
26607     }
26608   if (!TARGET_64BIT)
26609     {
26610       warning (OPT_Wattributes, "%qs attribute only available for 64-bit",
26611                IDENTIFIER_POINTER (name));
26612       *no_add_attrs = true;
26613       return NULL_TREE;
26614     }
26615
26616   /* Can combine regparm with all attributes but fastcall.  */
26617   if (is_attribute_p ("ms_abi", name))
26618     {
26619       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
26620         {
26621           error ("ms_abi and sysv_abi attributes are not compatible");
26622         }
26623
26624       return NULL_TREE;
26625     }
26626   else if (is_attribute_p ("sysv_abi", name))
26627     {
26628       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
26629         {
26630           error ("ms_abi and sysv_abi attributes are not compatible");
26631         }
26632
26633       return NULL_TREE;
26634     }
26635
26636   return NULL_TREE;
26637 }
26638
26639 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
26640    struct attribute_spec.handler.  */
26641 static tree
26642 ix86_handle_struct_attribute (tree *node, tree name,
26643                               tree args ATTRIBUTE_UNUSED,
26644                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26645 {
26646   tree *type = NULL;
26647   if (DECL_P (*node))
26648     {
26649       if (TREE_CODE (*node) == TYPE_DECL)
26650         type = &TREE_TYPE (*node);
26651     }
26652   else
26653     type = node;
26654
26655   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
26656                  || TREE_CODE (*type) == UNION_TYPE)))
26657     {
26658       warning (OPT_Wattributes, "%qs attribute ignored",
26659                IDENTIFIER_POINTER (name));
26660       *no_add_attrs = true;
26661     }
26662
26663   else if ((is_attribute_p ("ms_struct", name)
26664             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
26665            || ((is_attribute_p ("gcc_struct", name)
26666                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
26667     {
26668       warning (OPT_Wattributes, "%qs incompatible attribute ignored",
26669                IDENTIFIER_POINTER (name));
26670       *no_add_attrs = true;
26671     }
26672
26673   return NULL_TREE;
26674 }
26675
26676 static bool
26677 ix86_ms_bitfield_layout_p (const_tree record_type)
26678 {
26679   return (TARGET_MS_BITFIELD_LAYOUT &&
26680           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
26681     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
26682 }
26683
26684 /* Returns an expression indicating where the this parameter is
26685    located on entry to the FUNCTION.  */
26686
26687 static rtx
26688 x86_this_parameter (tree function)
26689 {
26690   tree type = TREE_TYPE (function);
26691   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
26692   int nregs;
26693
26694   if (TARGET_64BIT)
26695     {
26696       const int *parm_regs;
26697
26698       if (ix86_function_type_abi (type) == MS_ABI)
26699         parm_regs = x86_64_ms_abi_int_parameter_registers;
26700       else
26701         parm_regs = x86_64_int_parameter_registers;
26702       return gen_rtx_REG (DImode, parm_regs[aggr]);
26703     }
26704
26705   nregs = ix86_function_regparm (type, function);
26706
26707   if (nregs > 0 && !stdarg_p (type))
26708     {
26709       int regno;
26710
26711       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
26712         regno = aggr ? DX_REG : CX_REG;
26713       else
26714         {
26715           regno = AX_REG;
26716           if (aggr)
26717             {
26718               regno = DX_REG;
26719               if (nregs == 1)
26720                 return gen_rtx_MEM (SImode,
26721                                     plus_constant (stack_pointer_rtx, 4));
26722             }
26723         }
26724       return gen_rtx_REG (SImode, regno);
26725     }
26726
26727   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
26728 }
26729
26730 /* Determine whether x86_output_mi_thunk can succeed.  */
26731
26732 static bool
26733 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
26734                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
26735                          HOST_WIDE_INT vcall_offset, const_tree function)
26736 {
26737   /* 64-bit can handle anything.  */
26738   if (TARGET_64BIT)
26739     return true;
26740
26741   /* For 32-bit, everything's fine if we have one free register.  */
26742   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
26743     return true;
26744
26745   /* Need a free register for vcall_offset.  */
26746   if (vcall_offset)
26747     return false;
26748
26749   /* Need a free register for GOT references.  */
26750   if (flag_pic && !(*targetm.binds_local_p) (function))
26751     return false;
26752
26753   /* Otherwise ok.  */
26754   return true;
26755 }
26756
26757 /* Output the assembler code for a thunk function.  THUNK_DECL is the
26758    declaration for the thunk function itself, FUNCTION is the decl for
26759    the target function.  DELTA is an immediate constant offset to be
26760    added to THIS.  If VCALL_OFFSET is nonzero, the word at
26761    *(*this + vcall_offset) should be added to THIS.  */
26762
26763 static void
26764 x86_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
26765                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
26766                      HOST_WIDE_INT vcall_offset, tree function)
26767 {
26768   rtx xops[3];
26769   rtx this_param = x86_this_parameter (function);
26770   rtx this_reg, tmp;
26771
26772   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
26773      pull it in now and let DELTA benefit.  */
26774   if (REG_P (this_param))
26775     this_reg = this_param;
26776   else if (vcall_offset)
26777     {
26778       /* Put the this parameter into %eax.  */
26779       xops[0] = this_param;
26780       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
26781       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26782     }
26783   else
26784     this_reg = NULL_RTX;
26785
26786   /* Adjust the this parameter by a fixed constant.  */
26787   if (delta)
26788     {
26789       xops[0] = GEN_INT (delta);
26790       xops[1] = this_reg ? this_reg : this_param;
26791       if (TARGET_64BIT)
26792         {
26793           if (!x86_64_general_operand (xops[0], DImode))
26794             {
26795               tmp = gen_rtx_REG (DImode, R10_REG);
26796               xops[1] = tmp;
26797               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
26798               xops[0] = tmp;
26799               xops[1] = this_param;
26800             }
26801           output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
26802         }
26803       else
26804         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
26805     }
26806
26807   /* Adjust the this parameter by a value stored in the vtable.  */
26808   if (vcall_offset)
26809     {
26810       if (TARGET_64BIT)
26811         tmp = gen_rtx_REG (DImode, R10_REG);
26812       else
26813         {
26814           int tmp_regno = CX_REG;
26815           if (lookup_attribute ("fastcall",
26816                                 TYPE_ATTRIBUTES (TREE_TYPE (function))))
26817             tmp_regno = AX_REG;
26818           tmp = gen_rtx_REG (SImode, tmp_regno);
26819         }
26820
26821       xops[0] = gen_rtx_MEM (Pmode, this_reg);
26822       xops[1] = tmp;
26823       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26824
26825       /* Adjust the this parameter.  */
26826       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
26827       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
26828         {
26829           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
26830           xops[0] = GEN_INT (vcall_offset);
26831           xops[1] = tmp2;
26832           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
26833           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
26834         }
26835       xops[1] = this_reg;
26836       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
26837     }
26838
26839   /* If necessary, drop THIS back to its stack slot.  */
26840   if (this_reg && this_reg != this_param)
26841     {
26842       xops[0] = this_reg;
26843       xops[1] = this_param;
26844       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26845     }
26846
26847   xops[0] = XEXP (DECL_RTL (function), 0);
26848   if (TARGET_64BIT)
26849     {
26850       if (!flag_pic || (*targetm.binds_local_p) (function))
26851         output_asm_insn ("jmp\t%P0", xops);
26852       /* All thunks should be in the same object as their target,
26853          and thus binds_local_p should be true.  */
26854       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
26855         gcc_unreachable ();
26856       else
26857         {
26858           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
26859           tmp = gen_rtx_CONST (Pmode, tmp);
26860           tmp = gen_rtx_MEM (QImode, tmp);
26861           xops[0] = tmp;
26862           output_asm_insn ("jmp\t%A0", xops);
26863         }
26864     }
26865   else
26866     {
26867       if (!flag_pic || (*targetm.binds_local_p) (function))
26868         output_asm_insn ("jmp\t%P0", xops);
26869       else
26870 #if TARGET_MACHO
26871         if (TARGET_MACHO)
26872           {
26873             rtx sym_ref = XEXP (DECL_RTL (function), 0);
26874             tmp = (gen_rtx_SYMBOL_REF
26875                    (Pmode,
26876                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
26877             tmp = gen_rtx_MEM (QImode, tmp);
26878             xops[0] = tmp;
26879             output_asm_insn ("jmp\t%0", xops);
26880           }
26881         else
26882 #endif /* TARGET_MACHO */
26883         {
26884           tmp = gen_rtx_REG (SImode, CX_REG);
26885           output_set_got (tmp, NULL_RTX);
26886
26887           xops[1] = tmp;
26888           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
26889           output_asm_insn ("jmp\t{*}%1", xops);
26890         }
26891     }
26892 }
26893
26894 static void
26895 x86_file_start (void)
26896 {
26897   default_file_start ();
26898 #if TARGET_MACHO
26899   darwin_file_start ();
26900 #endif
26901   if (X86_FILE_START_VERSION_DIRECTIVE)
26902     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
26903   if (X86_FILE_START_FLTUSED)
26904     fputs ("\t.global\t__fltused\n", asm_out_file);
26905   if (ix86_asm_dialect == ASM_INTEL)
26906     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
26907 }
26908
26909 int
26910 x86_field_alignment (tree field, int computed)
26911 {
26912   enum machine_mode mode;
26913   tree type = TREE_TYPE (field);
26914
26915   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
26916     return computed;
26917   mode = TYPE_MODE (strip_array_types (type));
26918   if (mode == DFmode || mode == DCmode
26919       || GET_MODE_CLASS (mode) == MODE_INT
26920       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
26921     return MIN (32, computed);
26922   return computed;
26923 }
26924
26925 /* Output assembler code to FILE to increment profiler label # LABELNO
26926    for profiling a function entry.  */
26927 void
26928 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
26929 {
26930   if (TARGET_64BIT)
26931     {
26932 #ifndef NO_PROFILE_COUNTERS
26933       fprintf (file, "\tleaq\t%sP%d(%%rip),%%r11\n", LPREFIX, labelno);
26934 #endif
26935
26936       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
26937         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", MCOUNT_NAME);
26938       else
26939         fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
26940     }
26941   else if (flag_pic)
26942     {
26943 #ifndef NO_PROFILE_COUNTERS
26944       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%%s\n",
26945                LPREFIX, labelno, PROFILE_COUNT_REGISTER);
26946 #endif
26947       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", MCOUNT_NAME);
26948     }
26949   else
26950     {
26951 #ifndef NO_PROFILE_COUNTERS
26952       fprintf (file, "\tmovl\t$%sP%d,%%%s\n", LPREFIX, labelno,
26953                PROFILE_COUNT_REGISTER);
26954 #endif
26955       fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
26956     }
26957 }
26958
26959 /* We don't have exact information about the insn sizes, but we may assume
26960    quite safely that we are informed about all 1 byte insns and memory
26961    address sizes.  This is enough to eliminate unnecessary padding in
26962    99% of cases.  */
26963
26964 static int
26965 min_insn_size (rtx insn)
26966 {
26967   int l = 0;
26968
26969   if (!INSN_P (insn) || !active_insn_p (insn))
26970     return 0;
26971
26972   /* Discard alignments we've emit and jump instructions.  */
26973   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
26974       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
26975     return 0;
26976   if (JUMP_P (insn)
26977       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
26978           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
26979     return 0;
26980
26981   /* Important case - calls are always 5 bytes.
26982      It is common to have many calls in the row.  */
26983   if (CALL_P (insn)
26984       && symbolic_reference_mentioned_p (PATTERN (insn))
26985       && !SIBLING_CALL_P (insn))
26986     return 5;
26987   if (get_attr_length (insn) <= 1)
26988     return 1;
26989
26990   /* For normal instructions we may rely on the sizes of addresses
26991      and the presence of symbol to require 4 bytes of encoding.
26992      This is not the case for jumps where references are PC relative.  */
26993   if (!JUMP_P (insn))
26994     {
26995       l = get_attr_length_address (insn);
26996       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
26997         l = 4;
26998     }
26999   if (l)
27000     return 1+l;
27001   else
27002     return 2;
27003 }
27004
27005 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
27006    window.  */
27007
27008 static void
27009 ix86_avoid_jump_misspredicts (void)
27010 {
27011   rtx insn, start = get_insns ();
27012   int nbytes = 0, njumps = 0;
27013   int isjump = 0;
27014
27015   /* Look for all minimal intervals of instructions containing 4 jumps.
27016      The intervals are bounded by START and INSN.  NBYTES is the total
27017      size of instructions in the interval including INSN and not including
27018      START.  When the NBYTES is smaller than 16 bytes, it is possible
27019      that the end of START and INSN ends up in the same 16byte page.
27020
27021      The smallest offset in the page INSN can start is the case where START
27022      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
27023      We add p2align to 16byte window with maxskip 17 - NBYTES + sizeof (INSN).
27024      */
27025   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
27026     {
27027
27028       nbytes += min_insn_size (insn);
27029       if (dump_file)
27030         fprintf(dump_file, "Insn %i estimated to %i bytes\n",
27031                 INSN_UID (insn), min_insn_size (insn));
27032       if ((JUMP_P (insn)
27033            && GET_CODE (PATTERN (insn)) != ADDR_VEC
27034            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
27035           || CALL_P (insn))
27036         njumps++;
27037       else
27038         continue;
27039
27040       while (njumps > 3)
27041         {
27042           start = NEXT_INSN (start);
27043           if ((JUMP_P (start)
27044                && GET_CODE (PATTERN (start)) != ADDR_VEC
27045                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
27046               || CALL_P (start))
27047             njumps--, isjump = 1;
27048           else
27049             isjump = 0;
27050           nbytes -= min_insn_size (start);
27051         }
27052       gcc_assert (njumps >= 0);
27053       if (dump_file)
27054         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
27055                 INSN_UID (start), INSN_UID (insn), nbytes);
27056
27057       if (njumps == 3 && isjump && nbytes < 16)
27058         {
27059           int padsize = 15 - nbytes + min_insn_size (insn);
27060
27061           if (dump_file)
27062             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
27063                      INSN_UID (insn), padsize);
27064           emit_insn_before (gen_align (GEN_INT (padsize)), insn);
27065         }
27066     }
27067 }
27068
27069 /* AMD Athlon works faster
27070    when RET is not destination of conditional jump or directly preceded
27071    by other jump instruction.  We avoid the penalty by inserting NOP just
27072    before the RET instructions in such cases.  */
27073 static void
27074 ix86_pad_returns (void)
27075 {
27076   edge e;
27077   edge_iterator ei;
27078
27079   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
27080     {
27081       basic_block bb = e->src;
27082       rtx ret = BB_END (bb);
27083       rtx prev;
27084       bool replace = false;
27085
27086       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
27087           || optimize_bb_for_size_p (bb))
27088         continue;
27089       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
27090         if (active_insn_p (prev) || LABEL_P (prev))
27091           break;
27092       if (prev && LABEL_P (prev))
27093         {
27094           edge e;
27095           edge_iterator ei;
27096
27097           FOR_EACH_EDGE (e, ei, bb->preds)
27098             if (EDGE_FREQUENCY (e) && e->src->index >= 0
27099                 && !(e->flags & EDGE_FALLTHRU))
27100               replace = true;
27101         }
27102       if (!replace)
27103         {
27104           prev = prev_active_insn (ret);
27105           if (prev
27106               && ((JUMP_P (prev) && any_condjump_p (prev))
27107                   || CALL_P (prev)))
27108             replace = true;
27109           /* Empty functions get branch mispredict even when the jump destination
27110              is not visible to us.  */
27111           if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
27112             replace = true;
27113         }
27114       if (replace)
27115         {
27116           emit_insn_before (gen_return_internal_long (), ret);
27117           delete_insn (ret);
27118         }
27119     }
27120 }
27121
27122 /* Implement machine specific optimizations.  We implement padding of returns
27123    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
27124 static void
27125 ix86_reorg (void)
27126 {
27127   if (TARGET_PAD_RETURNS && optimize
27128       && optimize_function_for_speed_p (cfun))
27129     ix86_pad_returns ();
27130   if (TARGET_FOUR_JUMP_LIMIT && optimize
27131       && optimize_function_for_speed_p (cfun))
27132     ix86_avoid_jump_misspredicts ();
27133 }
27134
27135 /* Return nonzero when QImode register that must be represented via REX prefix
27136    is used.  */
27137 bool
27138 x86_extended_QIreg_mentioned_p (rtx insn)
27139 {
27140   int i;
27141   extract_insn_cached (insn);
27142   for (i = 0; i < recog_data.n_operands; i++)
27143     if (REG_P (recog_data.operand[i])
27144         && REGNO (recog_data.operand[i]) > BX_REG)
27145        return true;
27146   return false;
27147 }
27148
27149 /* Return nonzero when P points to register encoded via REX prefix.
27150    Called via for_each_rtx.  */
27151 static int
27152 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
27153 {
27154    unsigned int regno;
27155    if (!REG_P (*p))
27156      return 0;
27157    regno = REGNO (*p);
27158    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
27159 }
27160
27161 /* Return true when INSN mentions register that must be encoded using REX
27162    prefix.  */
27163 bool
27164 x86_extended_reg_mentioned_p (rtx insn)
27165 {
27166   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
27167                        extended_reg_mentioned_1, NULL);
27168 }
27169
27170 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
27171    optabs would emit if we didn't have TFmode patterns.  */
27172
27173 void
27174 x86_emit_floatuns (rtx operands[2])
27175 {
27176   rtx neglab, donelab, i0, i1, f0, in, out;
27177   enum machine_mode mode, inmode;
27178
27179   inmode = GET_MODE (operands[1]);
27180   gcc_assert (inmode == SImode || inmode == DImode);
27181
27182   out = operands[0];
27183   in = force_reg (inmode, operands[1]);
27184   mode = GET_MODE (out);
27185   neglab = gen_label_rtx ();
27186   donelab = gen_label_rtx ();
27187   f0 = gen_reg_rtx (mode);
27188
27189   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
27190
27191   expand_float (out, in, 0);
27192
27193   emit_jump_insn (gen_jump (donelab));
27194   emit_barrier ();
27195
27196   emit_label (neglab);
27197
27198   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
27199                             1, OPTAB_DIRECT);
27200   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
27201                             1, OPTAB_DIRECT);
27202   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
27203
27204   expand_float (f0, i0, 0);
27205
27206   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
27207
27208   emit_label (donelab);
27209 }
27210 \f
27211 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27212    with all elements equal to VAR.  Return true if successful.  */
27213
27214 static bool
27215 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
27216                                    rtx target, rtx val)
27217 {
27218   enum machine_mode hmode, smode, wsmode, wvmode;
27219   rtx x;
27220
27221   switch (mode)
27222     {
27223     case V2SImode:
27224     case V2SFmode:
27225       if (!mmx_ok)
27226         return false;
27227       /* FALLTHRU */
27228
27229     case V2DFmode:
27230     case V2DImode:
27231     case V4SFmode:
27232     case V4SImode:
27233       val = force_reg (GET_MODE_INNER (mode), val);
27234       x = gen_rtx_VEC_DUPLICATE (mode, val);
27235       emit_insn (gen_rtx_SET (VOIDmode, target, x));
27236       return true;
27237
27238     case V4HImode:
27239       if (!mmx_ok)
27240         return false;
27241       if (TARGET_SSE || TARGET_3DNOW_A)
27242         {
27243           val = gen_lowpart (SImode, val);
27244           x = gen_rtx_TRUNCATE (HImode, val);
27245           x = gen_rtx_VEC_DUPLICATE (mode, x);
27246           emit_insn (gen_rtx_SET (VOIDmode, target, x));
27247           return true;
27248         }
27249       else
27250         {
27251           smode = HImode;
27252           wsmode = SImode;
27253           wvmode = V2SImode;
27254           goto widen;
27255         }
27256
27257     case V8QImode:
27258       if (!mmx_ok)
27259         return false;
27260       smode = QImode;
27261       wsmode = HImode;
27262       wvmode = V4HImode;
27263       goto widen;
27264     case V8HImode:
27265       if (TARGET_SSE2)
27266         {
27267           rtx tmp1, tmp2;
27268           /* Extend HImode to SImode using a paradoxical SUBREG.  */
27269           tmp1 = gen_reg_rtx (SImode);
27270           emit_move_insn (tmp1, gen_lowpart (SImode, val));
27271           /* Insert the SImode value as low element of V4SImode vector. */
27272           tmp2 = gen_reg_rtx (V4SImode);
27273           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27274                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27275                                     CONST0_RTX (V4SImode),
27276                                     const1_rtx);
27277           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27278           /* Cast the V4SImode vector back to a V8HImode vector.  */
27279           tmp1 = gen_reg_rtx (V8HImode);
27280           emit_move_insn (tmp1, gen_lowpart (V8HImode, tmp2));
27281           /* Duplicate the low short through the whole low SImode word.  */
27282           emit_insn (gen_sse2_punpcklwd (tmp1, tmp1, tmp1));
27283           /* Cast the V8HImode vector back to a V4SImode vector.  */
27284           tmp2 = gen_reg_rtx (V4SImode);
27285           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27286           /* Replicate the low element of the V4SImode vector.  */
27287           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27288           /* Cast the V2SImode back to V8HImode, and store in target.  */
27289           emit_move_insn (target, gen_lowpart (V8HImode, tmp2));
27290           return true;
27291         }
27292       smode = HImode;
27293       wsmode = SImode;
27294       wvmode = V4SImode;
27295       goto widen;
27296     case V16QImode:
27297       if (TARGET_SSE2)
27298         {
27299           rtx tmp1, tmp2;
27300           /* Extend QImode to SImode using a paradoxical SUBREG.  */
27301           tmp1 = gen_reg_rtx (SImode);
27302           emit_move_insn (tmp1, gen_lowpart (SImode, val));
27303           /* Insert the SImode value as low element of V4SImode vector. */
27304           tmp2 = gen_reg_rtx (V4SImode);
27305           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27306                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27307                                     CONST0_RTX (V4SImode),
27308                                     const1_rtx);
27309           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27310           /* Cast the V4SImode vector back to a V16QImode vector.  */
27311           tmp1 = gen_reg_rtx (V16QImode);
27312           emit_move_insn (tmp1, gen_lowpart (V16QImode, tmp2));
27313           /* Duplicate the low byte through the whole low SImode word.  */
27314           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27315           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27316           /* Cast the V16QImode vector back to a V4SImode vector.  */
27317           tmp2 = gen_reg_rtx (V4SImode);
27318           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27319           /* Replicate the low element of the V4SImode vector.  */
27320           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27321           /* Cast the V2SImode back to V16QImode, and store in target.  */
27322           emit_move_insn (target, gen_lowpart (V16QImode, tmp2));
27323           return true;
27324         }
27325       smode = QImode;
27326       wsmode = HImode;
27327       wvmode = V8HImode;
27328       goto widen;
27329     widen:
27330       /* Replicate the value once into the next wider mode and recurse.  */
27331       val = convert_modes (wsmode, smode, val, true);
27332       x = expand_simple_binop (wsmode, ASHIFT, val,
27333                                GEN_INT (GET_MODE_BITSIZE (smode)),
27334                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
27335       val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
27336
27337       x = gen_reg_rtx (wvmode);
27338       if (!ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val))
27339         gcc_unreachable ();
27340       emit_move_insn (target, gen_lowpart (mode, x));
27341       return true;
27342
27343     case V4DFmode:
27344       hmode = V2DFmode;
27345       goto half;
27346     case V4DImode:
27347       hmode = V2DImode;
27348       goto half;
27349     case V8SFmode:
27350       hmode = V4SFmode;
27351       goto half;
27352     case V8SImode:
27353       hmode = V4SImode;
27354       goto half;
27355     case V16HImode:
27356       hmode = V8HImode;
27357       goto half;
27358     case V32QImode:
27359       hmode = V16QImode;
27360       goto half;
27361 half:
27362       {
27363         rtx tmp = gen_reg_rtx (hmode);
27364         ix86_expand_vector_init_duplicate (mmx_ok, hmode, tmp, val);
27365         emit_insn (gen_rtx_SET (VOIDmode, target,
27366                                 gen_rtx_VEC_CONCAT (mode, tmp, tmp)));
27367       }
27368       return true;
27369
27370     default:
27371       return false;
27372     }
27373 }
27374
27375 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27376    whose ONE_VAR element is VAR, and other elements are zero.  Return true
27377    if successful.  */
27378
27379 static bool
27380 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
27381                                      rtx target, rtx var, int one_var)
27382 {
27383   enum machine_mode vsimode;
27384   rtx new_target;
27385   rtx x, tmp;
27386   bool use_vector_set = false;
27387
27388   switch (mode)
27389     {
27390     case V2DImode:
27391       /* For SSE4.1, we normally use vector set.  But if the second
27392          element is zero and inter-unit moves are OK, we use movq
27393          instead.  */
27394       use_vector_set = (TARGET_64BIT
27395                         && TARGET_SSE4_1
27396                         && !(TARGET_INTER_UNIT_MOVES
27397                              && one_var == 0));
27398       break;
27399     case V16QImode:
27400     case V4SImode:
27401     case V4SFmode:
27402       use_vector_set = TARGET_SSE4_1;
27403       break;
27404     case V8HImode:
27405       use_vector_set = TARGET_SSE2;
27406       break;
27407     case V4HImode:
27408       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
27409       break;
27410     case V32QImode:
27411     case V16HImode:
27412     case V8SImode:
27413     case V8SFmode:
27414     case V4DFmode:
27415       use_vector_set = TARGET_AVX;
27416       break;
27417     case V4DImode:
27418       /* Use ix86_expand_vector_set in 64bit mode only.  */
27419       use_vector_set = TARGET_AVX && TARGET_64BIT;
27420       break;
27421     default:
27422       break;
27423     }
27424
27425   if (use_vector_set)
27426     {
27427       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
27428       var = force_reg (GET_MODE_INNER (mode), var);
27429       ix86_expand_vector_set (mmx_ok, target, var, one_var);
27430       return true; 
27431     }
27432
27433   switch (mode)
27434     {
27435     case V2SFmode:
27436     case V2SImode:
27437       if (!mmx_ok)
27438         return false;
27439       /* FALLTHRU */
27440
27441     case V2DFmode:
27442     case V2DImode:
27443       if (one_var != 0)
27444         return false;
27445       var = force_reg (GET_MODE_INNER (mode), var);
27446       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
27447       emit_insn (gen_rtx_SET (VOIDmode, target, x));
27448       return true;
27449
27450     case V4SFmode:
27451     case V4SImode:
27452       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
27453         new_target = gen_reg_rtx (mode);
27454       else
27455         new_target = target;
27456       var = force_reg (GET_MODE_INNER (mode), var);
27457       x = gen_rtx_VEC_DUPLICATE (mode, var);
27458       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
27459       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
27460       if (one_var != 0)
27461         {
27462           /* We need to shuffle the value to the correct position, so
27463              create a new pseudo to store the intermediate result.  */
27464
27465           /* With SSE2, we can use the integer shuffle insns.  */
27466           if (mode != V4SFmode && TARGET_SSE2)
27467             {
27468               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
27469                                             GEN_INT (1),
27470                                             GEN_INT (one_var == 1 ? 0 : 1),
27471                                             GEN_INT (one_var == 2 ? 0 : 1),
27472                                             GEN_INT (one_var == 3 ? 0 : 1)));
27473               if (target != new_target)
27474                 emit_move_insn (target, new_target);
27475               return true;
27476             }
27477
27478           /* Otherwise convert the intermediate result to V4SFmode and
27479              use the SSE1 shuffle instructions.  */
27480           if (mode != V4SFmode)
27481             {
27482               tmp = gen_reg_rtx (V4SFmode);
27483               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
27484             }
27485           else
27486             tmp = new_target;
27487
27488           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
27489                                        GEN_INT (1),
27490                                        GEN_INT (one_var == 1 ? 0 : 1),
27491                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
27492                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
27493
27494           if (mode != V4SFmode)
27495             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
27496           else if (tmp != target)
27497             emit_move_insn (target, tmp);
27498         }
27499       else if (target != new_target)
27500         emit_move_insn (target, new_target);
27501       return true;
27502
27503     case V8HImode:
27504     case V16QImode:
27505       vsimode = V4SImode;
27506       goto widen;
27507     case V4HImode:
27508     case V8QImode:
27509       if (!mmx_ok)
27510         return false;
27511       vsimode = V2SImode;
27512       goto widen;
27513     widen:
27514       if (one_var != 0)
27515         return false;
27516
27517       /* Zero extend the variable element to SImode and recurse.  */
27518       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
27519
27520       x = gen_reg_rtx (vsimode);
27521       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
27522                                                 var, one_var))
27523         gcc_unreachable ();
27524
27525       emit_move_insn (target, gen_lowpart (mode, x));
27526       return true;
27527
27528     default:
27529       return false;
27530     }
27531 }
27532
27533 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27534    consisting of the values in VALS.  It is known that all elements
27535    except ONE_VAR are constants.  Return true if successful.  */
27536
27537 static bool
27538 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
27539                                  rtx target, rtx vals, int one_var)
27540 {
27541   rtx var = XVECEXP (vals, 0, one_var);
27542   enum machine_mode wmode;
27543   rtx const_vec, x;
27544
27545   const_vec = copy_rtx (vals);
27546   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
27547   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
27548
27549   switch (mode)
27550     {
27551     case V2DFmode:
27552     case V2DImode:
27553     case V2SFmode:
27554     case V2SImode:
27555       /* For the two element vectors, it's just as easy to use
27556          the general case.  */
27557       return false;
27558
27559     case V4DImode:
27560       /* Use ix86_expand_vector_set in 64bit mode only.  */
27561       if (!TARGET_64BIT)
27562         return false;
27563     case V4DFmode:
27564     case V8SFmode:
27565     case V8SImode:
27566     case V16HImode:
27567     case V32QImode:
27568     case V4SFmode:
27569     case V4SImode:
27570     case V8HImode:
27571     case V4HImode:
27572       break;
27573
27574     case V16QImode:
27575       if (TARGET_SSE4_1)
27576         break;
27577       wmode = V8HImode;
27578       goto widen;
27579     case V8QImode:
27580       wmode = V4HImode;
27581       goto widen;
27582     widen:
27583       /* There's no way to set one QImode entry easily.  Combine
27584          the variable value with its adjacent constant value, and
27585          promote to an HImode set.  */
27586       x = XVECEXP (vals, 0, one_var ^ 1);
27587       if (one_var & 1)
27588         {
27589           var = convert_modes (HImode, QImode, var, true);
27590           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
27591                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
27592           x = GEN_INT (INTVAL (x) & 0xff);
27593         }
27594       else
27595         {
27596           var = convert_modes (HImode, QImode, var, true);
27597           x = gen_int_mode (INTVAL (x) << 8, HImode);
27598         }
27599       if (x != const0_rtx)
27600         var = expand_simple_binop (HImode, IOR, var, x, var,
27601                                    1, OPTAB_LIB_WIDEN);
27602
27603       x = gen_reg_rtx (wmode);
27604       emit_move_insn (x, gen_lowpart (wmode, const_vec));
27605       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
27606
27607       emit_move_insn (target, gen_lowpart (mode, x));
27608       return true;
27609
27610     default:
27611       return false;
27612     }
27613
27614   emit_move_insn (target, const_vec);
27615   ix86_expand_vector_set (mmx_ok, target, var, one_var);
27616   return true;
27617 }
27618
27619 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27620    concatenate to handle the most general case: all values variable,
27621    and none identical.  */
27622
27623 static void
27624 ix86_expand_vector_init_concat (enum machine_mode mode,
27625                                 rtx target, rtx *ops, int n)
27626 {
27627   enum machine_mode cmode, hmode = VOIDmode;
27628   rtx first[8], second[4];
27629   rtvec v;
27630   int i, j;
27631
27632   switch (n)
27633     {
27634     case 2:
27635       switch (mode)
27636         {
27637         case V8SImode:
27638           cmode = V4SImode;
27639           break;
27640         case V8SFmode:
27641           cmode = V4SFmode;
27642           break;
27643         case V4DImode:
27644           cmode = V2DImode;
27645           break;
27646         case V4DFmode:
27647           cmode = V2DFmode;
27648           break;
27649         case V4SImode:
27650           cmode = V2SImode;
27651           break;
27652         case V4SFmode:
27653           cmode = V2SFmode;
27654           break;
27655         case V2DImode:
27656           cmode = DImode;
27657           break;
27658         case V2SImode:
27659           cmode = SImode;
27660           break;
27661         case V2DFmode:
27662           cmode = DFmode;
27663           break;
27664         case V2SFmode:
27665           cmode = SFmode;
27666           break;
27667         default:
27668           gcc_unreachable ();
27669         }
27670
27671       if (!register_operand (ops[1], cmode))
27672         ops[1] = force_reg (cmode, ops[1]);
27673       if (!register_operand (ops[0], cmode))
27674         ops[0] = force_reg (cmode, ops[0]);
27675       emit_insn (gen_rtx_SET (VOIDmode, target,
27676                               gen_rtx_VEC_CONCAT (mode, ops[0],
27677                                                   ops[1])));
27678       break;
27679
27680     case 4:
27681       switch (mode)
27682         {
27683         case V4DImode:
27684           cmode = V2DImode;
27685           break;
27686         case V4DFmode:
27687           cmode = V2DFmode;
27688           break;
27689         case V4SImode:
27690           cmode = V2SImode;
27691           break;
27692         case V4SFmode:
27693           cmode = V2SFmode;
27694           break;
27695         default:
27696           gcc_unreachable ();
27697         }
27698       goto half;
27699
27700     case 8:
27701       switch (mode)
27702         {
27703         case V8SImode:
27704           cmode = V2SImode;
27705           hmode = V4SImode;
27706           break;
27707         case V8SFmode:
27708           cmode = V2SFmode;
27709           hmode = V4SFmode;
27710           break;
27711         default:
27712           gcc_unreachable ();
27713         }
27714       goto half;
27715
27716 half:
27717       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
27718       i = n - 1;
27719       j = (n >> 1) - 1;
27720       for (; i > 0; i -= 2, j--)
27721         {
27722           first[j] = gen_reg_rtx (cmode);
27723           v = gen_rtvec (2, ops[i - 1], ops[i]);
27724           ix86_expand_vector_init (false, first[j],
27725                                    gen_rtx_PARALLEL (cmode, v));
27726         }
27727
27728       n >>= 1;
27729       if (n > 2)
27730         {
27731           gcc_assert (hmode != VOIDmode);
27732           for (i = j = 0; i < n; i += 2, j++)
27733             {
27734               second[j] = gen_reg_rtx (hmode);
27735               ix86_expand_vector_init_concat (hmode, second [j],
27736                                               &first [i], 2);
27737             }
27738           n >>= 1;
27739           ix86_expand_vector_init_concat (mode, target, second, n);
27740         }
27741       else
27742         ix86_expand_vector_init_concat (mode, target, first, n);
27743       break;
27744
27745     default:
27746       gcc_unreachable ();
27747     }
27748 }
27749
27750 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27751    interleave to handle the most general case: all values variable,
27752    and none identical.  */
27753
27754 static void
27755 ix86_expand_vector_init_interleave (enum machine_mode mode,
27756                                     rtx target, rtx *ops, int n)
27757 {
27758   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
27759   int i, j;
27760   rtx op0, op1;
27761   rtx (*gen_load_even) (rtx, rtx, rtx);
27762   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
27763   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
27764   
27765   switch (mode)
27766     {
27767     case V8HImode:
27768       gen_load_even = gen_vec_setv8hi;
27769       gen_interleave_first_low = gen_vec_interleave_lowv4si;
27770       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27771       inner_mode = HImode;
27772       first_imode = V4SImode;
27773       second_imode = V2DImode;
27774       third_imode = VOIDmode;
27775       break;
27776     case V16QImode:
27777       gen_load_even = gen_vec_setv16qi;
27778       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
27779       gen_interleave_second_low = gen_vec_interleave_lowv4si;
27780       inner_mode = QImode;
27781       first_imode = V8HImode;
27782       second_imode = V4SImode;
27783       third_imode = V2DImode;
27784       break;
27785     default:
27786       gcc_unreachable ();
27787     }
27788      
27789   for (i = 0; i < n; i++)
27790     {
27791       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
27792       op0 = gen_reg_rtx (SImode);
27793       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
27794
27795       /* Insert the SImode value as low element of V4SImode vector. */
27796       op1 = gen_reg_rtx (V4SImode);
27797       op0 = gen_rtx_VEC_MERGE (V4SImode,
27798                                gen_rtx_VEC_DUPLICATE (V4SImode,
27799                                                       op0),
27800                                CONST0_RTX (V4SImode),
27801                                const1_rtx);
27802       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
27803
27804       /* Cast the V4SImode vector back to a vector in orignal mode.  */
27805       op0 = gen_reg_rtx (mode);
27806       emit_move_insn (op0, gen_lowpart (mode, op1));
27807       
27808       /* Load even elements into the second positon.  */
27809       emit_insn ((*gen_load_even) (op0,
27810                                    force_reg (inner_mode,
27811                                               ops [i + i + 1]),
27812                                    const1_rtx));
27813
27814       /* Cast vector to FIRST_IMODE vector.  */
27815       ops[i] = gen_reg_rtx (first_imode);
27816       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
27817     }
27818
27819   /* Interleave low FIRST_IMODE vectors.  */
27820   for (i = j = 0; i < n; i += 2, j++)
27821     {
27822       op0 = gen_reg_rtx (first_imode);
27823       emit_insn ((*gen_interleave_first_low) (op0, ops[i], ops[i + 1]));
27824
27825       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
27826       ops[j] = gen_reg_rtx (second_imode);
27827       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
27828     }
27829
27830   /* Interleave low SECOND_IMODE vectors.  */
27831   switch (second_imode)
27832     {
27833     case V4SImode:
27834       for (i = j = 0; i < n / 2; i += 2, j++)
27835         {
27836           op0 = gen_reg_rtx (second_imode);
27837           emit_insn ((*gen_interleave_second_low) (op0, ops[i],
27838                                                    ops[i + 1]));
27839
27840           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
27841              vector.  */
27842           ops[j] = gen_reg_rtx (third_imode);
27843           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
27844         }
27845       second_imode = V2DImode;
27846       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27847       /* FALLTHRU */
27848
27849     case V2DImode:
27850       op0 = gen_reg_rtx (second_imode);
27851       emit_insn ((*gen_interleave_second_low) (op0, ops[0],
27852                                                ops[1]));
27853
27854       /* Cast the SECOND_IMODE vector back to a vector on original
27855          mode.  */
27856       emit_insn (gen_rtx_SET (VOIDmode, target,
27857                               gen_lowpart (mode, op0)));
27858       break;
27859
27860     default:
27861       gcc_unreachable ();
27862     }
27863 }
27864
27865 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
27866    all values variable, and none identical.  */
27867
27868 static void
27869 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
27870                                  rtx target, rtx vals)
27871 {
27872   rtx ops[32], op0, op1;
27873   enum machine_mode half_mode = VOIDmode;
27874   int n, i;
27875
27876   switch (mode)
27877     {
27878     case V2SFmode:
27879     case V2SImode:
27880       if (!mmx_ok && !TARGET_SSE)
27881         break;
27882       /* FALLTHRU */
27883
27884     case V8SFmode:
27885     case V8SImode:
27886     case V4DFmode:
27887     case V4DImode:
27888     case V4SFmode:
27889     case V4SImode:
27890     case V2DFmode:
27891     case V2DImode:
27892       n = GET_MODE_NUNITS (mode);
27893       for (i = 0; i < n; i++)
27894         ops[i] = XVECEXP (vals, 0, i);
27895       ix86_expand_vector_init_concat (mode, target, ops, n);
27896       return;
27897
27898     case V32QImode:
27899       half_mode = V16QImode;
27900       goto half;
27901
27902     case V16HImode:
27903       half_mode = V8HImode;
27904       goto half;
27905
27906 half:
27907       n = GET_MODE_NUNITS (mode);
27908       for (i = 0; i < n; i++)
27909         ops[i] = XVECEXP (vals, 0, i);
27910       op0 = gen_reg_rtx (half_mode);
27911       op1 = gen_reg_rtx (half_mode);
27912       ix86_expand_vector_init_interleave (half_mode, op0, ops,
27913                                           n >> 2);
27914       ix86_expand_vector_init_interleave (half_mode, op1,
27915                                           &ops [n >> 1], n >> 2);
27916       emit_insn (gen_rtx_SET (VOIDmode, target,
27917                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
27918       return;
27919
27920     case V16QImode:
27921       if (!TARGET_SSE4_1)
27922         break;
27923       /* FALLTHRU */
27924
27925     case V8HImode:
27926       if (!TARGET_SSE2)
27927         break;
27928
27929       /* Don't use ix86_expand_vector_init_interleave if we can't
27930          move from GPR to SSE register directly.  */ 
27931       if (!TARGET_INTER_UNIT_MOVES)
27932         break;
27933
27934       n = GET_MODE_NUNITS (mode);
27935       for (i = 0; i < n; i++)
27936         ops[i] = XVECEXP (vals, 0, i);
27937       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
27938       return;
27939
27940     case V4HImode:
27941     case V8QImode:
27942       break;
27943
27944     default:
27945       gcc_unreachable ();
27946     }
27947
27948     {
27949       int i, j, n_elts, n_words, n_elt_per_word;
27950       enum machine_mode inner_mode;
27951       rtx words[4], shift;
27952
27953       inner_mode = GET_MODE_INNER (mode);
27954       n_elts = GET_MODE_NUNITS (mode);
27955       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
27956       n_elt_per_word = n_elts / n_words;
27957       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
27958
27959       for (i = 0; i < n_words; ++i)
27960         {
27961           rtx word = NULL_RTX;
27962
27963           for (j = 0; j < n_elt_per_word; ++j)
27964             {
27965               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
27966               elt = convert_modes (word_mode, inner_mode, elt, true);
27967
27968               if (j == 0)
27969                 word = elt;
27970               else
27971                 {
27972                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
27973                                               word, 1, OPTAB_LIB_WIDEN);
27974                   word = expand_simple_binop (word_mode, IOR, word, elt,
27975                                               word, 1, OPTAB_LIB_WIDEN);
27976                 }
27977             }
27978
27979           words[i] = word;
27980         }
27981
27982       if (n_words == 1)
27983         emit_move_insn (target, gen_lowpart (mode, words[0]));
27984       else if (n_words == 2)
27985         {
27986           rtx tmp = gen_reg_rtx (mode);
27987           emit_clobber (tmp);
27988           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
27989           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
27990           emit_move_insn (target, tmp);
27991         }
27992       else if (n_words == 4)
27993         {
27994           rtx tmp = gen_reg_rtx (V4SImode);
27995           gcc_assert (word_mode == SImode);
27996           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
27997           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
27998           emit_move_insn (target, gen_lowpart (mode, tmp));
27999         }
28000       else
28001         gcc_unreachable ();
28002     }
28003 }
28004
28005 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
28006    instructions unless MMX_OK is true.  */
28007
28008 void
28009 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
28010 {
28011   enum machine_mode mode = GET_MODE (target);
28012   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28013   int n_elts = GET_MODE_NUNITS (mode);
28014   int n_var = 0, one_var = -1;
28015   bool all_same = true, all_const_zero = true;
28016   int i;
28017   rtx x;
28018
28019   for (i = 0; i < n_elts; ++i)
28020     {
28021       x = XVECEXP (vals, 0, i);
28022       if (!(CONST_INT_P (x)
28023             || GET_CODE (x) == CONST_DOUBLE
28024             || GET_CODE (x) == CONST_FIXED))
28025         n_var++, one_var = i;
28026       else if (x != CONST0_RTX (inner_mode))
28027         all_const_zero = false;
28028       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
28029         all_same = false;
28030     }
28031
28032   /* Constants are best loaded from the constant pool.  */
28033   if (n_var == 0)
28034     {
28035       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
28036       return;
28037     }
28038
28039   /* If all values are identical, broadcast the value.  */
28040   if (all_same
28041       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
28042                                             XVECEXP (vals, 0, 0)))
28043     return;
28044
28045   /* Values where only one field is non-constant are best loaded from
28046      the pool and overwritten via move later.  */
28047   if (n_var == 1)
28048     {
28049       if (all_const_zero
28050           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
28051                                                   XVECEXP (vals, 0, one_var),
28052                                                   one_var))
28053         return;
28054
28055       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
28056         return;
28057     }
28058
28059   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
28060 }
28061
28062 void
28063 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
28064 {
28065   enum machine_mode mode = GET_MODE (target);
28066   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28067   enum machine_mode half_mode;
28068   bool use_vec_merge = false;
28069   rtx tmp;
28070   static rtx (*gen_extract[6][2]) (rtx, rtx)
28071     = {
28072         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
28073         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
28074         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
28075         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
28076         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
28077         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
28078       };
28079   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
28080     = {
28081         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
28082         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
28083         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
28084         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
28085         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
28086         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
28087       };
28088   int i, j, n;
28089
28090   switch (mode)
28091     {
28092     case V2SFmode:
28093     case V2SImode:
28094       if (mmx_ok)
28095         {
28096           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
28097           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
28098           if (elt == 0)
28099             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
28100           else
28101             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
28102           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28103           return;
28104         }
28105       break;
28106
28107     case V2DImode:
28108       use_vec_merge = TARGET_SSE4_1;
28109       if (use_vec_merge)
28110         break;
28111
28112     case V2DFmode:
28113       {
28114         rtx op0, op1;
28115
28116         /* For the two element vectors, we implement a VEC_CONCAT with
28117            the extraction of the other element.  */
28118
28119         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
28120         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
28121
28122         if (elt == 0)
28123           op0 = val, op1 = tmp;
28124         else
28125           op0 = tmp, op1 = val;
28126
28127         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
28128         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28129       }
28130       return;
28131
28132     case V4SFmode:
28133       use_vec_merge = TARGET_SSE4_1;
28134       if (use_vec_merge)
28135         break;
28136
28137       switch (elt)
28138         {
28139         case 0:
28140           use_vec_merge = true;
28141           break;
28142
28143         case 1:
28144           /* tmp = target = A B C D */
28145           tmp = copy_to_reg (target);
28146           /* target = A A B B */
28147           emit_insn (gen_sse_unpcklps (target, target, target));
28148           /* target = X A B B */
28149           ix86_expand_vector_set (false, target, val, 0);
28150           /* target = A X C D  */
28151           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28152                                        GEN_INT (1), GEN_INT (0),
28153                                        GEN_INT (2+4), GEN_INT (3+4)));
28154           return;
28155
28156         case 2:
28157           /* tmp = target = A B C D */
28158           tmp = copy_to_reg (target);
28159           /* tmp = X B C D */
28160           ix86_expand_vector_set (false, tmp, val, 0);
28161           /* target = A B X D */
28162           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28163                                        GEN_INT (0), GEN_INT (1),
28164                                        GEN_INT (0+4), GEN_INT (3+4)));
28165           return;
28166
28167         case 3:
28168           /* tmp = target = A B C D */
28169           tmp = copy_to_reg (target);
28170           /* tmp = X B C D */
28171           ix86_expand_vector_set (false, tmp, val, 0);
28172           /* target = A B X D */
28173           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28174                                        GEN_INT (0), GEN_INT (1),
28175                                        GEN_INT (2+4), GEN_INT (0+4)));
28176           return;
28177
28178         default:
28179           gcc_unreachable ();
28180         }
28181       break;
28182
28183     case V4SImode:
28184       use_vec_merge = TARGET_SSE4_1;
28185       if (use_vec_merge)
28186         break;
28187
28188       /* Element 0 handled by vec_merge below.  */
28189       if (elt == 0)
28190         {
28191           use_vec_merge = true;
28192           break;
28193         }
28194
28195       if (TARGET_SSE2)
28196         {
28197           /* With SSE2, use integer shuffles to swap element 0 and ELT,
28198              store into element 0, then shuffle them back.  */
28199
28200           rtx order[4];
28201
28202           order[0] = GEN_INT (elt);
28203           order[1] = const1_rtx;
28204           order[2] = const2_rtx;
28205           order[3] = GEN_INT (3);
28206           order[elt] = const0_rtx;
28207
28208           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
28209                                         order[1], order[2], order[3]));
28210
28211           ix86_expand_vector_set (false, target, val, 0);
28212
28213           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
28214                                         order[1], order[2], order[3]));
28215         }
28216       else
28217         {
28218           /* For SSE1, we have to reuse the V4SF code.  */
28219           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
28220                                   gen_lowpart (SFmode, val), elt);
28221         }
28222       return;
28223
28224     case V8HImode:
28225       use_vec_merge = TARGET_SSE2;
28226       break;
28227     case V4HImode:
28228       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
28229       break;
28230
28231     case V16QImode:
28232       use_vec_merge = TARGET_SSE4_1;
28233       break;
28234
28235     case V8QImode:
28236       break;
28237
28238     case V32QImode:
28239       half_mode = V16QImode;
28240       j = 0;
28241       n = 16;
28242       goto half;
28243
28244     case V16HImode:
28245       half_mode = V8HImode;
28246       j = 1;
28247       n = 8;
28248       goto half;
28249
28250     case V8SImode:
28251       half_mode = V4SImode;
28252       j = 2;
28253       n = 4;
28254       goto half;
28255
28256     case V4DImode:
28257       half_mode = V2DImode;
28258       j = 3;
28259       n = 2;
28260       goto half;
28261
28262     case V8SFmode:
28263       half_mode = V4SFmode;
28264       j = 4;
28265       n = 4;
28266       goto half;
28267
28268     case V4DFmode:
28269       half_mode = V2DFmode;
28270       j = 5;
28271       n = 2;
28272       goto half;
28273
28274 half:
28275       /* Compute offset.  */
28276       i = elt / n;
28277       elt %= n;
28278
28279       gcc_assert (i <= 1);
28280
28281       /* Extract the half.  */
28282       tmp = gen_reg_rtx (half_mode);
28283       emit_insn ((*gen_extract[j][i]) (tmp, target));
28284
28285       /* Put val in tmp at elt.  */
28286       ix86_expand_vector_set (false, tmp, val, elt);
28287
28288       /* Put it back.  */
28289       emit_insn ((*gen_insert[j][i]) (target, target, tmp));
28290       return;
28291
28292     default:
28293       break;
28294     }
28295
28296   if (use_vec_merge)
28297     {
28298       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
28299       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
28300       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28301     }
28302   else
28303     {
28304       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28305
28306       emit_move_insn (mem, target);
28307
28308       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28309       emit_move_insn (tmp, val);
28310
28311       emit_move_insn (target, mem);
28312     }
28313 }
28314
28315 void
28316 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
28317 {
28318   enum machine_mode mode = GET_MODE (vec);
28319   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28320   bool use_vec_extr = false;
28321   rtx tmp;
28322
28323   switch (mode)
28324     {
28325     case V2SImode:
28326     case V2SFmode:
28327       if (!mmx_ok)
28328         break;
28329       /* FALLTHRU */
28330
28331     case V2DFmode:
28332     case V2DImode:
28333       use_vec_extr = true;
28334       break;
28335
28336     case V4SFmode:
28337       use_vec_extr = TARGET_SSE4_1;
28338       if (use_vec_extr)
28339         break;
28340
28341       switch (elt)
28342         {
28343         case 0:
28344           tmp = vec;
28345           break;
28346
28347         case 1:
28348         case 3:
28349           tmp = gen_reg_rtx (mode);
28350           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
28351                                        GEN_INT (elt), GEN_INT (elt),
28352                                        GEN_INT (elt+4), GEN_INT (elt+4)));
28353           break;
28354
28355         case 2:
28356           tmp = gen_reg_rtx (mode);
28357           emit_insn (gen_sse_unpckhps (tmp, vec, vec));
28358           break;
28359
28360         default:
28361           gcc_unreachable ();
28362         }
28363       vec = tmp;
28364       use_vec_extr = true;
28365       elt = 0;
28366       break;
28367
28368     case V4SImode:
28369       use_vec_extr = TARGET_SSE4_1;
28370       if (use_vec_extr)
28371         break;
28372
28373       if (TARGET_SSE2)
28374         {
28375           switch (elt)
28376             {
28377             case 0:
28378               tmp = vec;
28379               break;
28380
28381             case 1:
28382             case 3:
28383               tmp = gen_reg_rtx (mode);
28384               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
28385                                             GEN_INT (elt), GEN_INT (elt),
28386                                             GEN_INT (elt), GEN_INT (elt)));
28387               break;
28388
28389             case 2:
28390               tmp = gen_reg_rtx (mode);
28391               emit_insn (gen_sse2_punpckhdq (tmp, vec, vec));
28392               break;
28393
28394             default:
28395               gcc_unreachable ();
28396             }
28397           vec = tmp;
28398           use_vec_extr = true;
28399           elt = 0;
28400         }
28401       else
28402         {
28403           /* For SSE1, we have to reuse the V4SF code.  */
28404           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
28405                                       gen_lowpart (V4SFmode, vec), elt);
28406           return;
28407         }
28408       break;
28409
28410     case V8HImode:
28411       use_vec_extr = TARGET_SSE2;
28412       break;
28413     case V4HImode:
28414       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
28415       break;
28416
28417     case V16QImode:
28418       use_vec_extr = TARGET_SSE4_1;
28419       break;
28420
28421     case V8QImode:
28422       /* ??? Could extract the appropriate HImode element and shift.  */
28423     default:
28424       break;
28425     }
28426
28427   if (use_vec_extr)
28428     {
28429       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
28430       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
28431
28432       /* Let the rtl optimizers know about the zero extension performed.  */
28433       if (inner_mode == QImode || inner_mode == HImode)
28434         {
28435           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
28436           target = gen_lowpart (SImode, target);
28437         }
28438
28439       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28440     }
28441   else
28442     {
28443       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28444
28445       emit_move_insn (mem, vec);
28446
28447       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28448       emit_move_insn (target, tmp);
28449     }
28450 }
28451
28452 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
28453    pattern to reduce; DEST is the destination; IN is the input vector.  */
28454
28455 void
28456 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
28457 {
28458   rtx tmp1, tmp2, tmp3;
28459
28460   tmp1 = gen_reg_rtx (V4SFmode);
28461   tmp2 = gen_reg_rtx (V4SFmode);
28462   tmp3 = gen_reg_rtx (V4SFmode);
28463
28464   emit_insn (gen_sse_movhlps (tmp1, in, in));
28465   emit_insn (fn (tmp2, tmp1, in));
28466
28467   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
28468                                GEN_INT (1), GEN_INT (1),
28469                                GEN_INT (1+4), GEN_INT (1+4)));
28470   emit_insn (fn (dest, tmp2, tmp3));
28471 }
28472 \f
28473 /* Target hook for scalar_mode_supported_p.  */
28474 static bool
28475 ix86_scalar_mode_supported_p (enum machine_mode mode)
28476 {
28477   if (DECIMAL_FLOAT_MODE_P (mode))
28478     return true;
28479   else if (mode == TFmode)
28480     return true;
28481   else
28482     return default_scalar_mode_supported_p (mode);
28483 }
28484
28485 /* Implements target hook vector_mode_supported_p.  */
28486 static bool
28487 ix86_vector_mode_supported_p (enum machine_mode mode)
28488 {
28489   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
28490     return true;
28491   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
28492     return true;
28493   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
28494     return true;
28495   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
28496     return true;
28497   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
28498     return true;
28499   return false;
28500 }
28501
28502 /* Target hook for c_mode_for_suffix.  */
28503 static enum machine_mode
28504 ix86_c_mode_for_suffix (char suffix)
28505 {
28506   if (suffix == 'q')
28507     return TFmode;
28508   if (suffix == 'w')
28509     return XFmode;
28510
28511   return VOIDmode;
28512 }
28513
28514 /* Worker function for TARGET_MD_ASM_CLOBBERS.
28515
28516    We do this in the new i386 backend to maintain source compatibility
28517    with the old cc0-based compiler.  */
28518
28519 static tree
28520 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
28521                       tree inputs ATTRIBUTE_UNUSED,
28522                       tree clobbers)
28523 {
28524   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
28525                         clobbers);
28526   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
28527                         clobbers);
28528   return clobbers;
28529 }
28530
28531 /* Implements target vector targetm.asm.encode_section_info.  This
28532    is not used by netware.  */
28533
28534 static void ATTRIBUTE_UNUSED
28535 ix86_encode_section_info (tree decl, rtx rtl, int first)
28536 {
28537   default_encode_section_info (decl, rtl, first);
28538
28539   if (TREE_CODE (decl) == VAR_DECL
28540       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
28541       && ix86_in_large_data_p (decl))
28542     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
28543 }
28544
28545 /* Worker function for REVERSE_CONDITION.  */
28546
28547 enum rtx_code
28548 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
28549 {
28550   return (mode != CCFPmode && mode != CCFPUmode
28551           ? reverse_condition (code)
28552           : reverse_condition_maybe_unordered (code));
28553 }
28554
28555 /* Output code to perform an x87 FP register move, from OPERANDS[1]
28556    to OPERANDS[0].  */
28557
28558 const char *
28559 output_387_reg_move (rtx insn, rtx *operands)
28560 {
28561   if (REG_P (operands[0]))
28562     {
28563       if (REG_P (operands[1])
28564           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28565         {
28566           if (REGNO (operands[0]) == FIRST_STACK_REG)
28567             return output_387_ffreep (operands, 0);
28568           return "fstp\t%y0";
28569         }
28570       if (STACK_TOP_P (operands[0]))
28571         return "fld%z1\t%y1";
28572       return "fst\t%y0";
28573     }
28574   else if (MEM_P (operands[0]))
28575     {
28576       gcc_assert (REG_P (operands[1]));
28577       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28578         return "fstp%z0\t%y0";
28579       else
28580         {
28581           /* There is no non-popping store to memory for XFmode.
28582              So if we need one, follow the store with a load.  */
28583           if (GET_MODE (operands[0]) == XFmode)
28584             return "fstp%z0\t%y0\n\tfld%z0\t%y0";
28585           else
28586             return "fst%z0\t%y0";
28587         }
28588     }
28589   else
28590     gcc_unreachable();
28591 }
28592
28593 /* Output code to perform a conditional jump to LABEL, if C2 flag in
28594    FP status register is set.  */
28595
28596 void
28597 ix86_emit_fp_unordered_jump (rtx label)
28598 {
28599   rtx reg = gen_reg_rtx (HImode);
28600   rtx temp;
28601
28602   emit_insn (gen_x86_fnstsw_1 (reg));
28603
28604   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
28605     {
28606       emit_insn (gen_x86_sahf_1 (reg));
28607
28608       temp = gen_rtx_REG (CCmode, FLAGS_REG);
28609       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
28610     }
28611   else
28612     {
28613       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
28614
28615       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
28616       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
28617     }
28618
28619   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
28620                               gen_rtx_LABEL_REF (VOIDmode, label),
28621                               pc_rtx);
28622   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
28623
28624   emit_jump_insn (temp);
28625   predict_jump (REG_BR_PROB_BASE * 10 / 100);
28626 }
28627
28628 /* Output code to perform a log1p XFmode calculation.  */
28629
28630 void ix86_emit_i387_log1p (rtx op0, rtx op1)
28631 {
28632   rtx label1 = gen_label_rtx ();
28633   rtx label2 = gen_label_rtx ();
28634
28635   rtx tmp = gen_reg_rtx (XFmode);
28636   rtx tmp2 = gen_reg_rtx (XFmode);
28637
28638   emit_insn (gen_absxf2 (tmp, op1));
28639   emit_insn (gen_cmpxf (tmp,
28640     CONST_DOUBLE_FROM_REAL_VALUE (
28641        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
28642        XFmode)));
28643   emit_jump_insn (gen_bge (label1));
28644
28645   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28646   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
28647   emit_jump (label2);
28648
28649   emit_label (label1);
28650   emit_move_insn (tmp, CONST1_RTX (XFmode));
28651   emit_insn (gen_addxf3 (tmp, op1, tmp));
28652   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28653   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
28654
28655   emit_label (label2);
28656 }
28657
28658 /* Output code to perform a Newton-Rhapson approximation of a single precision
28659    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
28660
28661 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
28662 {
28663   rtx x0, x1, e0, e1, two;
28664
28665   x0 = gen_reg_rtx (mode);
28666   e0 = gen_reg_rtx (mode);
28667   e1 = gen_reg_rtx (mode);
28668   x1 = gen_reg_rtx (mode);
28669
28670   two = CONST_DOUBLE_FROM_REAL_VALUE (dconst2, SFmode);
28671
28672   if (VECTOR_MODE_P (mode))
28673     two = ix86_build_const_vector (SFmode, true, two);
28674
28675   two = force_reg (mode, two);
28676
28677   /* a / b = a * rcp(b) * (2.0 - b * rcp(b)) */
28678
28679   /* x0 = rcp(b) estimate */
28680   emit_insn (gen_rtx_SET (VOIDmode, x0,
28681                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
28682                                           UNSPEC_RCP)));
28683   /* e0 = x0 * b */
28684   emit_insn (gen_rtx_SET (VOIDmode, e0,
28685                           gen_rtx_MULT (mode, x0, b)));
28686   /* e1 = 2. - e0 */
28687   emit_insn (gen_rtx_SET (VOIDmode, e1,
28688                           gen_rtx_MINUS (mode, two, e0)));
28689   /* x1 = x0 * e1 */
28690   emit_insn (gen_rtx_SET (VOIDmode, x1,
28691                           gen_rtx_MULT (mode, x0, e1)));
28692   /* res = a * x1 */
28693   emit_insn (gen_rtx_SET (VOIDmode, res,
28694                           gen_rtx_MULT (mode, a, x1)));
28695 }
28696
28697 /* Output code to perform a Newton-Rhapson approximation of a
28698    single precision floating point [reciprocal] square root.  */
28699
28700 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
28701                          bool recip)
28702 {
28703   rtx x0, e0, e1, e2, e3, mthree, mhalf;
28704   REAL_VALUE_TYPE r;
28705
28706   x0 = gen_reg_rtx (mode);
28707   e0 = gen_reg_rtx (mode);
28708   e1 = gen_reg_rtx (mode);
28709   e2 = gen_reg_rtx (mode);
28710   e3 = gen_reg_rtx (mode);
28711
28712   real_from_integer (&r, VOIDmode, -3, -1, 0);
28713   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28714
28715   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
28716   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28717
28718   if (VECTOR_MODE_P (mode))
28719     {
28720       mthree = ix86_build_const_vector (SFmode, true, mthree);
28721       mhalf = ix86_build_const_vector (SFmode, true, mhalf);
28722     }
28723
28724   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
28725      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
28726
28727   /* x0 = rsqrt(a) estimate */
28728   emit_insn (gen_rtx_SET (VOIDmode, x0,
28729                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
28730                                           UNSPEC_RSQRT)));
28731
28732   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
28733   if (!recip)
28734     {
28735       rtx zero, mask;
28736
28737       zero = gen_reg_rtx (mode);
28738       mask = gen_reg_rtx (mode);
28739
28740       zero = force_reg (mode, CONST0_RTX(mode));
28741       emit_insn (gen_rtx_SET (VOIDmode, mask,
28742                               gen_rtx_NE (mode, zero, a)));
28743
28744       emit_insn (gen_rtx_SET (VOIDmode, x0,
28745                               gen_rtx_AND (mode, x0, mask)));
28746     }
28747
28748   /* e0 = x0 * a */
28749   emit_insn (gen_rtx_SET (VOIDmode, e0,
28750                           gen_rtx_MULT (mode, x0, a)));
28751   /* e1 = e0 * x0 */
28752   emit_insn (gen_rtx_SET (VOIDmode, e1,
28753                           gen_rtx_MULT (mode, e0, x0)));
28754
28755   /* e2 = e1 - 3. */
28756   mthree = force_reg (mode, mthree);
28757   emit_insn (gen_rtx_SET (VOIDmode, e2,
28758                           gen_rtx_PLUS (mode, e1, mthree)));
28759
28760   mhalf = force_reg (mode, mhalf);
28761   if (recip)
28762     /* e3 = -.5 * x0 */
28763     emit_insn (gen_rtx_SET (VOIDmode, e3,
28764                             gen_rtx_MULT (mode, x0, mhalf)));
28765   else
28766     /* e3 = -.5 * e0 */
28767     emit_insn (gen_rtx_SET (VOIDmode, e3,
28768                             gen_rtx_MULT (mode, e0, mhalf)));
28769   /* ret = e2 * e3 */
28770   emit_insn (gen_rtx_SET (VOIDmode, res,
28771                           gen_rtx_MULT (mode, e2, e3)));
28772 }
28773
28774 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
28775
28776 static void ATTRIBUTE_UNUSED
28777 i386_solaris_elf_named_section (const char *name, unsigned int flags,
28778                                 tree decl)
28779 {
28780   /* With Binutils 2.15, the "@unwind" marker must be specified on
28781      every occurrence of the ".eh_frame" section, not just the first
28782      one.  */
28783   if (TARGET_64BIT
28784       && strcmp (name, ".eh_frame") == 0)
28785     {
28786       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
28787                flags & SECTION_WRITE ? "aw" : "a");
28788       return;
28789     }
28790   default_elf_asm_named_section (name, flags, decl);
28791 }
28792
28793 /* Return the mangling of TYPE if it is an extended fundamental type.  */
28794
28795 static const char *
28796 ix86_mangle_type (const_tree type)
28797 {
28798   type = TYPE_MAIN_VARIANT (type);
28799
28800   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
28801       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
28802     return NULL;
28803
28804   switch (TYPE_MODE (type))
28805     {
28806     case TFmode:
28807       /* __float128 is "g".  */
28808       return "g";
28809     case XFmode:
28810       /* "long double" or __float80 is "e".  */
28811       return "e";
28812     default:
28813       return NULL;
28814     }
28815 }
28816
28817 /* For 32-bit code we can save PIC register setup by using
28818    __stack_chk_fail_local hidden function instead of calling
28819    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
28820    register, so it is better to call __stack_chk_fail directly.  */
28821
28822 static tree
28823 ix86_stack_protect_fail (void)
28824 {
28825   return TARGET_64BIT
28826          ? default_external_stack_protect_fail ()
28827          : default_hidden_stack_protect_fail ();
28828 }
28829
28830 /* Select a format to encode pointers in exception handling data.  CODE
28831    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
28832    true if the symbol may be affected by dynamic relocations.
28833
28834    ??? All x86 object file formats are capable of representing this.
28835    After all, the relocation needed is the same as for the call insn.
28836    Whether or not a particular assembler allows us to enter such, I
28837    guess we'll have to see.  */
28838 int
28839 asm_preferred_eh_data_format (int code, int global)
28840 {
28841   if (flag_pic)
28842     {
28843       int type = DW_EH_PE_sdata8;
28844       if (!TARGET_64BIT
28845           || ix86_cmodel == CM_SMALL_PIC
28846           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
28847         type = DW_EH_PE_sdata4;
28848       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
28849     }
28850   if (ix86_cmodel == CM_SMALL
28851       || (ix86_cmodel == CM_MEDIUM && code))
28852     return DW_EH_PE_udata4;
28853   return DW_EH_PE_absptr;
28854 }
28855 \f
28856 /* Expand copysign from SIGN to the positive value ABS_VALUE
28857    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
28858    the sign-bit.  */
28859 static void
28860 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
28861 {
28862   enum machine_mode mode = GET_MODE (sign);
28863   rtx sgn = gen_reg_rtx (mode);
28864   if (mask == NULL_RTX)
28865     {
28866       mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), false);
28867       if (!VECTOR_MODE_P (mode))
28868         {
28869           /* We need to generate a scalar mode mask in this case.  */
28870           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28871           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28872           mask = gen_reg_rtx (mode);
28873           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28874         }
28875     }
28876   else
28877     mask = gen_rtx_NOT (mode, mask);
28878   emit_insn (gen_rtx_SET (VOIDmode, sgn,
28879                           gen_rtx_AND (mode, mask, sign)));
28880   emit_insn (gen_rtx_SET (VOIDmode, result,
28881                           gen_rtx_IOR (mode, abs_value, sgn)));
28882 }
28883
28884 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
28885    mask for masking out the sign-bit is stored in *SMASK, if that is
28886    non-null.  */
28887 static rtx
28888 ix86_expand_sse_fabs (rtx op0, rtx *smask)
28889 {
28890   enum machine_mode mode = GET_MODE (op0);
28891   rtx xa, mask;
28892
28893   xa = gen_reg_rtx (mode);
28894   mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), true);
28895   if (!VECTOR_MODE_P (mode))
28896     {
28897       /* We need to generate a scalar mode mask in this case.  */
28898       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28899       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28900       mask = gen_reg_rtx (mode);
28901       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28902     }
28903   emit_insn (gen_rtx_SET (VOIDmode, xa,
28904                           gen_rtx_AND (mode, op0, mask)));
28905
28906   if (smask)
28907     *smask = mask;
28908
28909   return xa;
28910 }
28911
28912 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
28913    swapping the operands if SWAP_OPERANDS is true.  The expanded
28914    code is a forward jump to a newly created label in case the
28915    comparison is true.  The generated label rtx is returned.  */
28916 static rtx
28917 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
28918                                   bool swap_operands)
28919 {
28920   rtx label, tmp;
28921
28922   if (swap_operands)
28923     {
28924       tmp = op0;
28925       op0 = op1;
28926       op1 = tmp;
28927     }
28928
28929   label = gen_label_rtx ();
28930   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
28931   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28932                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
28933   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
28934   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
28935                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
28936   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
28937   JUMP_LABEL (tmp) = label;
28938
28939   return label;
28940 }
28941
28942 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
28943    using comparison code CODE.  Operands are swapped for the comparison if
28944    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
28945 static rtx
28946 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
28947                               bool swap_operands)
28948 {
28949   enum machine_mode mode = GET_MODE (op0);
28950   rtx mask = gen_reg_rtx (mode);
28951
28952   if (swap_operands)
28953     {
28954       rtx tmp = op0;
28955       op0 = op1;
28956       op1 = tmp;
28957     }
28958
28959   if (mode == DFmode)
28960     emit_insn (gen_sse2_maskcmpdf3 (mask, op0, op1,
28961                                     gen_rtx_fmt_ee (code, mode, op0, op1)));
28962   else
28963     emit_insn (gen_sse_maskcmpsf3 (mask, op0, op1,
28964                                    gen_rtx_fmt_ee (code, mode, op0, op1)));
28965
28966   return mask;
28967 }
28968
28969 /* Generate and return a rtx of mode MODE for 2**n where n is the number
28970    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
28971 static rtx
28972 ix86_gen_TWO52 (enum machine_mode mode)
28973 {
28974   REAL_VALUE_TYPE TWO52r;
28975   rtx TWO52;
28976
28977   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
28978   TWO52 = const_double_from_real_value (TWO52r, mode);
28979   TWO52 = force_reg (mode, TWO52);
28980
28981   return TWO52;
28982 }
28983
28984 /* Expand SSE sequence for computing lround from OP1 storing
28985    into OP0.  */
28986 void
28987 ix86_expand_lround (rtx op0, rtx op1)
28988 {
28989   /* C code for the stuff we're doing below:
28990        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
28991        return (long)tmp;
28992    */
28993   enum machine_mode mode = GET_MODE (op1);
28994   const struct real_format *fmt;
28995   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
28996   rtx adj;
28997
28998   /* load nextafter (0.5, 0.0) */
28999   fmt = REAL_MODE_FORMAT (mode);
29000   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
29001   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
29002
29003   /* adj = copysign (0.5, op1) */
29004   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
29005   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
29006
29007   /* adj = op1 + adj */
29008   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
29009
29010   /* op0 = (imode)adj */
29011   expand_fix (op0, adj, 0);
29012 }
29013
29014 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
29015    into OPERAND0.  */
29016 void
29017 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
29018 {
29019   /* C code for the stuff we're doing below (for do_floor):
29020         xi = (long)op1;
29021         xi -= (double)xi > op1 ? 1 : 0;
29022         return xi;
29023    */
29024   enum machine_mode fmode = GET_MODE (op1);
29025   enum machine_mode imode = GET_MODE (op0);
29026   rtx ireg, freg, label, tmp;
29027
29028   /* reg = (long)op1 */
29029   ireg = gen_reg_rtx (imode);
29030   expand_fix (ireg, op1, 0);
29031
29032   /* freg = (double)reg */
29033   freg = gen_reg_rtx (fmode);
29034   expand_float (freg, ireg, 0);
29035
29036   /* ireg = (freg > op1) ? ireg - 1 : ireg */
29037   label = ix86_expand_sse_compare_and_jump (UNLE,
29038                                             freg, op1, !do_floor);
29039   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
29040                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
29041   emit_move_insn (ireg, tmp);
29042
29043   emit_label (label);
29044   LABEL_NUSES (label) = 1;
29045
29046   emit_move_insn (op0, ireg);
29047 }
29048
29049 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
29050    result in OPERAND0.  */
29051 void
29052 ix86_expand_rint (rtx operand0, rtx operand1)
29053 {
29054   /* C code for the stuff we're doing below:
29055         xa = fabs (operand1);
29056         if (!isless (xa, 2**52))
29057           return operand1;
29058         xa = xa + 2**52 - 2**52;
29059         return copysign (xa, operand1);
29060    */
29061   enum machine_mode mode = GET_MODE (operand0);
29062   rtx res, xa, label, TWO52, mask;
29063
29064   res = gen_reg_rtx (mode);
29065   emit_move_insn (res, operand1);
29066
29067   /* xa = abs (operand1) */
29068   xa = ix86_expand_sse_fabs (res, &mask);
29069
29070   /* if (!isless (xa, TWO52)) goto label; */
29071   TWO52 = ix86_gen_TWO52 (mode);
29072   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29073
29074   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29075   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
29076
29077   ix86_sse_copysign_to_positive (res, xa, res, mask);
29078
29079   emit_label (label);
29080   LABEL_NUSES (label) = 1;
29081
29082   emit_move_insn (operand0, res);
29083 }
29084
29085 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
29086    into OPERAND0.  */
29087 void
29088 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
29089 {
29090   /* C code for the stuff we expand below.
29091         double xa = fabs (x), x2;
29092         if (!isless (xa, TWO52))
29093           return x;
29094         xa = xa + TWO52 - TWO52;
29095         x2 = copysign (xa, x);
29096      Compensate.  Floor:
29097         if (x2 > x)
29098           x2 -= 1;
29099      Compensate.  Ceil:
29100         if (x2 < x)
29101           x2 -= -1;
29102         return x2;
29103    */
29104   enum machine_mode mode = GET_MODE (operand0);
29105   rtx xa, TWO52, tmp, label, one, res, mask;
29106
29107   TWO52 = ix86_gen_TWO52 (mode);
29108
29109   /* Temporary for holding the result, initialized to the input
29110      operand to ease control flow.  */
29111   res = gen_reg_rtx (mode);
29112   emit_move_insn (res, operand1);
29113
29114   /* xa = abs (operand1) */
29115   xa = ix86_expand_sse_fabs (res, &mask);
29116
29117   /* if (!isless (xa, TWO52)) goto label; */
29118   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29119
29120   /* xa = xa + TWO52 - TWO52; */
29121   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29122   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
29123
29124   /* xa = copysign (xa, operand1) */
29125   ix86_sse_copysign_to_positive (xa, xa, res, mask);
29126
29127   /* generate 1.0 or -1.0 */
29128   one = force_reg (mode,
29129                    const_double_from_real_value (do_floor
29130                                                  ? dconst1 : dconstm1, mode));
29131
29132   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
29133   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
29134   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29135                           gen_rtx_AND (mode, one, tmp)));
29136   /* We always need to subtract here to preserve signed zero.  */
29137   tmp = expand_simple_binop (mode, MINUS,
29138                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29139   emit_move_insn (res, tmp);
29140
29141   emit_label (label);
29142   LABEL_NUSES (label) = 1;
29143
29144   emit_move_insn (operand0, res);
29145 }
29146
29147 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
29148    into OPERAND0.  */
29149 void
29150 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
29151 {
29152   /* C code for the stuff we expand below.
29153         double xa = fabs (x), x2;
29154         if (!isless (xa, TWO52))
29155           return x;
29156         x2 = (double)(long)x;
29157      Compensate.  Floor:
29158         if (x2 > x)
29159           x2 -= 1;
29160      Compensate.  Ceil:
29161         if (x2 < x)
29162           x2 += 1;
29163         if (HONOR_SIGNED_ZEROS (mode))
29164           return copysign (x2, x);
29165         return x2;
29166    */
29167   enum machine_mode mode = GET_MODE (operand0);
29168   rtx xa, xi, TWO52, tmp, label, one, res, mask;
29169
29170   TWO52 = ix86_gen_TWO52 (mode);
29171
29172   /* Temporary for holding the result, initialized to the input
29173      operand to ease control flow.  */
29174   res = gen_reg_rtx (mode);
29175   emit_move_insn (res, operand1);
29176
29177   /* xa = abs (operand1) */
29178   xa = ix86_expand_sse_fabs (res, &mask);
29179
29180   /* if (!isless (xa, TWO52)) goto label; */
29181   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29182
29183   /* xa = (double)(long)x */
29184   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29185   expand_fix (xi, res, 0);
29186   expand_float (xa, xi, 0);
29187
29188   /* generate 1.0 */
29189   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
29190
29191   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
29192   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
29193   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29194                           gen_rtx_AND (mode, one, tmp)));
29195   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
29196                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29197   emit_move_insn (res, tmp);
29198
29199   if (HONOR_SIGNED_ZEROS (mode))
29200     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
29201
29202   emit_label (label);
29203   LABEL_NUSES (label) = 1;
29204
29205   emit_move_insn (operand0, res);
29206 }
29207
29208 /* Expand SSE sequence for computing round from OPERAND1 storing
29209    into OPERAND0.  Sequence that works without relying on DImode truncation
29210    via cvttsd2siq that is only available on 64bit targets.  */
29211 void
29212 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
29213 {
29214   /* C code for the stuff we expand below.
29215         double xa = fabs (x), xa2, x2;
29216         if (!isless (xa, TWO52))
29217           return x;
29218      Using the absolute value and copying back sign makes
29219      -0.0 -> -0.0 correct.
29220         xa2 = xa + TWO52 - TWO52;
29221      Compensate.
29222         dxa = xa2 - xa;
29223         if (dxa <= -0.5)
29224           xa2 += 1;
29225         else if (dxa > 0.5)
29226           xa2 -= 1;
29227         x2 = copysign (xa2, x);
29228         return x2;
29229    */
29230   enum machine_mode mode = GET_MODE (operand0);
29231   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
29232
29233   TWO52 = ix86_gen_TWO52 (mode);
29234
29235   /* Temporary for holding the result, initialized to the input
29236      operand to ease control flow.  */
29237   res = gen_reg_rtx (mode);
29238   emit_move_insn (res, operand1);
29239
29240   /* xa = abs (operand1) */
29241   xa = ix86_expand_sse_fabs (res, &mask);
29242
29243   /* if (!isless (xa, TWO52)) goto label; */
29244   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29245
29246   /* xa2 = xa + TWO52 - TWO52; */
29247   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29248   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
29249
29250   /* dxa = xa2 - xa; */
29251   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
29252
29253   /* generate 0.5, 1.0 and -0.5 */
29254   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
29255   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
29256   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
29257                                0, OPTAB_DIRECT);
29258
29259   /* Compensate.  */
29260   tmp = gen_reg_rtx (mode);
29261   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
29262   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
29263   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29264                           gen_rtx_AND (mode, one, tmp)));
29265   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29266   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
29267   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
29268   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29269                           gen_rtx_AND (mode, one, tmp)));
29270   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29271
29272   /* res = copysign (xa2, operand1) */
29273   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
29274
29275   emit_label (label);
29276   LABEL_NUSES (label) = 1;
29277
29278   emit_move_insn (operand0, res);
29279 }
29280
29281 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29282    into OPERAND0.  */
29283 void
29284 ix86_expand_trunc (rtx operand0, rtx operand1)
29285 {
29286   /* C code for SSE variant we expand below.
29287         double xa = fabs (x), x2;
29288         if (!isless (xa, TWO52))
29289           return x;
29290         x2 = (double)(long)x;
29291         if (HONOR_SIGNED_ZEROS (mode))
29292           return copysign (x2, x);
29293         return x2;
29294    */
29295   enum machine_mode mode = GET_MODE (operand0);
29296   rtx xa, xi, TWO52, label, res, mask;
29297
29298   TWO52 = ix86_gen_TWO52 (mode);
29299
29300   /* Temporary for holding the result, initialized to the input
29301      operand to ease control flow.  */
29302   res = gen_reg_rtx (mode);
29303   emit_move_insn (res, operand1);
29304
29305   /* xa = abs (operand1) */
29306   xa = ix86_expand_sse_fabs (res, &mask);
29307
29308   /* if (!isless (xa, TWO52)) goto label; */
29309   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29310
29311   /* x = (double)(long)x */
29312   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29313   expand_fix (xi, res, 0);
29314   expand_float (res, xi, 0);
29315
29316   if (HONOR_SIGNED_ZEROS (mode))
29317     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
29318
29319   emit_label (label);
29320   LABEL_NUSES (label) = 1;
29321
29322   emit_move_insn (operand0, res);
29323 }
29324
29325 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29326    into OPERAND0.  */
29327 void
29328 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
29329 {
29330   enum machine_mode mode = GET_MODE (operand0);
29331   rtx xa, mask, TWO52, label, one, res, smask, tmp;
29332
29333   /* C code for SSE variant we expand below.
29334         double xa = fabs (x), x2;
29335         if (!isless (xa, TWO52))
29336           return x;
29337         xa2 = xa + TWO52 - TWO52;
29338      Compensate:
29339         if (xa2 > xa)
29340           xa2 -= 1.0;
29341         x2 = copysign (xa2, x);
29342         return x2;
29343    */
29344
29345   TWO52 = ix86_gen_TWO52 (mode);
29346
29347   /* Temporary for holding the result, initialized to the input
29348      operand to ease control flow.  */
29349   res = gen_reg_rtx (mode);
29350   emit_move_insn (res, operand1);
29351
29352   /* xa = abs (operand1) */
29353   xa = ix86_expand_sse_fabs (res, &smask);
29354
29355   /* if (!isless (xa, TWO52)) goto label; */
29356   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29357
29358   /* res = xa + TWO52 - TWO52; */
29359   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29360   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
29361   emit_move_insn (res, tmp);
29362
29363   /* generate 1.0 */
29364   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
29365
29366   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
29367   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
29368   emit_insn (gen_rtx_SET (VOIDmode, mask,
29369                           gen_rtx_AND (mode, mask, one)));
29370   tmp = expand_simple_binop (mode, MINUS,
29371                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
29372   emit_move_insn (res, tmp);
29373
29374   /* res = copysign (res, operand1) */
29375   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
29376
29377   emit_label (label);
29378   LABEL_NUSES (label) = 1;
29379
29380   emit_move_insn (operand0, res);
29381 }
29382
29383 /* Expand SSE sequence for computing round from OPERAND1 storing
29384    into OPERAND0.  */
29385 void
29386 ix86_expand_round (rtx operand0, rtx operand1)
29387 {
29388   /* C code for the stuff we're doing below:
29389         double xa = fabs (x);
29390         if (!isless (xa, TWO52))
29391           return x;
29392         xa = (double)(long)(xa + nextafter (0.5, 0.0));
29393         return copysign (xa, x);
29394    */
29395   enum machine_mode mode = GET_MODE (operand0);
29396   rtx res, TWO52, xa, label, xi, half, mask;
29397   const struct real_format *fmt;
29398   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
29399
29400   /* Temporary for holding the result, initialized to the input
29401      operand to ease control flow.  */
29402   res = gen_reg_rtx (mode);
29403   emit_move_insn (res, operand1);
29404
29405   TWO52 = ix86_gen_TWO52 (mode);
29406   xa = ix86_expand_sse_fabs (res, &mask);
29407   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29408
29409   /* load nextafter (0.5, 0.0) */
29410   fmt = REAL_MODE_FORMAT (mode);
29411   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
29412   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
29413
29414   /* xa = xa + 0.5 */
29415   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
29416   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
29417
29418   /* xa = (double)(int64_t)xa */
29419   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29420   expand_fix (xi, xa, 0);
29421   expand_float (xa, xi, 0);
29422
29423   /* res = copysign (xa, operand1) */
29424   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
29425
29426   emit_label (label);
29427   LABEL_NUSES (label) = 1;
29428
29429   emit_move_insn (operand0, res);
29430 }
29431
29432 \f
29433 /* Validate whether a SSE5 instruction is valid or not.
29434    OPERANDS is the array of operands.
29435    NUM is the number of operands.
29436    USES_OC0 is true if the instruction uses OC0 and provides 4 variants.
29437    NUM_MEMORY is the maximum number of memory operands to accept.  
29438    when COMMUTATIVE is set, operand 1 and 2 can be swapped.  */
29439
29440 bool
29441 ix86_sse5_valid_op_p (rtx operands[], rtx insn ATTRIBUTE_UNUSED, int num,
29442                       bool uses_oc0, int num_memory, bool commutative)
29443 {
29444   int mem_mask;
29445   int mem_count;
29446   int i;
29447
29448   /* Count the number of memory arguments */
29449   mem_mask = 0;
29450   mem_count = 0;
29451   for (i = 0; i < num; i++)
29452     {
29453       enum machine_mode mode = GET_MODE (operands[i]);
29454       if (register_operand (operands[i], mode))
29455         ;
29456
29457       else if (memory_operand (operands[i], mode))
29458         {
29459           mem_mask |= (1 << i);
29460           mem_count++;
29461         }
29462
29463       else
29464         {
29465           rtx pattern = PATTERN (insn);
29466
29467           /* allow 0 for pcmov */
29468           if (GET_CODE (pattern) != SET
29469               || GET_CODE (SET_SRC (pattern)) != IF_THEN_ELSE
29470               || i < 2
29471               || operands[i] != CONST0_RTX (mode))
29472             return false;
29473         }
29474     }
29475
29476   /* Special case pmacsdq{l,h} where we allow the 3rd argument to be
29477      a memory operation.  */
29478   if (num_memory < 0)
29479     {
29480       num_memory = -num_memory;
29481       if ((mem_mask & (1 << (num-1))) != 0)
29482         {
29483           mem_mask &= ~(1 << (num-1));
29484           mem_count--;
29485         }
29486     }
29487
29488   /* If there were no memory operations, allow the insn */
29489   if (mem_mask == 0)
29490     return true;
29491
29492   /* Do not allow the destination register to be a memory operand.  */
29493   else if (mem_mask & (1 << 0))
29494     return false;
29495
29496   /* If there are too many memory operations, disallow the instruction.  While
29497      the hardware only allows 1 memory reference, before register allocation
29498      for some insns, we allow two memory operations sometimes in order to allow
29499      code like the following to be optimized:
29500
29501         float fmadd (float *a, float *b, float *c) { return (*a * *b) + *c; }
29502
29503     or similar cases that are vectorized into using the fmaddss
29504     instruction.  */
29505   else if (mem_count > num_memory)
29506     return false;
29507
29508   /* Don't allow more than one memory operation if not optimizing.  */
29509   else if (mem_count > 1 && !optimize)
29510     return false;
29511
29512   else if (num == 4 && mem_count == 1)
29513     {
29514       /* formats (destination is the first argument), example fmaddss:
29515          xmm1, xmm1, xmm2, xmm3/mem
29516          xmm1, xmm1, xmm2/mem, xmm3
29517          xmm1, xmm2, xmm3/mem, xmm1
29518          xmm1, xmm2/mem, xmm3, xmm1 */
29519       if (uses_oc0)
29520         return ((mem_mask == (1 << 1))
29521                 || (mem_mask == (1 << 2))
29522                 || (mem_mask == (1 << 3)));
29523
29524       /* format, example pmacsdd:
29525          xmm1, xmm2, xmm3/mem, xmm1 */
29526       if (commutative)
29527         return (mem_mask == (1 << 2) || mem_mask == (1 << 1));
29528       else
29529         return (mem_mask == (1 << 2));
29530     }
29531
29532   else if (num == 4 && num_memory == 2)
29533     {
29534       /* If there are two memory operations, we can load one of the memory ops
29535          into the destination register.  This is for optimizing the
29536          multiply/add ops, which the combiner has optimized both the multiply
29537          and the add insns to have a memory operation.  We have to be careful
29538          that the destination doesn't overlap with the inputs.  */
29539       rtx op0 = operands[0];
29540
29541       if (reg_mentioned_p (op0, operands[1])
29542           || reg_mentioned_p (op0, operands[2])
29543           || reg_mentioned_p (op0, operands[3]))
29544         return false;
29545
29546       /* formats (destination is the first argument), example fmaddss:
29547          xmm1, xmm1, xmm2, xmm3/mem
29548          xmm1, xmm1, xmm2/mem, xmm3
29549          xmm1, xmm2, xmm3/mem, xmm1
29550          xmm1, xmm2/mem, xmm3, xmm1
29551
29552          For the oc0 case, we will load either operands[1] or operands[3] into
29553          operands[0], so any combination of 2 memory operands is ok.  */
29554       if (uses_oc0)
29555         return true;
29556
29557       /* format, example pmacsdd:
29558          xmm1, xmm2, xmm3/mem, xmm1
29559
29560          For the integer multiply/add instructions be more restrictive and
29561          require operands[2] and operands[3] to be the memory operands.  */
29562       if (commutative)
29563         return (mem_mask == ((1 << 1) | (1 << 3)) || ((1 << 2) | (1 << 3)));
29564       else
29565         return (mem_mask == ((1 << 2) | (1 << 3)));
29566     }
29567
29568   else if (num == 3 && num_memory == 1)
29569     {
29570       /* formats, example protb:
29571          xmm1, xmm2, xmm3/mem
29572          xmm1, xmm2/mem, xmm3 */
29573       if (uses_oc0)
29574         return ((mem_mask == (1 << 1)) || (mem_mask == (1 << 2)));
29575
29576       /* format, example comeq:
29577          xmm1, xmm2, xmm3/mem */
29578       else
29579         return (mem_mask == (1 << 2));
29580     }
29581
29582   else
29583     gcc_unreachable ();
29584
29585   return false;
29586 }
29587
29588 \f
29589 /* Fixup an SSE5 instruction that has 2 memory input references into a form the
29590    hardware will allow by using the destination register to load one of the
29591    memory operations.  Presently this is used by the multiply/add routines to
29592    allow 2 memory references.  */
29593
29594 void
29595 ix86_expand_sse5_multiple_memory (rtx operands[],
29596                                   int num,
29597                                   enum machine_mode mode)
29598 {
29599   rtx op0 = operands[0];
29600   if (num != 4
29601       || memory_operand (op0, mode)
29602       || reg_mentioned_p (op0, operands[1])
29603       || reg_mentioned_p (op0, operands[2])
29604       || reg_mentioned_p (op0, operands[3]))
29605     gcc_unreachable ();
29606
29607   /* For 2 memory operands, pick either operands[1] or operands[3] to move into
29608      the destination register.  */
29609   if (memory_operand (operands[1], mode))
29610     {
29611       emit_move_insn (op0, operands[1]);
29612       operands[1] = op0;
29613     }
29614   else if (memory_operand (operands[3], mode))
29615     {
29616       emit_move_insn (op0, operands[3]);
29617       operands[3] = op0;
29618     }
29619   else
29620     gcc_unreachable ();
29621
29622   return;
29623 }
29624
29625 \f
29626 /* Table of valid machine attributes.  */
29627 static const struct attribute_spec ix86_attribute_table[] =
29628 {
29629   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
29630   /* Stdcall attribute says callee is responsible for popping arguments
29631      if they are not variable.  */
29632   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29633   /* Fastcall attribute says callee is responsible for popping arguments
29634      if they are not variable.  */
29635   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29636   /* Cdecl attribute says the callee is a normal C declaration */
29637   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29638   /* Regparm attribute specifies how many integer arguments are to be
29639      passed in registers.  */
29640   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute },
29641   /* Sseregparm attribute says we are using x86_64 calling conventions
29642      for FP arguments.  */
29643   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute },
29644   /* force_align_arg_pointer says this function realigns the stack at entry.  */
29645   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
29646     false, true,  true, ix86_handle_cconv_attribute },
29647 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29648   { "dllimport", 0, 0, false, false, false, handle_dll_attribute },
29649   { "dllexport", 0, 0, false, false, false, handle_dll_attribute },
29650   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
29651 #endif
29652   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29653   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29654 #ifdef SUBTARGET_ATTRIBUTE_TABLE
29655   SUBTARGET_ATTRIBUTE_TABLE,
29656 #endif
29657   /* ms_abi and sysv_abi calling convention function attributes.  */
29658   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29659   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29660   /* End element.  */
29661   { NULL,        0, 0, false, false, false, NULL }
29662 };
29663
29664 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
29665 static int
29666 x86_builtin_vectorization_cost (bool runtime_test)
29667 {
29668   /* If the branch of the runtime test is taken - i.e. - the vectorized
29669      version is skipped - this incurs a misprediction cost (because the
29670      vectorized version is expected to be the fall-through).  So we subtract
29671      the latency of a mispredicted branch from the costs that are incured
29672      when the vectorized version is executed.
29673
29674      TODO: The values in individual target tables have to be tuned or new
29675      fields may be needed. For eg. on K8, the default branch path is the
29676      not-taken path. If the taken path is predicted correctly, the minimum
29677      penalty of going down the taken-path is 1 cycle. If the taken-path is
29678      not predicted correctly, then the minimum penalty is 10 cycles.  */
29679
29680   if (runtime_test)
29681     {
29682       return (-(ix86_cost->cond_taken_branch_cost));
29683     }
29684   else
29685     return 0;
29686 }
29687
29688 /* This function returns the calling abi specific va_list type node.
29689    It returns  the FNDECL specific va_list type.  */
29690
29691 tree
29692 ix86_fn_abi_va_list (tree fndecl)
29693 {
29694   int abi;
29695
29696   if (!TARGET_64BIT)
29697     return va_list_type_node;
29698   gcc_assert (fndecl != NULL_TREE);
29699   abi = ix86_function_abi ((const_tree) fndecl);
29700
29701   if (abi == MS_ABI)
29702     return ms_va_list_type_node;
29703   else
29704     return sysv_va_list_type_node;
29705 }
29706
29707 /* Returns the canonical va_list type specified by TYPE. If there
29708    is no valid TYPE provided, it return NULL_TREE.  */
29709
29710 tree
29711 ix86_canonical_va_list_type (tree type)
29712 {
29713   tree wtype, htype;
29714
29715   /* Resolve references and pointers to va_list type.  */
29716   if (INDIRECT_REF_P (type))
29717     type = TREE_TYPE (type);
29718   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
29719     type = TREE_TYPE (type);
29720
29721   if (TARGET_64BIT)
29722     {
29723       wtype = va_list_type_node;
29724           gcc_assert (wtype != NULL_TREE);
29725       htype = type;
29726       if (TREE_CODE (wtype) == ARRAY_TYPE)
29727         {
29728           /* If va_list is an array type, the argument may have decayed
29729              to a pointer type, e.g. by being passed to another function.
29730              In that case, unwrap both types so that we can compare the
29731              underlying records.  */
29732           if (TREE_CODE (htype) == ARRAY_TYPE
29733               || POINTER_TYPE_P (htype))
29734             {
29735               wtype = TREE_TYPE (wtype);
29736               htype = TREE_TYPE (htype);
29737             }
29738         }
29739       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29740         return va_list_type_node;
29741       wtype = sysv_va_list_type_node;
29742           gcc_assert (wtype != NULL_TREE);
29743       htype = type;
29744       if (TREE_CODE (wtype) == ARRAY_TYPE)
29745         {
29746           /* If va_list is an array type, the argument may have decayed
29747              to a pointer type, e.g. by being passed to another function.
29748              In that case, unwrap both types so that we can compare the
29749              underlying records.  */
29750           if (TREE_CODE (htype) == ARRAY_TYPE
29751               || POINTER_TYPE_P (htype))
29752             {
29753               wtype = TREE_TYPE (wtype);
29754               htype = TREE_TYPE (htype);
29755             }
29756         }
29757       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29758         return sysv_va_list_type_node;
29759       wtype = ms_va_list_type_node;
29760           gcc_assert (wtype != NULL_TREE);
29761       htype = type;
29762       if (TREE_CODE (wtype) == ARRAY_TYPE)
29763         {
29764           /* If va_list is an array type, the argument may have decayed
29765              to a pointer type, e.g. by being passed to another function.
29766              In that case, unwrap both types so that we can compare the
29767              underlying records.  */
29768           if (TREE_CODE (htype) == ARRAY_TYPE
29769               || POINTER_TYPE_P (htype))
29770             {
29771               wtype = TREE_TYPE (wtype);
29772               htype = TREE_TYPE (htype);
29773             }
29774         }
29775       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29776         return ms_va_list_type_node;
29777       return NULL_TREE;
29778     }
29779   return std_canonical_va_list_type (type);
29780 }
29781
29782 /* Iterate through the target-specific builtin types for va_list.
29783     IDX denotes the iterator, *PTREE is set to the result type of
29784     the va_list builtin, and *PNAME to its internal type.
29785     Returns zero if there is no element for this index, otherwise
29786     IDX should be increased upon the next call.
29787     Note, do not iterate a base builtin's name like __builtin_va_list.
29788     Used from c_common_nodes_and_builtins.  */
29789
29790 int
29791 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
29792 {
29793   if (!TARGET_64BIT)
29794     return 0;
29795   switch (idx) {
29796   case 0:
29797     *ptree = ms_va_list_type_node;
29798     *pname = "__builtin_ms_va_list";
29799     break;
29800   case 1:
29801     *ptree = sysv_va_list_type_node;
29802     *pname = "__builtin_sysv_va_list";
29803     break;
29804   default:
29805     return 0;
29806   }
29807   return 1;
29808 }
29809
29810 /* Initialize the GCC target structure.  */
29811 #undef TARGET_RETURN_IN_MEMORY
29812 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
29813
29814 #undef TARGET_ATTRIBUTE_TABLE
29815 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
29816 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29817 #  undef TARGET_MERGE_DECL_ATTRIBUTES
29818 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
29819 #endif
29820
29821 #undef TARGET_COMP_TYPE_ATTRIBUTES
29822 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
29823
29824 #undef TARGET_INIT_BUILTINS
29825 #define TARGET_INIT_BUILTINS ix86_init_builtins
29826 #undef TARGET_EXPAND_BUILTIN
29827 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
29828
29829 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
29830 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
29831   ix86_builtin_vectorized_function
29832
29833 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
29834 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
29835
29836 #undef TARGET_BUILTIN_RECIPROCAL
29837 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
29838
29839 #undef TARGET_ASM_FUNCTION_EPILOGUE
29840 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
29841
29842 #undef TARGET_ENCODE_SECTION_INFO
29843 #ifndef SUBTARGET_ENCODE_SECTION_INFO
29844 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
29845 #else
29846 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
29847 #endif
29848
29849 #undef TARGET_ASM_OPEN_PAREN
29850 #define TARGET_ASM_OPEN_PAREN ""
29851 #undef TARGET_ASM_CLOSE_PAREN
29852 #define TARGET_ASM_CLOSE_PAREN ""
29853
29854 #undef TARGET_ASM_ALIGNED_HI_OP
29855 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
29856 #undef TARGET_ASM_ALIGNED_SI_OP
29857 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
29858 #ifdef ASM_QUAD
29859 #undef TARGET_ASM_ALIGNED_DI_OP
29860 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
29861 #endif
29862
29863 #undef TARGET_ASM_UNALIGNED_HI_OP
29864 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
29865 #undef TARGET_ASM_UNALIGNED_SI_OP
29866 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
29867 #undef TARGET_ASM_UNALIGNED_DI_OP
29868 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
29869
29870 #undef TARGET_SCHED_ADJUST_COST
29871 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
29872 #undef TARGET_SCHED_ISSUE_RATE
29873 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
29874 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
29875 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
29876   ia32_multipass_dfa_lookahead
29877
29878 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
29879 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
29880
29881 #ifdef HAVE_AS_TLS
29882 #undef TARGET_HAVE_TLS
29883 #define TARGET_HAVE_TLS true
29884 #endif
29885 #undef TARGET_CANNOT_FORCE_CONST_MEM
29886 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
29887 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
29888 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
29889
29890 #undef TARGET_DELEGITIMIZE_ADDRESS
29891 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
29892
29893 #undef TARGET_MS_BITFIELD_LAYOUT_P
29894 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
29895
29896 #if TARGET_MACHO
29897 #undef TARGET_BINDS_LOCAL_P
29898 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
29899 #endif
29900 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29901 #undef TARGET_BINDS_LOCAL_P
29902 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
29903 #endif
29904
29905 #undef TARGET_ASM_OUTPUT_MI_THUNK
29906 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
29907 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
29908 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
29909
29910 #undef TARGET_ASM_FILE_START
29911 #define TARGET_ASM_FILE_START x86_file_start
29912
29913 #undef TARGET_DEFAULT_TARGET_FLAGS
29914 #define TARGET_DEFAULT_TARGET_FLAGS     \
29915   (TARGET_DEFAULT                       \
29916    | TARGET_SUBTARGET_DEFAULT           \
29917    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
29918
29919 #undef TARGET_HANDLE_OPTION
29920 #define TARGET_HANDLE_OPTION ix86_handle_option
29921
29922 #undef TARGET_RTX_COSTS
29923 #define TARGET_RTX_COSTS ix86_rtx_costs
29924 #undef TARGET_ADDRESS_COST
29925 #define TARGET_ADDRESS_COST ix86_address_cost
29926
29927 #undef TARGET_FIXED_CONDITION_CODE_REGS
29928 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
29929 #undef TARGET_CC_MODES_COMPATIBLE
29930 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
29931
29932 #undef TARGET_MACHINE_DEPENDENT_REORG
29933 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
29934
29935 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
29936 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
29937
29938 #undef TARGET_BUILD_BUILTIN_VA_LIST
29939 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
29940
29941 #undef TARGET_FN_ABI_VA_LIST
29942 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
29943
29944 #undef TARGET_CANONICAL_VA_LIST_TYPE
29945 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
29946
29947 #undef TARGET_EXPAND_BUILTIN_VA_START
29948 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
29949
29950 #undef TARGET_MD_ASM_CLOBBERS
29951 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
29952
29953 #undef TARGET_PROMOTE_PROTOTYPES
29954 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
29955 #undef TARGET_STRUCT_VALUE_RTX
29956 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
29957 #undef TARGET_SETUP_INCOMING_VARARGS
29958 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
29959 #undef TARGET_MUST_PASS_IN_STACK
29960 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
29961 #undef TARGET_PASS_BY_REFERENCE
29962 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
29963 #undef TARGET_INTERNAL_ARG_POINTER
29964 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
29965 #undef TARGET_UPDATE_STACK_BOUNDARY
29966 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
29967 #undef TARGET_GET_DRAP_RTX
29968 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
29969 #undef TARGET_DWARF_HANDLE_FRAME_UNSPEC
29970 #define TARGET_DWARF_HANDLE_FRAME_UNSPEC ix86_dwarf_handle_frame_unspec
29971 #undef TARGET_STRICT_ARGUMENT_NAMING
29972 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
29973
29974 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
29975 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
29976
29977 #undef TARGET_SCALAR_MODE_SUPPORTED_P
29978 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
29979
29980 #undef TARGET_VECTOR_MODE_SUPPORTED_P
29981 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
29982
29983 #undef TARGET_C_MODE_FOR_SUFFIX
29984 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
29985
29986 #ifdef HAVE_AS_TLS
29987 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
29988 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
29989 #endif
29990
29991 #ifdef SUBTARGET_INSERT_ATTRIBUTES
29992 #undef TARGET_INSERT_ATTRIBUTES
29993 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
29994 #endif
29995
29996 #undef TARGET_MANGLE_TYPE
29997 #define TARGET_MANGLE_TYPE ix86_mangle_type
29998
29999 #undef TARGET_STACK_PROTECT_FAIL
30000 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
30001
30002 #undef TARGET_FUNCTION_VALUE
30003 #define TARGET_FUNCTION_VALUE ix86_function_value
30004
30005 #undef TARGET_SECONDARY_RELOAD
30006 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
30007
30008 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
30009 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST x86_builtin_vectorization_cost
30010
30011 #undef TARGET_SET_CURRENT_FUNCTION
30012 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
30013
30014 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
30015 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
30016
30017 #undef TARGET_OPTION_SAVE
30018 #define TARGET_OPTION_SAVE ix86_function_specific_save
30019
30020 #undef TARGET_OPTION_RESTORE
30021 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
30022
30023 #undef TARGET_OPTION_PRINT
30024 #define TARGET_OPTION_PRINT ix86_function_specific_print
30025
30026 #undef TARGET_OPTION_CAN_INLINE_P
30027 #define TARGET_OPTION_CAN_INLINE_P ix86_can_inline_p
30028
30029 #undef TARGET_EXPAND_TO_RTL_HOOK
30030 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
30031
30032 struct gcc_target targetm = TARGET_INITIALIZER;
30033 \f
30034 #include "gt-i386.h"