OSDN Git Service

* config/i386/emmintrin.h (_mm_loadh_pd): Don't cast pointer arg
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.c
1 /* Subroutines used for code generation on IA-32.
2    Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3    2002, 2003, 2004 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "tm_p.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "real.h"
32 #include "insn-config.h"
33 #include "conditions.h"
34 #include "output.h"
35 #include "insn-codes.h"
36 #include "insn-attr.h"
37 #include "flags.h"
38 #include "except.h"
39 #include "function.h"
40 #include "recog.h"
41 #include "expr.h"
42 #include "optabs.h"
43 #include "toplev.h"
44 #include "basic-block.h"
45 #include "ggc.h"
46 #include "target.h"
47 #include "target-def.h"
48 #include "langhooks.h"
49 #include "cgraph.h"
50 #include "tree-gimple.h"
51
52 #ifndef CHECK_STACK_LIMIT
53 #define CHECK_STACK_LIMIT (-1)
54 #endif
55
56 /* Return index of given mode in mult and division cost tables.  */
57 #define MODE_INDEX(mode)                                        \
58   ((mode) == QImode ? 0                                         \
59    : (mode) == HImode ? 1                                       \
60    : (mode) == SImode ? 2                                       \
61    : (mode) == DImode ? 3                                       \
62    : 4)
63
64 /* Processor costs (relative to an add) */
65 static const
66 struct processor_costs size_cost = {    /* costs for tunning for size */
67   2,                                    /* cost of an add instruction */
68   3,                                    /* cost of a lea instruction */
69   2,                                    /* variable shift costs */
70   3,                                    /* constant shift costs */
71   {3, 3, 3, 3, 5},                      /* cost of starting a multiply */
72   0,                                    /* cost of multiply per each bit set */
73   {3, 3, 3, 3, 5},                      /* cost of a divide/mod */
74   3,                                    /* cost of movsx */
75   3,                                    /* cost of movzx */
76   0,                                    /* "large" insn */
77   2,                                    /* MOVE_RATIO */
78   2,                                    /* cost for loading QImode using movzbl */
79   {2, 2, 2},                            /* cost of loading integer registers
80                                            in QImode, HImode and SImode.
81                                            Relative to reg-reg move (2).  */
82   {2, 2, 2},                            /* cost of storing integer registers */
83   2,                                    /* cost of reg,reg fld/fst */
84   {2, 2, 2},                            /* cost of loading fp registers
85                                            in SFmode, DFmode and XFmode */
86   {2, 2, 2},                            /* cost of loading integer registers */
87   3,                                    /* cost of moving MMX register */
88   {3, 3},                               /* cost of loading MMX registers
89                                            in SImode and DImode */
90   {3, 3},                               /* cost of storing MMX registers
91                                            in SImode and DImode */
92   3,                                    /* cost of moving SSE register */
93   {3, 3, 3},                            /* cost of loading SSE registers
94                                            in SImode, DImode and TImode */
95   {3, 3, 3},                            /* cost of storing SSE registers
96                                            in SImode, DImode and TImode */
97   3,                                    /* MMX or SSE register to integer */
98   0,                                    /* size of prefetch block */
99   0,                                    /* number of parallel prefetches */
100   1,                                    /* Branch cost */
101   2,                                    /* cost of FADD and FSUB insns.  */
102   2,                                    /* cost of FMUL instruction.  */
103   2,                                    /* cost of FDIV instruction.  */
104   2,                                    /* cost of FABS instruction.  */
105   2,                                    /* cost of FCHS instruction.  */
106   2,                                    /* cost of FSQRT instruction.  */
107 };
108
109 /* Processor costs (relative to an add) */
110 static const
111 struct processor_costs i386_cost = {    /* 386 specific costs */
112   1,                                    /* cost of an add instruction */
113   1,                                    /* cost of a lea instruction */
114   3,                                    /* variable shift costs */
115   2,                                    /* constant shift costs */
116   {6, 6, 6, 6, 6},                      /* cost of starting a multiply */
117   1,                                    /* cost of multiply per each bit set */
118   {23, 23, 23, 23, 23},                 /* cost of a divide/mod */
119   3,                                    /* cost of movsx */
120   2,                                    /* cost of movzx */
121   15,                                   /* "large" insn */
122   3,                                    /* MOVE_RATIO */
123   4,                                    /* cost for loading QImode using movzbl */
124   {2, 4, 2},                            /* cost of loading integer registers
125                                            in QImode, HImode and SImode.
126                                            Relative to reg-reg move (2).  */
127   {2, 4, 2},                            /* cost of storing integer registers */
128   2,                                    /* cost of reg,reg fld/fst */
129   {8, 8, 8},                            /* cost of loading fp registers
130                                            in SFmode, DFmode and XFmode */
131   {8, 8, 8},                            /* cost of loading integer registers */
132   2,                                    /* cost of moving MMX register */
133   {4, 8},                               /* cost of loading MMX registers
134                                            in SImode and DImode */
135   {4, 8},                               /* cost of storing MMX registers
136                                            in SImode and DImode */
137   2,                                    /* cost of moving SSE register */
138   {4, 8, 16},                           /* cost of loading SSE registers
139                                            in SImode, DImode and TImode */
140   {4, 8, 16},                           /* cost of storing SSE registers
141                                            in SImode, DImode and TImode */
142   3,                                    /* MMX or SSE register to integer */
143   0,                                    /* size of prefetch block */
144   0,                                    /* number of parallel prefetches */
145   1,                                    /* Branch cost */
146   23,                                   /* cost of FADD and FSUB insns.  */
147   27,                                   /* cost of FMUL instruction.  */
148   88,                                   /* cost of FDIV instruction.  */
149   22,                                   /* cost of FABS instruction.  */
150   24,                                   /* cost of FCHS instruction.  */
151   122,                                  /* cost of FSQRT instruction.  */
152 };
153
154 static const
155 struct processor_costs i486_cost = {    /* 486 specific costs */
156   1,                                    /* cost of an add instruction */
157   1,                                    /* cost of a lea instruction */
158   3,                                    /* variable shift costs */
159   2,                                    /* constant shift costs */
160   {12, 12, 12, 12, 12},                 /* cost of starting a multiply */
161   1,                                    /* cost of multiply per each bit set */
162   {40, 40, 40, 40, 40},                 /* cost of a divide/mod */
163   3,                                    /* cost of movsx */
164   2,                                    /* cost of movzx */
165   15,                                   /* "large" insn */
166   3,                                    /* MOVE_RATIO */
167   4,                                    /* cost for loading QImode using movzbl */
168   {2, 4, 2},                            /* cost of loading integer registers
169                                            in QImode, HImode and SImode.
170                                            Relative to reg-reg move (2).  */
171   {2, 4, 2},                            /* cost of storing integer registers */
172   2,                                    /* cost of reg,reg fld/fst */
173   {8, 8, 8},                            /* cost of loading fp registers
174                                            in SFmode, DFmode and XFmode */
175   {8, 8, 8},                            /* cost of loading integer registers */
176   2,                                    /* cost of moving MMX register */
177   {4, 8},                               /* cost of loading MMX registers
178                                            in SImode and DImode */
179   {4, 8},                               /* cost of storing MMX registers
180                                            in SImode and DImode */
181   2,                                    /* cost of moving SSE register */
182   {4, 8, 16},                           /* cost of loading SSE registers
183                                            in SImode, DImode and TImode */
184   {4, 8, 16},                           /* cost of storing SSE registers
185                                            in SImode, DImode and TImode */
186   3,                                    /* MMX or SSE register to integer */
187   0,                                    /* size of prefetch block */
188   0,                                    /* number of parallel prefetches */
189   1,                                    /* Branch cost */
190   8,                                    /* cost of FADD and FSUB insns.  */
191   16,                                   /* cost of FMUL instruction.  */
192   73,                                   /* cost of FDIV instruction.  */
193   3,                                    /* cost of FABS instruction.  */
194   3,                                    /* cost of FCHS instruction.  */
195   83,                                   /* cost of FSQRT instruction.  */
196 };
197
198 static const
199 struct processor_costs pentium_cost = {
200   1,                                    /* cost of an add instruction */
201   1,                                    /* cost of a lea instruction */
202   4,                                    /* variable shift costs */
203   1,                                    /* constant shift costs */
204   {11, 11, 11, 11, 11},                 /* cost of starting a multiply */
205   0,                                    /* cost of multiply per each bit set */
206   {25, 25, 25, 25, 25},                 /* cost of a divide/mod */
207   3,                                    /* cost of movsx */
208   2,                                    /* cost of movzx */
209   8,                                    /* "large" insn */
210   6,                                    /* MOVE_RATIO */
211   6,                                    /* cost for loading QImode using movzbl */
212   {2, 4, 2},                            /* cost of loading integer registers
213                                            in QImode, HImode and SImode.
214                                            Relative to reg-reg move (2).  */
215   {2, 4, 2},                            /* cost of storing integer registers */
216   2,                                    /* cost of reg,reg fld/fst */
217   {2, 2, 6},                            /* cost of loading fp registers
218                                            in SFmode, DFmode and XFmode */
219   {4, 4, 6},                            /* cost of loading integer registers */
220   8,                                    /* cost of moving MMX register */
221   {8, 8},                               /* cost of loading MMX registers
222                                            in SImode and DImode */
223   {8, 8},                               /* cost of storing MMX registers
224                                            in SImode and DImode */
225   2,                                    /* cost of moving SSE register */
226   {4, 8, 16},                           /* cost of loading SSE registers
227                                            in SImode, DImode and TImode */
228   {4, 8, 16},                           /* cost of storing SSE registers
229                                            in SImode, DImode and TImode */
230   3,                                    /* MMX or SSE register to integer */
231   0,                                    /* size of prefetch block */
232   0,                                    /* number of parallel prefetches */
233   2,                                    /* Branch cost */
234   3,                                    /* cost of FADD and FSUB insns.  */
235   3,                                    /* cost of FMUL instruction.  */
236   39,                                   /* cost of FDIV instruction.  */
237   1,                                    /* cost of FABS instruction.  */
238   1,                                    /* cost of FCHS instruction.  */
239   70,                                   /* cost of FSQRT instruction.  */
240 };
241
242 static const
243 struct processor_costs pentiumpro_cost = {
244   1,                                    /* cost of an add instruction */
245   1,                                    /* cost of a lea instruction */
246   1,                                    /* variable shift costs */
247   1,                                    /* constant shift costs */
248   {4, 4, 4, 4, 4},                      /* cost of starting a multiply */
249   0,                                    /* cost of multiply per each bit set */
250   {17, 17, 17, 17, 17},                 /* cost of a divide/mod */
251   1,                                    /* cost of movsx */
252   1,                                    /* cost of movzx */
253   8,                                    /* "large" insn */
254   6,                                    /* MOVE_RATIO */
255   2,                                    /* cost for loading QImode using movzbl */
256   {4, 4, 4},                            /* cost of loading integer registers
257                                            in QImode, HImode and SImode.
258                                            Relative to reg-reg move (2).  */
259   {2, 2, 2},                            /* cost of storing integer registers */
260   2,                                    /* cost of reg,reg fld/fst */
261   {2, 2, 6},                            /* cost of loading fp registers
262                                            in SFmode, DFmode and XFmode */
263   {4, 4, 6},                            /* cost of loading integer registers */
264   2,                                    /* cost of moving MMX register */
265   {2, 2},                               /* cost of loading MMX registers
266                                            in SImode and DImode */
267   {2, 2},                               /* cost of storing MMX registers
268                                            in SImode and DImode */
269   2,                                    /* cost of moving SSE register */
270   {2, 2, 8},                            /* cost of loading SSE registers
271                                            in SImode, DImode and TImode */
272   {2, 2, 8},                            /* cost of storing SSE registers
273                                            in SImode, DImode and TImode */
274   3,                                    /* MMX or SSE register to integer */
275   32,                                   /* size of prefetch block */
276   6,                                    /* number of parallel prefetches */
277   2,                                    /* Branch cost */
278   3,                                    /* cost of FADD and FSUB insns.  */
279   5,                                    /* cost of FMUL instruction.  */
280   56,                                   /* cost of FDIV instruction.  */
281   2,                                    /* cost of FABS instruction.  */
282   2,                                    /* cost of FCHS instruction.  */
283   56,                                   /* cost of FSQRT instruction.  */
284 };
285
286 static const
287 struct processor_costs k6_cost = {
288   1,                                    /* cost of an add instruction */
289   2,                                    /* cost of a lea instruction */
290   1,                                    /* variable shift costs */
291   1,                                    /* constant shift costs */
292   {3, 3, 3, 3, 3},                      /* cost of starting a multiply */
293   0,                                    /* cost of multiply per each bit set */
294   {18, 18, 18, 18, 18},                 /* cost of a divide/mod */
295   2,                                    /* cost of movsx */
296   2,                                    /* cost of movzx */
297   8,                                    /* "large" insn */
298   4,                                    /* MOVE_RATIO */
299   3,                                    /* cost for loading QImode using movzbl */
300   {4, 5, 4},                            /* cost of loading integer registers
301                                            in QImode, HImode and SImode.
302                                            Relative to reg-reg move (2).  */
303   {2, 3, 2},                            /* cost of storing integer registers */
304   4,                                    /* cost of reg,reg fld/fst */
305   {6, 6, 6},                            /* cost of loading fp registers
306                                            in SFmode, DFmode and XFmode */
307   {4, 4, 4},                            /* cost of loading integer registers */
308   2,                                    /* cost of moving MMX register */
309   {2, 2},                               /* cost of loading MMX registers
310                                            in SImode and DImode */
311   {2, 2},                               /* cost of storing MMX registers
312                                            in SImode and DImode */
313   2,                                    /* cost of moving SSE register */
314   {2, 2, 8},                            /* cost of loading SSE registers
315                                            in SImode, DImode and TImode */
316   {2, 2, 8},                            /* cost of storing SSE registers
317                                            in SImode, DImode and TImode */
318   6,                                    /* MMX or SSE register to integer */
319   32,                                   /* size of prefetch block */
320   1,                                    /* number of parallel prefetches */
321   1,                                    /* Branch cost */
322   2,                                    /* cost of FADD and FSUB insns.  */
323   2,                                    /* cost of FMUL instruction.  */
324   56,                                   /* cost of FDIV instruction.  */
325   2,                                    /* cost of FABS instruction.  */
326   2,                                    /* cost of FCHS instruction.  */
327   56,                                   /* cost of FSQRT instruction.  */
328 };
329
330 static const
331 struct processor_costs athlon_cost = {
332   1,                                    /* cost of an add instruction */
333   2,                                    /* cost of a lea instruction */
334   1,                                    /* variable shift costs */
335   1,                                    /* constant shift costs */
336   {5, 5, 5, 5, 5},                      /* cost of starting a multiply */
337   0,                                    /* cost of multiply per each bit set */
338   {18, 26, 42, 74, 74},                 /* cost of a divide/mod */
339   1,                                    /* cost of movsx */
340   1,                                    /* cost of movzx */
341   8,                                    /* "large" insn */
342   9,                                    /* MOVE_RATIO */
343   4,                                    /* cost for loading QImode using movzbl */
344   {3, 4, 3},                            /* cost of loading integer registers
345                                            in QImode, HImode and SImode.
346                                            Relative to reg-reg move (2).  */
347   {3, 4, 3},                            /* cost of storing integer registers */
348   4,                                    /* cost of reg,reg fld/fst */
349   {4, 4, 12},                           /* cost of loading fp registers
350                                            in SFmode, DFmode and XFmode */
351   {6, 6, 8},                            /* cost of loading integer registers */
352   2,                                    /* cost of moving MMX register */
353   {4, 4},                               /* cost of loading MMX registers
354                                            in SImode and DImode */
355   {4, 4},                               /* cost of storing MMX registers
356                                            in SImode and DImode */
357   2,                                    /* cost of moving SSE register */
358   {4, 4, 6},                            /* cost of loading SSE registers
359                                            in SImode, DImode and TImode */
360   {4, 4, 5},                            /* cost of storing SSE registers
361                                            in SImode, DImode and TImode */
362   5,                                    /* MMX or SSE register to integer */
363   64,                                   /* size of prefetch block */
364   6,                                    /* number of parallel prefetches */
365   5,                                    /* Branch cost */
366   4,                                    /* cost of FADD and FSUB insns.  */
367   4,                                    /* cost of FMUL instruction.  */
368   24,                                   /* cost of FDIV instruction.  */
369   2,                                    /* cost of FABS instruction.  */
370   2,                                    /* cost of FCHS instruction.  */
371   35,                                   /* cost of FSQRT instruction.  */
372 };
373
374 static const
375 struct processor_costs k8_cost = {
376   1,                                    /* cost of an add instruction */
377   2,                                    /* cost of a lea instruction */
378   1,                                    /* variable shift costs */
379   1,                                    /* constant shift costs */
380   {3, 4, 3, 4, 5},                      /* cost of starting a multiply */
381   0,                                    /* cost of multiply per each bit set */
382   {18, 26, 42, 74, 74},                 /* cost of a divide/mod */
383   1,                                    /* cost of movsx */
384   1,                                    /* cost of movzx */
385   8,                                    /* "large" insn */
386   9,                                    /* MOVE_RATIO */
387   4,                                    /* cost for loading QImode using movzbl */
388   {3, 4, 3},                            /* cost of loading integer registers
389                                            in QImode, HImode and SImode.
390                                            Relative to reg-reg move (2).  */
391   {3, 4, 3},                            /* cost of storing integer registers */
392   4,                                    /* cost of reg,reg fld/fst */
393   {4, 4, 12},                           /* cost of loading fp registers
394                                            in SFmode, DFmode and XFmode */
395   {6, 6, 8},                            /* cost of loading integer registers */
396   2,                                    /* cost of moving MMX register */
397   {3, 3},                               /* cost of loading MMX registers
398                                            in SImode and DImode */
399   {4, 4},                               /* cost of storing MMX registers
400                                            in SImode and DImode */
401   2,                                    /* cost of moving SSE register */
402   {4, 3, 6},                            /* cost of loading SSE registers
403                                            in SImode, DImode and TImode */
404   {4, 4, 5},                            /* cost of storing SSE registers
405                                            in SImode, DImode and TImode */
406   5,                                    /* MMX or SSE register to integer */
407   64,                                   /* size of prefetch block */
408   6,                                    /* number of parallel prefetches */
409   5,                                    /* Branch cost */
410   4,                                    /* cost of FADD and FSUB insns.  */
411   4,                                    /* cost of FMUL instruction.  */
412   19,                                   /* cost of FDIV instruction.  */
413   2,                                    /* cost of FABS instruction.  */
414   2,                                    /* cost of FCHS instruction.  */
415   35,                                   /* cost of FSQRT instruction.  */
416 };
417
418 static const
419 struct processor_costs pentium4_cost = {
420   1,                                    /* cost of an add instruction */
421   3,                                    /* cost of a lea instruction */
422   4,                                    /* variable shift costs */
423   4,                                    /* constant shift costs */
424   {15, 15, 15, 15, 15},                 /* cost of starting a multiply */
425   0,                                    /* cost of multiply per each bit set */
426   {56, 56, 56, 56, 56},                 /* cost of a divide/mod */
427   1,                                    /* cost of movsx */
428   1,                                    /* cost of movzx */
429   16,                                   /* "large" insn */
430   6,                                    /* MOVE_RATIO */
431   2,                                    /* cost for loading QImode using movzbl */
432   {4, 5, 4},                            /* cost of loading integer registers
433                                            in QImode, HImode and SImode.
434                                            Relative to reg-reg move (2).  */
435   {2, 3, 2},                            /* cost of storing integer registers */
436   2,                                    /* cost of reg,reg fld/fst */
437   {2, 2, 6},                            /* cost of loading fp registers
438                                            in SFmode, DFmode and XFmode */
439   {4, 4, 6},                            /* cost of loading integer registers */
440   2,                                    /* cost of moving MMX register */
441   {2, 2},                               /* cost of loading MMX registers
442                                            in SImode and DImode */
443   {2, 2},                               /* cost of storing MMX registers
444                                            in SImode and DImode */
445   12,                                   /* cost of moving SSE register */
446   {12, 12, 12},                         /* cost of loading SSE registers
447                                            in SImode, DImode and TImode */
448   {2, 2, 8},                            /* cost of storing SSE registers
449                                            in SImode, DImode and TImode */
450   10,                                   /* MMX or SSE register to integer */
451   64,                                   /* size of prefetch block */
452   6,                                    /* number of parallel prefetches */
453   2,                                    /* Branch cost */
454   5,                                    /* cost of FADD and FSUB insns.  */
455   7,                                    /* cost of FMUL instruction.  */
456   43,                                   /* cost of FDIV instruction.  */
457   2,                                    /* cost of FABS instruction.  */
458   2,                                    /* cost of FCHS instruction.  */
459   43,                                   /* cost of FSQRT instruction.  */
460 };
461
462 static const
463 struct processor_costs nocona_cost = {
464   1,                                    /* cost of an add instruction */
465   1,                                    /* cost of a lea instruction */
466   1,                                    /* variable shift costs */
467   1,                                    /* constant shift costs */
468   {10, 10, 10, 10, 10},                 /* cost of starting a multiply */
469   0,                                    /* cost of multiply per each bit set */
470   {66, 66, 66, 66, 66},                 /* cost of a divide/mod */
471   1,                                    /* cost of movsx */
472   1,                                    /* cost of movzx */
473   16,                                   /* "large" insn */
474   9,                                    /* MOVE_RATIO */
475   4,                                    /* cost for loading QImode using movzbl */
476   {4, 4, 4},                            /* cost of loading integer registers
477                                            in QImode, HImode and SImode.
478                                            Relative to reg-reg move (2).  */
479   {4, 4, 4},                            /* cost of storing integer registers */
480   3,                                    /* cost of reg,reg fld/fst */
481   {12, 12, 12},                         /* cost of loading fp registers
482                                            in SFmode, DFmode and XFmode */
483   {4, 4, 4},                            /* cost of loading integer registers */
484   6,                                    /* cost of moving MMX register */
485   {12, 12},                             /* cost of loading MMX registers
486                                            in SImode and DImode */
487   {12, 12},                             /* cost of storing MMX registers
488                                            in SImode and DImode */
489   6,                                    /* cost of moving SSE register */
490   {12, 12, 12},                         /* cost of loading SSE registers
491                                            in SImode, DImode and TImode */
492   {12, 12, 12},                         /* cost of storing SSE registers
493                                            in SImode, DImode and TImode */
494   8,                                    /* MMX or SSE register to integer */
495   128,                                  /* size of prefetch block */
496   8,                                    /* number of parallel prefetches */
497   1,                                    /* Branch cost */
498   6,                                    /* cost of FADD and FSUB insns.  */
499   8,                                    /* cost of FMUL instruction.  */
500   40,                                   /* cost of FDIV instruction.  */
501   3,                                    /* cost of FABS instruction.  */
502   3,                                    /* cost of FCHS instruction.  */
503   44,                                   /* cost of FSQRT instruction.  */
504 };
505
506 const struct processor_costs *ix86_cost = &pentium_cost;
507
508 /* Processor feature/optimization bitmasks.  */
509 #define m_386 (1<<PROCESSOR_I386)
510 #define m_486 (1<<PROCESSOR_I486)
511 #define m_PENT (1<<PROCESSOR_PENTIUM)
512 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
513 #define m_K6  (1<<PROCESSOR_K6)
514 #define m_ATHLON  (1<<PROCESSOR_ATHLON)
515 #define m_PENT4  (1<<PROCESSOR_PENTIUM4)
516 #define m_K8  (1<<PROCESSOR_K8)
517 #define m_ATHLON_K8  (m_K8 | m_ATHLON)
518 #define m_NOCONA  (1<<PROCESSOR_NOCONA)
519
520 const int x86_use_leave = m_386 | m_K6 | m_ATHLON_K8;
521 const int x86_push_memory = m_386 | m_K6 | m_ATHLON_K8 | m_PENT4 | m_NOCONA;
522 const int x86_zero_extend_with_and = m_486 | m_PENT;
523 const int x86_movx = m_ATHLON_K8 | m_PPRO | m_PENT4 | m_NOCONA /* m_386 | m_K6 */;
524 const int x86_double_with_add = ~m_386;
525 const int x86_use_bit_test = m_386;
526 const int x86_unroll_strlen = m_486 | m_PENT | m_PPRO | m_ATHLON_K8 | m_K6;
527 const int x86_cmove = m_PPRO | m_ATHLON_K8 | m_PENT4 | m_NOCONA;
528 const int x86_3dnow_a = m_ATHLON_K8;
529 const int x86_deep_branch = m_PPRO | m_K6 | m_ATHLON_K8 | m_PENT4 | m_NOCONA;
530 /* Branch hints were put in P4 based on simulation result. But
531    after P4 was made, no performance benefit was observed with
532    branch hints. It also increases the code size. As the result,
533    icc never generates branch hints.  */
534 const int x86_branch_hints = 0;
535 const int x86_use_sahf = m_PPRO | m_K6 | m_PENT4 | m_NOCONA;
536 const int x86_partial_reg_stall = m_PPRO;
537 const int x86_use_loop = m_K6;
538 const int x86_use_fiop = ~(m_PPRO | m_ATHLON_K8 | m_PENT);
539 const int x86_use_mov0 = m_K6;
540 const int x86_use_cltd = ~(m_PENT | m_K6);
541 const int x86_read_modify_write = ~m_PENT;
542 const int x86_read_modify = ~(m_PENT | m_PPRO);
543 const int x86_split_long_moves = m_PPRO;
544 const int x86_promote_QImode = m_K6 | m_PENT | m_386 | m_486 | m_ATHLON_K8;
545 const int x86_fast_prefix = ~(m_PENT | m_486 | m_386);
546 const int x86_single_stringop = m_386 | m_PENT4 | m_NOCONA;
547 const int x86_qimode_math = ~(0);
548 const int x86_promote_qi_regs = 0;
549 const int x86_himode_math = ~(m_PPRO);
550 const int x86_promote_hi_regs = m_PPRO;
551 const int x86_sub_esp_4 = m_ATHLON_K8 | m_PPRO | m_PENT4 | m_NOCONA;
552 const int x86_sub_esp_8 = m_ATHLON_K8 | m_PPRO | m_386 | m_486 | m_PENT4 | m_NOCONA;
553 const int x86_add_esp_4 = m_ATHLON_K8 | m_K6 | m_PENT4 | m_NOCONA;
554 const int x86_add_esp_8 = m_ATHLON_K8 | m_PPRO | m_K6 | m_386 | m_486 | m_PENT4 | m_NOCONA;
555 const int x86_integer_DFmode_moves = ~(m_ATHLON_K8 | m_PENT4 | m_NOCONA | m_PPRO);
556 const int x86_partial_reg_dependency = m_ATHLON_K8 | m_PENT4 | m_NOCONA;
557 const int x86_memory_mismatch_stall = m_ATHLON_K8 | m_PENT4 | m_NOCONA;
558 const int x86_accumulate_outgoing_args = m_ATHLON_K8 | m_PENT4 | m_NOCONA | m_PPRO;
559 const int x86_prologue_using_move = m_ATHLON_K8 | m_PPRO;
560 const int x86_epilogue_using_move = m_ATHLON_K8 | m_PPRO;
561 const int x86_decompose_lea = m_PENT4 | m_NOCONA;
562 const int x86_shift1 = ~m_486;
563 const int x86_arch_always_fancy_math_387 = m_PENT | m_PPRO | m_ATHLON_K8 | m_PENT4 | m_NOCONA;
564 const int x86_sse_partial_reg_dependency = m_PENT4 | m_NOCONA | m_PPRO;
565 /* Set for machines where the type and dependencies are resolved on SSE
566    register parts instead of whole registers, so we may maintain just
567    lower part of scalar values in proper format leaving the upper part
568    undefined.  */
569 const int x86_sse_split_regs = m_ATHLON_K8;
570 const int x86_sse_typeless_stores = m_ATHLON_K8;
571 const int x86_sse_load0_by_pxor = m_PPRO | m_PENT4 | m_NOCONA;
572 const int x86_use_ffreep = m_ATHLON_K8;
573 const int x86_rep_movl_optimal = m_386 | m_PENT | m_PPRO | m_K6;
574 const int x86_inter_unit_moves = ~(m_ATHLON_K8);
575 const int x86_ext_80387_constants = m_K6 | m_ATHLON | m_PENT4 | m_NOCONA | m_PPRO;
576 /* Some CPU cores are not able to predict more than 4 branch instructions in
577    the 16 byte window.  */
578 const int x86_four_jump_limit = m_PPRO | m_ATHLON_K8 | m_PENT4 | m_NOCONA;
579 const int x86_schedule = m_PPRO | m_ATHLON_K8 | m_K6 | m_PENT;
580 const int x86_use_bt = m_ATHLON_K8;
581
582 /* In case the average insn count for single function invocation is
583    lower than this constant, emit fast (but longer) prologue and
584    epilogue code.  */
585 #define FAST_PROLOGUE_INSN_COUNT 20
586
587 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
588 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
589 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
590 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
591
592 /* Array of the smallest class containing reg number REGNO, indexed by
593    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
594
595 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
596 {
597   /* ax, dx, cx, bx */
598   AREG, DREG, CREG, BREG,
599   /* si, di, bp, sp */
600   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
601   /* FP registers */
602   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
603   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
604   /* arg pointer */
605   NON_Q_REGS,
606   /* flags, fpsr, dirflag, frame */
607   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
608   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
609   SSE_REGS, SSE_REGS,
610   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
611   MMX_REGS, MMX_REGS,
612   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
613   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
614   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
615   SSE_REGS, SSE_REGS,
616 };
617
618 /* The "default" register map used in 32bit mode.  */
619
620 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
621 {
622   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
623   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
624   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, dir, frame */
625   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
626   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
627   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
628   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
629 };
630
631 static int const x86_64_int_parameter_registers[6] =
632 {
633   5 /*RDI*/, 4 /*RSI*/, 1 /*RDX*/, 2 /*RCX*/,
634   FIRST_REX_INT_REG /*R8 */, FIRST_REX_INT_REG + 1 /*R9 */
635 };
636
637 static int const x86_64_int_return_registers[4] =
638 {
639   0 /*RAX*/, 1 /*RDI*/, 5 /*RDI*/, 4 /*RSI*/
640 };
641
642 /* The "default" register map used in 64bit mode.  */
643 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
644 {
645   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
646   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
647   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, dir, frame */
648   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
649   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
650   8,9,10,11,12,13,14,15,                /* extended integer registers */
651   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
652 };
653
654 /* Define the register numbers to be used in Dwarf debugging information.
655    The SVR4 reference port C compiler uses the following register numbers
656    in its Dwarf output code:
657         0 for %eax (gcc regno = 0)
658         1 for %ecx (gcc regno = 2)
659         2 for %edx (gcc regno = 1)
660         3 for %ebx (gcc regno = 3)
661         4 for %esp (gcc regno = 7)
662         5 for %ebp (gcc regno = 6)
663         6 for %esi (gcc regno = 4)
664         7 for %edi (gcc regno = 5)
665    The following three DWARF register numbers are never generated by
666    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
667    believes these numbers have these meanings.
668         8  for %eip    (no gcc equivalent)
669         9  for %eflags (gcc regno = 17)
670         10 for %trapno (no gcc equivalent)
671    It is not at all clear how we should number the FP stack registers
672    for the x86 architecture.  If the version of SDB on x86/svr4 were
673    a bit less brain dead with respect to floating-point then we would
674    have a precedent to follow with respect to DWARF register numbers
675    for x86 FP registers, but the SDB on x86/svr4 is so completely
676    broken with respect to FP registers that it is hardly worth thinking
677    of it as something to strive for compatibility with.
678    The version of x86/svr4 SDB I have at the moment does (partially)
679    seem to believe that DWARF register number 11 is associated with
680    the x86 register %st(0), but that's about all.  Higher DWARF
681    register numbers don't seem to be associated with anything in
682    particular, and even for DWARF regno 11, SDB only seems to under-
683    stand that it should say that a variable lives in %st(0) (when
684    asked via an `=' command) if we said it was in DWARF regno 11,
685    but SDB still prints garbage when asked for the value of the
686    variable in question (via a `/' command).
687    (Also note that the labels SDB prints for various FP stack regs
688    when doing an `x' command are all wrong.)
689    Note that these problems generally don't affect the native SVR4
690    C compiler because it doesn't allow the use of -O with -g and
691    because when it is *not* optimizing, it allocates a memory
692    location for each floating-point variable, and the memory
693    location is what gets described in the DWARF AT_location
694    attribute for the variable in question.
695    Regardless of the severe mental illness of the x86/svr4 SDB, we
696    do something sensible here and we use the following DWARF
697    register numbers.  Note that these are all stack-top-relative
698    numbers.
699         11 for %st(0) (gcc regno = 8)
700         12 for %st(1) (gcc regno = 9)
701         13 for %st(2) (gcc regno = 10)
702         14 for %st(3) (gcc regno = 11)
703         15 for %st(4) (gcc regno = 12)
704         16 for %st(5) (gcc regno = 13)
705         17 for %st(6) (gcc regno = 14)
706         18 for %st(7) (gcc regno = 15)
707 */
708 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
709 {
710   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
711   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
712   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, dir, frame */
713   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
714   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
715   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
716   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
717 };
718
719 /* Test and compare insns in i386.md store the information needed to
720    generate branch and scc insns here.  */
721
722 rtx ix86_compare_op0 = NULL_RTX;
723 rtx ix86_compare_op1 = NULL_RTX;
724
725 #define MAX_386_STACK_LOCALS 3
726 /* Size of the register save area.  */
727 #define X86_64_VARARGS_SIZE (REGPARM_MAX * UNITS_PER_WORD + SSE_REGPARM_MAX * 16)
728
729 /* Define the structure for the machine field in struct function.  */
730
731 struct stack_local_entry GTY(())
732 {
733   unsigned short mode;
734   unsigned short n;
735   rtx rtl;
736   struct stack_local_entry *next;
737 };
738
739 /* Structure describing stack frame layout.
740    Stack grows downward:
741
742    [arguments]
743                                               <- ARG_POINTER
744    saved pc
745
746    saved frame pointer if frame_pointer_needed
747                                               <- HARD_FRAME_POINTER
748    [saved regs]
749
750    [padding1]          \
751                         )
752    [va_arg registers]  (
753                         > to_allocate         <- FRAME_POINTER
754    [frame]             (
755                         )
756    [padding2]          /
757   */
758 struct ix86_frame
759 {
760   int nregs;
761   int padding1;
762   int va_arg_size;
763   HOST_WIDE_INT frame;
764   int padding2;
765   int outgoing_arguments_size;
766   int red_zone_size;
767
768   HOST_WIDE_INT to_allocate;
769   /* The offsets relative to ARG_POINTER.  */
770   HOST_WIDE_INT frame_pointer_offset;
771   HOST_WIDE_INT hard_frame_pointer_offset;
772   HOST_WIDE_INT stack_pointer_offset;
773
774   /* When save_regs_using_mov is set, emit prologue using
775      move instead of push instructions.  */
776   bool save_regs_using_mov;
777 };
778
779 /* Used to enable/disable debugging features.  */
780 const char *ix86_debug_arg_string, *ix86_debug_addr_string;
781 /* Code model option as passed by user.  */
782 const char *ix86_cmodel_string;
783 /* Parsed value.  */
784 enum cmodel ix86_cmodel;
785 /* Asm dialect.  */
786 const char *ix86_asm_string;
787 enum asm_dialect ix86_asm_dialect = ASM_ATT;
788 /* TLS dialext.  */
789 const char *ix86_tls_dialect_string;
790 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
791
792 /* Which unit we are generating floating point math for.  */
793 enum fpmath_unit ix86_fpmath;
794
795 /* Which cpu are we scheduling for.  */
796 enum processor_type ix86_tune;
797 /* Which instruction set architecture to use.  */
798 enum processor_type ix86_arch;
799
800 /* Strings to hold which cpu and instruction set architecture  to use.  */
801 const char *ix86_tune_string;           /* for -mtune=<xxx> */
802 const char *ix86_arch_string;           /* for -march=<xxx> */
803 const char *ix86_fpmath_string;         /* for -mfpmath=<xxx> */
804
805 /* # of registers to use to pass arguments.  */
806 const char *ix86_regparm_string;
807
808 /* true if sse prefetch instruction is not NOOP.  */
809 int x86_prefetch_sse;
810
811 /* ix86_regparm_string as a number */
812 int ix86_regparm;
813
814 /* Alignment to use for loops and jumps:  */
815
816 /* Power of two alignment for loops.  */
817 const char *ix86_align_loops_string;
818
819 /* Power of two alignment for non-loop jumps.  */
820 const char *ix86_align_jumps_string;
821
822 /* Power of two alignment for stack boundary in bytes.  */
823 const char *ix86_preferred_stack_boundary_string;
824
825 /* Preferred alignment for stack boundary in bits.  */
826 unsigned int ix86_preferred_stack_boundary;
827
828 /* Values 1-5: see jump.c */
829 int ix86_branch_cost;
830 const char *ix86_branch_cost_string;
831
832 /* Power of two alignment for functions.  */
833 const char *ix86_align_funcs_string;
834
835 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
836 char internal_label_prefix[16];
837 int internal_label_prefix_len;
838 \f
839 static void output_pic_addr_const (FILE *, rtx, int);
840 static void put_condition_code (enum rtx_code, enum machine_mode,
841                                 int, int, FILE *);
842 static const char *get_some_local_dynamic_name (void);
843 static int get_some_local_dynamic_name_1 (rtx *, void *);
844 static rtx ix86_expand_int_compare (enum rtx_code, rtx, rtx);
845 static enum rtx_code ix86_prepare_fp_compare_args (enum rtx_code, rtx *,
846                                                    rtx *);
847 static bool ix86_fixed_condition_code_regs (unsigned int *, unsigned int *);
848 static enum machine_mode ix86_cc_modes_compatible (enum machine_mode,
849                                                    enum machine_mode);
850 static rtx get_thread_pointer (int);
851 static rtx legitimize_tls_address (rtx, enum tls_model, int);
852 static void get_pc_thunk_name (char [32], unsigned int);
853 static rtx gen_push (rtx);
854 static int ix86_flags_dependant (rtx, rtx, enum attr_type);
855 static int ix86_agi_dependant (rtx, rtx, enum attr_type);
856 static struct machine_function * ix86_init_machine_status (void);
857 static int ix86_split_to_parts (rtx, rtx *, enum machine_mode);
858 static int ix86_nsaved_regs (void);
859 static void ix86_emit_save_regs (void);
860 static void ix86_emit_save_regs_using_mov (rtx, HOST_WIDE_INT);
861 static void ix86_emit_restore_regs_using_mov (rtx, HOST_WIDE_INT, int);
862 static void ix86_output_function_epilogue (FILE *, HOST_WIDE_INT);
863 static HOST_WIDE_INT ix86_GOT_alias_set (void);
864 static void ix86_adjust_counter (rtx, HOST_WIDE_INT);
865 static rtx ix86_expand_aligntest (rtx, int);
866 static void ix86_expand_strlensi_unroll_1 (rtx, rtx, rtx);
867 static int ix86_issue_rate (void);
868 static int ix86_adjust_cost (rtx, rtx, rtx, int);
869 static int ia32_multipass_dfa_lookahead (void);
870 static bool ix86_misaligned_mem_ok (enum machine_mode);
871 static void ix86_init_mmx_sse_builtins (void);
872 static rtx x86_this_parameter (tree);
873 static void x86_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
874                                  HOST_WIDE_INT, tree);
875 static bool x86_can_output_mi_thunk (tree, HOST_WIDE_INT, HOST_WIDE_INT, tree);
876 static void x86_file_start (void);
877 static void ix86_reorg (void);
878 static bool ix86_expand_carry_flag_compare (enum rtx_code, rtx, rtx, rtx*);
879 static tree ix86_build_builtin_va_list (void);
880 static void ix86_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
881                                          tree, int *, int);
882 static tree ix86_gimplify_va_arg (tree, tree, tree *, tree *);
883 static bool ix86_vector_mode_supported_p (enum machine_mode);
884
885 static int ix86_address_cost (rtx);
886 static bool ix86_cannot_force_const_mem (rtx);
887 static rtx ix86_delegitimize_address (rtx);
888
889 struct builtin_description;
890 static rtx ix86_expand_sse_comi (const struct builtin_description *,
891                                  tree, rtx);
892 static rtx ix86_expand_sse_compare (const struct builtin_description *,
893                                     tree, rtx);
894 static rtx ix86_expand_unop1_builtin (enum insn_code, tree, rtx);
895 static rtx ix86_expand_unop_builtin (enum insn_code, tree, rtx, int);
896 static rtx ix86_expand_binop_builtin (enum insn_code, tree, rtx);
897 static rtx ix86_expand_store_builtin (enum insn_code, tree);
898 static rtx safe_vector_operand (rtx, enum machine_mode);
899 static rtx ix86_expand_fp_compare (enum rtx_code, rtx, rtx, rtx, rtx *, rtx *);
900 static int ix86_fp_comparison_arithmetics_cost (enum rtx_code code);
901 static int ix86_fp_comparison_fcomi_cost (enum rtx_code code);
902 static int ix86_fp_comparison_sahf_cost (enum rtx_code code);
903 static int ix86_fp_comparison_cost (enum rtx_code code);
904 static unsigned int ix86_select_alt_pic_regnum (void);
905 static int ix86_save_reg (unsigned int, int);
906 static void ix86_compute_frame_layout (struct ix86_frame *);
907 static int ix86_comp_type_attributes (tree, tree);
908 static int ix86_function_regparm (tree, tree);
909 const struct attribute_spec ix86_attribute_table[];
910 static bool ix86_function_ok_for_sibcall (tree, tree);
911 static tree ix86_handle_cdecl_attribute (tree *, tree, tree, int, bool *);
912 static tree ix86_handle_regparm_attribute (tree *, tree, tree, int, bool *);
913 static int ix86_value_regno (enum machine_mode);
914 static bool contains_128bit_aligned_vector_p (tree);
915 static rtx ix86_struct_value_rtx (tree, int);
916 static bool ix86_ms_bitfield_layout_p (tree);
917 static tree ix86_handle_struct_attribute (tree *, tree, tree, int, bool *);
918 static int extended_reg_mentioned_1 (rtx *, void *);
919 static bool ix86_rtx_costs (rtx, int, int, int *);
920 static int min_insn_size (rtx);
921 static tree ix86_md_asm_clobbers (tree clobbers);
922 static bool ix86_must_pass_in_stack (enum machine_mode mode, tree type);
923 static bool ix86_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
924                                     tree, bool);
925
926 /* This function is only used on Solaris.  */
927 static void i386_solaris_elf_named_section (const char *, unsigned int, tree)
928   ATTRIBUTE_UNUSED;
929
930 /* Register class used for passing given 64bit part of the argument.
931    These represent classes as documented by the PS ABI, with the exception
932    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
933    use SF or DFmode move instead of DImode to avoid reformatting penalties.
934
935    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
936    whenever possible (upper half does contain padding).
937  */
938 enum x86_64_reg_class
939   {
940     X86_64_NO_CLASS,
941     X86_64_INTEGER_CLASS,
942     X86_64_INTEGERSI_CLASS,
943     X86_64_SSE_CLASS,
944     X86_64_SSESF_CLASS,
945     X86_64_SSEDF_CLASS,
946     X86_64_SSEUP_CLASS,
947     X86_64_X87_CLASS,
948     X86_64_X87UP_CLASS,
949     X86_64_COMPLEX_X87_CLASS,
950     X86_64_MEMORY_CLASS
951   };
952 static const char * const x86_64_reg_class_name[] = {
953   "no", "integer", "integerSI", "sse", "sseSF", "sseDF",
954   "sseup", "x87", "x87up", "cplx87", "no"
955 };
956
957 #define MAX_CLASSES 4
958
959 /* Table of constants used by fldpi, fldln2, etc....  */
960 static REAL_VALUE_TYPE ext_80387_constants_table [5];
961 static bool ext_80387_constants_init = 0;
962 static void init_ext_80387_constants (void);
963 \f
964 /* Initialize the GCC target structure.  */
965 #undef TARGET_ATTRIBUTE_TABLE
966 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
967 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
968 #  undef TARGET_MERGE_DECL_ATTRIBUTES
969 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
970 #endif
971
972 #undef TARGET_COMP_TYPE_ATTRIBUTES
973 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
974
975 #undef TARGET_INIT_BUILTINS
976 #define TARGET_INIT_BUILTINS ix86_init_builtins
977
978 #undef TARGET_EXPAND_BUILTIN
979 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
980
981 #undef TARGET_ASM_FUNCTION_EPILOGUE
982 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
983
984 #undef TARGET_ASM_OPEN_PAREN
985 #define TARGET_ASM_OPEN_PAREN ""
986 #undef TARGET_ASM_CLOSE_PAREN
987 #define TARGET_ASM_CLOSE_PAREN ""
988
989 #undef TARGET_ASM_ALIGNED_HI_OP
990 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
991 #undef TARGET_ASM_ALIGNED_SI_OP
992 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
993 #ifdef ASM_QUAD
994 #undef TARGET_ASM_ALIGNED_DI_OP
995 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
996 #endif
997
998 #undef TARGET_ASM_UNALIGNED_HI_OP
999 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
1000 #undef TARGET_ASM_UNALIGNED_SI_OP
1001 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
1002 #undef TARGET_ASM_UNALIGNED_DI_OP
1003 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
1004
1005 #undef TARGET_SCHED_ADJUST_COST
1006 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
1007 #undef TARGET_SCHED_ISSUE_RATE
1008 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
1009 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1010 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
1011   ia32_multipass_dfa_lookahead
1012
1013 #undef TARGET_VECTORIZE_MISALIGNED_MEM_OK
1014 #define TARGET_VECTORIZE_MISALIGNED_MEM_OK ix86_misaligned_mem_ok
1015
1016 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1017 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
1018
1019 #ifdef HAVE_AS_TLS
1020 #undef TARGET_HAVE_TLS
1021 #define TARGET_HAVE_TLS true
1022 #endif
1023 #undef TARGET_CANNOT_FORCE_CONST_MEM
1024 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
1025
1026 #undef TARGET_DELEGITIMIZE_ADDRESS
1027 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
1028
1029 #undef TARGET_MS_BITFIELD_LAYOUT_P
1030 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
1031
1032 #undef TARGET_ASM_OUTPUT_MI_THUNK
1033 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
1034 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1035 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
1036
1037 #undef TARGET_ASM_FILE_START
1038 #define TARGET_ASM_FILE_START x86_file_start
1039
1040 #undef TARGET_RTX_COSTS
1041 #define TARGET_RTX_COSTS ix86_rtx_costs
1042 #undef TARGET_ADDRESS_COST
1043 #define TARGET_ADDRESS_COST ix86_address_cost
1044
1045 #undef TARGET_FIXED_CONDITION_CODE_REGS
1046 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
1047 #undef TARGET_CC_MODES_COMPATIBLE
1048 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
1049
1050 #undef TARGET_MACHINE_DEPENDENT_REORG
1051 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
1052
1053 #undef TARGET_BUILD_BUILTIN_VA_LIST
1054 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
1055
1056 #undef TARGET_MD_ASM_CLOBBERS
1057 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
1058
1059 #undef TARGET_PROMOTE_PROTOTYPES
1060 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
1061 #undef TARGET_STRUCT_VALUE_RTX
1062 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
1063 #undef TARGET_SETUP_INCOMING_VARARGS
1064 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
1065 #undef TARGET_MUST_PASS_IN_STACK
1066 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
1067 #undef TARGET_PASS_BY_REFERENCE
1068 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
1069
1070 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1071 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
1072
1073 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1074 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
1075
1076 #ifdef SUBTARGET_INSERT_ATTRIBUTES
1077 #undef TARGET_INSERT_ATTRIBUTES
1078 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
1079 #endif
1080
1081 struct gcc_target targetm = TARGET_INITIALIZER;
1082
1083 \f
1084 /* The svr4 ABI for the i386 says that records and unions are returned
1085    in memory.  */
1086 #ifndef DEFAULT_PCC_STRUCT_RETURN
1087 #define DEFAULT_PCC_STRUCT_RETURN 1
1088 #endif
1089
1090 /* Sometimes certain combinations of command options do not make
1091    sense on a particular target machine.  You can define a macro
1092    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
1093    defined, is executed once just after all the command options have
1094    been parsed.
1095
1096    Don't use this macro to turn on various extra optimizations for
1097    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
1098
1099 void
1100 override_options (void)
1101 {
1102   int i;
1103   int ix86_tune_defaulted = 0;
1104
1105   /* Comes from final.c -- no real reason to change it.  */
1106 #define MAX_CODE_ALIGN 16
1107
1108   static struct ptt
1109     {
1110       const struct processor_costs *cost;       /* Processor costs */
1111       const int target_enable;                  /* Target flags to enable.  */
1112       const int target_disable;                 /* Target flags to disable.  */
1113       const int align_loop;                     /* Default alignments.  */
1114       const int align_loop_max_skip;
1115       const int align_jump;
1116       const int align_jump_max_skip;
1117       const int align_func;
1118     }
1119   const processor_target_table[PROCESSOR_max] =
1120     {
1121       {&i386_cost, 0, 0, 4, 3, 4, 3, 4},
1122       {&i486_cost, 0, 0, 16, 15, 16, 15, 16},
1123       {&pentium_cost, 0, 0, 16, 7, 16, 7, 16},
1124       {&pentiumpro_cost, 0, 0, 16, 15, 16, 7, 16},
1125       {&k6_cost, 0, 0, 32, 7, 32, 7, 32},
1126       {&athlon_cost, 0, 0, 16, 7, 16, 7, 16},
1127       {&pentium4_cost, 0, 0, 0, 0, 0, 0, 0},
1128       {&k8_cost, 0, 0, 16, 7, 16, 7, 16},
1129       {&nocona_cost, 0, 0, 0, 0, 0, 0, 0}
1130     };
1131
1132   static const char * const cpu_names[] = TARGET_CPU_DEFAULT_NAMES;
1133   static struct pta
1134     {
1135       const char *const name;           /* processor name or nickname.  */
1136       const enum processor_type processor;
1137       const enum pta_flags
1138         {
1139           PTA_SSE = 1,
1140           PTA_SSE2 = 2,
1141           PTA_SSE3 = 4,
1142           PTA_MMX = 8,
1143           PTA_PREFETCH_SSE = 16,
1144           PTA_3DNOW = 32,
1145           PTA_3DNOW_A = 64,
1146           PTA_64BIT = 128
1147         } flags;
1148     }
1149   const processor_alias_table[] =
1150     {
1151       {"i386", PROCESSOR_I386, 0},
1152       {"i486", PROCESSOR_I486, 0},
1153       {"i586", PROCESSOR_PENTIUM, 0},
1154       {"pentium", PROCESSOR_PENTIUM, 0},
1155       {"pentium-mmx", PROCESSOR_PENTIUM, PTA_MMX},
1156       {"winchip-c6", PROCESSOR_I486, PTA_MMX},
1157       {"winchip2", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
1158       {"c3", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
1159       {"c3-2", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_PREFETCH_SSE | PTA_SSE},
1160       {"i686", PROCESSOR_PENTIUMPRO, 0},
1161       {"pentiumpro", PROCESSOR_PENTIUMPRO, 0},
1162       {"pentium2", PROCESSOR_PENTIUMPRO, PTA_MMX},
1163       {"pentium3", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE},
1164       {"pentium3m", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE},
1165       {"pentium-m", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE | PTA_SSE2},
1166       {"pentium4", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2
1167                                        | PTA_MMX | PTA_PREFETCH_SSE},
1168       {"pentium4m", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2
1169                                         | PTA_MMX | PTA_PREFETCH_SSE},
1170       {"prescott", PROCESSOR_NOCONA, PTA_SSE | PTA_SSE2 | PTA_SSE3
1171                                         | PTA_MMX | PTA_PREFETCH_SSE},
1172       {"nocona", PROCESSOR_NOCONA, PTA_SSE | PTA_SSE2 | PTA_SSE3 | PTA_64BIT
1173                                         | PTA_MMX | PTA_PREFETCH_SSE},
1174       {"k6", PROCESSOR_K6, PTA_MMX},
1175       {"k6-2", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
1176       {"k6-3", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
1177       {"athlon", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1178                                    | PTA_3DNOW_A},
1179       {"athlon-tbird", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE
1180                                          | PTA_3DNOW | PTA_3DNOW_A},
1181       {"athlon-4", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1182                                     | PTA_3DNOW_A | PTA_SSE},
1183       {"athlon-xp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1184                                       | PTA_3DNOW_A | PTA_SSE},
1185       {"athlon-mp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1186                                       | PTA_3DNOW_A | PTA_SSE},
1187       {"x86-64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_64BIT
1188                                | PTA_SSE | PTA_SSE2 },
1189       {"k8", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
1190                                       | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
1191       {"opteron", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
1192                                       | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
1193       {"athlon64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
1194                                       | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
1195       {"athlon-fx", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
1196                                       | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
1197     };
1198
1199   int const pta_size = ARRAY_SIZE (processor_alias_table);
1200
1201 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1202   SUBTARGET_OVERRIDE_OPTIONS;
1203 #endif
1204
1205   /* Set the default values for switches whose default depends on TARGET_64BIT
1206      in case they weren't overwritten by command line options.  */
1207   if (TARGET_64BIT)
1208     {
1209       if (flag_omit_frame_pointer == 2)
1210         flag_omit_frame_pointer = 1;
1211       if (flag_asynchronous_unwind_tables == 2)
1212         flag_asynchronous_unwind_tables = 1;
1213       if (flag_pcc_struct_return == 2)
1214         flag_pcc_struct_return = 0;
1215     }
1216   else
1217     {
1218       if (flag_omit_frame_pointer == 2)
1219         flag_omit_frame_pointer = 0;
1220       if (flag_asynchronous_unwind_tables == 2)
1221         flag_asynchronous_unwind_tables = 0;
1222       if (flag_pcc_struct_return == 2)
1223         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
1224     }
1225
1226   if (!ix86_tune_string && ix86_arch_string)
1227     ix86_tune_string = ix86_arch_string;
1228   if (!ix86_tune_string)
1229     {
1230       ix86_tune_string = cpu_names [TARGET_CPU_DEFAULT];
1231       ix86_tune_defaulted = 1;
1232     }
1233   if (!ix86_arch_string)
1234     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386";
1235
1236   if (ix86_cmodel_string != 0)
1237     {
1238       if (!strcmp (ix86_cmodel_string, "small"))
1239         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
1240       else if (flag_pic)
1241         sorry ("code model %s not supported in PIC mode", ix86_cmodel_string);
1242       else if (!strcmp (ix86_cmodel_string, "32"))
1243         ix86_cmodel = CM_32;
1244       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
1245         ix86_cmodel = CM_KERNEL;
1246       else if (!strcmp (ix86_cmodel_string, "medium") && !flag_pic)
1247         ix86_cmodel = CM_MEDIUM;
1248       else if (!strcmp (ix86_cmodel_string, "large") && !flag_pic)
1249         ix86_cmodel = CM_LARGE;
1250       else
1251         error ("bad value (%s) for -mcmodel= switch", ix86_cmodel_string);
1252     }
1253   else
1254     {
1255       ix86_cmodel = CM_32;
1256       if (TARGET_64BIT)
1257         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
1258     }
1259   if (ix86_asm_string != 0)
1260     {
1261       if (!strcmp (ix86_asm_string, "intel"))
1262         ix86_asm_dialect = ASM_INTEL;
1263       else if (!strcmp (ix86_asm_string, "att"))
1264         ix86_asm_dialect = ASM_ATT;
1265       else
1266         error ("bad value (%s) for -masm= switch", ix86_asm_string);
1267     }
1268   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
1269     error ("code model %qs not supported in the %s bit mode",
1270            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
1271   if (ix86_cmodel == CM_LARGE)
1272     sorry ("code model %<large%> not supported yet");
1273   if ((TARGET_64BIT != 0) != ((target_flags & MASK_64BIT) != 0))
1274     sorry ("%i-bit mode not compiled in",
1275            (target_flags & MASK_64BIT) ? 64 : 32);
1276
1277   for (i = 0; i < pta_size; i++)
1278     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
1279       {
1280         ix86_arch = processor_alias_table[i].processor;
1281         /* Default cpu tuning to the architecture.  */
1282         ix86_tune = ix86_arch;
1283         if (processor_alias_table[i].flags & PTA_MMX
1284             && !(target_flags_explicit & MASK_MMX))
1285           target_flags |= MASK_MMX;
1286         if (processor_alias_table[i].flags & PTA_3DNOW
1287             && !(target_flags_explicit & MASK_3DNOW))
1288           target_flags |= MASK_3DNOW;
1289         if (processor_alias_table[i].flags & PTA_3DNOW_A
1290             && !(target_flags_explicit & MASK_3DNOW_A))
1291           target_flags |= MASK_3DNOW_A;
1292         if (processor_alias_table[i].flags & PTA_SSE
1293             && !(target_flags_explicit & MASK_SSE))
1294           target_flags |= MASK_SSE;
1295         if (processor_alias_table[i].flags & PTA_SSE2
1296             && !(target_flags_explicit & MASK_SSE2))
1297           target_flags |= MASK_SSE2;
1298         if (processor_alias_table[i].flags & PTA_SSE3
1299             && !(target_flags_explicit & MASK_SSE3))
1300           target_flags |= MASK_SSE3;
1301         if (processor_alias_table[i].flags & PTA_PREFETCH_SSE)
1302           x86_prefetch_sse = true;
1303         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
1304           error ("CPU you selected does not support x86-64 "
1305                  "instruction set");
1306         break;
1307       }
1308
1309   if (i == pta_size)
1310     error ("bad value (%s) for -march= switch", ix86_arch_string);
1311
1312   for (i = 0; i < pta_size; i++)
1313     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
1314       {
1315         ix86_tune = processor_alias_table[i].processor;
1316         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
1317           {
1318             if (ix86_tune_defaulted)
1319               {
1320                 ix86_tune_string = "x86-64";
1321                 for (i = 0; i < pta_size; i++)
1322                   if (! strcmp (ix86_tune_string,
1323                                 processor_alias_table[i].name))
1324                     break;
1325                 ix86_tune = processor_alias_table[i].processor;
1326               }
1327             else
1328               error ("CPU you selected does not support x86-64 "
1329                      "instruction set");
1330           }
1331         /* Intel CPUs have always interpreted SSE prefetch instructions as
1332            NOPs; so, we can enable SSE prefetch instructions even when
1333            -mtune (rather than -march) points us to a processor that has them.
1334            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
1335            higher processors.  */
1336         if (TARGET_CMOVE && (processor_alias_table[i].flags & PTA_PREFETCH_SSE))
1337           x86_prefetch_sse = true;
1338         break;
1339       }
1340   if (i == pta_size)
1341     error ("bad value (%s) for -mtune= switch", ix86_tune_string);
1342
1343   if (optimize_size)
1344     ix86_cost = &size_cost;
1345   else
1346     ix86_cost = processor_target_table[ix86_tune].cost;
1347   target_flags |= processor_target_table[ix86_tune].target_enable;
1348   target_flags &= ~processor_target_table[ix86_tune].target_disable;
1349
1350   /* Arrange to set up i386_stack_locals for all functions.  */
1351   init_machine_status = ix86_init_machine_status;
1352
1353   /* Validate -mregparm= value.  */
1354   if (ix86_regparm_string)
1355     {
1356       i = atoi (ix86_regparm_string);
1357       if (i < 0 || i > REGPARM_MAX)
1358         error ("-mregparm=%d is not between 0 and %d", i, REGPARM_MAX);
1359       else
1360         ix86_regparm = i;
1361     }
1362   else
1363    if (TARGET_64BIT)
1364      ix86_regparm = REGPARM_MAX;
1365
1366   /* If the user has provided any of the -malign-* options,
1367      warn and use that value only if -falign-* is not set.
1368      Remove this code in GCC 3.2 or later.  */
1369   if (ix86_align_loops_string)
1370     {
1371       warning ("-malign-loops is obsolete, use -falign-loops");
1372       if (align_loops == 0)
1373         {
1374           i = atoi (ix86_align_loops_string);
1375           if (i < 0 || i > MAX_CODE_ALIGN)
1376             error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);
1377           else
1378             align_loops = 1 << i;
1379         }
1380     }
1381
1382   if (ix86_align_jumps_string)
1383     {
1384       warning ("-malign-jumps is obsolete, use -falign-jumps");
1385       if (align_jumps == 0)
1386         {
1387           i = atoi (ix86_align_jumps_string);
1388           if (i < 0 || i > MAX_CODE_ALIGN)
1389             error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);
1390           else
1391             align_jumps = 1 << i;
1392         }
1393     }
1394
1395   if (ix86_align_funcs_string)
1396     {
1397       warning ("-malign-functions is obsolete, use -falign-functions");
1398       if (align_functions == 0)
1399         {
1400           i = atoi (ix86_align_funcs_string);
1401           if (i < 0 || i > MAX_CODE_ALIGN)
1402             error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);
1403           else
1404             align_functions = 1 << i;
1405         }
1406     }
1407
1408   /* Default align_* from the processor table.  */
1409   if (align_loops == 0)
1410     {
1411       align_loops = processor_target_table[ix86_tune].align_loop;
1412       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
1413     }
1414   if (align_jumps == 0)
1415     {
1416       align_jumps = processor_target_table[ix86_tune].align_jump;
1417       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
1418     }
1419   if (align_functions == 0)
1420     {
1421       align_functions = processor_target_table[ix86_tune].align_func;
1422     }
1423
1424   /* Validate -mpreferred-stack-boundary= value, or provide default.
1425      The default of 128 bits is for Pentium III's SSE __m128, but we
1426      don't want additional code to keep the stack aligned when
1427      optimizing for code size.  */
1428   ix86_preferred_stack_boundary = (optimize_size
1429                                    ? TARGET_64BIT ? 128 : 32
1430                                    : 128);
1431   if (ix86_preferred_stack_boundary_string)
1432     {
1433       i = atoi (ix86_preferred_stack_boundary_string);
1434       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
1435         error ("-mpreferred-stack-boundary=%d is not between %d and 12", i,
1436                TARGET_64BIT ? 4 : 2);
1437       else
1438         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
1439     }
1440
1441   /* Validate -mbranch-cost= value, or provide default.  */
1442   ix86_branch_cost = processor_target_table[ix86_tune].cost->branch_cost;
1443   if (ix86_branch_cost_string)
1444     {
1445       i = atoi (ix86_branch_cost_string);
1446       if (i < 0 || i > 5)
1447         error ("-mbranch-cost=%d is not between 0 and 5", i);
1448       else
1449         ix86_branch_cost = i;
1450     }
1451
1452   if (ix86_tls_dialect_string)
1453     {
1454       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
1455         ix86_tls_dialect = TLS_DIALECT_GNU;
1456       else if (strcmp (ix86_tls_dialect_string, "sun") == 0)
1457         ix86_tls_dialect = TLS_DIALECT_SUN;
1458       else
1459         error ("bad value (%s) for -mtls-dialect= switch",
1460                ix86_tls_dialect_string);
1461     }
1462
1463   /* Keep nonleaf frame pointers.  */
1464   if (flag_omit_frame_pointer)
1465     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
1466   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
1467     flag_omit_frame_pointer = 1;
1468
1469   /* If we're doing fast math, we don't care about comparison order
1470      wrt NaNs.  This lets us use a shorter comparison sequence.  */
1471   if (flag_unsafe_math_optimizations)
1472     target_flags &= ~MASK_IEEE_FP;
1473
1474   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
1475      since the insns won't need emulation.  */
1476   if (!(target_flags_explicit & MASK_NO_FANCY_MATH_387)
1477       && (x86_arch_always_fancy_math_387 & (1 << ix86_arch)))
1478     target_flags &= ~MASK_NO_FANCY_MATH_387;
1479
1480   /* Likewise, if the target doesn't have a 387, or we've specified
1481      software floating point, don't use 387 inline instrinsics.  */
1482   if (!TARGET_80387)
1483     target_flags |= MASK_NO_FANCY_MATH_387;
1484
1485   /* Turn on SSE2 builtins for -msse3.  */
1486   if (TARGET_SSE3)
1487     target_flags |= MASK_SSE2;
1488
1489   /* Turn on SSE builtins for -msse2.  */
1490   if (TARGET_SSE2)
1491     target_flags |= MASK_SSE;
1492
1493   /* Turn on MMX builtins for -msse.  */
1494   if (TARGET_SSE)
1495     {
1496       target_flags |= MASK_MMX & ~target_flags_explicit;
1497       x86_prefetch_sse = true;
1498     }
1499
1500   /* Turn on MMX builtins for 3Dnow.  */
1501   if (TARGET_3DNOW)
1502     target_flags |= MASK_MMX;
1503
1504   if (TARGET_64BIT)
1505     {
1506       if (TARGET_ALIGN_DOUBLE)
1507         error ("-malign-double makes no sense in the 64bit mode");
1508       if (TARGET_RTD)
1509         error ("-mrtd calling convention not supported in the 64bit mode");
1510
1511       /* Enable by default the SSE and MMX builtins.  Do allow the user to
1512          explicitly disable any of these.  In particular, disabling SSE and
1513          MMX for kernel code is extremely useful.  */
1514       target_flags
1515         |= ((MASK_SSE2 | MASK_SSE | MASK_MMX | MASK_128BIT_LONG_DOUBLE)
1516             & ~target_flags_explicit);
1517
1518       if (TARGET_SSE)
1519         ix86_fpmath = FPMATH_SSE;
1520      }
1521   else
1522     {
1523       ix86_fpmath = FPMATH_387;
1524       /* i386 ABI does not specify red zone.  It still makes sense to use it
1525          when programmer takes care to stack from being destroyed.  */
1526       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
1527         target_flags |= MASK_NO_RED_ZONE;
1528     }
1529
1530   if (ix86_fpmath_string != 0)
1531     {
1532       if (! strcmp (ix86_fpmath_string, "387"))
1533         ix86_fpmath = FPMATH_387;
1534       else if (! strcmp (ix86_fpmath_string, "sse"))
1535         {
1536           if (!TARGET_SSE)
1537             {
1538               warning ("SSE instruction set disabled, using 387 arithmetics");
1539               ix86_fpmath = FPMATH_387;
1540             }
1541           else
1542             ix86_fpmath = FPMATH_SSE;
1543         }
1544       else if (! strcmp (ix86_fpmath_string, "387,sse")
1545                || ! strcmp (ix86_fpmath_string, "sse,387"))
1546         {
1547           if (!TARGET_SSE)
1548             {
1549               warning ("SSE instruction set disabled, using 387 arithmetics");
1550               ix86_fpmath = FPMATH_387;
1551             }
1552           else if (!TARGET_80387)
1553             {
1554               warning ("387 instruction set disabled, using SSE arithmetics");
1555               ix86_fpmath = FPMATH_SSE;
1556             }
1557           else
1558             ix86_fpmath = FPMATH_SSE | FPMATH_387;
1559         }
1560       else
1561         error ("bad value (%s) for -mfpmath= switch", ix86_fpmath_string);
1562     }
1563
1564   /* If fpmath doesn't include 387, disable use of x87 intrinsics.  */
1565   if (! (ix86_fpmath & FPMATH_387))
1566     target_flags |= MASK_NO_FANCY_MATH_387;
1567
1568   if ((x86_accumulate_outgoing_args & TUNEMASK)
1569       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
1570       && !optimize_size)
1571     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
1572
1573   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
1574   {
1575     char *p;
1576     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
1577     p = strchr (internal_label_prefix, 'X');
1578     internal_label_prefix_len = p - internal_label_prefix;
1579     *p = '\0';
1580   }
1581
1582   /* When scheduling description is not available, disable scheduler pass
1583      so it won't slow down the compilation and make x87 code slower.  */
1584   if (!TARGET_SCHEDULE)
1585     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
1586 }
1587 \f
1588 void
1589 optimization_options (int level, int size ATTRIBUTE_UNUSED)
1590 {
1591   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
1592      make the problem with not enough registers even worse.  */
1593 #ifdef INSN_SCHEDULING
1594   if (level > 1)
1595     flag_schedule_insns = 0;
1596 #endif
1597
1598   /* The default values of these switches depend on the TARGET_64BIT
1599      that is not known at this moment.  Mark these values with 2 and
1600      let user the to override these.  In case there is no command line option
1601      specifying them, we will set the defaults in override_options.  */
1602   if (optimize >= 1)
1603     flag_omit_frame_pointer = 2;
1604   flag_pcc_struct_return = 2;
1605   flag_asynchronous_unwind_tables = 2;
1606 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
1607   SUBTARGET_OPTIMIZATION_OPTIONS;
1608 #endif
1609 }
1610 \f
1611 /* Table of valid machine attributes.  */
1612 const struct attribute_spec ix86_attribute_table[] =
1613 {
1614   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
1615   /* Stdcall attribute says callee is responsible for popping arguments
1616      if they are not variable.  */
1617   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cdecl_attribute },
1618   /* Fastcall attribute says callee is responsible for popping arguments
1619      if they are not variable.  */
1620   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cdecl_attribute },
1621   /* Cdecl attribute says the callee is a normal C declaration */
1622   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cdecl_attribute },
1623   /* Regparm attribute specifies how many integer arguments are to be
1624      passed in registers.  */
1625   { "regparm",   1, 1, false, true,  true,  ix86_handle_regparm_attribute },
1626 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
1627   { "dllimport", 0, 0, false, false, false, handle_dll_attribute },
1628   { "dllexport", 0, 0, false, false, false, handle_dll_attribute },
1629   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
1630 #endif
1631   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
1632   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
1633 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1634   SUBTARGET_ATTRIBUTE_TABLE,
1635 #endif
1636   { NULL,        0, 0, false, false, false, NULL }
1637 };
1638
1639 /* Decide whether we can make a sibling call to a function.  DECL is the
1640    declaration of the function being targeted by the call and EXP is the
1641    CALL_EXPR representing the call.  */
1642
1643 static bool
1644 ix86_function_ok_for_sibcall (tree decl, tree exp)
1645 {
1646   /* If we are generating position-independent code, we cannot sibcall
1647      optimize any indirect call, or a direct call to a global function,
1648      as the PLT requires %ebx be live.  */
1649   if (!TARGET_64BIT && flag_pic && (!decl || TREE_PUBLIC (decl)))
1650     return false;
1651
1652   /* If we are returning floats on the 80387 register stack, we cannot
1653      make a sibcall from a function that doesn't return a float to a
1654      function that does or, conversely, from a function that does return
1655      a float to a function that doesn't; the necessary stack adjustment
1656      would not be executed.  */
1657   if (STACK_REG_P (ix86_function_value (TREE_TYPE (exp)))
1658       != STACK_REG_P (ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)))))
1659     return false;
1660
1661   /* If this call is indirect, we'll need to be able to use a call-clobbered
1662      register for the address of the target function.  Make sure that all
1663      such registers are not used for passing parameters.  */
1664   if (!decl && !TARGET_64BIT)
1665     {
1666       tree type;
1667
1668       /* We're looking at the CALL_EXPR, we need the type of the function.  */
1669       type = TREE_OPERAND (exp, 0);             /* pointer expression */
1670       type = TREE_TYPE (type);                  /* pointer type */
1671       type = TREE_TYPE (type);                  /* function type */
1672
1673       if (ix86_function_regparm (type, NULL) >= 3)
1674         {
1675           /* ??? Need to count the actual number of registers to be used,
1676              not the possible number of registers.  Fix later.  */
1677           return false;
1678         }
1679     }
1680
1681   /* Otherwise okay.  That also includes certain types of indirect calls.  */
1682   return true;
1683 }
1684
1685 /* Handle a "cdecl", "stdcall", or "fastcall" attribute;
1686    arguments as in struct attribute_spec.handler.  */
1687 static tree
1688 ix86_handle_cdecl_attribute (tree *node, tree name,
1689                              tree args ATTRIBUTE_UNUSED,
1690                              int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
1691 {
1692   if (TREE_CODE (*node) != FUNCTION_TYPE
1693       && TREE_CODE (*node) != METHOD_TYPE
1694       && TREE_CODE (*node) != FIELD_DECL
1695       && TREE_CODE (*node) != TYPE_DECL)
1696     {
1697       warning ("%qs attribute only applies to functions",
1698                IDENTIFIER_POINTER (name));
1699       *no_add_attrs = true;
1700     }
1701   else
1702     {
1703       if (is_attribute_p ("fastcall", name))
1704         {
1705           if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
1706             {
1707               error ("fastcall and stdcall attributes are not compatible");
1708             }
1709            else if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
1710             {
1711               error ("fastcall and regparm attributes are not compatible");
1712             }
1713         }
1714       else if (is_attribute_p ("stdcall", name))
1715         {
1716           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
1717             {
1718               error ("fastcall and stdcall attributes are not compatible");
1719             }
1720         }
1721     }
1722
1723   if (TARGET_64BIT)
1724     {
1725       warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
1726       *no_add_attrs = true;
1727     }
1728
1729   return NULL_TREE;
1730 }
1731
1732 /* Handle a "regparm" attribute;
1733    arguments as in struct attribute_spec.handler.  */
1734 static tree
1735 ix86_handle_regparm_attribute (tree *node, tree name, tree args,
1736                                int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
1737 {
1738   if (TREE_CODE (*node) != FUNCTION_TYPE
1739       && TREE_CODE (*node) != METHOD_TYPE
1740       && TREE_CODE (*node) != FIELD_DECL
1741       && TREE_CODE (*node) != TYPE_DECL)
1742     {
1743       warning ("%qs attribute only applies to functions",
1744                IDENTIFIER_POINTER (name));
1745       *no_add_attrs = true;
1746     }
1747   else
1748     {
1749       tree cst;
1750
1751       cst = TREE_VALUE (args);
1752       if (TREE_CODE (cst) != INTEGER_CST)
1753         {
1754           warning ("%qs attribute requires an integer constant argument",
1755                    IDENTIFIER_POINTER (name));
1756           *no_add_attrs = true;
1757         }
1758       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
1759         {
1760           warning ("argument to %qs attribute larger than %d",
1761                    IDENTIFIER_POINTER (name), REGPARM_MAX);
1762           *no_add_attrs = true;
1763         }
1764
1765       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
1766         {
1767           error ("fastcall and regparm attributes are not compatible");
1768         }
1769     }
1770
1771   return NULL_TREE;
1772 }
1773
1774 /* Return 0 if the attributes for two types are incompatible, 1 if they
1775    are compatible, and 2 if they are nearly compatible (which causes a
1776    warning to be generated).  */
1777
1778 static int
1779 ix86_comp_type_attributes (tree type1, tree type2)
1780 {
1781   /* Check for mismatch of non-default calling convention.  */
1782   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
1783
1784   if (TREE_CODE (type1) != FUNCTION_TYPE)
1785     return 1;
1786
1787   /*  Check for mismatched fastcall types */
1788   if (!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
1789       != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
1790     return 0;
1791
1792   /* Check for mismatched return types (cdecl vs stdcall).  */
1793   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
1794       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
1795     return 0;
1796   if (ix86_function_regparm (type1, NULL)
1797       != ix86_function_regparm (type2, NULL))
1798     return 0;
1799   return 1;
1800 }
1801 \f
1802 /* Return the regparm value for a fuctio with the indicated TYPE and DECL.
1803    DECL may be NULL when calling function indirectly
1804    or considering a libcall.  */
1805
1806 static int
1807 ix86_function_regparm (tree type, tree decl)
1808 {
1809   tree attr;
1810   int regparm = ix86_regparm;
1811   bool user_convention = false;
1812
1813   if (!TARGET_64BIT)
1814     {
1815       attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
1816       if (attr)
1817         {
1818           regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
1819           user_convention = true;
1820         }
1821
1822       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
1823         {
1824           regparm = 2;
1825           user_convention = true;
1826         }
1827
1828       /* Use register calling convention for local functions when possible.  */
1829       if (!TARGET_64BIT && !user_convention && decl
1830           && flag_unit_at_a_time && !profile_flag)
1831         {
1832           struct cgraph_local_info *i = cgraph_local_info (decl);
1833           if (i && i->local)
1834             {
1835               /* We can't use regparm(3) for nested functions as these use
1836                  static chain pointer in third argument.  */
1837               if (DECL_CONTEXT (decl) && !DECL_NO_STATIC_CHAIN (decl))
1838                 regparm = 2;
1839               else
1840                 regparm = 3;
1841             }
1842         }
1843     }
1844   return regparm;
1845 }
1846
1847 /* Return true if EAX is live at the start of the function.  Used by
1848    ix86_expand_prologue to determine if we need special help before
1849    calling allocate_stack_worker.  */
1850
1851 static bool
1852 ix86_eax_live_at_start_p (void)
1853 {
1854   /* Cheat.  Don't bother working forward from ix86_function_regparm
1855      to the function type to whether an actual argument is located in
1856      eax.  Instead just look at cfg info, which is still close enough
1857      to correct at this point.  This gives false positives for broken
1858      functions that might use uninitialized data that happens to be
1859      allocated in eax, but who cares?  */
1860   return REGNO_REG_SET_P (ENTRY_BLOCK_PTR->global_live_at_end, 0);
1861 }
1862
1863 /* Value is the number of bytes of arguments automatically
1864    popped when returning from a subroutine call.
1865    FUNDECL is the declaration node of the function (as a tree),
1866    FUNTYPE is the data type of the function (as a tree),
1867    or for a library call it is an identifier node for the subroutine name.
1868    SIZE is the number of bytes of arguments passed on the stack.
1869
1870    On the 80386, the RTD insn may be used to pop them if the number
1871      of args is fixed, but if the number is variable then the caller
1872      must pop them all.  RTD can't be used for library calls now
1873      because the library is compiled with the Unix compiler.
1874    Use of RTD is a selectable option, since it is incompatible with
1875    standard Unix calling sequences.  If the option is not selected,
1876    the caller must always pop the args.
1877
1878    The attribute stdcall is equivalent to RTD on a per module basis.  */
1879
1880 int
1881 ix86_return_pops_args (tree fundecl, tree funtype, int size)
1882 {
1883   int rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
1884
1885   /* Cdecl functions override -mrtd, and never pop the stack.  */
1886   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype))) {
1887
1888     /* Stdcall and fastcall functions will pop the stack if not
1889        variable args.  */
1890     if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
1891         || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
1892       rtd = 1;
1893
1894     if (rtd
1895         && (TYPE_ARG_TYPES (funtype) == NULL_TREE
1896             || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (funtype)))
1897                 == void_type_node)))
1898       return size;
1899   }
1900
1901   /* Lose any fake structure return argument if it is passed on the stack.  */
1902   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
1903       && !TARGET_64BIT
1904       && !KEEP_AGGREGATE_RETURN_POINTER)
1905     {
1906       int nregs = ix86_function_regparm (funtype, fundecl);
1907
1908       if (!nregs)
1909         return GET_MODE_SIZE (Pmode);
1910     }
1911
1912   return 0;
1913 }
1914 \f
1915 /* Argument support functions.  */
1916
1917 /* Return true when register may be used to pass function parameters.  */
1918 bool
1919 ix86_function_arg_regno_p (int regno)
1920 {
1921   int i;
1922   if (!TARGET_64BIT)
1923     return (regno < REGPARM_MAX
1924             || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
1925   if (SSE_REGNO_P (regno) && TARGET_SSE)
1926     return true;
1927   /* RAX is used as hidden argument to va_arg functions.  */
1928   if (!regno)
1929     return true;
1930   for (i = 0; i < REGPARM_MAX; i++)
1931     if (regno == x86_64_int_parameter_registers[i])
1932       return true;
1933   return false;
1934 }
1935
1936 /* Return if we do not know how to pass TYPE solely in registers.  */
1937
1938 static bool
1939 ix86_must_pass_in_stack (enum machine_mode mode, tree type)
1940 {
1941   if (must_pass_in_stack_var_size_or_pad (mode, type))
1942     return true;
1943
1944   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
1945      The layout_type routine is crafty and tries to trick us into passing
1946      currently unsupported vector types on the stack by using TImode.  */
1947   return (!TARGET_64BIT && mode == TImode
1948           && type && TREE_CODE (type) != VECTOR_TYPE);
1949 }
1950
1951 /* Initialize a variable CUM of type CUMULATIVE_ARGS
1952    for a call to a function whose data type is FNTYPE.
1953    For a library call, FNTYPE is 0.  */
1954
1955 void
1956 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
1957                       tree fntype,      /* tree ptr for function decl */
1958                       rtx libname,      /* SYMBOL_REF of library name or 0 */
1959                       tree fndecl)
1960 {
1961   static CUMULATIVE_ARGS zero_cum;
1962   tree param, next_param;
1963
1964   if (TARGET_DEBUG_ARG)
1965     {
1966       fprintf (stderr, "\ninit_cumulative_args (");
1967       if (fntype)
1968         fprintf (stderr, "fntype code = %s, ret code = %s",
1969                  tree_code_name[(int) TREE_CODE (fntype)],
1970                  tree_code_name[(int) TREE_CODE (TREE_TYPE (fntype))]);
1971       else
1972         fprintf (stderr, "no fntype");
1973
1974       if (libname)
1975         fprintf (stderr, ", libname = %s", XSTR (libname, 0));
1976     }
1977
1978   *cum = zero_cum;
1979
1980   /* Set up the number of registers to use for passing arguments.  */
1981   if (fntype)
1982     cum->nregs = ix86_function_regparm (fntype, fndecl);
1983   else
1984     cum->nregs = ix86_regparm;
1985   if (TARGET_SSE)
1986     cum->sse_nregs = SSE_REGPARM_MAX;
1987   if (TARGET_MMX)
1988     cum->mmx_nregs = MMX_REGPARM_MAX;
1989   cum->warn_sse = true;
1990   cum->warn_mmx = true;
1991   cum->maybe_vaarg = false;
1992
1993   /* Use ecx and edx registers if function has fastcall attribute */
1994   if (fntype && !TARGET_64BIT)
1995     {
1996       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
1997         {
1998           cum->nregs = 2;
1999           cum->fastcall = 1;
2000         }
2001     }
2002
2003   /* Determine if this function has variable arguments.  This is
2004      indicated by the last argument being 'void_type_mode' if there
2005      are no variable arguments.  If there are variable arguments, then
2006      we won't pass anything in registers in 32-bit mode. */
2007
2008   if (cum->nregs || cum->mmx_nregs || cum->sse_nregs)
2009     {
2010       for (param = (fntype) ? TYPE_ARG_TYPES (fntype) : 0;
2011            param != 0; param = next_param)
2012         {
2013           next_param = TREE_CHAIN (param);
2014           if (next_param == 0 && TREE_VALUE (param) != void_type_node)
2015             {
2016               if (!TARGET_64BIT)
2017                 {
2018                   cum->nregs = 0;
2019                   cum->sse_nregs = 0;
2020                   cum->mmx_nregs = 0;
2021                   cum->warn_sse = 0;
2022                   cum->warn_mmx = 0;
2023                   cum->fastcall = 0;
2024                 }
2025               cum->maybe_vaarg = true;
2026             }
2027         }
2028     }
2029   if ((!fntype && !libname)
2030       || (fntype && !TYPE_ARG_TYPES (fntype)))
2031     cum->maybe_vaarg = 1;
2032
2033   if (TARGET_DEBUG_ARG)
2034     fprintf (stderr, ", nregs=%d )\n", cum->nregs);
2035
2036   return;
2037 }
2038
2039 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
2040    But in the case of vector types, it is some vector mode.
2041
2042    When we have only some of our vector isa extensions enabled, then there
2043    are some modes for which vector_mode_supported_p is false.  For these
2044    modes, the generic vector support in gcc will choose some non-vector mode
2045    in order to implement the type.  By computing the natural mode, we'll 
2046    select the proper ABI location for the operand and not depend on whatever
2047    the middle-end decides to do with these vector types.  */
2048
2049 static enum machine_mode
2050 type_natural_mode (tree type)
2051 {
2052   enum machine_mode mode = TYPE_MODE (type);
2053
2054   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
2055     {
2056       HOST_WIDE_INT size = int_size_in_bytes (type);
2057       if ((size == 8 || size == 16)
2058           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
2059           && TYPE_VECTOR_SUBPARTS (type) > 1)
2060         {
2061           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
2062
2063           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
2064             mode = MIN_MODE_VECTOR_FLOAT;
2065           else
2066             mode = MIN_MODE_VECTOR_INT;
2067
2068           /* Get the mode which has this inner mode and number of units.  */
2069           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
2070             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
2071                 && GET_MODE_INNER (mode) == innermode)
2072               return mode;
2073
2074           abort ();
2075         }
2076     }
2077
2078   return mode;
2079 }
2080
2081 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
2082    this may not agree with the mode that the type system has chosen for the
2083    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
2084    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
2085
2086 static rtx
2087 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
2088                      unsigned int regno)
2089 {
2090   rtx tmp;
2091
2092   if (orig_mode != BLKmode)
2093     tmp = gen_rtx_REG (orig_mode, regno);
2094   else
2095     {
2096       tmp = gen_rtx_REG (mode, regno);
2097       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
2098       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
2099     }
2100
2101   return tmp;
2102 }
2103
2104 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
2105    of this code is to classify each 8bytes of incoming argument by the register
2106    class and assign registers accordingly.  */
2107
2108 /* Return the union class of CLASS1 and CLASS2.
2109    See the x86-64 PS ABI for details.  */
2110
2111 static enum x86_64_reg_class
2112 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
2113 {
2114   /* Rule #1: If both classes are equal, this is the resulting class.  */
2115   if (class1 == class2)
2116     return class1;
2117
2118   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
2119      the other class.  */
2120   if (class1 == X86_64_NO_CLASS)
2121     return class2;
2122   if (class2 == X86_64_NO_CLASS)
2123     return class1;
2124
2125   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
2126   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
2127     return X86_64_MEMORY_CLASS;
2128
2129   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
2130   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
2131       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
2132     return X86_64_INTEGERSI_CLASS;
2133   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
2134       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
2135     return X86_64_INTEGER_CLASS;
2136
2137   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
2138      MEMORY is used.  */
2139   if (class1 == X86_64_X87_CLASS
2140       || class1 == X86_64_X87UP_CLASS
2141       || class1 == X86_64_COMPLEX_X87_CLASS
2142       || class2 == X86_64_X87_CLASS
2143       || class2 == X86_64_X87UP_CLASS
2144       || class2 == X86_64_COMPLEX_X87_CLASS)
2145     return X86_64_MEMORY_CLASS;
2146
2147   /* Rule #6: Otherwise class SSE is used.  */
2148   return X86_64_SSE_CLASS;
2149 }
2150
2151 /* Classify the argument of type TYPE and mode MODE.
2152    CLASSES will be filled by the register class used to pass each word
2153    of the operand.  The number of words is returned.  In case the parameter
2154    should be passed in memory, 0 is returned. As a special case for zero
2155    sized containers, classes[0] will be NO_CLASS and 1 is returned.
2156
2157    BIT_OFFSET is used internally for handling records and specifies offset
2158    of the offset in bits modulo 256 to avoid overflow cases.
2159
2160    See the x86-64 PS ABI for details.
2161 */
2162
2163 static int
2164 classify_argument (enum machine_mode mode, tree type,
2165                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
2166 {
2167   HOST_WIDE_INT bytes =
2168     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
2169   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2170
2171   /* Variable sized entities are always passed/returned in memory.  */
2172   if (bytes < 0)
2173     return 0;
2174
2175   if (mode != VOIDmode
2176       && targetm.calls.must_pass_in_stack (mode, type))
2177     return 0;
2178
2179   if (type && AGGREGATE_TYPE_P (type))
2180     {
2181       int i;
2182       tree field;
2183       enum x86_64_reg_class subclasses[MAX_CLASSES];
2184
2185       /* On x86-64 we pass structures larger than 16 bytes on the stack.  */
2186       if (bytes > 16)
2187         return 0;
2188
2189       for (i = 0; i < words; i++)
2190         classes[i] = X86_64_NO_CLASS;
2191
2192       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
2193          signalize memory class, so handle it as special case.  */
2194       if (!words)
2195         {
2196           classes[0] = X86_64_NO_CLASS;
2197           return 1;
2198         }
2199
2200       /* Classify each field of record and merge classes.  */
2201       if (TREE_CODE (type) == RECORD_TYPE)
2202         {
2203           /* For classes first merge in the field of the subclasses.  */
2204           if (TYPE_BINFO (type))
2205             {
2206               tree binfo, base_binfo;
2207               int basenum;
2208
2209               for (binfo = TYPE_BINFO (type), basenum = 0;
2210                    BINFO_BASE_ITERATE (binfo, basenum, base_binfo); basenum++)
2211                 {
2212                    int num;
2213                    int offset = tree_low_cst (BINFO_OFFSET (base_binfo), 0) * 8;
2214                    tree type = BINFO_TYPE (base_binfo);
2215
2216                    num = classify_argument (TYPE_MODE (type),
2217                                             type, subclasses,
2218                                             (offset + bit_offset) % 256);
2219                    if (!num)
2220                      return 0;
2221                    for (i = 0; i < num; i++)
2222                      {
2223                        int pos = (offset + (bit_offset % 64)) / 8 / 8;
2224                        classes[i + pos] =
2225                          merge_classes (subclasses[i], classes[i + pos]);
2226                      }
2227                 }
2228             }
2229           /* And now merge the fields of structure.  */
2230           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2231             {
2232               if (TREE_CODE (field) == FIELD_DECL)
2233                 {
2234                   int num;
2235
2236                   /* Bitfields are always classified as integer.  Handle them
2237                      early, since later code would consider them to be
2238                      misaligned integers.  */
2239                   if (DECL_BIT_FIELD (field))
2240                     {
2241                       for (i = int_bit_position (field) / 8 / 8;
2242                            i < (int_bit_position (field)
2243                                 + tree_low_cst (DECL_SIZE (field), 0)
2244                                 + 63) / 8 / 8; i++)
2245                         classes[i] =
2246                           merge_classes (X86_64_INTEGER_CLASS,
2247                                          classes[i]);
2248                     }
2249                   else
2250                     {
2251                       num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
2252                                                TREE_TYPE (field), subclasses,
2253                                                (int_bit_position (field)
2254                                                 + bit_offset) % 256);
2255                       if (!num)
2256                         return 0;
2257                       for (i = 0; i < num; i++)
2258                         {
2259                           int pos =
2260                             (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
2261                           classes[i + pos] =
2262                             merge_classes (subclasses[i], classes[i + pos]);
2263                         }
2264                     }
2265                 }
2266             }
2267         }
2268       /* Arrays are handled as small records.  */
2269       else if (TREE_CODE (type) == ARRAY_TYPE)
2270         {
2271           int num;
2272           num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
2273                                    TREE_TYPE (type), subclasses, bit_offset);
2274           if (!num)
2275             return 0;
2276
2277           /* The partial classes are now full classes.  */
2278           if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
2279             subclasses[0] = X86_64_SSE_CLASS;
2280           if (subclasses[0] == X86_64_INTEGERSI_CLASS && bytes != 4)
2281             subclasses[0] = X86_64_INTEGER_CLASS;
2282
2283           for (i = 0; i < words; i++)
2284             classes[i] = subclasses[i % num];
2285         }
2286       /* Unions are similar to RECORD_TYPE but offset is always 0.  */
2287       else if (TREE_CODE (type) == UNION_TYPE
2288                || TREE_CODE (type) == QUAL_UNION_TYPE)
2289         {
2290           /* For classes first merge in the field of the subclasses.  */
2291           if (TYPE_BINFO (type))
2292             {
2293               tree binfo, base_binfo;
2294               int basenum;
2295
2296               for (binfo = TYPE_BINFO (type), basenum = 0;
2297                    BINFO_BASE_ITERATE (binfo, basenum, base_binfo); basenum++)
2298                 {
2299                    int num;
2300                    int offset = tree_low_cst (BINFO_OFFSET (base_binfo), 0) * 8;
2301                    tree type = BINFO_TYPE (base_binfo);
2302
2303                    num = classify_argument (TYPE_MODE (type),
2304                                             type, subclasses,
2305                                             (offset + (bit_offset % 64)) % 256);
2306                    if (!num)
2307                      return 0;
2308                    for (i = 0; i < num; i++)
2309                      {
2310                        int pos = (offset + (bit_offset % 64)) / 8 / 8;
2311                        classes[i + pos] =
2312                          merge_classes (subclasses[i], classes[i + pos]);
2313                      }
2314                 }
2315             }
2316           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2317             {
2318               if (TREE_CODE (field) == FIELD_DECL)
2319                 {
2320                   int num;
2321                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
2322                                            TREE_TYPE (field), subclasses,
2323                                            bit_offset);
2324                   if (!num)
2325                     return 0;
2326                   for (i = 0; i < num; i++)
2327                     classes[i] = merge_classes (subclasses[i], classes[i]);
2328                 }
2329             }
2330         }
2331       else
2332         abort ();
2333
2334       /* Final merger cleanup.  */
2335       for (i = 0; i < words; i++)
2336         {
2337           /* If one class is MEMORY, everything should be passed in
2338              memory.  */
2339           if (classes[i] == X86_64_MEMORY_CLASS)
2340             return 0;
2341
2342           /* The X86_64_SSEUP_CLASS should be always preceded by
2343              X86_64_SSE_CLASS.  */
2344           if (classes[i] == X86_64_SSEUP_CLASS
2345               && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
2346             classes[i] = X86_64_SSE_CLASS;
2347
2348           /*  X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS.  */
2349           if (classes[i] == X86_64_X87UP_CLASS
2350               && (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
2351             classes[i] = X86_64_SSE_CLASS;
2352         }
2353       return words;
2354     }
2355
2356   /* Compute alignment needed.  We align all types to natural boundaries with
2357      exception of XFmode that is aligned to 64bits.  */
2358   if (mode != VOIDmode && mode != BLKmode)
2359     {
2360       int mode_alignment = GET_MODE_BITSIZE (mode);
2361
2362       if (mode == XFmode)
2363         mode_alignment = 128;
2364       else if (mode == XCmode)
2365         mode_alignment = 256;
2366       if (COMPLEX_MODE_P (mode))
2367         mode_alignment /= 2;
2368       /* Misaligned fields are always returned in memory.  */
2369       if (bit_offset % mode_alignment)
2370         return 0;
2371     }
2372
2373   /* for V1xx modes, just use the base mode */
2374   if (VECTOR_MODE_P (mode)
2375       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
2376     mode = GET_MODE_INNER (mode);
2377
2378   /* Classification of atomic types.  */
2379   switch (mode)
2380     {
2381     case DImode:
2382     case SImode:
2383     case HImode:
2384     case QImode:
2385     case CSImode:
2386     case CHImode:
2387     case CQImode:
2388       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
2389         classes[0] = X86_64_INTEGERSI_CLASS;
2390       else
2391         classes[0] = X86_64_INTEGER_CLASS;
2392       return 1;
2393     case CDImode:
2394     case TImode:
2395       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
2396       return 2;
2397     case CTImode:
2398       return 0;
2399     case SFmode:
2400       if (!(bit_offset % 64))
2401         classes[0] = X86_64_SSESF_CLASS;
2402       else
2403         classes[0] = X86_64_SSE_CLASS;
2404       return 1;
2405     case DFmode:
2406       classes[0] = X86_64_SSEDF_CLASS;
2407       return 1;
2408     case XFmode:
2409       classes[0] = X86_64_X87_CLASS;
2410       classes[1] = X86_64_X87UP_CLASS;
2411       return 2;
2412     case TFmode:
2413       classes[0] = X86_64_SSE_CLASS;
2414       classes[1] = X86_64_SSEUP_CLASS;
2415       return 2;
2416     case SCmode:
2417       classes[0] = X86_64_SSE_CLASS;
2418       return 1;
2419     case DCmode:
2420       classes[0] = X86_64_SSEDF_CLASS;
2421       classes[1] = X86_64_SSEDF_CLASS;
2422       return 2;
2423     case XCmode:
2424       classes[0] = X86_64_COMPLEX_X87_CLASS;
2425       return 1;
2426     case TCmode:
2427       /* This modes is larger than 16 bytes.  */
2428       return 0;
2429     case V4SFmode:
2430     case V4SImode:
2431     case V16QImode:
2432     case V8HImode:
2433     case V2DFmode:
2434     case V2DImode:
2435       classes[0] = X86_64_SSE_CLASS;
2436       classes[1] = X86_64_SSEUP_CLASS;
2437       return 2;
2438     case V2SFmode:
2439     case V2SImode:
2440     case V4HImode:
2441     case V8QImode:
2442       classes[0] = X86_64_SSE_CLASS;
2443       return 1;
2444     case BLKmode:
2445     case VOIDmode:
2446       return 0;
2447     default:
2448       if (VECTOR_MODE_P (mode))
2449         {
2450           if (bytes > 16)
2451             return 0;
2452           if (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT)
2453             {
2454               if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
2455                 classes[0] = X86_64_INTEGERSI_CLASS;
2456               else
2457                 classes[0] = X86_64_INTEGER_CLASS;
2458               classes[1] = X86_64_INTEGER_CLASS;
2459               return 1 + (bytes > 8);
2460             }
2461         }
2462       abort ();
2463     }
2464 }
2465
2466 /* Examine the argument and return set number of register required in each
2467    class.  Return 0 iff parameter should be passed in memory.  */
2468 static int
2469 examine_argument (enum machine_mode mode, tree type, int in_return,
2470                   int *int_nregs, int *sse_nregs)
2471 {
2472   enum x86_64_reg_class class[MAX_CLASSES];
2473   int n = classify_argument (mode, type, class, 0);
2474
2475   *int_nregs = 0;
2476   *sse_nregs = 0;
2477   if (!n)
2478     return 0;
2479   for (n--; n >= 0; n--)
2480     switch (class[n])
2481       {
2482       case X86_64_INTEGER_CLASS:
2483       case X86_64_INTEGERSI_CLASS:
2484         (*int_nregs)++;
2485         break;
2486       case X86_64_SSE_CLASS:
2487       case X86_64_SSESF_CLASS:
2488       case X86_64_SSEDF_CLASS:
2489         (*sse_nregs)++;
2490         break;
2491       case X86_64_NO_CLASS:
2492       case X86_64_SSEUP_CLASS:
2493         break;
2494       case X86_64_X87_CLASS:
2495       case X86_64_X87UP_CLASS:
2496         if (!in_return)
2497           return 0;
2498         break;
2499       case X86_64_COMPLEX_X87_CLASS:
2500         return in_return ? 2 : 0;
2501       case X86_64_MEMORY_CLASS:
2502         abort ();
2503       }
2504   return 1;
2505 }
2506
2507 /* Construct container for the argument used by GCC interface.  See
2508    FUNCTION_ARG for the detailed description.  */
2509
2510 static rtx
2511 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
2512                      tree type, int in_return, int nintregs, int nsseregs,
2513                      const int *intreg, int sse_regno)
2514 {
2515   enum machine_mode tmpmode;
2516   int bytes =
2517     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
2518   enum x86_64_reg_class class[MAX_CLASSES];
2519   int n;
2520   int i;
2521   int nexps = 0;
2522   int needed_sseregs, needed_intregs;
2523   rtx exp[MAX_CLASSES];
2524   rtx ret;
2525
2526   n = classify_argument (mode, type, class, 0);
2527   if (TARGET_DEBUG_ARG)
2528     {
2529       if (!n)
2530         fprintf (stderr, "Memory class\n");
2531       else
2532         {
2533           fprintf (stderr, "Classes:");
2534           for (i = 0; i < n; i++)
2535             {
2536               fprintf (stderr, " %s", x86_64_reg_class_name[class[i]]);
2537             }
2538            fprintf (stderr, "\n");
2539         }
2540     }
2541   if (!n)
2542     return NULL;
2543   if (!examine_argument (mode, type, in_return, &needed_intregs,
2544                          &needed_sseregs))
2545     return NULL;
2546   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
2547     return NULL;
2548
2549   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
2550      some less clueful developer tries to use floating-point anyway.  */
2551   if (needed_sseregs && !TARGET_SSE)
2552     {
2553       static bool issued_error;
2554       if (!issued_error)
2555         {
2556           issued_error = true;
2557           if (in_return)
2558             error ("SSE register return with SSE disabled");
2559           else
2560             error ("SSE register argument with SSE disabled");
2561         }
2562       return NULL;
2563     }
2564
2565   /* First construct simple cases.  Avoid SCmode, since we want to use
2566      single register to pass this type.  */
2567   if (n == 1 && mode != SCmode)
2568     switch (class[0])
2569       {
2570       case X86_64_INTEGER_CLASS:
2571       case X86_64_INTEGERSI_CLASS:
2572         return gen_rtx_REG (mode, intreg[0]);
2573       case X86_64_SSE_CLASS:
2574       case X86_64_SSESF_CLASS:
2575       case X86_64_SSEDF_CLASS:
2576         return gen_reg_or_parallel (mode, orig_mode, SSE_REGNO (sse_regno));
2577       case X86_64_X87_CLASS:
2578       case X86_64_COMPLEX_X87_CLASS:
2579         return gen_rtx_REG (mode, FIRST_STACK_REG);
2580       case X86_64_NO_CLASS:
2581         /* Zero sized array, struct or class.  */
2582         return NULL;
2583       default:
2584         abort ();
2585       }
2586   if (n == 2 && class[0] == X86_64_SSE_CLASS && class[1] == X86_64_SSEUP_CLASS
2587       && mode != BLKmode)
2588     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
2589   if (n == 2
2590       && class[0] == X86_64_X87_CLASS && class[1] == X86_64_X87UP_CLASS)
2591     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
2592   if (n == 2 && class[0] == X86_64_INTEGER_CLASS
2593       && class[1] == X86_64_INTEGER_CLASS
2594       && (mode == CDImode || mode == TImode || mode == TFmode)
2595       && intreg[0] + 1 == intreg[1])
2596     return gen_rtx_REG (mode, intreg[0]);
2597
2598   /* Otherwise figure out the entries of the PARALLEL.  */
2599   for (i = 0; i < n; i++)
2600     {
2601       switch (class[i])
2602         {
2603           case X86_64_NO_CLASS:
2604             break;
2605           case X86_64_INTEGER_CLASS:
2606           case X86_64_INTEGERSI_CLASS:
2607             /* Merge TImodes on aligned occasions here too.  */
2608             if (i * 8 + 8 > bytes)
2609               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
2610             else if (class[i] == X86_64_INTEGERSI_CLASS)
2611               tmpmode = SImode;
2612             else
2613               tmpmode = DImode;
2614             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
2615             if (tmpmode == BLKmode)
2616               tmpmode = DImode;
2617             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2618                                                gen_rtx_REG (tmpmode, *intreg),
2619                                                GEN_INT (i*8));
2620             intreg++;
2621             break;
2622           case X86_64_SSESF_CLASS:
2623             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2624                                                gen_rtx_REG (SFmode,
2625                                                             SSE_REGNO (sse_regno)),
2626                                                GEN_INT (i*8));
2627             sse_regno++;
2628             break;
2629           case X86_64_SSEDF_CLASS:
2630             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2631                                                gen_rtx_REG (DFmode,
2632                                                             SSE_REGNO (sse_regno)),
2633                                                GEN_INT (i*8));
2634             sse_regno++;
2635             break;
2636           case X86_64_SSE_CLASS:
2637             if (i < n - 1 && class[i + 1] == X86_64_SSEUP_CLASS)
2638               tmpmode = TImode;
2639             else
2640               tmpmode = DImode;
2641             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2642                                                gen_rtx_REG (tmpmode,
2643                                                             SSE_REGNO (sse_regno)),
2644                                                GEN_INT (i*8));
2645             if (tmpmode == TImode)
2646               i++;
2647             sse_regno++;
2648             break;
2649           default:
2650             abort ();
2651         }
2652     }
2653   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
2654   for (i = 0; i < nexps; i++)
2655     XVECEXP (ret, 0, i) = exp [i];
2656   return ret;
2657 }
2658
2659 /* Update the data in CUM to advance over an argument
2660    of mode MODE and data type TYPE.
2661    (TYPE is null for libcalls where that information may not be available.)  */
2662
2663 void
2664 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
2665                       tree type, int named)
2666 {
2667   int bytes =
2668     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
2669   int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2670
2671   if (TARGET_DEBUG_ARG)
2672     fprintf (stderr, "function_adv (sz=%d, wds=%2d, nregs=%d, ssenregs=%d, "
2673              "mode=%s, named=%d)\n\n",
2674              words, cum->words, cum->nregs, cum->sse_nregs,
2675              GET_MODE_NAME (mode), named);
2676   if (TARGET_64BIT)
2677     {
2678       int int_nregs, sse_nregs;
2679       if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
2680         cum->words += words;
2681       else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
2682         {
2683           cum->nregs -= int_nregs;
2684           cum->sse_nregs -= sse_nregs;
2685           cum->regno += int_nregs;
2686           cum->sse_regno += sse_nregs;
2687         }
2688       else
2689         cum->words += words;
2690     }
2691   else
2692     {
2693       if (TARGET_SSE && SSE_REG_MODE_P (mode)
2694           && (!type || !AGGREGATE_TYPE_P (type)))
2695         {
2696           cum->sse_words += words;
2697           cum->sse_nregs -= 1;
2698           cum->sse_regno += 1;
2699           if (cum->sse_nregs <= 0)
2700             {
2701               cum->sse_nregs = 0;
2702               cum->sse_regno = 0;
2703             }
2704         }
2705       else if (TARGET_MMX && MMX_REG_MODE_P (mode)
2706                && (!type || !AGGREGATE_TYPE_P (type)))
2707         {
2708           cum->mmx_words += words;
2709           cum->mmx_nregs -= 1;
2710           cum->mmx_regno += 1;
2711           if (cum->mmx_nregs <= 0)
2712             {
2713               cum->mmx_nregs = 0;
2714               cum->mmx_regno = 0;
2715             }
2716         }
2717       else
2718         {
2719           cum->words += words;
2720           cum->nregs -= words;
2721           cum->regno += words;
2722
2723           if (cum->nregs <= 0)
2724             {
2725               cum->nregs = 0;
2726               cum->regno = 0;
2727             }
2728         }
2729     }
2730   return;
2731 }
2732
2733 /* Define where to put the arguments to a function.
2734    Value is zero to push the argument on the stack,
2735    or a hard register in which to store the argument.
2736
2737    MODE is the argument's machine mode.
2738    TYPE is the data type of the argument (as a tree).
2739     This is null for libcalls where that information may
2740     not be available.
2741    CUM is a variable of type CUMULATIVE_ARGS which gives info about
2742     the preceding args and about the function being called.
2743    NAMED is nonzero if this argument is a named parameter
2744     (otherwise it is an extra parameter matching an ellipsis).  */
2745
2746 rtx
2747 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode orig_mode,
2748               tree type, int named)
2749 {
2750   enum machine_mode mode = orig_mode;
2751   rtx ret = NULL_RTX;
2752   int bytes =
2753     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
2754   int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2755   static bool warnedsse, warnedmmx;
2756
2757   /* To simplify the code below, represent vector types with a vector mode
2758      even if MMX/SSE are not active.  */
2759   if (type && TREE_CODE (type) == VECTOR_TYPE)
2760     mode = type_natural_mode (type);
2761
2762   /* Handle a hidden AL argument containing number of registers for varargs
2763      x86-64 functions.  For i386 ABI just return constm1_rtx to avoid
2764      any AL settings.  */
2765   if (mode == VOIDmode)
2766     {
2767       if (TARGET_64BIT)
2768         return GEN_INT (cum->maybe_vaarg
2769                         ? (cum->sse_nregs < 0
2770                            ? SSE_REGPARM_MAX
2771                            : cum->sse_regno)
2772                         : -1);
2773       else
2774         return constm1_rtx;
2775     }
2776   if (TARGET_64BIT)
2777     ret = construct_container (mode, orig_mode, type, 0, cum->nregs,
2778                                cum->sse_nregs,
2779                                &x86_64_int_parameter_registers [cum->regno],
2780                                cum->sse_regno);
2781   else
2782     switch (mode)
2783       {
2784         /* For now, pass fp/complex values on the stack.  */
2785       default:
2786         break;
2787
2788       case BLKmode:
2789         if (bytes < 0)
2790           break;
2791         /* FALLTHRU */
2792       case DImode:
2793       case SImode:
2794       case HImode:
2795       case QImode:
2796         if (words <= cum->nregs)
2797           {
2798             int regno = cum->regno;
2799
2800             /* Fastcall allocates the first two DWORD (SImode) or
2801                smaller arguments to ECX and EDX.  */
2802             if (cum->fastcall)
2803               {
2804                 if (mode == BLKmode || mode == DImode)
2805                   break;
2806
2807                 /* ECX not EAX is the first allocated register.  */
2808                 if (regno == 0)
2809                   regno = 2;
2810               }
2811             ret = gen_rtx_REG (mode, regno);
2812           }
2813         break;
2814       case TImode:
2815       case V16QImode:
2816       case V8HImode:
2817       case V4SImode:
2818       case V2DImode:
2819       case V4SFmode:
2820       case V2DFmode:
2821         if (!type || !AGGREGATE_TYPE_P (type))
2822           {
2823             if (!TARGET_SSE && !warnedsse && cum->warn_sse)
2824               {
2825                 warnedsse = true;
2826                 warning ("SSE vector argument without SSE enabled "
2827                          "changes the ABI");
2828               }
2829             if (cum->sse_nregs)
2830               ret = gen_reg_or_parallel (mode, orig_mode,
2831                                          cum->sse_regno + FIRST_SSE_REG);
2832           }
2833         break;
2834       case V8QImode:
2835       case V4HImode:
2836       case V2SImode:
2837       case V2SFmode:
2838         if (!type || !AGGREGATE_TYPE_P (type))
2839           {
2840             if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
2841               {
2842                 warnedmmx = true;
2843                 warning ("MMX vector argument without MMX enabled "
2844                          "changes the ABI");
2845               }
2846             if (cum->mmx_nregs)
2847               ret = gen_reg_or_parallel (mode, orig_mode,
2848                                          cum->mmx_regno + FIRST_MMX_REG);
2849           }
2850         break;
2851       }
2852
2853   if (TARGET_DEBUG_ARG)
2854     {
2855       fprintf (stderr,
2856                "function_arg (size=%d, wds=%2d, nregs=%d, mode=%4s, named=%d, ",
2857                words, cum->words, cum->nregs, GET_MODE_NAME (mode), named);
2858
2859       if (ret)
2860         print_simple_rtl (stderr, ret);
2861       else
2862         fprintf (stderr, ", stack");
2863
2864       fprintf (stderr, " )\n");
2865     }
2866
2867   return ret;
2868 }
2869
2870 /* A C expression that indicates when an argument must be passed by
2871    reference.  If nonzero for an argument, a copy of that argument is
2872    made in memory and a pointer to the argument is passed instead of
2873    the argument itself.  The pointer is passed in whatever way is
2874    appropriate for passing a pointer to that type.  */
2875
2876 static bool
2877 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
2878                         enum machine_mode mode ATTRIBUTE_UNUSED,
2879                         tree type, bool named ATTRIBUTE_UNUSED)
2880 {
2881   if (!TARGET_64BIT)
2882     return 0;
2883
2884   if (type && int_size_in_bytes (type) == -1)
2885     {
2886       if (TARGET_DEBUG_ARG)
2887         fprintf (stderr, "function_arg_pass_by_reference\n");
2888       return 1;
2889     }
2890
2891   return 0;
2892 }
2893
2894 /* Return true when TYPE should be 128bit aligned for 32bit argument passing
2895    ABI.  Only called if TARGET_SSE.  */
2896 static bool
2897 contains_128bit_aligned_vector_p (tree type)
2898 {
2899   enum machine_mode mode = TYPE_MODE (type);
2900   if (SSE_REG_MODE_P (mode)
2901       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
2902     return true;
2903   if (TYPE_ALIGN (type) < 128)
2904     return false;
2905
2906   if (AGGREGATE_TYPE_P (type))
2907     {
2908       /* Walk the aggregates recursively.  */
2909       if (TREE_CODE (type) == RECORD_TYPE
2910           || TREE_CODE (type) == UNION_TYPE
2911           || TREE_CODE (type) == QUAL_UNION_TYPE)
2912         {
2913           tree field;
2914
2915           if (TYPE_BINFO (type))
2916             {
2917               tree binfo, base_binfo;
2918               int i;
2919
2920               for (binfo = TYPE_BINFO (type), i = 0;
2921                    BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2922                 if (contains_128bit_aligned_vector_p (BINFO_TYPE (base_binfo)))
2923                   return true;
2924             }
2925           /* And now merge the fields of structure.  */
2926           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2927             {
2928               if (TREE_CODE (field) == FIELD_DECL
2929                   && contains_128bit_aligned_vector_p (TREE_TYPE (field)))
2930                 return true;
2931             }
2932         }
2933       /* Just for use if some languages passes arrays by value.  */
2934       else if (TREE_CODE (type) == ARRAY_TYPE)
2935         {
2936           if (contains_128bit_aligned_vector_p (TREE_TYPE (type)))
2937             return true;
2938         }
2939       else
2940         abort ();
2941     }
2942   return false;
2943 }
2944
2945 /* Gives the alignment boundary, in bits, of an argument with the
2946    specified mode and type.  */
2947
2948 int
2949 ix86_function_arg_boundary (enum machine_mode mode, tree type)
2950 {
2951   int align;
2952   if (type)
2953     align = TYPE_ALIGN (type);
2954   else
2955     align = GET_MODE_ALIGNMENT (mode);
2956   if (align < PARM_BOUNDARY)
2957     align = PARM_BOUNDARY;
2958   if (!TARGET_64BIT)
2959     {
2960       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
2961          make an exception for SSE modes since these require 128bit
2962          alignment.
2963
2964          The handling here differs from field_alignment.  ICC aligns MMX
2965          arguments to 4 byte boundaries, while structure fields are aligned
2966          to 8 byte boundaries.  */
2967       if (!TARGET_SSE)
2968         align = PARM_BOUNDARY;
2969       else if (!type)
2970         {
2971           if (!SSE_REG_MODE_P (mode))
2972             align = PARM_BOUNDARY;
2973         }
2974       else
2975         {
2976           if (!contains_128bit_aligned_vector_p (type))
2977             align = PARM_BOUNDARY;
2978         }
2979     }
2980   if (align > 128)
2981     align = 128;
2982   return align;
2983 }
2984
2985 /* Return true if N is a possible register number of function value.  */
2986 bool
2987 ix86_function_value_regno_p (int regno)
2988 {
2989   if (!TARGET_64BIT)
2990     {
2991       return ((regno) == 0
2992               || ((regno) == FIRST_FLOAT_REG && TARGET_FLOAT_RETURNS_IN_80387)
2993               || ((regno) == FIRST_SSE_REG && TARGET_SSE));
2994     }
2995   return ((regno) == 0 || (regno) == FIRST_FLOAT_REG
2996           || ((regno) == FIRST_SSE_REG && TARGET_SSE)
2997           || ((regno) == FIRST_FLOAT_REG && TARGET_FLOAT_RETURNS_IN_80387));
2998 }
2999
3000 /* Define how to find the value returned by a function.
3001    VALTYPE is the data type of the value (as a tree).
3002    If the precise function being called is known, FUNC is its FUNCTION_DECL;
3003    otherwise, FUNC is 0.  */
3004 rtx
3005 ix86_function_value (tree valtype)
3006 {
3007   if (TARGET_64BIT)
3008     {
3009       rtx ret = construct_container (type_natural_mode (valtype),
3010                                      TYPE_MODE (valtype), valtype,
3011                                      1, REGPARM_MAX, SSE_REGPARM_MAX,
3012                                      x86_64_int_return_registers, 0);
3013       /* For zero sized structures, construct_container return NULL, but we
3014          need to keep rest of compiler happy by returning meaningful value.  */
3015       if (!ret)
3016         ret = gen_rtx_REG (TYPE_MODE (valtype), 0);
3017       return ret;
3018     }
3019   else
3020     return gen_rtx_REG (TYPE_MODE (valtype),
3021                         ix86_value_regno (TYPE_MODE (valtype)));
3022 }
3023
3024 /* Return false iff type is returned in memory.  */
3025 int
3026 ix86_return_in_memory (tree type)
3027 {
3028   int needed_intregs, needed_sseregs, size;
3029   enum machine_mode mode = TYPE_MODE (type);
3030
3031   if (TARGET_64BIT)
3032     return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
3033
3034   if (mode == BLKmode)
3035     return 1;
3036
3037   size = int_size_in_bytes (type);
3038
3039   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
3040     return 0;
3041
3042   if (VECTOR_MODE_P (mode) || mode == TImode)
3043     {
3044       /* User-created vectors small enough to fit in EAX.  */
3045       if (size < 8)
3046         return 0;
3047
3048       /* MMX/3dNow values are returned on the stack, since we've
3049          got to EMMS/FEMMS before returning.  */
3050       if (size == 8)
3051         return 1;
3052
3053       /* SSE values are returned in XMM0, except when it doesn't exist.  */
3054       if (size == 16)
3055         return (TARGET_SSE ? 0 : 1);
3056     }
3057
3058   if (mode == XFmode)
3059     return 0;
3060
3061   if (size > 12)
3062     return 1;
3063   return 0;
3064 }
3065
3066 /* When returning SSE vector types, we have a choice of either
3067      (1) being abi incompatible with a -march switch, or
3068      (2) generating an error.
3069    Given no good solution, I think the safest thing is one warning.
3070    The user won't be able to use -Werror, but....
3071
3072    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
3073    called in response to actually generating a caller or callee that
3074    uses such a type.  As opposed to RETURN_IN_MEMORY, which is called
3075    via aggregate_value_p for general type probing from tree-ssa.  */
3076
3077 static rtx
3078 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
3079 {
3080   static bool warned;
3081
3082   if (!TARGET_SSE && type && !warned)
3083     {
3084       /* Look at the return type of the function, not the function type.  */
3085       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
3086
3087       if (mode == TImode
3088           || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
3089         {
3090           warned = true;
3091           warning ("SSE vector return without SSE enabled changes the ABI");
3092         }
3093     }
3094
3095   return NULL;
3096 }
3097
3098 /* Define how to find the value returned by a library function
3099    assuming the value has mode MODE.  */
3100 rtx
3101 ix86_libcall_value (enum machine_mode mode)
3102 {
3103   if (TARGET_64BIT)
3104     {
3105       switch (mode)
3106         {
3107         case SFmode:
3108         case SCmode:
3109         case DFmode:
3110         case DCmode:
3111         case TFmode:
3112           return gen_rtx_REG (mode, FIRST_SSE_REG);
3113         case XFmode:
3114         case XCmode:
3115           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
3116         case TCmode:
3117           return NULL;
3118         default:
3119           return gen_rtx_REG (mode, 0);
3120         }
3121     }
3122   else
3123     return gen_rtx_REG (mode, ix86_value_regno (mode));
3124 }
3125
3126 /* Given a mode, return the register to use for a return value.  */
3127
3128 static int
3129 ix86_value_regno (enum machine_mode mode)
3130 {
3131   /* Floating point return values in %st(0).  */
3132   if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_FLOAT_RETURNS_IN_80387)
3133     return FIRST_FLOAT_REG;
3134   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
3135      we prevent this case when sse is not available.  */
3136   if (mode == TImode || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
3137     return FIRST_SSE_REG;
3138   /* Everything else in %eax.  */
3139   return 0;
3140 }
3141 \f
3142 /* Create the va_list data type.  */
3143
3144 static tree
3145 ix86_build_builtin_va_list (void)
3146 {
3147   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
3148
3149   /* For i386 we use plain pointer to argument area.  */
3150   if (!TARGET_64BIT)
3151     return build_pointer_type (char_type_node);
3152
3153   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
3154   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
3155
3156   f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"),
3157                       unsigned_type_node);
3158   f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"),
3159                       unsigned_type_node);
3160   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
3161                       ptr_type_node);
3162   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
3163                       ptr_type_node);
3164
3165   DECL_FIELD_CONTEXT (f_gpr) = record;
3166   DECL_FIELD_CONTEXT (f_fpr) = record;
3167   DECL_FIELD_CONTEXT (f_ovf) = record;
3168   DECL_FIELD_CONTEXT (f_sav) = record;
3169
3170   TREE_CHAIN (record) = type_decl;
3171   TYPE_NAME (record) = type_decl;
3172   TYPE_FIELDS (record) = f_gpr;
3173   TREE_CHAIN (f_gpr) = f_fpr;
3174   TREE_CHAIN (f_fpr) = f_ovf;
3175   TREE_CHAIN (f_ovf) = f_sav;
3176
3177   layout_type (record);
3178
3179   /* The correct type is an array type of one element.  */
3180   return build_array_type (record, build_index_type (size_zero_node));
3181 }
3182
3183 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
3184
3185 static void
3186 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3187                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
3188                              int no_rtl)
3189 {
3190   CUMULATIVE_ARGS next_cum;
3191   rtx save_area = NULL_RTX, mem;
3192   rtx label;
3193   rtx label_ref;
3194   rtx tmp_reg;
3195   rtx nsse_reg;
3196   int set;
3197   tree fntype;
3198   int stdarg_p;
3199   int i;
3200
3201   if (!TARGET_64BIT)
3202     return;
3203
3204   /* Indicate to allocate space on the stack for varargs save area.  */
3205   ix86_save_varrargs_registers = 1;
3206
3207   cfun->stack_alignment_needed = 128;
3208
3209   fntype = TREE_TYPE (current_function_decl);
3210   stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
3211               && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3212                   != void_type_node));
3213
3214   /* For varargs, we do not want to skip the dummy va_dcl argument.
3215      For stdargs, we do want to skip the last named argument.  */
3216   next_cum = *cum;
3217   if (stdarg_p)
3218     function_arg_advance (&next_cum, mode, type, 1);
3219
3220   if (!no_rtl)
3221     save_area = frame_pointer_rtx;
3222
3223   set = get_varargs_alias_set ();
3224
3225   for (i = next_cum.regno; i < ix86_regparm; i++)
3226     {
3227       mem = gen_rtx_MEM (Pmode,
3228                          plus_constant (save_area, i * UNITS_PER_WORD));
3229       set_mem_alias_set (mem, set);
3230       emit_move_insn (mem, gen_rtx_REG (Pmode,
3231                                         x86_64_int_parameter_registers[i]));
3232     }
3233
3234   if (next_cum.sse_nregs)
3235     {
3236       /* Now emit code to save SSE registers.  The AX parameter contains number
3237          of SSE parameter registers used to call this function.  We use
3238          sse_prologue_save insn template that produces computed jump across
3239          SSE saves.  We need some preparation work to get this working.  */
3240
3241       label = gen_label_rtx ();
3242       label_ref = gen_rtx_LABEL_REF (Pmode, label);
3243
3244       /* Compute address to jump to :
3245          label - 5*eax + nnamed_sse_arguments*5  */
3246       tmp_reg = gen_reg_rtx (Pmode);
3247       nsse_reg = gen_reg_rtx (Pmode);
3248       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, 0)));
3249       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
3250                               gen_rtx_MULT (Pmode, nsse_reg,
3251                                             GEN_INT (4))));
3252       if (next_cum.sse_regno)
3253         emit_move_insn
3254           (nsse_reg,
3255            gen_rtx_CONST (DImode,
3256                           gen_rtx_PLUS (DImode,
3257                                         label_ref,
3258                                         GEN_INT (next_cum.sse_regno * 4))));
3259       else
3260         emit_move_insn (nsse_reg, label_ref);
3261       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
3262
3263       /* Compute address of memory block we save into.  We always use pointer
3264          pointing 127 bytes after first byte to store - this is needed to keep
3265          instruction size limited by 4 bytes.  */
3266       tmp_reg = gen_reg_rtx (Pmode);
3267       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
3268                               plus_constant (save_area,
3269                                              8 * REGPARM_MAX + 127)));
3270       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
3271       set_mem_alias_set (mem, set);
3272       set_mem_align (mem, BITS_PER_WORD);
3273
3274       /* And finally do the dirty job!  */
3275       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
3276                                         GEN_INT (next_cum.sse_regno), label));
3277     }
3278
3279 }
3280
3281 /* Implement va_start.  */
3282
3283 void
3284 ix86_va_start (tree valist, rtx nextarg)
3285 {
3286   HOST_WIDE_INT words, n_gpr, n_fpr;
3287   tree f_gpr, f_fpr, f_ovf, f_sav;
3288   tree gpr, fpr, ovf, sav, t;
3289
3290   /* Only 64bit target needs something special.  */
3291   if (!TARGET_64BIT)
3292     {
3293       std_expand_builtin_va_start (valist, nextarg);
3294       return;
3295     }
3296
3297   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
3298   f_fpr = TREE_CHAIN (f_gpr);
3299   f_ovf = TREE_CHAIN (f_fpr);
3300   f_sav = TREE_CHAIN (f_ovf);
3301
3302   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
3303   gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
3304   fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
3305   ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
3306   sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
3307
3308   /* Count number of gp and fp argument registers used.  */
3309   words = current_function_args_info.words;
3310   n_gpr = current_function_args_info.regno;
3311   n_fpr = current_function_args_info.sse_regno;
3312
3313   if (TARGET_DEBUG_ARG)
3314     fprintf (stderr, "va_start: words = %d, n_gpr = %d, n_fpr = %d\n",
3315              (int) words, (int) n_gpr, (int) n_fpr);
3316
3317   t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
3318              build_int_cst (NULL_TREE, n_gpr * 8));
3319   TREE_SIDE_EFFECTS (t) = 1;
3320   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3321
3322   t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
3323              build_int_cst (NULL_TREE, n_fpr * 16 + 8*REGPARM_MAX));
3324   TREE_SIDE_EFFECTS (t) = 1;
3325   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3326
3327   /* Find the overflow area.  */
3328   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
3329   if (words != 0)
3330     t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
3331                build_int_cst (NULL_TREE, words * UNITS_PER_WORD));
3332   t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
3333   TREE_SIDE_EFFECTS (t) = 1;
3334   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3335
3336   /* Find the register save area.
3337      Prologue of the function save it right above stack frame.  */
3338   t = make_tree (TREE_TYPE (sav), frame_pointer_rtx);
3339   t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
3340   TREE_SIDE_EFFECTS (t) = 1;
3341   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3342 }
3343
3344 /* Implement va_arg.  */
3345
3346 tree
3347 ix86_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
3348 {
3349   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
3350   tree f_gpr, f_fpr, f_ovf, f_sav;
3351   tree gpr, fpr, ovf, sav, t;
3352   int size, rsize;
3353   tree lab_false, lab_over = NULL_TREE;
3354   tree addr, t2;
3355   rtx container;
3356   int indirect_p = 0;
3357   tree ptrtype;
3358
3359   /* Only 64bit target needs something special.  */
3360   if (!TARGET_64BIT)
3361     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
3362
3363   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
3364   f_fpr = TREE_CHAIN (f_gpr);
3365   f_ovf = TREE_CHAIN (f_fpr);
3366   f_sav = TREE_CHAIN (f_ovf);
3367
3368   valist = build_va_arg_indirect_ref (valist);
3369   gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
3370   fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
3371   ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
3372   sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
3373
3374   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
3375   if (indirect_p)
3376     type = build_pointer_type (type);
3377   size = int_size_in_bytes (type);
3378   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3379
3380   container = construct_container (type_natural_mode (type), TYPE_MODE (type),
3381                                    type, 0, REGPARM_MAX, SSE_REGPARM_MAX,
3382                                    intreg, 0);
3383
3384   /* Pull the value out of the saved registers.  */
3385
3386   addr = create_tmp_var (ptr_type_node, "addr");
3387   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
3388
3389   if (container)
3390     {
3391       int needed_intregs, needed_sseregs;
3392       bool need_temp;
3393       tree int_addr, sse_addr;
3394
3395       lab_false = create_artificial_label ();
3396       lab_over = create_artificial_label ();
3397
3398       examine_argument (TYPE_MODE (type), type, 0,
3399                         &needed_intregs, &needed_sseregs);
3400
3401       need_temp = (!REG_P (container)
3402                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
3403                        || TYPE_ALIGN (type) > 128));
3404
3405       /* In case we are passing structure, verify that it is consecutive block
3406          on the register save area.  If not we need to do moves.  */
3407       if (!need_temp && !REG_P (container))
3408         {
3409           /* Verify that all registers are strictly consecutive  */
3410           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
3411             {
3412               int i;
3413
3414               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
3415                 {
3416                   rtx slot = XVECEXP (container, 0, i);
3417                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
3418                       || INTVAL (XEXP (slot, 1)) != i * 16)
3419                     need_temp = 1;
3420                 }
3421             }
3422           else
3423             {
3424               int i;
3425
3426               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
3427                 {
3428                   rtx slot = XVECEXP (container, 0, i);
3429                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
3430                       || INTVAL (XEXP (slot, 1)) != i * 8)
3431                     need_temp = 1;
3432                 }
3433             }
3434         }
3435       if (!need_temp)
3436         {
3437           int_addr = addr;
3438           sse_addr = addr;
3439         }
3440       else
3441         {
3442           int_addr = create_tmp_var (ptr_type_node, "int_addr");
3443           DECL_POINTER_ALIAS_SET (int_addr) = get_varargs_alias_set ();
3444           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
3445           DECL_POINTER_ALIAS_SET (sse_addr) = get_varargs_alias_set ();
3446         }
3447
3448       /* First ensure that we fit completely in registers.  */
3449       if (needed_intregs)
3450         {
3451           t = build_int_cst (TREE_TYPE (gpr),
3452                              (REGPARM_MAX - needed_intregs + 1) * 8);
3453           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
3454           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
3455           t = build (COND_EXPR, void_type_node, t, t2, NULL_TREE);
3456           gimplify_and_add (t, pre_p);
3457         }
3458       if (needed_sseregs)
3459         {
3460           t = build_int_cst (TREE_TYPE (fpr),
3461                              (SSE_REGPARM_MAX - needed_sseregs + 1) * 16
3462                              + REGPARM_MAX * 8);
3463           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
3464           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
3465           t = build (COND_EXPR, void_type_node, t, t2, NULL_TREE);
3466           gimplify_and_add (t, pre_p);
3467         }
3468
3469       /* Compute index to start of area used for integer regs.  */
3470       if (needed_intregs)
3471         {
3472           /* int_addr = gpr + sav; */
3473           t = fold_convert (ptr_type_node, gpr);
3474           t = build2 (PLUS_EXPR, ptr_type_node, sav, t);
3475           t = build2 (MODIFY_EXPR, void_type_node, int_addr, t);
3476           gimplify_and_add (t, pre_p);
3477         }
3478       if (needed_sseregs)
3479         {
3480           /* sse_addr = fpr + sav; */
3481           t = fold_convert (ptr_type_node, fpr);
3482           t = build2 (PLUS_EXPR, ptr_type_node, sav, t);
3483           t = build2 (MODIFY_EXPR, void_type_node, sse_addr, t);
3484           gimplify_and_add (t, pre_p);
3485         }
3486       if (need_temp)
3487         {
3488           int i;
3489           tree temp = create_tmp_var (type, "va_arg_tmp");
3490
3491           /* addr = &temp; */
3492           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
3493           t = build2 (MODIFY_EXPR, void_type_node, addr, t);
3494           gimplify_and_add (t, pre_p);
3495
3496           for (i = 0; i < XVECLEN (container, 0); i++)
3497             {
3498               rtx slot = XVECEXP (container, 0, i);
3499               rtx reg = XEXP (slot, 0);
3500               enum machine_mode mode = GET_MODE (reg);
3501               tree piece_type = lang_hooks.types.type_for_mode (mode, 1);
3502               tree addr_type = build_pointer_type (piece_type);
3503               tree src_addr, src;
3504               int src_offset;
3505               tree dest_addr, dest;
3506
3507               if (SSE_REGNO_P (REGNO (reg)))
3508                 {
3509                   src_addr = sse_addr;
3510                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
3511                 }
3512               else
3513                 {
3514                   src_addr = int_addr;
3515                   src_offset = REGNO (reg) * 8;
3516                 }
3517               src_addr = fold_convert (addr_type, src_addr);
3518               src_addr = fold (build2 (PLUS_EXPR, addr_type, src_addr,
3519                                        size_int (src_offset)));
3520               src = build_va_arg_indirect_ref (src_addr);
3521
3522               dest_addr = fold_convert (addr_type, addr);
3523               dest_addr = fold (build2 (PLUS_EXPR, addr_type, dest_addr,
3524                                         size_int (INTVAL (XEXP (slot, 1)))));
3525               dest = build_va_arg_indirect_ref (dest_addr);
3526
3527               t = build2 (MODIFY_EXPR, void_type_node, dest, src);
3528               gimplify_and_add (t, pre_p);
3529             }
3530         }
3531
3532       if (needed_intregs)
3533         {
3534           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
3535                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
3536           t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr, t);
3537           gimplify_and_add (t, pre_p);
3538         }
3539       if (needed_sseregs)
3540         {
3541           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
3542                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
3543           t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr, t);
3544           gimplify_and_add (t, pre_p);
3545         }
3546
3547       t = build1 (GOTO_EXPR, void_type_node, lab_over);
3548       gimplify_and_add (t, pre_p);
3549
3550       t = build1 (LABEL_EXPR, void_type_node, lab_false);
3551       append_to_statement_list (t, pre_p);
3552     }
3553
3554   /* ... otherwise out of the overflow area.  */
3555
3556   /* Care for on-stack alignment if needed.  */
3557   if (FUNCTION_ARG_BOUNDARY (VOIDmode, type) <= 64)
3558     t = ovf;
3559   else
3560     {
3561       HOST_WIDE_INT align = FUNCTION_ARG_BOUNDARY (VOIDmode, type) / 8;
3562       t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf,
3563                  build_int_cst (TREE_TYPE (ovf), align - 1));
3564       t = build (BIT_AND_EXPR, TREE_TYPE (t), t,
3565                  build_int_cst (TREE_TYPE (t), -align));
3566     }
3567   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
3568
3569   t2 = build2 (MODIFY_EXPR, void_type_node, addr, t);
3570   gimplify_and_add (t2, pre_p);
3571
3572   t = build2 (PLUS_EXPR, TREE_TYPE (t), t,
3573               build_int_cst (TREE_TYPE (t), rsize * UNITS_PER_WORD));
3574   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
3575   gimplify_and_add (t, pre_p);
3576
3577   if (container)
3578     {
3579       t = build1 (LABEL_EXPR, void_type_node, lab_over);
3580       append_to_statement_list (t, pre_p);
3581     }
3582
3583   ptrtype = build_pointer_type (type);
3584   addr = fold_convert (ptrtype, addr);
3585
3586   if (indirect_p)
3587     addr = build_va_arg_indirect_ref (addr);
3588   return build_va_arg_indirect_ref (addr);
3589 }
3590 \f
3591 /* Return nonzero if OPNUM's MEM should be matched
3592    in movabs* patterns.  */
3593
3594 int
3595 ix86_check_movabs (rtx insn, int opnum)
3596 {
3597   rtx set, mem;
3598
3599   set = PATTERN (insn);
3600   if (GET_CODE (set) == PARALLEL)
3601     set = XVECEXP (set, 0, 0);
3602   if (GET_CODE (set) != SET)
3603     abort ();
3604   mem = XEXP (set, opnum);
3605   while (GET_CODE (mem) == SUBREG)
3606     mem = SUBREG_REG (mem);
3607   if (GET_CODE (mem) != MEM)
3608     abort ();
3609   return (volatile_ok || !MEM_VOLATILE_P (mem));
3610 }
3611 \f
3612 /* Initialize the table of extra 80387 mathematical constants.  */
3613
3614 static void
3615 init_ext_80387_constants (void)
3616 {
3617   static const char * cst[5] =
3618   {
3619     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
3620     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
3621     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
3622     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
3623     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
3624   };
3625   int i;
3626
3627   for (i = 0; i < 5; i++)
3628     {
3629       real_from_string (&ext_80387_constants_table[i], cst[i]);
3630       /* Ensure each constant is rounded to XFmode precision.  */
3631       real_convert (&ext_80387_constants_table[i],
3632                     XFmode, &ext_80387_constants_table[i]);
3633     }
3634
3635   ext_80387_constants_init = 1;
3636 }
3637
3638 /* Return true if the constant is something that can be loaded with
3639    a special instruction.  */
3640
3641 int
3642 standard_80387_constant_p (rtx x)
3643 {
3644   if (GET_CODE (x) != CONST_DOUBLE || !FLOAT_MODE_P (GET_MODE (x)))
3645     return -1;
3646
3647   if (x == CONST0_RTX (GET_MODE (x)))
3648     return 1;
3649   if (x == CONST1_RTX (GET_MODE (x)))
3650     return 2;
3651
3652   /* For XFmode constants, try to find a special 80387 instruction when
3653      optimizing for size or on those CPUs that benefit from them.  */
3654   if (GET_MODE (x) == XFmode
3655       && (optimize_size || x86_ext_80387_constants & TUNEMASK))
3656     {
3657       REAL_VALUE_TYPE r;
3658       int i;
3659
3660       if (! ext_80387_constants_init)
3661         init_ext_80387_constants ();
3662
3663       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3664       for (i = 0; i < 5; i++)
3665         if (real_identical (&r, &ext_80387_constants_table[i]))
3666           return i + 3;
3667     }
3668
3669   return 0;
3670 }
3671
3672 /* Return the opcode of the special instruction to be used to load
3673    the constant X.  */
3674
3675 const char *
3676 standard_80387_constant_opcode (rtx x)
3677 {
3678   switch (standard_80387_constant_p (x))
3679     {
3680     case 1:
3681       return "fldz";
3682     case 2:
3683       return "fld1";
3684     case 3:
3685       return "fldlg2";
3686     case 4:
3687       return "fldln2";
3688     case 5:
3689       return "fldl2e";
3690     case 6:
3691       return "fldl2t";
3692     case 7:
3693       return "fldpi";
3694     }
3695   abort ();
3696 }
3697
3698 /* Return the CONST_DOUBLE representing the 80387 constant that is
3699    loaded by the specified special instruction.  The argument IDX
3700    matches the return value from standard_80387_constant_p.  */
3701
3702 rtx
3703 standard_80387_constant_rtx (int idx)
3704 {
3705   int i;
3706
3707   if (! ext_80387_constants_init)
3708     init_ext_80387_constants ();
3709
3710   switch (idx)
3711     {
3712     case 3:
3713     case 4:
3714     case 5:
3715     case 6:
3716     case 7:
3717       i = idx - 3;
3718       break;
3719
3720     default:
3721       abort ();
3722     }
3723
3724   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
3725                                        XFmode);
3726 }
3727
3728 /* Return 1 if X is FP constant we can load to SSE register w/o using memory.
3729  */
3730 int
3731 standard_sse_constant_p (rtx x)
3732 {
3733   if (x == const0_rtx)
3734     return 1;
3735   return (x == CONST0_RTX (GET_MODE (x)));
3736 }
3737
3738 /* Returns 1 if OP contains a symbol reference */
3739
3740 int
3741 symbolic_reference_mentioned_p (rtx op)
3742 {
3743   const char *fmt;
3744   int i;
3745
3746   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
3747     return 1;
3748
3749   fmt = GET_RTX_FORMAT (GET_CODE (op));
3750   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
3751     {
3752       if (fmt[i] == 'E')
3753         {
3754           int j;
3755
3756           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
3757             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
3758               return 1;
3759         }
3760
3761       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
3762         return 1;
3763     }
3764
3765   return 0;
3766 }
3767
3768 /* Return 1 if it is appropriate to emit `ret' instructions in the
3769    body of a function.  Do this only if the epilogue is simple, needing a
3770    couple of insns.  Prior to reloading, we can't tell how many registers
3771    must be saved, so return 0 then.  Return 0 if there is no frame
3772    marker to de-allocate.  */
3773
3774 int
3775 ix86_can_use_return_insn_p (void)
3776 {
3777   struct ix86_frame frame;
3778
3779   if (! reload_completed || frame_pointer_needed)
3780     return 0;
3781
3782   /* Don't allow more than 32 pop, since that's all we can do
3783      with one instruction.  */
3784   if (current_function_pops_args
3785       && current_function_args_size >= 32768)
3786     return 0;
3787
3788   ix86_compute_frame_layout (&frame);
3789   return frame.to_allocate == 0 && frame.nregs == 0;
3790 }
3791 \f
3792 /* Value should be nonzero if functions must have frame pointers.
3793    Zero means the frame pointer need not be set up (and parms may
3794    be accessed via the stack pointer) in functions that seem suitable.  */
3795
3796 int
3797 ix86_frame_pointer_required (void)
3798 {
3799   /* If we accessed previous frames, then the generated code expects
3800      to be able to access the saved ebp value in our frame.  */
3801   if (cfun->machine->accesses_prev_frame)
3802     return 1;
3803
3804   /* Several x86 os'es need a frame pointer for other reasons,
3805      usually pertaining to setjmp.  */
3806   if (SUBTARGET_FRAME_POINTER_REQUIRED)
3807     return 1;
3808
3809   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
3810      the frame pointer by default.  Turn it back on now if we've not
3811      got a leaf function.  */
3812   if (TARGET_OMIT_LEAF_FRAME_POINTER
3813       && (!current_function_is_leaf))
3814     return 1;
3815
3816   if (current_function_profile)
3817     return 1;
3818
3819   return 0;
3820 }
3821
3822 /* Record that the current function accesses previous call frames.  */
3823
3824 void
3825 ix86_setup_frame_addresses (void)
3826 {
3827   cfun->machine->accesses_prev_frame = 1;
3828 }
3829 \f
3830 #if defined(HAVE_GAS_HIDDEN) && defined(SUPPORTS_ONE_ONLY)
3831 # define USE_HIDDEN_LINKONCE 1
3832 #else
3833 # define USE_HIDDEN_LINKONCE 0
3834 #endif
3835
3836 static int pic_labels_used;
3837
3838 /* Fills in the label name that should be used for a pc thunk for
3839    the given register.  */
3840
3841 static void
3842 get_pc_thunk_name (char name[32], unsigned int regno)
3843 {
3844   if (USE_HIDDEN_LINKONCE)
3845     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
3846   else
3847     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
3848 }
3849
3850
3851 /* This function generates code for -fpic that loads %ebx with
3852    the return address of the caller and then returns.  */
3853
3854 void
3855 ix86_file_end (void)
3856 {
3857   rtx xops[2];
3858   int regno;
3859
3860   for (regno = 0; regno < 8; ++regno)
3861     {
3862       char name[32];
3863
3864       if (! ((pic_labels_used >> regno) & 1))
3865         continue;
3866
3867       get_pc_thunk_name (name, regno);
3868
3869       if (USE_HIDDEN_LINKONCE)
3870         {
3871           tree decl;
3872
3873           decl = build_decl (FUNCTION_DECL, get_identifier (name),
3874                              error_mark_node);
3875           TREE_PUBLIC (decl) = 1;
3876           TREE_STATIC (decl) = 1;
3877           DECL_ONE_ONLY (decl) = 1;
3878
3879           (*targetm.asm_out.unique_section) (decl, 0);
3880           named_section (decl, NULL, 0);
3881
3882           (*targetm.asm_out.globalize_label) (asm_out_file, name);
3883           fputs ("\t.hidden\t", asm_out_file);
3884           assemble_name (asm_out_file, name);
3885           fputc ('\n', asm_out_file);
3886           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
3887         }
3888       else
3889         {
3890           text_section ();
3891           ASM_OUTPUT_LABEL (asm_out_file, name);
3892         }
3893
3894       xops[0] = gen_rtx_REG (SImode, regno);
3895       xops[1] = gen_rtx_MEM (SImode, stack_pointer_rtx);
3896       output_asm_insn ("mov{l}\t{%1, %0|%0, %1}", xops);
3897       output_asm_insn ("ret", xops);
3898     }
3899
3900   if (NEED_INDICATE_EXEC_STACK)
3901     file_end_indicate_exec_stack ();
3902 }
3903
3904 /* Emit code for the SET_GOT patterns.  */
3905
3906 const char *
3907 output_set_got (rtx dest)
3908 {
3909   rtx xops[3];
3910
3911   xops[0] = dest;
3912   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
3913
3914   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
3915     {
3916       xops[2] = gen_rtx_LABEL_REF (Pmode, gen_label_rtx ());
3917
3918       if (!flag_pic)
3919         output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
3920       else
3921         output_asm_insn ("call\t%a2", xops);
3922
3923 #if TARGET_MACHO
3924       /* Output the "canonical" label name ("Lxx$pb") here too.  This
3925          is what will be referred to by the Mach-O PIC subsystem.  */
3926       ASM_OUTPUT_LABEL (asm_out_file, machopic_function_base_name ());
3927 #endif
3928       (*targetm.asm_out.internal_label) (asm_out_file, "L",
3929                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
3930
3931       if (flag_pic)
3932         output_asm_insn ("pop{l}\t%0", xops);
3933     }
3934   else
3935     {
3936       char name[32];
3937       get_pc_thunk_name (name, REGNO (dest));
3938       pic_labels_used |= 1 << REGNO (dest);
3939
3940       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
3941       xops[2] = gen_rtx_MEM (QImode, xops[2]);
3942       output_asm_insn ("call\t%X2", xops);
3943     }
3944
3945   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
3946     output_asm_insn ("add{l}\t{%1, %0|%0, %1}", xops);
3947   else if (!TARGET_MACHO)
3948     output_asm_insn ("add{l}\t{%1+[.-%a2], %0|%0, %a1+(.-%a2)}", xops);
3949
3950   return "";
3951 }
3952
3953 /* Generate an "push" pattern for input ARG.  */
3954
3955 static rtx
3956 gen_push (rtx arg)
3957 {
3958   return gen_rtx_SET (VOIDmode,
3959                       gen_rtx_MEM (Pmode,
3960                                    gen_rtx_PRE_DEC (Pmode,
3961                                                     stack_pointer_rtx)),
3962                       arg);
3963 }
3964
3965 /* Return >= 0 if there is an unused call-clobbered register available
3966    for the entire function.  */
3967
3968 static unsigned int
3969 ix86_select_alt_pic_regnum (void)
3970 {
3971   if (current_function_is_leaf && !current_function_profile)
3972     {
3973       int i;
3974       for (i = 2; i >= 0; --i)
3975         if (!regs_ever_live[i])
3976           return i;
3977     }
3978
3979   return INVALID_REGNUM;
3980 }
3981
3982 /* Return 1 if we need to save REGNO.  */
3983 static int
3984 ix86_save_reg (unsigned int regno, int maybe_eh_return)
3985 {
3986   if (pic_offset_table_rtx
3987       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
3988       && (regs_ever_live[REAL_PIC_OFFSET_TABLE_REGNUM]
3989           || current_function_profile
3990           || current_function_calls_eh_return
3991           || current_function_uses_const_pool))
3992     {
3993       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
3994         return 0;
3995       return 1;
3996     }
3997
3998   if (current_function_calls_eh_return && maybe_eh_return)
3999     {
4000       unsigned i;
4001       for (i = 0; ; i++)
4002         {
4003           unsigned test = EH_RETURN_DATA_REGNO (i);
4004           if (test == INVALID_REGNUM)
4005             break;
4006           if (test == regno)
4007             return 1;
4008         }
4009     }
4010
4011   return (regs_ever_live[regno]
4012           && !call_used_regs[regno]
4013           && !fixed_regs[regno]
4014           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
4015 }
4016
4017 /* Return number of registers to be saved on the stack.  */
4018
4019 static int
4020 ix86_nsaved_regs (void)
4021 {
4022   int nregs = 0;
4023   int regno;
4024
4025   for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno--)
4026     if (ix86_save_reg (regno, true))
4027       nregs++;
4028   return nregs;
4029 }
4030
4031 /* Return the offset between two registers, one to be eliminated, and the other
4032    its replacement, at the start of a routine.  */
4033
4034 HOST_WIDE_INT
4035 ix86_initial_elimination_offset (int from, int to)
4036 {
4037   struct ix86_frame frame;
4038   ix86_compute_frame_layout (&frame);
4039
4040   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
4041     return frame.hard_frame_pointer_offset;
4042   else if (from == FRAME_POINTER_REGNUM
4043            && to == HARD_FRAME_POINTER_REGNUM)
4044     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
4045   else
4046     {
4047       if (to != STACK_POINTER_REGNUM)
4048         abort ();
4049       else if (from == ARG_POINTER_REGNUM)
4050         return frame.stack_pointer_offset;
4051       else if (from != FRAME_POINTER_REGNUM)
4052         abort ();
4053       else
4054         return frame.stack_pointer_offset - frame.frame_pointer_offset;
4055     }
4056 }
4057
4058 /* Fill structure ix86_frame about frame of currently computed function.  */
4059
4060 static void
4061 ix86_compute_frame_layout (struct ix86_frame *frame)
4062 {
4063   HOST_WIDE_INT total_size;
4064   unsigned int stack_alignment_needed;
4065   HOST_WIDE_INT offset;
4066   unsigned int preferred_alignment;
4067   HOST_WIDE_INT size = get_frame_size ();
4068
4069   frame->nregs = ix86_nsaved_regs ();
4070   total_size = size;
4071
4072   stack_alignment_needed = cfun->stack_alignment_needed / BITS_PER_UNIT;
4073   preferred_alignment = cfun->preferred_stack_boundary / BITS_PER_UNIT;
4074
4075   /* During reload iteration the amount of registers saved can change.
4076      Recompute the value as needed.  Do not recompute when amount of registers
4077      didn't change as reload does mutiple calls to the function and does not
4078      expect the decision to change within single iteration.  */
4079   if (!optimize_size
4080       && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
4081     {
4082       int count = frame->nregs;
4083
4084       cfun->machine->use_fast_prologue_epilogue_nregs = count;
4085       /* The fast prologue uses move instead of push to save registers.  This
4086          is significantly longer, but also executes faster as modern hardware
4087          can execute the moves in parallel, but can't do that for push/pop.
4088
4089          Be careful about choosing what prologue to emit:  When function takes
4090          many instructions to execute we may use slow version as well as in
4091          case function is known to be outside hot spot (this is known with
4092          feedback only).  Weight the size of function by number of registers
4093          to save as it is cheap to use one or two push instructions but very
4094          slow to use many of them.  */
4095       if (count)
4096         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
4097       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
4098           || (flag_branch_probabilities
4099               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
4100         cfun->machine->use_fast_prologue_epilogue = false;
4101       else
4102         cfun->machine->use_fast_prologue_epilogue
4103            = !expensive_function_p (count);
4104     }
4105   if (TARGET_PROLOGUE_USING_MOVE
4106       && cfun->machine->use_fast_prologue_epilogue)
4107     frame->save_regs_using_mov = true;
4108   else
4109     frame->save_regs_using_mov = false;
4110
4111
4112   /* Skip return address and saved base pointer.  */
4113   offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
4114
4115   frame->hard_frame_pointer_offset = offset;
4116
4117   /* Do some sanity checking of stack_alignment_needed and
4118      preferred_alignment, since i386 port is the only using those features
4119      that may break easily.  */
4120
4121   if (size && !stack_alignment_needed)
4122     abort ();
4123   if (preferred_alignment < STACK_BOUNDARY / BITS_PER_UNIT)
4124     abort ();
4125   if (preferred_alignment > PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
4126     abort ();
4127   if (stack_alignment_needed > PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
4128     abort ();
4129
4130   if (stack_alignment_needed < STACK_BOUNDARY / BITS_PER_UNIT)
4131     stack_alignment_needed = STACK_BOUNDARY / BITS_PER_UNIT;
4132
4133   /* Register save area */
4134   offset += frame->nregs * UNITS_PER_WORD;
4135
4136   /* Va-arg area */
4137   if (ix86_save_varrargs_registers)
4138     {
4139       offset += X86_64_VARARGS_SIZE;
4140       frame->va_arg_size = X86_64_VARARGS_SIZE;
4141     }
4142   else
4143     frame->va_arg_size = 0;
4144
4145   /* Align start of frame for local function.  */
4146   frame->padding1 = ((offset + stack_alignment_needed - 1)
4147                      & -stack_alignment_needed) - offset;
4148
4149   offset += frame->padding1;
4150
4151   /* Frame pointer points here.  */
4152   frame->frame_pointer_offset = offset;
4153
4154   offset += size;
4155
4156   /* Add outgoing arguments area.  Can be skipped if we eliminated
4157      all the function calls as dead code.
4158      Skipping is however impossible when function calls alloca.  Alloca
4159      expander assumes that last current_function_outgoing_args_size
4160      of stack frame are unused.  */
4161   if (ACCUMULATE_OUTGOING_ARGS
4162       && (!current_function_is_leaf || current_function_calls_alloca))
4163     {
4164       offset += current_function_outgoing_args_size;
4165       frame->outgoing_arguments_size = current_function_outgoing_args_size;
4166     }
4167   else
4168     frame->outgoing_arguments_size = 0;
4169
4170   /* Align stack boundary.  Only needed if we're calling another function
4171      or using alloca.  */
4172   if (!current_function_is_leaf || current_function_calls_alloca)
4173     frame->padding2 = ((offset + preferred_alignment - 1)
4174                        & -preferred_alignment) - offset;
4175   else
4176     frame->padding2 = 0;
4177
4178   offset += frame->padding2;
4179
4180   /* We've reached end of stack frame.  */
4181   frame->stack_pointer_offset = offset;
4182
4183   /* Size prologue needs to allocate.  */
4184   frame->to_allocate =
4185     (size + frame->padding1 + frame->padding2
4186      + frame->outgoing_arguments_size + frame->va_arg_size);
4187
4188   if ((!frame->to_allocate && frame->nregs <= 1)
4189       || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
4190     frame->save_regs_using_mov = false;
4191
4192   if (TARGET_RED_ZONE && current_function_sp_is_unchanging
4193       && current_function_is_leaf)
4194     {
4195       frame->red_zone_size = frame->to_allocate;
4196       if (frame->save_regs_using_mov)
4197         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
4198       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
4199         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
4200     }
4201   else
4202     frame->red_zone_size = 0;
4203   frame->to_allocate -= frame->red_zone_size;
4204   frame->stack_pointer_offset -= frame->red_zone_size;
4205 #if 0
4206   fprintf (stderr, "nregs: %i\n", frame->nregs);
4207   fprintf (stderr, "size: %i\n", size);
4208   fprintf (stderr, "alignment1: %i\n", stack_alignment_needed);
4209   fprintf (stderr, "padding1: %i\n", frame->padding1);
4210   fprintf (stderr, "va_arg: %i\n", frame->va_arg_size);
4211   fprintf (stderr, "padding2: %i\n", frame->padding2);
4212   fprintf (stderr, "to_allocate: %i\n", frame->to_allocate);
4213   fprintf (stderr, "red_zone_size: %i\n", frame->red_zone_size);
4214   fprintf (stderr, "frame_pointer_offset: %i\n", frame->frame_pointer_offset);
4215   fprintf (stderr, "hard_frame_pointer_offset: %i\n",
4216            frame->hard_frame_pointer_offset);
4217   fprintf (stderr, "stack_pointer_offset: %i\n", frame->stack_pointer_offset);
4218 #endif
4219 }
4220
4221 /* Emit code to save registers in the prologue.  */
4222
4223 static void
4224 ix86_emit_save_regs (void)
4225 {
4226   int regno;
4227   rtx insn;
4228
4229   for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno--)
4230     if (ix86_save_reg (regno, true))
4231       {
4232         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
4233         RTX_FRAME_RELATED_P (insn) = 1;
4234       }
4235 }
4236
4237 /* Emit code to save registers using MOV insns.  First register
4238    is restored from POINTER + OFFSET.  */
4239 static void
4240 ix86_emit_save_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
4241 {
4242   int regno;
4243   rtx insn;
4244
4245   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4246     if (ix86_save_reg (regno, true))
4247       {
4248         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
4249                                                Pmode, offset),
4250                                gen_rtx_REG (Pmode, regno));
4251         RTX_FRAME_RELATED_P (insn) = 1;
4252         offset += UNITS_PER_WORD;
4253       }
4254 }
4255
4256 /* Expand prologue or epilogue stack adjustment.
4257    The pattern exist to put a dependency on all ebp-based memory accesses.
4258    STYLE should be negative if instructions should be marked as frame related,
4259    zero if %r11 register is live and cannot be freely used and positive
4260    otherwise.  */
4261
4262 static void
4263 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset, int style)
4264 {
4265   rtx insn;
4266
4267   if (! TARGET_64BIT)
4268     insn = emit_insn (gen_pro_epilogue_adjust_stack_1 (dest, src, offset));
4269   else if (x86_64_immediate_operand (offset, DImode))
4270     insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
4271   else
4272     {
4273       rtx r11;
4274       /* r11 is used by indirect sibcall return as well, set before the
4275          epilogue and used after the epilogue.  ATM indirect sibcall
4276          shouldn't be used together with huge frame sizes in one
4277          function because of the frame_size check in sibcall.c.  */
4278       if (style == 0)
4279         abort ();
4280       r11 = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 3 /* R11 */);
4281       insn = emit_insn (gen_rtx_SET (DImode, r11, offset));
4282       if (style < 0)
4283         RTX_FRAME_RELATED_P (insn) = 1;
4284       insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11,
4285                                                                offset));
4286     }
4287   if (style < 0)
4288     RTX_FRAME_RELATED_P (insn) = 1;
4289 }
4290
4291 /* Expand the prologue into a bunch of separate insns.  */
4292
4293 void
4294 ix86_expand_prologue (void)
4295 {
4296   rtx insn;
4297   bool pic_reg_used;
4298   struct ix86_frame frame;
4299   HOST_WIDE_INT allocate;
4300
4301   ix86_compute_frame_layout (&frame);
4302
4303   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
4304      slower on all targets.  Also sdb doesn't like it.  */
4305
4306   if (frame_pointer_needed)
4307     {
4308       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
4309       RTX_FRAME_RELATED_P (insn) = 1;
4310
4311       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
4312       RTX_FRAME_RELATED_P (insn) = 1;
4313     }
4314
4315   allocate = frame.to_allocate;
4316
4317   if (!frame.save_regs_using_mov)
4318     ix86_emit_save_regs ();
4319   else
4320     allocate += frame.nregs * UNITS_PER_WORD;
4321
4322   /* When using red zone we may start register saving before allocating
4323      the stack frame saving one cycle of the prologue.  */
4324   if (TARGET_RED_ZONE && frame.save_regs_using_mov)
4325     ix86_emit_save_regs_using_mov (frame_pointer_needed ? hard_frame_pointer_rtx
4326                                    : stack_pointer_rtx,
4327                                    -frame.nregs * UNITS_PER_WORD);
4328
4329   if (allocate == 0)
4330     ;
4331   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
4332     pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
4333                                GEN_INT (-allocate), -1);
4334   else
4335     {
4336       /* Only valid for Win32.  */
4337       rtx eax = gen_rtx_REG (SImode, 0);
4338       bool eax_live = ix86_eax_live_at_start_p ();
4339
4340       if (TARGET_64BIT)
4341         abort ();
4342
4343       if (eax_live)
4344         {
4345           emit_insn (gen_push (eax));
4346           allocate -= 4;
4347         }
4348
4349       insn = emit_move_insn (eax, GEN_INT (allocate));
4350       RTX_FRAME_RELATED_P (insn) = 1;
4351
4352       insn = emit_insn (gen_allocate_stack_worker (eax));
4353       RTX_FRAME_RELATED_P (insn) = 1;
4354
4355       if (eax_live)
4356         {
4357           rtx t;
4358           if (frame_pointer_needed)
4359             t = plus_constant (hard_frame_pointer_rtx,
4360                                allocate
4361                                - frame.to_allocate
4362                                - frame.nregs * UNITS_PER_WORD);
4363           else
4364             t = plus_constant (stack_pointer_rtx, allocate);
4365           emit_move_insn (eax, gen_rtx_MEM (SImode, t));
4366         }
4367     }
4368
4369   if (frame.save_regs_using_mov && !TARGET_RED_ZONE)
4370     {
4371       if (!frame_pointer_needed || !frame.to_allocate)
4372         ix86_emit_save_regs_using_mov (stack_pointer_rtx, frame.to_allocate);
4373       else
4374         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
4375                                        -frame.nregs * UNITS_PER_WORD);
4376     }
4377
4378   pic_reg_used = false;
4379   if (pic_offset_table_rtx
4380       && (regs_ever_live[REAL_PIC_OFFSET_TABLE_REGNUM]
4381           || current_function_profile))
4382     {
4383       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
4384
4385       if (alt_pic_reg_used != INVALID_REGNUM)
4386         REGNO (pic_offset_table_rtx) = alt_pic_reg_used;
4387
4388       pic_reg_used = true;
4389     }
4390
4391   if (pic_reg_used)
4392     {
4393       insn = emit_insn (gen_set_got (pic_offset_table_rtx));
4394
4395       /* Even with accurate pre-reload life analysis, we can wind up
4396          deleting all references to the pic register after reload.
4397          Consider if cross-jumping unifies two sides of a branch
4398          controlled by a comparison vs the only read from a global.
4399          In which case, allow the set_got to be deleted, though we're
4400          too late to do anything about the ebx save in the prologue.  */
4401       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD, const0_rtx, NULL);
4402     }
4403
4404   /* Prevent function calls from be scheduled before the call to mcount.
4405      In the pic_reg_used case, make sure that the got load isn't deleted.  */
4406   if (current_function_profile)
4407     emit_insn (gen_blockage (pic_reg_used ? pic_offset_table_rtx : const0_rtx));
4408 }
4409
4410 /* Emit code to restore saved registers using MOV insns.  First register
4411    is restored from POINTER + OFFSET.  */
4412 static void
4413 ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
4414                                   int maybe_eh_return)
4415 {
4416   int regno;
4417   rtx base_address = gen_rtx_MEM (Pmode, pointer);
4418
4419   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4420     if (ix86_save_reg (regno, maybe_eh_return))
4421       {
4422         /* Ensure that adjust_address won't be forced to produce pointer
4423            out of range allowed by x86-64 instruction set.  */
4424         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
4425           {
4426             rtx r11;
4427
4428             r11 = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 3 /* R11 */);
4429             emit_move_insn (r11, GEN_INT (offset));
4430             emit_insn (gen_adddi3 (r11, r11, pointer));
4431             base_address = gen_rtx_MEM (Pmode, r11);
4432             offset = 0;
4433           }
4434         emit_move_insn (gen_rtx_REG (Pmode, regno),
4435                         adjust_address (base_address, Pmode, offset));
4436         offset += UNITS_PER_WORD;
4437       }
4438 }
4439
4440 /* Restore function stack, frame, and registers.  */
4441
4442 void
4443 ix86_expand_epilogue (int style)
4444 {
4445   int regno;
4446   int sp_valid = !frame_pointer_needed || current_function_sp_is_unchanging;
4447   struct ix86_frame frame;
4448   HOST_WIDE_INT offset;
4449
4450   ix86_compute_frame_layout (&frame);
4451
4452   /* Calculate start of saved registers relative to ebp.  Special care
4453      must be taken for the normal return case of a function using
4454      eh_return: the eax and edx registers are marked as saved, but not
4455      restored along this path.  */
4456   offset = frame.nregs;
4457   if (current_function_calls_eh_return && style != 2)
4458     offset -= 2;
4459   offset *= -UNITS_PER_WORD;
4460
4461   /* If we're only restoring one register and sp is not valid then
4462      using a move instruction to restore the register since it's
4463      less work than reloading sp and popping the register.
4464
4465      The default code result in stack adjustment using add/lea instruction,
4466      while this code results in LEAVE instruction (or discrete equivalent),
4467      so it is profitable in some other cases as well.  Especially when there
4468      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
4469      and there is exactly one register to pop. This heuristic may need some
4470      tuning in future.  */
4471   if ((!sp_valid && frame.nregs <= 1)
4472       || (TARGET_EPILOGUE_USING_MOVE
4473           && cfun->machine->use_fast_prologue_epilogue
4474           && (frame.nregs > 1 || frame.to_allocate))
4475       || (frame_pointer_needed && !frame.nregs && frame.to_allocate)
4476       || (frame_pointer_needed && TARGET_USE_LEAVE
4477           && cfun->machine->use_fast_prologue_epilogue
4478           && frame.nregs == 1)
4479       || current_function_calls_eh_return)
4480     {
4481       /* Restore registers.  We can use ebp or esp to address the memory
4482          locations.  If both are available, default to ebp, since offsets
4483          are known to be small.  Only exception is esp pointing directly to the
4484          end of block of saved registers, where we may simplify addressing
4485          mode.  */
4486
4487       if (!frame_pointer_needed || (sp_valid && !frame.to_allocate))
4488         ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
4489                                           frame.to_allocate, style == 2);
4490       else
4491         ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
4492                                           offset, style == 2);
4493
4494       /* eh_return epilogues need %ecx added to the stack pointer.  */
4495       if (style == 2)
4496         {
4497           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
4498
4499           if (frame_pointer_needed)
4500             {
4501               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
4502               tmp = plus_constant (tmp, UNITS_PER_WORD);
4503               emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
4504
4505               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
4506               emit_move_insn (hard_frame_pointer_rtx, tmp);
4507
4508               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
4509                                          const0_rtx, style);
4510             }
4511           else
4512             {
4513               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
4514               tmp = plus_constant (tmp, (frame.to_allocate
4515                                          + frame.nregs * UNITS_PER_WORD));
4516               emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
4517             }
4518         }
4519       else if (!frame_pointer_needed)
4520         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
4521                                    GEN_INT (frame.to_allocate
4522                                             + frame.nregs * UNITS_PER_WORD),
4523                                    style);
4524       /* If not an i386, mov & pop is faster than "leave".  */
4525       else if (TARGET_USE_LEAVE || optimize_size
4526                || !cfun->machine->use_fast_prologue_epilogue)
4527         emit_insn (TARGET_64BIT ? gen_leave_rex64 () : gen_leave ());
4528       else
4529         {
4530           pro_epilogue_adjust_stack (stack_pointer_rtx,
4531                                      hard_frame_pointer_rtx,
4532                                      const0_rtx, style);
4533           if (TARGET_64BIT)
4534             emit_insn (gen_popdi1 (hard_frame_pointer_rtx));
4535           else
4536             emit_insn (gen_popsi1 (hard_frame_pointer_rtx));
4537         }
4538     }
4539   else
4540     {
4541       /* First step is to deallocate the stack frame so that we can
4542          pop the registers.  */
4543       if (!sp_valid)
4544         {
4545           if (!frame_pointer_needed)
4546             abort ();
4547           pro_epilogue_adjust_stack (stack_pointer_rtx,
4548                                      hard_frame_pointer_rtx,
4549                                      GEN_INT (offset), style);
4550         }
4551       else if (frame.to_allocate)
4552         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
4553                                    GEN_INT (frame.to_allocate), style);
4554
4555       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4556         if (ix86_save_reg (regno, false))
4557           {
4558             if (TARGET_64BIT)
4559               emit_insn (gen_popdi1 (gen_rtx_REG (Pmode, regno)));
4560             else
4561               emit_insn (gen_popsi1 (gen_rtx_REG (Pmode, regno)));
4562           }
4563       if (frame_pointer_needed)
4564         {
4565           /* Leave results in shorter dependency chains on CPUs that are
4566              able to grok it fast.  */
4567           if (TARGET_USE_LEAVE)
4568             emit_insn (TARGET_64BIT ? gen_leave_rex64 () : gen_leave ());
4569           else if (TARGET_64BIT)
4570             emit_insn (gen_popdi1 (hard_frame_pointer_rtx));
4571           else
4572             emit_insn (gen_popsi1 (hard_frame_pointer_rtx));
4573         }
4574     }
4575
4576   /* Sibcall epilogues don't want a return instruction.  */
4577   if (style == 0)
4578     return;
4579
4580   if (current_function_pops_args && current_function_args_size)
4581     {
4582       rtx popc = GEN_INT (current_function_pops_args);
4583
4584       /* i386 can only pop 64K bytes.  If asked to pop more, pop
4585          return address, do explicit add, and jump indirectly to the
4586          caller.  */
4587
4588       if (current_function_pops_args >= 65536)
4589         {
4590           rtx ecx = gen_rtx_REG (SImode, 2);
4591
4592           /* There is no "pascal" calling convention in 64bit ABI.  */
4593           if (TARGET_64BIT)
4594             abort ();
4595
4596           emit_insn (gen_popsi1 (ecx));
4597           emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
4598           emit_jump_insn (gen_return_indirect_internal (ecx));
4599         }
4600       else
4601         emit_jump_insn (gen_return_pop_internal (popc));
4602     }
4603   else
4604     emit_jump_insn (gen_return_internal ());
4605 }
4606
4607 /* Reset from the function's potential modifications.  */
4608
4609 static void
4610 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
4611                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
4612 {
4613   if (pic_offset_table_rtx)
4614     REGNO (pic_offset_table_rtx) = REAL_PIC_OFFSET_TABLE_REGNUM;
4615 }
4616 \f
4617 /* Extract the parts of an RTL expression that is a valid memory address
4618    for an instruction.  Return 0 if the structure of the address is
4619    grossly off.  Return -1 if the address contains ASHIFT, so it is not
4620    strictly valid, but still used for computing length of lea instruction.  */
4621
4622 int
4623 ix86_decompose_address (rtx addr, struct ix86_address *out)
4624 {
4625   rtx base = NULL_RTX;
4626   rtx index = NULL_RTX;
4627   rtx disp = NULL_RTX;
4628   HOST_WIDE_INT scale = 1;
4629   rtx scale_rtx = NULL_RTX;
4630   int retval = 1;
4631   enum ix86_address_seg seg = SEG_DEFAULT;
4632
4633   if (GET_CODE (addr) == REG || GET_CODE (addr) == SUBREG)
4634     base = addr;
4635   else if (GET_CODE (addr) == PLUS)
4636     {
4637       rtx addends[4], op;
4638       int n = 0, i;
4639
4640       op = addr;
4641       do
4642         {
4643           if (n >= 4)
4644             return 0;
4645           addends[n++] = XEXP (op, 1);
4646           op = XEXP (op, 0);
4647         }
4648       while (GET_CODE (op) == PLUS);
4649       if (n >= 4)
4650         return 0;
4651       addends[n] = op;
4652
4653       for (i = n; i >= 0; --i)
4654         {
4655           op = addends[i];
4656           switch (GET_CODE (op))
4657             {
4658             case MULT:
4659               if (index)
4660                 return 0;
4661               index = XEXP (op, 0);
4662               scale_rtx = XEXP (op, 1);
4663               break;
4664
4665             case UNSPEC:
4666               if (XINT (op, 1) == UNSPEC_TP
4667                   && TARGET_TLS_DIRECT_SEG_REFS
4668                   && seg == SEG_DEFAULT)
4669                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
4670               else
4671                 return 0;
4672               break;
4673
4674             case REG:
4675             case SUBREG:
4676               if (!base)
4677                 base = op;
4678               else if (!index)
4679                 index = op;
4680               else
4681                 return 0;
4682               break;
4683
4684             case CONST:
4685             case CONST_INT:
4686             case SYMBOL_REF:
4687             case LABEL_REF:
4688               if (disp)
4689                 return 0;
4690               disp = op;
4691               break;
4692
4693             default:
4694               return 0;
4695             }
4696         }
4697     }
4698   else if (GET_CODE (addr) == MULT)
4699     {
4700       index = XEXP (addr, 0);           /* index*scale */
4701       scale_rtx = XEXP (addr, 1);
4702     }
4703   else if (GET_CODE (addr) == ASHIFT)
4704     {
4705       rtx tmp;
4706
4707       /* We're called for lea too, which implements ashift on occasion.  */
4708       index = XEXP (addr, 0);
4709       tmp = XEXP (addr, 1);
4710       if (GET_CODE (tmp) != CONST_INT)
4711         return 0;
4712       scale = INTVAL (tmp);
4713       if ((unsigned HOST_WIDE_INT) scale > 3)
4714         return 0;
4715       scale = 1 << scale;
4716       retval = -1;
4717     }
4718   else
4719     disp = addr;                        /* displacement */
4720
4721   /* Extract the integral value of scale.  */
4722   if (scale_rtx)
4723     {
4724       if (GET_CODE (scale_rtx) != CONST_INT)
4725         return 0;
4726       scale = INTVAL (scale_rtx);
4727     }
4728
4729   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
4730   if (base && index && scale == 1
4731       && (index == arg_pointer_rtx
4732           || index == frame_pointer_rtx
4733           || (REG_P (index) && REGNO (index) == STACK_POINTER_REGNUM)))
4734     {
4735       rtx tmp = base;
4736       base = index;
4737       index = tmp;
4738     }
4739
4740   /* Special case: %ebp cannot be encoded as a base without a displacement.  */
4741   if ((base == hard_frame_pointer_rtx
4742        || base == frame_pointer_rtx
4743        || base == arg_pointer_rtx) && !disp)
4744     disp = const0_rtx;
4745
4746   /* Special case: on K6, [%esi] makes the instruction vector decoded.
4747      Avoid this by transforming to [%esi+0].  */
4748   if (ix86_tune == PROCESSOR_K6 && !optimize_size
4749       && base && !index && !disp
4750       && REG_P (base)
4751       && REGNO_REG_CLASS (REGNO (base)) == SIREG)
4752     disp = const0_rtx;
4753
4754   /* Special case: encode reg+reg instead of reg*2.  */
4755   if (!base && index && scale && scale == 2)
4756     base = index, scale = 1;
4757
4758   /* Special case: scaling cannot be encoded without base or displacement.  */
4759   if (!base && !disp && index && scale != 1)
4760     disp = const0_rtx;
4761
4762   out->base = base;
4763   out->index = index;
4764   out->disp = disp;
4765   out->scale = scale;
4766   out->seg = seg;
4767
4768   return retval;
4769 }
4770 \f
4771 /* Return cost of the memory address x.
4772    For i386, it is better to use a complex address than let gcc copy
4773    the address into a reg and make a new pseudo.  But not if the address
4774    requires to two regs - that would mean more pseudos with longer
4775    lifetimes.  */
4776 static int
4777 ix86_address_cost (rtx x)
4778 {
4779   struct ix86_address parts;
4780   int cost = 1;
4781
4782   if (!ix86_decompose_address (x, &parts))
4783     abort ();
4784
4785   /* More complex memory references are better.  */
4786   if (parts.disp && parts.disp != const0_rtx)
4787     cost--;
4788   if (parts.seg != SEG_DEFAULT)
4789     cost--;
4790
4791   /* Attempt to minimize number of registers in the address.  */
4792   if ((parts.base
4793        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
4794       || (parts.index
4795           && (!REG_P (parts.index)
4796               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
4797     cost++;
4798
4799   if (parts.base
4800       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
4801       && parts.index
4802       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
4803       && parts.base != parts.index)
4804     cost++;
4805
4806   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
4807      since it's predecode logic can't detect the length of instructions
4808      and it degenerates to vector decoded.  Increase cost of such
4809      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
4810      to split such addresses or even refuse such addresses at all.
4811
4812      Following addressing modes are affected:
4813       [base+scale*index]
4814       [scale*index+disp]
4815       [base+index]
4816
4817      The first and last case  may be avoidable by explicitly coding the zero in
4818      memory address, but I don't have AMD-K6 machine handy to check this
4819      theory.  */
4820
4821   if (TARGET_K6
4822       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
4823           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
4824           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
4825     cost += 10;
4826
4827   return cost;
4828 }
4829 \f
4830 /* If X is a machine specific address (i.e. a symbol or label being
4831    referenced as a displacement from the GOT implemented using an
4832    UNSPEC), then return the base term.  Otherwise return X.  */
4833
4834 rtx
4835 ix86_find_base_term (rtx x)
4836 {
4837   rtx term;
4838
4839   if (TARGET_64BIT)
4840     {
4841       if (GET_CODE (x) != CONST)
4842         return x;
4843       term = XEXP (x, 0);
4844       if (GET_CODE (term) == PLUS
4845           && (GET_CODE (XEXP (term, 1)) == CONST_INT
4846               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
4847         term = XEXP (term, 0);
4848       if (GET_CODE (term) != UNSPEC
4849           || XINT (term, 1) != UNSPEC_GOTPCREL)
4850         return x;
4851
4852       term = XVECEXP (term, 0, 0);
4853
4854       if (GET_CODE (term) != SYMBOL_REF
4855           && GET_CODE (term) != LABEL_REF)
4856         return x;
4857
4858       return term;
4859     }
4860
4861   term = ix86_delegitimize_address (x);
4862
4863   if (GET_CODE (term) != SYMBOL_REF
4864       && GET_CODE (term) != LABEL_REF)
4865     return x;
4866
4867   return term;
4868 }
4869
4870 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
4871    this is used for to form addresses to local data when -fPIC is in
4872    use.  */
4873
4874 static bool
4875 darwin_local_data_pic (rtx disp)
4876 {
4877   if (GET_CODE (disp) == MINUS)
4878     {
4879       if (GET_CODE (XEXP (disp, 0)) == LABEL_REF
4880           || GET_CODE (XEXP (disp, 0)) == SYMBOL_REF)
4881         if (GET_CODE (XEXP (disp, 1)) == SYMBOL_REF)
4882           {
4883             const char *sym_name = XSTR (XEXP (disp, 1), 0);
4884             if (! strcmp (sym_name, "<pic base>"))
4885               return true;
4886           }
4887     }
4888
4889   return false;
4890 }
4891 \f
4892 /* Determine if a given RTX is a valid constant.  We already know this
4893    satisfies CONSTANT_P.  */
4894
4895 bool
4896 legitimate_constant_p (rtx x)
4897 {
4898   switch (GET_CODE (x))
4899     {
4900     case CONST:
4901       x = XEXP (x, 0);
4902
4903       if (GET_CODE (x) == PLUS)
4904         {
4905           if (GET_CODE (XEXP (x, 1)) != CONST_INT)
4906             return false;
4907           x = XEXP (x, 0);
4908         }
4909
4910       if (TARGET_MACHO && darwin_local_data_pic (x))
4911         return true;
4912
4913       /* Only some unspecs are valid as "constants".  */
4914       if (GET_CODE (x) == UNSPEC)
4915         switch (XINT (x, 1))
4916           {
4917           case UNSPEC_TPOFF:
4918           case UNSPEC_NTPOFF:
4919             return local_exec_symbolic_operand (XVECEXP (x, 0, 0), Pmode);
4920           case UNSPEC_DTPOFF:
4921             return local_dynamic_symbolic_operand (XVECEXP (x, 0, 0), Pmode);
4922           default:
4923             return false;
4924           }
4925
4926       /* We must have drilled down to a symbol.  */
4927       if (!symbolic_operand (x, Pmode))
4928         return false;
4929       /* FALLTHRU */
4930
4931     case SYMBOL_REF:
4932       /* TLS symbols are never valid.  */
4933       if (tls_symbolic_operand (x, Pmode))
4934         return false;
4935       break;
4936
4937     default:
4938       break;
4939     }
4940
4941   /* Otherwise we handle everything else in the move patterns.  */
4942   return true;
4943 }
4944
4945 /* Determine if it's legal to put X into the constant pool.  This
4946    is not possible for the address of thread-local symbols, which
4947    is checked above.  */
4948
4949 static bool
4950 ix86_cannot_force_const_mem (rtx x)
4951 {
4952   return !legitimate_constant_p (x);
4953 }
4954
4955 /* Determine if a given RTX is a valid constant address.  */
4956
4957 bool
4958 constant_address_p (rtx x)
4959 {
4960   return CONSTANT_P (x) && legitimate_address_p (Pmode, x, 1);
4961 }
4962
4963 /* Nonzero if the constant value X is a legitimate general operand
4964    when generating PIC code.  It is given that flag_pic is on and
4965    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
4966
4967 bool
4968 legitimate_pic_operand_p (rtx x)
4969 {
4970   rtx inner;
4971
4972   switch (GET_CODE (x))
4973     {
4974     case CONST:
4975       inner = XEXP (x, 0);
4976
4977       /* Only some unspecs are valid as "constants".  */
4978       if (GET_CODE (inner) == UNSPEC)
4979         switch (XINT (inner, 1))
4980           {
4981           case UNSPEC_TPOFF:
4982             return local_exec_symbolic_operand (XVECEXP (inner, 0, 0), Pmode);
4983           default:
4984             return false;
4985           }
4986       /* FALLTHRU */
4987
4988     case SYMBOL_REF:
4989     case LABEL_REF:
4990       return legitimate_pic_address_disp_p (x);
4991
4992     default:
4993       return true;
4994     }
4995 }
4996
4997 /* Determine if a given CONST RTX is a valid memory displacement
4998    in PIC mode.  */
4999
5000 int
5001 legitimate_pic_address_disp_p (rtx disp)
5002 {
5003   bool saw_plus;
5004
5005   /* In 64bit mode we can allow direct addresses of symbols and labels
5006      when they are not dynamic symbols.  */
5007   if (TARGET_64BIT)
5008     {
5009       /* TLS references should always be enclosed in UNSPEC.  */
5010       if (tls_symbolic_operand (disp, GET_MODE (disp)))
5011         return 0;
5012       if (GET_CODE (disp) == SYMBOL_REF
5013           && ix86_cmodel == CM_SMALL_PIC
5014           && SYMBOL_REF_LOCAL_P (disp))
5015         return 1;
5016       if (GET_CODE (disp) == LABEL_REF)
5017         return 1;
5018       if (GET_CODE (disp) == CONST
5019           && GET_CODE (XEXP (disp, 0)) == PLUS)
5020         {
5021           rtx op0 = XEXP (XEXP (disp, 0), 0);
5022           rtx op1 = XEXP (XEXP (disp, 0), 1);
5023
5024           /* TLS references should always be enclosed in UNSPEC.  */
5025           if (tls_symbolic_operand (op0, GET_MODE (op0)))
5026             return 0;
5027           if (((GET_CODE (op0) == SYMBOL_REF
5028                 && ix86_cmodel == CM_SMALL_PIC
5029                 && SYMBOL_REF_LOCAL_P (op0))
5030                || GET_CODE (op0) == LABEL_REF)
5031               && GET_CODE (op1) == CONST_INT
5032               && INTVAL (op1) < 16*1024*1024
5033               && INTVAL (op1) >= -16*1024*1024)
5034             return 1;
5035         }
5036     }
5037   if (GET_CODE (disp) != CONST)
5038     return 0;
5039   disp = XEXP (disp, 0);
5040
5041   if (TARGET_64BIT)
5042     {
5043       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
5044          of GOT tables.  We should not need these anyway.  */
5045       if (GET_CODE (disp) != UNSPEC
5046           || XINT (disp, 1) != UNSPEC_GOTPCREL)
5047         return 0;
5048
5049       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
5050           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
5051         return 0;
5052       return 1;
5053     }
5054
5055   saw_plus = false;
5056   if (GET_CODE (disp) == PLUS)
5057     {
5058       if (GET_CODE (XEXP (disp, 1)) != CONST_INT)
5059         return 0;
5060       disp = XEXP (disp, 0);
5061       saw_plus = true;
5062     }
5063
5064   if (TARGET_MACHO && darwin_local_data_pic (disp))
5065     return 1;
5066
5067   if (GET_CODE (disp) != UNSPEC)
5068     return 0;
5069
5070   switch (XINT (disp, 1))
5071     {
5072     case UNSPEC_GOT:
5073       if (saw_plus)
5074         return false;
5075       return GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF;
5076     case UNSPEC_GOTOFF:
5077       if (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
5078           || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
5079         return local_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5080       return false;
5081     case UNSPEC_GOTTPOFF:
5082     case UNSPEC_GOTNTPOFF:
5083     case UNSPEC_INDNTPOFF:
5084       if (saw_plus)
5085         return false;
5086       return initial_exec_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5087     case UNSPEC_NTPOFF:
5088       return local_exec_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5089     case UNSPEC_DTPOFF:
5090       return local_dynamic_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5091     }
5092
5093   return 0;
5094 }
5095
5096 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression that is a valid
5097    memory address for an instruction.  The MODE argument is the machine mode
5098    for the MEM expression that wants to use this address.
5099
5100    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
5101    convert common non-canonical forms to canonical form so that they will
5102    be recognized.  */
5103
5104 int
5105 legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
5106 {
5107   struct ix86_address parts;
5108   rtx base, index, disp;
5109   HOST_WIDE_INT scale;
5110   const char *reason = NULL;
5111   rtx reason_rtx = NULL_RTX;
5112
5113   if (TARGET_DEBUG_ADDR)
5114     {
5115       fprintf (stderr,
5116                "\n======\nGO_IF_LEGITIMATE_ADDRESS, mode = %s, strict = %d\n",
5117                GET_MODE_NAME (mode), strict);
5118       debug_rtx (addr);
5119     }
5120
5121   if (ix86_decompose_address (addr, &parts) <= 0)
5122     {
5123       reason = "decomposition failed";
5124       goto report_error;
5125     }
5126
5127   base = parts.base;
5128   index = parts.index;
5129   disp = parts.disp;
5130   scale = parts.scale;
5131
5132   /* Validate base register.
5133
5134      Don't allow SUBREG's here, it can lead to spill failures when the base
5135      is one word out of a two word structure, which is represented internally
5136      as a DImode int.  */
5137
5138   if (base)
5139     {
5140       reason_rtx = base;
5141
5142       if (GET_CODE (base) != REG)
5143         {
5144           reason = "base is not a register";
5145           goto report_error;
5146         }
5147
5148       if (GET_MODE (base) != Pmode)
5149         {
5150           reason = "base is not in Pmode";
5151           goto report_error;
5152         }
5153
5154       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (base))
5155           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (base)))
5156         {
5157           reason = "base is not valid";
5158           goto report_error;
5159         }
5160     }
5161
5162   /* Validate index register.
5163
5164      Don't allow SUBREG's here, it can lead to spill failures when the index
5165      is one word out of a two word structure, which is represented internally
5166      as a DImode int.  */
5167
5168   if (index)
5169     {
5170       reason_rtx = index;
5171
5172       if (GET_CODE (index) != REG)
5173         {
5174           reason = "index is not a register";
5175           goto report_error;
5176         }
5177
5178       if (GET_MODE (index) != Pmode)
5179         {
5180           reason = "index is not in Pmode";
5181           goto report_error;
5182         }
5183
5184       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (index))
5185           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (index)))
5186         {
5187           reason = "index is not valid";
5188           goto report_error;
5189         }
5190     }
5191
5192   /* Validate scale factor.  */
5193   if (scale != 1)
5194     {
5195       reason_rtx = GEN_INT (scale);
5196       if (!index)
5197         {
5198           reason = "scale without index";
5199           goto report_error;
5200         }
5201
5202       if (scale != 2 && scale != 4 && scale != 8)
5203         {
5204           reason = "scale is not a valid multiplier";
5205           goto report_error;
5206         }
5207     }
5208
5209   /* Validate displacement.  */
5210   if (disp)
5211     {
5212       reason_rtx = disp;
5213
5214       if (GET_CODE (disp) == CONST
5215           && GET_CODE (XEXP (disp, 0)) == UNSPEC)
5216         switch (XINT (XEXP (disp, 0), 1))
5217           {
5218           case UNSPEC_GOT:
5219           case UNSPEC_GOTOFF:
5220           case UNSPEC_GOTPCREL:
5221             if (!flag_pic)
5222               abort ();
5223             goto is_legitimate_pic;
5224
5225           case UNSPEC_GOTTPOFF:
5226           case UNSPEC_GOTNTPOFF:
5227           case UNSPEC_INDNTPOFF:
5228           case UNSPEC_NTPOFF:
5229           case UNSPEC_DTPOFF:
5230             break;
5231
5232           default:
5233             reason = "invalid address unspec";
5234             goto report_error;
5235           }
5236
5237       else if (flag_pic && (SYMBOLIC_CONST (disp)
5238 #if TARGET_MACHO
5239                             && !machopic_operand_p (disp)
5240 #endif
5241                             ))
5242         {
5243         is_legitimate_pic:
5244           if (TARGET_64BIT && (index || base))
5245             {
5246               /* foo@dtpoff(%rX) is ok.  */
5247               if (GET_CODE (disp) != CONST
5248                   || GET_CODE (XEXP (disp, 0)) != PLUS
5249                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
5250                   || GET_CODE (XEXP (XEXP (disp, 0), 1)) != CONST_INT
5251                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
5252                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
5253                 {
5254                   reason = "non-constant pic memory reference";
5255                   goto report_error;
5256                 }
5257             }
5258           else if (! legitimate_pic_address_disp_p (disp))
5259             {
5260               reason = "displacement is an invalid pic construct";
5261               goto report_error;
5262             }
5263
5264           /* This code used to verify that a symbolic pic displacement
5265              includes the pic_offset_table_rtx register.
5266
5267              While this is good idea, unfortunately these constructs may
5268              be created by "adds using lea" optimization for incorrect
5269              code like:
5270
5271              int a;
5272              int foo(int i)
5273                {
5274                  return *(&a+i);
5275                }
5276
5277              This code is nonsensical, but results in addressing
5278              GOT table with pic_offset_table_rtx base.  We can't
5279              just refuse it easily, since it gets matched by
5280              "addsi3" pattern, that later gets split to lea in the
5281              case output register differs from input.  While this
5282              can be handled by separate addsi pattern for this case
5283              that never results in lea, this seems to be easier and
5284              correct fix for crash to disable this test.  */
5285         }
5286       else if (GET_CODE (disp) != LABEL_REF
5287                && GET_CODE (disp) != CONST_INT
5288                && (GET_CODE (disp) != CONST
5289                    || !legitimate_constant_p (disp))
5290                && (GET_CODE (disp) != SYMBOL_REF
5291                    || !legitimate_constant_p (disp)))
5292         {
5293           reason = "displacement is not constant";
5294           goto report_error;
5295         }
5296       else if (TARGET_64BIT
5297                && !x86_64_immediate_operand (disp, VOIDmode))
5298         {
5299           reason = "displacement is out of range";
5300           goto report_error;
5301         }
5302     }
5303
5304   /* Everything looks valid.  */
5305   if (TARGET_DEBUG_ADDR)
5306     fprintf (stderr, "Success.\n");
5307   return TRUE;
5308
5309  report_error:
5310   if (TARGET_DEBUG_ADDR)
5311     {
5312       fprintf (stderr, "Error: %s\n", reason);
5313       debug_rtx (reason_rtx);
5314     }
5315   return FALSE;
5316 }
5317 \f
5318 /* Return an unique alias set for the GOT.  */
5319
5320 static HOST_WIDE_INT
5321 ix86_GOT_alias_set (void)
5322 {
5323   static HOST_WIDE_INT set = -1;
5324   if (set == -1)
5325     set = new_alias_set ();
5326   return set;
5327 }
5328
5329 /* Return a legitimate reference for ORIG (an address) using the
5330    register REG.  If REG is 0, a new pseudo is generated.
5331
5332    There are two types of references that must be handled:
5333
5334    1. Global data references must load the address from the GOT, via
5335       the PIC reg.  An insn is emitted to do this load, and the reg is
5336       returned.
5337
5338    2. Static data references, constant pool addresses, and code labels
5339       compute the address as an offset from the GOT, whose base is in
5340       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
5341       differentiate them from global data objects.  The returned
5342       address is the PIC reg + an unspec constant.
5343
5344    GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
5345    reg also appears in the address.  */
5346
5347 static rtx
5348 legitimize_pic_address (rtx orig, rtx reg)
5349 {
5350   rtx addr = orig;
5351   rtx new = orig;
5352   rtx base;
5353
5354 #if TARGET_MACHO
5355   if (reg == 0)
5356     reg = gen_reg_rtx (Pmode);
5357   /* Use the generic Mach-O PIC machinery.  */
5358   return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
5359 #endif
5360
5361   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
5362     new = addr;
5363   else if (!TARGET_64BIT && local_symbolic_operand (addr, Pmode))
5364     {
5365       /* This symbol may be referenced via a displacement from the PIC
5366          base address (@GOTOFF).  */
5367
5368       if (reload_in_progress)
5369         regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
5370       if (GET_CODE (addr) == CONST)
5371         addr = XEXP (addr, 0);
5372       if (GET_CODE (addr) == PLUS)
5373           {
5374             new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)), UNSPEC_GOTOFF);
5375             new = gen_rtx_PLUS (Pmode, new, XEXP (addr, 1));
5376           }
5377         else
5378           new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
5379       new = gen_rtx_CONST (Pmode, new);
5380       new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
5381
5382       if (reg != 0)
5383         {
5384           emit_move_insn (reg, new);
5385           new = reg;
5386         }
5387     }
5388   else if (GET_CODE (addr) == SYMBOL_REF)
5389     {
5390       if (TARGET_64BIT)
5391         {
5392           new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
5393           new = gen_rtx_CONST (Pmode, new);
5394           new = gen_const_mem (Pmode, new);
5395           set_mem_alias_set (new, ix86_GOT_alias_set ());
5396
5397           if (reg == 0)
5398             reg = gen_reg_rtx (Pmode);
5399           /* Use directly gen_movsi, otherwise the address is loaded
5400              into register for CSE.  We don't want to CSE this addresses,
5401              instead we CSE addresses from the GOT table, so skip this.  */
5402           emit_insn (gen_movsi (reg, new));
5403           new = reg;
5404         }
5405       else
5406         {
5407           /* This symbol must be referenced via a load from the
5408              Global Offset Table (@GOT).  */
5409
5410           if (reload_in_progress)
5411             regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
5412           new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
5413           new = gen_rtx_CONST (Pmode, new);
5414           new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
5415           new = gen_const_mem (Pmode, new);
5416           set_mem_alias_set (new, ix86_GOT_alias_set ());
5417
5418           if (reg == 0)
5419             reg = gen_reg_rtx (Pmode);
5420           emit_move_insn (reg, new);
5421           new = reg;
5422         }
5423     }
5424   else
5425     {
5426       if (GET_CODE (addr) == CONST)
5427         {
5428           addr = XEXP (addr, 0);
5429
5430           /* We must match stuff we generate before.  Assume the only
5431              unspecs that can get here are ours.  Not that we could do
5432              anything with them anyway....  */
5433           if (GET_CODE (addr) == UNSPEC
5434               || (GET_CODE (addr) == PLUS
5435                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
5436             return orig;
5437           if (GET_CODE (addr) != PLUS)
5438             abort ();
5439         }
5440       if (GET_CODE (addr) == PLUS)
5441         {
5442           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
5443
5444           /* Check first to see if this is a constant offset from a @GOTOFF
5445              symbol reference.  */
5446           if (local_symbolic_operand (op0, Pmode)
5447               && GET_CODE (op1) == CONST_INT)
5448             {
5449               if (!TARGET_64BIT)
5450                 {
5451                   if (reload_in_progress)
5452                     regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
5453                   new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
5454                                         UNSPEC_GOTOFF);
5455                   new = gen_rtx_PLUS (Pmode, new, op1);
5456                   new = gen_rtx_CONST (Pmode, new);
5457                   new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
5458
5459                   if (reg != 0)
5460                     {
5461                       emit_move_insn (reg, new);
5462                       new = reg;
5463                     }
5464                 }
5465               else
5466                 {
5467                   if (INTVAL (op1) < -16*1024*1024
5468                       || INTVAL (op1) >= 16*1024*1024)
5469                     new = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
5470                 }
5471             }
5472           else
5473             {
5474               base = legitimize_pic_address (XEXP (addr, 0), reg);
5475               new  = legitimize_pic_address (XEXP (addr, 1),
5476                                              base == reg ? NULL_RTX : reg);
5477
5478               if (GET_CODE (new) == CONST_INT)
5479                 new = plus_constant (base, INTVAL (new));
5480               else
5481                 {
5482                   if (GET_CODE (new) == PLUS && CONSTANT_P (XEXP (new, 1)))
5483                     {
5484                       base = gen_rtx_PLUS (Pmode, base, XEXP (new, 0));
5485                       new = XEXP (new, 1);
5486                     }
5487                   new = gen_rtx_PLUS (Pmode, base, new);
5488                 }
5489             }
5490         }
5491     }
5492   return new;
5493 }
5494 \f
5495 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
5496
5497 static rtx
5498 get_thread_pointer (int to_reg)
5499 {
5500   rtx tp, reg, insn;
5501
5502   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
5503   if (!to_reg)
5504     return tp;
5505
5506   reg = gen_reg_rtx (Pmode);
5507   insn = gen_rtx_SET (VOIDmode, reg, tp);
5508   insn = emit_insn (insn);
5509
5510   return reg;
5511 }
5512
5513 /* A subroutine of legitimize_address and ix86_expand_move.  FOR_MOV is
5514    false if we expect this to be used for a memory address and true if
5515    we expect to load the address into a register.  */
5516
5517 static rtx
5518 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
5519 {
5520   rtx dest, base, off, pic;
5521   int type;
5522
5523   switch (model)
5524     {
5525     case TLS_MODEL_GLOBAL_DYNAMIC:
5526       dest = gen_reg_rtx (Pmode);
5527       if (TARGET_64BIT)
5528         {
5529           rtx rax = gen_rtx_REG (Pmode, 0), insns;
5530
5531           start_sequence ();
5532           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
5533           insns = get_insns ();
5534           end_sequence ();
5535
5536           emit_libcall_block (insns, dest, rax, x);
5537         }
5538       else
5539         emit_insn (gen_tls_global_dynamic_32 (dest, x));
5540       break;
5541
5542     case TLS_MODEL_LOCAL_DYNAMIC:
5543       base = gen_reg_rtx (Pmode);
5544       if (TARGET_64BIT)
5545         {
5546           rtx rax = gen_rtx_REG (Pmode, 0), insns, note;
5547
5548           start_sequence ();
5549           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
5550           insns = get_insns ();
5551           end_sequence ();
5552
5553           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
5554           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
5555           emit_libcall_block (insns, base, rax, note);
5556         }
5557       else
5558         emit_insn (gen_tls_local_dynamic_base_32 (base));
5559
5560       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
5561       off = gen_rtx_CONST (Pmode, off);
5562
5563       return gen_rtx_PLUS (Pmode, base, off);
5564
5565     case TLS_MODEL_INITIAL_EXEC:
5566       if (TARGET_64BIT)
5567         {
5568           pic = NULL;
5569           type = UNSPEC_GOTNTPOFF;
5570         }
5571       else if (flag_pic)
5572         {
5573           if (reload_in_progress)
5574             regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
5575           pic = pic_offset_table_rtx;
5576           type = TARGET_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
5577         }
5578       else if (!TARGET_GNU_TLS)
5579         {
5580           pic = gen_reg_rtx (Pmode);
5581           emit_insn (gen_set_got (pic));
5582           type = UNSPEC_GOTTPOFF;
5583         }
5584       else
5585         {
5586           pic = NULL;
5587           type = UNSPEC_INDNTPOFF;
5588         }
5589
5590       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
5591       off = gen_rtx_CONST (Pmode, off);
5592       if (pic)
5593         off = gen_rtx_PLUS (Pmode, pic, off);
5594       off = gen_const_mem (Pmode, off);
5595       set_mem_alias_set (off, ix86_GOT_alias_set ());
5596
5597       if (TARGET_64BIT || TARGET_GNU_TLS)
5598         {
5599           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
5600           off = force_reg (Pmode, off);
5601           return gen_rtx_PLUS (Pmode, base, off);
5602         }
5603       else
5604         {
5605           base = get_thread_pointer (true);
5606           dest = gen_reg_rtx (Pmode);
5607           emit_insn (gen_subsi3 (dest, base, off));
5608         }
5609       break;
5610
5611     case TLS_MODEL_LOCAL_EXEC:
5612       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
5613                             (TARGET_64BIT || TARGET_GNU_TLS)
5614                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
5615       off = gen_rtx_CONST (Pmode, off);
5616
5617       if (TARGET_64BIT || TARGET_GNU_TLS)
5618         {
5619           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
5620           return gen_rtx_PLUS (Pmode, base, off);
5621         }
5622       else
5623         {
5624           base = get_thread_pointer (true);
5625           dest = gen_reg_rtx (Pmode);
5626           emit_insn (gen_subsi3 (dest, base, off));
5627         }
5628       break;
5629
5630     default:
5631       abort ();
5632     }
5633
5634   return dest;
5635 }
5636
5637 /* Try machine-dependent ways of modifying an illegitimate address
5638    to be legitimate.  If we find one, return the new, valid address.
5639    This macro is used in only one place: `memory_address' in explow.c.
5640
5641    OLDX is the address as it was before break_out_memory_refs was called.
5642    In some cases it is useful to look at this to decide what needs to be done.
5643
5644    MODE and WIN are passed so that this macro can use
5645    GO_IF_LEGITIMATE_ADDRESS.
5646
5647    It is always safe for this macro to do nothing.  It exists to recognize
5648    opportunities to optimize the output.
5649
5650    For the 80386, we handle X+REG by loading X into a register R and
5651    using R+REG.  R will go in a general reg and indexing will be used.
5652    However, if REG is a broken-out memory address or multiplication,
5653    nothing needs to be done because REG can certainly go in a general reg.
5654
5655    When -fpic is used, special handling is needed for symbolic references.
5656    See comments by legitimize_pic_address in i386.c for details.  */
5657
5658 rtx
5659 legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
5660 {
5661   int changed = 0;
5662   unsigned log;
5663
5664   if (TARGET_DEBUG_ADDR)
5665     {
5666       fprintf (stderr, "\n==========\nLEGITIMIZE_ADDRESS, mode = %s\n",
5667                GET_MODE_NAME (mode));
5668       debug_rtx (x);
5669     }
5670
5671   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
5672   if (log)
5673     return legitimize_tls_address (x, log, false);
5674   if (GET_CODE (x) == CONST
5675       && GET_CODE (XEXP (x, 0)) == PLUS
5676       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
5677       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
5678     {
5679       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0), log, false);
5680       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
5681     }
5682
5683   if (flag_pic && SYMBOLIC_CONST (x))
5684     return legitimize_pic_address (x, 0);
5685
5686   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
5687   if (GET_CODE (x) == ASHIFT
5688       && GET_CODE (XEXP (x, 1)) == CONST_INT
5689       && (log = (unsigned) exact_log2 (INTVAL (XEXP (x, 1)))) < 4)
5690     {
5691       changed = 1;
5692       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
5693                         GEN_INT (1 << log));
5694     }
5695
5696   if (GET_CODE (x) == PLUS)
5697     {
5698       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
5699
5700       if (GET_CODE (XEXP (x, 0)) == ASHIFT
5701           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
5702           && (log = (unsigned) exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) < 4)
5703         {
5704           changed = 1;
5705           XEXP (x, 0) = gen_rtx_MULT (Pmode,
5706                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
5707                                       GEN_INT (1 << log));
5708         }
5709
5710       if (GET_CODE (XEXP (x, 1)) == ASHIFT
5711           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
5712           && (log = (unsigned) exact_log2 (INTVAL (XEXP (XEXP (x, 1), 1)))) < 4)
5713         {
5714           changed = 1;
5715           XEXP (x, 1) = gen_rtx_MULT (Pmode,
5716                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
5717                                       GEN_INT (1 << log));
5718         }
5719
5720       /* Put multiply first if it isn't already.  */
5721       if (GET_CODE (XEXP (x, 1)) == MULT)
5722         {
5723           rtx tmp = XEXP (x, 0);
5724           XEXP (x, 0) = XEXP (x, 1);
5725           XEXP (x, 1) = tmp;
5726           changed = 1;
5727         }
5728
5729       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
5730          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
5731          created by virtual register instantiation, register elimination, and
5732          similar optimizations.  */
5733       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
5734         {
5735           changed = 1;
5736           x = gen_rtx_PLUS (Pmode,
5737                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
5738                                           XEXP (XEXP (x, 1), 0)),
5739                             XEXP (XEXP (x, 1), 1));
5740         }
5741
5742       /* Canonicalize
5743          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
5744          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
5745       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
5746                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
5747                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
5748                && CONSTANT_P (XEXP (x, 1)))
5749         {
5750           rtx constant;
5751           rtx other = NULL_RTX;
5752
5753           if (GET_CODE (XEXP (x, 1)) == CONST_INT)
5754             {
5755               constant = XEXP (x, 1);
5756               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
5757             }
5758           else if (GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 1)) == CONST_INT)
5759             {
5760               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
5761               other = XEXP (x, 1);
5762             }
5763           else
5764             constant = 0;
5765
5766           if (constant)
5767             {
5768               changed = 1;
5769               x = gen_rtx_PLUS (Pmode,
5770                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
5771                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
5772                                 plus_constant (other, INTVAL (constant)));
5773             }
5774         }
5775
5776       if (changed && legitimate_address_p (mode, x, FALSE))
5777         return x;
5778
5779       if (GET_CODE (XEXP (x, 0)) == MULT)
5780         {
5781           changed = 1;
5782           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
5783         }
5784
5785       if (GET_CODE (XEXP (x, 1)) == MULT)
5786         {
5787           changed = 1;
5788           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
5789         }
5790
5791       if (changed
5792           && GET_CODE (XEXP (x, 1)) == REG
5793           && GET_CODE (XEXP (x, 0)) == REG)
5794         return x;
5795
5796       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
5797         {
5798           changed = 1;
5799           x = legitimize_pic_address (x, 0);
5800         }
5801
5802       if (changed && legitimate_address_p (mode, x, FALSE))
5803         return x;
5804
5805       if (GET_CODE (XEXP (x, 0)) == REG)
5806         {
5807           rtx temp = gen_reg_rtx (Pmode);
5808           rtx val  = force_operand (XEXP (x, 1), temp);
5809           if (val != temp)
5810             emit_move_insn (temp, val);
5811
5812           XEXP (x, 1) = temp;
5813           return x;
5814         }
5815
5816       else if (GET_CODE (XEXP (x, 1)) == REG)
5817         {
5818           rtx temp = gen_reg_rtx (Pmode);
5819           rtx val  = force_operand (XEXP (x, 0), temp);
5820           if (val != temp)
5821             emit_move_insn (temp, val);
5822
5823           XEXP (x, 0) = temp;
5824           return x;
5825         }
5826     }
5827
5828   return x;
5829 }
5830 \f
5831 /* Print an integer constant expression in assembler syntax.  Addition
5832    and subtraction are the only arithmetic that may appear in these
5833    expressions.  FILE is the stdio stream to write to, X is the rtx, and
5834    CODE is the operand print code from the output string.  */
5835
5836 static void
5837 output_pic_addr_const (FILE *file, rtx x, int code)
5838 {
5839   char buf[256];
5840
5841   switch (GET_CODE (x))
5842     {
5843     case PC:
5844       if (flag_pic)
5845         putc ('.', file);
5846       else
5847         abort ();
5848       break;
5849
5850     case SYMBOL_REF:
5851      /* Mark the decl as referenced so that cgraph will output the function.  */
5852      if (SYMBOL_REF_DECL (x))
5853        mark_decl_referenced (SYMBOL_REF_DECL (x));
5854
5855       assemble_name (file, XSTR (x, 0));
5856       if (!TARGET_MACHO && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
5857         fputs ("@PLT", file);
5858       break;
5859
5860     case LABEL_REF:
5861       x = XEXP (x, 0);
5862       /* FALLTHRU */
5863     case CODE_LABEL:
5864       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
5865       assemble_name (asm_out_file, buf);
5866       break;
5867
5868     case CONST_INT:
5869       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
5870       break;
5871
5872     case CONST:
5873       /* This used to output parentheses around the expression,
5874          but that does not work on the 386 (either ATT or BSD assembler).  */
5875       output_pic_addr_const (file, XEXP (x, 0), code);
5876       break;
5877
5878     case CONST_DOUBLE:
5879       if (GET_MODE (x) == VOIDmode)
5880         {
5881           /* We can use %d if the number is <32 bits and positive.  */
5882           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
5883             fprintf (file, "0x%lx%08lx",
5884                      (unsigned long) CONST_DOUBLE_HIGH (x),
5885                      (unsigned long) CONST_DOUBLE_LOW (x));
5886           else
5887             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
5888         }
5889       else
5890         /* We can't handle floating point constants;
5891            PRINT_OPERAND must handle them.  */
5892         output_operand_lossage ("floating constant misused");
5893       break;
5894
5895     case PLUS:
5896       /* Some assemblers need integer constants to appear first.  */
5897       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
5898         {
5899           output_pic_addr_const (file, XEXP (x, 0), code);
5900           putc ('+', file);
5901           output_pic_addr_const (file, XEXP (x, 1), code);
5902         }
5903       else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
5904         {
5905           output_pic_addr_const (file, XEXP (x, 1), code);
5906           putc ('+', file);
5907           output_pic_addr_const (file, XEXP (x, 0), code);
5908         }
5909       else
5910         abort ();
5911       break;
5912
5913     case MINUS:
5914       if (!TARGET_MACHO)
5915         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
5916       output_pic_addr_const (file, XEXP (x, 0), code);
5917       putc ('-', file);
5918       output_pic_addr_const (file, XEXP (x, 1), code);
5919       if (!TARGET_MACHO)
5920         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
5921       break;
5922
5923      case UNSPEC:
5924        if (XVECLEN (x, 0) != 1)
5925          abort ();
5926        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
5927        switch (XINT (x, 1))
5928         {
5929         case UNSPEC_GOT:
5930           fputs ("@GOT", file);
5931           break;
5932         case UNSPEC_GOTOFF:
5933           fputs ("@GOTOFF", file);
5934           break;
5935         case UNSPEC_GOTPCREL:
5936           fputs ("@GOTPCREL(%rip)", file);
5937           break;
5938         case UNSPEC_GOTTPOFF:
5939           /* FIXME: This might be @TPOFF in Sun ld too.  */
5940           fputs ("@GOTTPOFF", file);
5941           break;
5942         case UNSPEC_TPOFF:
5943           fputs ("@TPOFF", file);
5944           break;
5945         case UNSPEC_NTPOFF:
5946           if (TARGET_64BIT)
5947             fputs ("@TPOFF", file);
5948           else
5949             fputs ("@NTPOFF", file);
5950           break;
5951         case UNSPEC_DTPOFF:
5952           fputs ("@DTPOFF", file);
5953           break;
5954         case UNSPEC_GOTNTPOFF:
5955           if (TARGET_64BIT)
5956             fputs ("@GOTTPOFF(%rip)", file);
5957           else
5958             fputs ("@GOTNTPOFF", file);
5959           break;
5960         case UNSPEC_INDNTPOFF:
5961           fputs ("@INDNTPOFF", file);
5962           break;
5963         default:
5964           output_operand_lossage ("invalid UNSPEC as operand");
5965           break;
5966         }
5967        break;
5968
5969     default:
5970       output_operand_lossage ("invalid expression as operand");
5971     }
5972 }
5973
5974 /* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
5975    We need to emit DTP-relative relocations.  */
5976
5977 void
5978 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
5979 {
5980   fputs (ASM_LONG, file);
5981   output_addr_const (file, x);
5982   fputs ("@DTPOFF", file);
5983   switch (size)
5984     {
5985     case 4:
5986       break;
5987     case 8:
5988       fputs (", 0", file);
5989       break;
5990     default:
5991       abort ();
5992    }
5993 }
5994
5995 /* In the name of slightly smaller debug output, and to cater to
5996    general assembler losage, recognize PIC+GOTOFF and turn it back
5997    into a direct symbol reference.  */
5998
5999 static rtx
6000 ix86_delegitimize_address (rtx orig_x)
6001 {
6002   rtx x = orig_x, y;
6003
6004   if (GET_CODE (x) == MEM)
6005     x = XEXP (x, 0);
6006
6007   if (TARGET_64BIT)
6008     {
6009       if (GET_CODE (x) != CONST
6010           || GET_CODE (XEXP (x, 0)) != UNSPEC
6011           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
6012           || GET_CODE (orig_x) != MEM)
6013         return orig_x;
6014       return XVECEXP (XEXP (x, 0), 0, 0);
6015     }
6016
6017   if (GET_CODE (x) != PLUS
6018       || GET_CODE (XEXP (x, 1)) != CONST)
6019     return orig_x;
6020
6021   if (GET_CODE (XEXP (x, 0)) == REG
6022       && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM)
6023     /* %ebx + GOT/GOTOFF */
6024     y = NULL;
6025   else if (GET_CODE (XEXP (x, 0)) == PLUS)
6026     {
6027       /* %ebx + %reg * scale + GOT/GOTOFF */
6028       y = XEXP (x, 0);
6029       if (GET_CODE (XEXP (y, 0)) == REG
6030           && REGNO (XEXP (y, 0)) == PIC_OFFSET_TABLE_REGNUM)
6031         y = XEXP (y, 1);
6032       else if (GET_CODE (XEXP (y, 1)) == REG
6033                && REGNO (XEXP (y, 1)) == PIC_OFFSET_TABLE_REGNUM)
6034         y = XEXP (y, 0);
6035       else
6036         return orig_x;
6037       if (GET_CODE (y) != REG
6038           && GET_CODE (y) != MULT
6039           && GET_CODE (y) != ASHIFT)
6040         return orig_x;
6041     }
6042   else
6043     return orig_x;
6044
6045   x = XEXP (XEXP (x, 1), 0);
6046   if (GET_CODE (x) == UNSPEC
6047       && ((XINT (x, 1) == UNSPEC_GOT && GET_CODE (orig_x) == MEM)
6048           || (XINT (x, 1) == UNSPEC_GOTOFF && GET_CODE (orig_x) != MEM)))
6049     {
6050       if (y)
6051         return gen_rtx_PLUS (Pmode, y, XVECEXP (x, 0, 0));
6052       return XVECEXP (x, 0, 0);
6053     }
6054
6055   if (GET_CODE (x) == PLUS
6056       && GET_CODE (XEXP (x, 0)) == UNSPEC
6057       && GET_CODE (XEXP (x, 1)) == CONST_INT
6058       && ((XINT (XEXP (x, 0), 1) == UNSPEC_GOT && GET_CODE (orig_x) == MEM)
6059           || (XINT (XEXP (x, 0), 1) == UNSPEC_GOTOFF
6060               && GET_CODE (orig_x) != MEM)))
6061     {
6062       x = gen_rtx_PLUS (VOIDmode, XVECEXP (XEXP (x, 0), 0, 0), XEXP (x, 1));
6063       if (y)
6064         return gen_rtx_PLUS (Pmode, y, x);
6065       return x;
6066     }
6067
6068   return orig_x;
6069 }
6070 \f
6071 static void
6072 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
6073                     int fp, FILE *file)
6074 {
6075   const char *suffix;
6076
6077   if (mode == CCFPmode || mode == CCFPUmode)
6078     {
6079       enum rtx_code second_code, bypass_code;
6080       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
6081       if (bypass_code != UNKNOWN || second_code != UNKNOWN)
6082         abort ();
6083       code = ix86_fp_compare_code_to_integer (code);
6084       mode = CCmode;
6085     }
6086   if (reverse)
6087     code = reverse_condition (code);
6088
6089   switch (code)
6090     {
6091     case EQ:
6092       suffix = "e";
6093       break;
6094     case NE:
6095       suffix = "ne";
6096       break;
6097     case GT:
6098       if (mode != CCmode && mode != CCNOmode && mode != CCGCmode)
6099         abort ();
6100       suffix = "g";
6101       break;
6102     case GTU:
6103       /* ??? Use "nbe" instead of "a" for fcmov losage on some assemblers.
6104          Those same assemblers have the same but opposite losage on cmov.  */
6105       if (mode != CCmode)
6106         abort ();
6107       suffix = fp ? "nbe" : "a";
6108       break;
6109     case LT:
6110       if (mode == CCNOmode || mode == CCGOCmode)
6111         suffix = "s";
6112       else if (mode == CCmode || mode == CCGCmode)
6113         suffix = "l";
6114       else
6115         abort ();
6116       break;
6117     case LTU:
6118       if (mode != CCmode)
6119         abort ();
6120       suffix = "b";
6121       break;
6122     case GE:
6123       if (mode == CCNOmode || mode == CCGOCmode)
6124         suffix = "ns";
6125       else if (mode == CCmode || mode == CCGCmode)
6126         suffix = "ge";
6127       else
6128         abort ();
6129       break;
6130     case GEU:
6131       /* ??? As above.  */
6132       if (mode != CCmode)
6133         abort ();
6134       suffix = fp ? "nb" : "ae";
6135       break;
6136     case LE:
6137       if (mode != CCmode && mode != CCGCmode && mode != CCNOmode)
6138         abort ();
6139       suffix = "le";
6140       break;
6141     case LEU:
6142       if (mode != CCmode)
6143         abort ();
6144       suffix = "be";
6145       break;
6146     case UNORDERED:
6147       suffix = fp ? "u" : "p";
6148       break;
6149     case ORDERED:
6150       suffix = fp ? "nu" : "np";
6151       break;
6152     default:
6153       abort ();
6154     }
6155   fputs (suffix, file);
6156 }
6157
6158 /* Print the name of register X to FILE based on its machine mode and number.
6159    If CODE is 'w', pretend the mode is HImode.
6160    If CODE is 'b', pretend the mode is QImode.
6161    If CODE is 'k', pretend the mode is SImode.
6162    If CODE is 'q', pretend the mode is DImode.
6163    If CODE is 'h', pretend the reg is the `high' byte register.
6164    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.  */
6165
6166 void
6167 print_reg (rtx x, int code, FILE *file)
6168 {
6169   if (REGNO (x) == ARG_POINTER_REGNUM
6170       || REGNO (x) == FRAME_POINTER_REGNUM
6171       || REGNO (x) == FLAGS_REG
6172       || REGNO (x) == FPSR_REG)
6173     abort ();
6174
6175   if (ASSEMBLER_DIALECT == ASM_ATT || USER_LABEL_PREFIX[0] == 0)
6176     putc ('%', file);
6177
6178   if (code == 'w' || MMX_REG_P (x))
6179     code = 2;
6180   else if (code == 'b')
6181     code = 1;
6182   else if (code == 'k')
6183     code = 4;
6184   else if (code == 'q')
6185     code = 8;
6186   else if (code == 'y')
6187     code = 3;
6188   else if (code == 'h')
6189     code = 0;
6190   else
6191     code = GET_MODE_SIZE (GET_MODE (x));
6192
6193   /* Irritatingly, AMD extended registers use different naming convention
6194      from the normal registers.  */
6195   if (REX_INT_REG_P (x))
6196     {
6197       if (!TARGET_64BIT)
6198         abort ();
6199       switch (code)
6200         {
6201           case 0:
6202             error ("extended registers have no high halves");
6203             break;
6204           case 1:
6205             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
6206             break;
6207           case 2:
6208             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
6209             break;
6210           case 4:
6211             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
6212             break;
6213           case 8:
6214             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
6215             break;
6216           default:
6217             error ("unsupported operand size for extended register");
6218             break;
6219         }
6220       return;
6221     }
6222   switch (code)
6223     {
6224     case 3:
6225       if (STACK_TOP_P (x))
6226         {
6227           fputs ("st(0)", file);
6228           break;
6229         }
6230       /* FALLTHRU */
6231     case 8:
6232     case 4:
6233     case 12:
6234       if (! ANY_FP_REG_P (x))
6235         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
6236       /* FALLTHRU */
6237     case 16:
6238     case 2:
6239     normal:
6240       fputs (hi_reg_name[REGNO (x)], file);
6241       break;
6242     case 1:
6243       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
6244         goto normal;
6245       fputs (qi_reg_name[REGNO (x)], file);
6246       break;
6247     case 0:
6248       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
6249         goto normal;
6250       fputs (qi_high_reg_name[REGNO (x)], file);
6251       break;
6252     default:
6253       abort ();
6254     }
6255 }
6256
6257 /* Locate some local-dynamic symbol still in use by this function
6258    so that we can print its name in some tls_local_dynamic_base
6259    pattern.  */
6260
6261 static const char *
6262 get_some_local_dynamic_name (void)
6263 {
6264   rtx insn;
6265
6266   if (cfun->machine->some_ld_name)
6267     return cfun->machine->some_ld_name;
6268
6269   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
6270     if (INSN_P (insn)
6271         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
6272       return cfun->machine->some_ld_name;
6273
6274   abort ();
6275 }
6276
6277 static int
6278 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
6279 {
6280   rtx x = *px;
6281
6282   if (GET_CODE (x) == SYMBOL_REF
6283       && local_dynamic_symbolic_operand (x, Pmode))
6284     {
6285       cfun->machine->some_ld_name = XSTR (x, 0);
6286       return 1;
6287     }
6288
6289   return 0;
6290 }
6291
6292 /* Meaning of CODE:
6293    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
6294    C -- print opcode suffix for set/cmov insn.
6295    c -- like C, but print reversed condition
6296    F,f -- likewise, but for floating-point.
6297    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
6298         otherwise nothing
6299    R -- print the prefix for register names.
6300    z -- print the opcode suffix for the size of the current operand.
6301    * -- print a star (in certain assembler syntax)
6302    A -- print an absolute memory reference.
6303    w -- print the operand as if it's a "word" (HImode) even if it isn't.
6304    s -- print a shift double count, followed by the assemblers argument
6305         delimiter.
6306    b -- print the QImode name of the register for the indicated operand.
6307         %b0 would print %al if operands[0] is reg 0.
6308    w --  likewise, print the HImode name of the register.
6309    k --  likewise, print the SImode name of the register.
6310    q --  likewise, print the DImode name of the register.
6311    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
6312    y -- print "st(0)" instead of "st" as a register.
6313    D -- print condition for SSE cmp instruction.
6314    P -- if PIC, print an @PLT suffix.
6315    X -- don't print any sort of PIC '@' suffix for a symbol.
6316    & -- print some in-use local-dynamic symbol name.
6317  */
6318
6319 void
6320 print_operand (FILE *file, rtx x, int code)
6321 {
6322   if (code)
6323     {
6324       switch (code)
6325         {
6326         case '*':
6327           if (ASSEMBLER_DIALECT == ASM_ATT)
6328             putc ('*', file);
6329           return;
6330
6331         case '&':
6332           assemble_name (file, get_some_local_dynamic_name ());
6333           return;
6334
6335         case 'A':
6336           if (ASSEMBLER_DIALECT == ASM_ATT)
6337             putc ('*', file);
6338           else if (ASSEMBLER_DIALECT == ASM_INTEL)
6339             {
6340               /* Intel syntax. For absolute addresses, registers should not
6341                  be surrounded by braces.  */
6342               if (GET_CODE (x) != REG)
6343                 {
6344                   putc ('[', file);
6345                   PRINT_OPERAND (file, x, 0);
6346                   putc (']', file);
6347                   return;
6348                 }
6349             }
6350           else
6351             abort ();
6352
6353           PRINT_OPERAND (file, x, 0);
6354           return;
6355
6356
6357         case 'L':
6358           if (ASSEMBLER_DIALECT == ASM_ATT)
6359             putc ('l', file);
6360           return;
6361
6362         case 'W':
6363           if (ASSEMBLER_DIALECT == ASM_ATT)
6364             putc ('w', file);
6365           return;
6366
6367         case 'B':
6368           if (ASSEMBLER_DIALECT == ASM_ATT)
6369             putc ('b', file);
6370           return;
6371
6372         case 'Q':
6373           if (ASSEMBLER_DIALECT == ASM_ATT)
6374             putc ('l', file);
6375           return;
6376
6377         case 'S':
6378           if (ASSEMBLER_DIALECT == ASM_ATT)
6379             putc ('s', file);
6380           return;
6381
6382         case 'T':
6383           if (ASSEMBLER_DIALECT == ASM_ATT)
6384             putc ('t', file);
6385           return;
6386
6387         case 'z':
6388           /* 387 opcodes don't get size suffixes if the operands are
6389              registers.  */
6390           if (STACK_REG_P (x))
6391             return;
6392
6393           /* Likewise if using Intel opcodes.  */
6394           if (ASSEMBLER_DIALECT == ASM_INTEL)
6395             return;
6396
6397           /* This is the size of op from size of operand.  */
6398           switch (GET_MODE_SIZE (GET_MODE (x)))
6399             {
6400             case 2:
6401 #ifdef HAVE_GAS_FILDS_FISTS
6402               putc ('s', file);
6403 #endif
6404               return;
6405
6406             case 4:
6407               if (GET_MODE (x) == SFmode)
6408                 {
6409                   putc ('s', file);
6410                   return;
6411                 }
6412               else
6413                 putc ('l', file);
6414               return;
6415
6416             case 12:
6417             case 16:
6418               putc ('t', file);
6419               return;
6420
6421             case 8:
6422               if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
6423                 {
6424 #ifdef GAS_MNEMONICS
6425                   putc ('q', file);
6426 #else
6427                   putc ('l', file);
6428                   putc ('l', file);
6429 #endif
6430                 }
6431               else
6432                 putc ('l', file);
6433               return;
6434
6435             default:
6436               abort ();
6437             }
6438
6439         case 'b':
6440         case 'w':
6441         case 'k':
6442         case 'q':
6443         case 'h':
6444         case 'y':
6445         case 'X':
6446         case 'P':
6447           break;
6448
6449         case 's':
6450           if (GET_CODE (x) == CONST_INT || ! SHIFT_DOUBLE_OMITS_COUNT)
6451             {
6452               PRINT_OPERAND (file, x, 0);
6453               putc (',', file);
6454             }
6455           return;
6456
6457         case 'D':
6458           /* Little bit of braindamage here.  The SSE compare instructions
6459              does use completely different names for the comparisons that the
6460              fp conditional moves.  */
6461           switch (GET_CODE (x))
6462             {
6463             case EQ:
6464             case UNEQ:
6465               fputs ("eq", file);
6466               break;
6467             case LT:
6468             case UNLT:
6469               fputs ("lt", file);
6470               break;
6471             case LE:
6472             case UNLE:
6473               fputs ("le", file);
6474               break;
6475             case UNORDERED:
6476               fputs ("unord", file);
6477               break;
6478             case NE:
6479             case LTGT:
6480               fputs ("neq", file);
6481               break;
6482             case UNGE:
6483             case GE:
6484               fputs ("nlt", file);
6485               break;
6486             case UNGT:
6487             case GT:
6488               fputs ("nle", file);
6489               break;
6490             case ORDERED:
6491               fputs ("ord", file);
6492               break;
6493             default:
6494               abort ();
6495               break;
6496             }
6497           return;
6498         case 'O':
6499 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
6500           if (ASSEMBLER_DIALECT == ASM_ATT)
6501             {
6502               switch (GET_MODE (x))
6503                 {
6504                 case HImode: putc ('w', file); break;
6505                 case SImode:
6506                 case SFmode: putc ('l', file); break;
6507                 case DImode:
6508                 case DFmode: putc ('q', file); break;
6509                 default: abort ();
6510                 }
6511               putc ('.', file);
6512             }
6513 #endif
6514           return;
6515         case 'C':
6516           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
6517           return;
6518         case 'F':
6519 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
6520           if (ASSEMBLER_DIALECT == ASM_ATT)
6521             putc ('.', file);
6522 #endif
6523           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
6524           return;
6525
6526           /* Like above, but reverse condition */
6527         case 'c':
6528           /* Check to see if argument to %c is really a constant
6529              and not a condition code which needs to be reversed.  */
6530           if (!COMPARISON_P (x))
6531           {
6532             output_operand_lossage ("operand is neither a constant nor a condition code, invalid operand code 'c'");
6533              return;
6534           }
6535           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
6536           return;
6537         case 'f':
6538 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
6539           if (ASSEMBLER_DIALECT == ASM_ATT)
6540             putc ('.', file);
6541 #endif
6542           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
6543           return;
6544         case '+':
6545           {
6546             rtx x;
6547
6548             if (!optimize || optimize_size || !TARGET_BRANCH_PREDICTION_HINTS)
6549               return;
6550
6551             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
6552             if (x)
6553               {
6554                 int pred_val = INTVAL (XEXP (x, 0));
6555
6556                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
6557                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
6558                   {
6559                     int taken = pred_val > REG_BR_PROB_BASE / 2;
6560                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
6561
6562                     /* Emit hints only in the case default branch prediction
6563                        heuristics would fail.  */
6564                     if (taken != cputaken)
6565                       {
6566                         /* We use 3e (DS) prefix for taken branches and
6567                            2e (CS) prefix for not taken branches.  */
6568                         if (taken)
6569                           fputs ("ds ; ", file);
6570                         else
6571                           fputs ("cs ; ", file);
6572                       }
6573                   }
6574               }
6575             return;
6576           }
6577         default:
6578             output_operand_lossage ("invalid operand code '%c'", code);
6579         }
6580     }
6581
6582   if (GET_CODE (x) == REG)
6583     print_reg (x, code, file);
6584
6585   else if (GET_CODE (x) == MEM)
6586     {
6587       /* No `byte ptr' prefix for call instructions.  */
6588       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P')
6589         {
6590           const char * size;
6591           switch (GET_MODE_SIZE (GET_MODE (x)))
6592             {
6593             case 1: size = "BYTE"; break;
6594             case 2: size = "WORD"; break;
6595             case 4: size = "DWORD"; break;
6596             case 8: size = "QWORD"; break;
6597             case 12: size = "XWORD"; break;
6598             case 16: size = "XMMWORD"; break;
6599             default:
6600               abort ();
6601             }
6602
6603           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
6604           if (code == 'b')
6605             size = "BYTE";
6606           else if (code == 'w')
6607             size = "WORD";
6608           else if (code == 'k')
6609             size = "DWORD";
6610
6611           fputs (size, file);
6612           fputs (" PTR ", file);
6613         }
6614
6615       x = XEXP (x, 0);
6616       /* Avoid (%rip) for call operands.  */
6617       if (CONSTANT_ADDRESS_P (x) && code == 'P'
6618                && GET_CODE (x) != CONST_INT)
6619         output_addr_const (file, x);
6620       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
6621         output_operand_lossage ("invalid constraints for operand");
6622       else
6623         output_address (x);
6624     }
6625
6626   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
6627     {
6628       REAL_VALUE_TYPE r;
6629       long l;
6630
6631       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
6632       REAL_VALUE_TO_TARGET_SINGLE (r, l);
6633
6634       if (ASSEMBLER_DIALECT == ASM_ATT)
6635         putc ('$', file);
6636       fprintf (file, "0x%08lx", l);
6637     }
6638
6639   /* These float cases don't actually occur as immediate operands.  */
6640   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
6641     {
6642       char dstr[30];
6643
6644       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
6645       fprintf (file, "%s", dstr);
6646     }
6647
6648   else if (GET_CODE (x) == CONST_DOUBLE
6649            && GET_MODE (x) == XFmode)
6650     {
6651       char dstr[30];
6652
6653       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
6654       fprintf (file, "%s", dstr);
6655     }
6656
6657   else
6658     {
6659       if (code != 'P')
6660         {
6661           if (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
6662             {
6663               if (ASSEMBLER_DIALECT == ASM_ATT)
6664                 putc ('$', file);
6665             }
6666           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
6667                    || GET_CODE (x) == LABEL_REF)
6668             {
6669               if (ASSEMBLER_DIALECT == ASM_ATT)
6670                 putc ('$', file);
6671               else
6672                 fputs ("OFFSET FLAT:", file);
6673             }
6674         }
6675       if (GET_CODE (x) == CONST_INT)
6676         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
6677       else if (flag_pic)
6678         output_pic_addr_const (file, x, code);
6679       else
6680         output_addr_const (file, x);
6681     }
6682 }
6683 \f
6684 /* Print a memory operand whose address is ADDR.  */
6685
6686 void
6687 print_operand_address (FILE *file, rtx addr)
6688 {
6689   struct ix86_address parts;
6690   rtx base, index, disp;
6691   int scale;
6692
6693   if (! ix86_decompose_address (addr, &parts))
6694     abort ();
6695
6696   base = parts.base;
6697   index = parts.index;
6698   disp = parts.disp;
6699   scale = parts.scale;
6700
6701   switch (parts.seg)
6702     {
6703     case SEG_DEFAULT:
6704       break;
6705     case SEG_FS:
6706     case SEG_GS:
6707       if (USER_LABEL_PREFIX[0] == 0)
6708         putc ('%', file);
6709       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
6710       break;
6711     default:
6712       abort ();
6713     }
6714
6715   if (!base && !index)
6716     {
6717       /* Displacement only requires special attention.  */
6718
6719       if (GET_CODE (disp) == CONST_INT)
6720         {
6721           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
6722             {
6723               if (USER_LABEL_PREFIX[0] == 0)
6724                 putc ('%', file);
6725               fputs ("ds:", file);
6726             }
6727           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
6728         }
6729       else if (flag_pic)
6730         output_pic_addr_const (file, disp, 0);
6731       else
6732         output_addr_const (file, disp);
6733
6734       /* Use one byte shorter RIP relative addressing for 64bit mode.  */
6735       if (TARGET_64BIT
6736           && ((GET_CODE (disp) == SYMBOL_REF
6737                && ! tls_symbolic_operand (disp, GET_MODE (disp)))
6738               || GET_CODE (disp) == LABEL_REF
6739               || (GET_CODE (disp) == CONST
6740                   && GET_CODE (XEXP (disp, 0)) == PLUS
6741                   && (GET_CODE (XEXP (XEXP (disp, 0), 0)) == SYMBOL_REF
6742                       || GET_CODE (XEXP (XEXP (disp, 0), 0)) == LABEL_REF)
6743                   && GET_CODE (XEXP (XEXP (disp, 0), 1)) == CONST_INT)))
6744         fputs ("(%rip)", file);
6745     }
6746   else
6747     {
6748       if (ASSEMBLER_DIALECT == ASM_ATT)
6749         {
6750           if (disp)
6751             {
6752               if (flag_pic)
6753                 output_pic_addr_const (file, disp, 0);
6754               else if (GET_CODE (disp) == LABEL_REF)
6755                 output_asm_label (disp);
6756               else
6757                 output_addr_const (file, disp);
6758             }
6759
6760           putc ('(', file);
6761           if (base)
6762             print_reg (base, 0, file);
6763           if (index)
6764             {
6765               putc (',', file);
6766               print_reg (index, 0, file);
6767               if (scale != 1)
6768                 fprintf (file, ",%d", scale);
6769             }
6770           putc (')', file);
6771         }
6772       else
6773         {
6774           rtx offset = NULL_RTX;
6775
6776           if (disp)
6777             {
6778               /* Pull out the offset of a symbol; print any symbol itself.  */
6779               if (GET_CODE (disp) == CONST
6780                   && GET_CODE (XEXP (disp, 0)) == PLUS
6781                   && GET_CODE (XEXP (XEXP (disp, 0), 1)) == CONST_INT)
6782                 {
6783                   offset = XEXP (XEXP (disp, 0), 1);
6784                   disp = gen_rtx_CONST (VOIDmode,
6785                                         XEXP (XEXP (disp, 0), 0));
6786                 }
6787
6788               if (flag_pic)
6789                 output_pic_addr_const (file, disp, 0);
6790               else if (GET_CODE (disp) == LABEL_REF)
6791                 output_asm_label (disp);
6792               else if (GET_CODE (disp) == CONST_INT)
6793                 offset = disp;
6794               else
6795                 output_addr_const (file, disp);
6796             }
6797
6798           putc ('[', file);
6799           if (base)
6800             {
6801               print_reg (base, 0, file);
6802               if (offset)
6803                 {
6804                   if (INTVAL (offset) >= 0)
6805                     putc ('+', file);
6806                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
6807                 }
6808             }
6809           else if (offset)
6810             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
6811           else
6812             putc ('0', file);
6813
6814           if (index)
6815             {
6816               putc ('+', file);
6817               print_reg (index, 0, file);
6818               if (scale != 1)
6819                 fprintf (file, "*%d", scale);
6820             }
6821           putc (']', file);
6822         }
6823     }
6824 }
6825
6826 bool
6827 output_addr_const_extra (FILE *file, rtx x)
6828 {
6829   rtx op;
6830
6831   if (GET_CODE (x) != UNSPEC)
6832     return false;
6833
6834   op = XVECEXP (x, 0, 0);
6835   switch (XINT (x, 1))
6836     {
6837     case UNSPEC_GOTTPOFF:
6838       output_addr_const (file, op);
6839       /* FIXME: This might be @TPOFF in Sun ld.  */
6840       fputs ("@GOTTPOFF", file);
6841       break;
6842     case UNSPEC_TPOFF:
6843       output_addr_const (file, op);
6844       fputs ("@TPOFF", file);
6845       break;
6846     case UNSPEC_NTPOFF:
6847       output_addr_const (file, op);
6848       if (TARGET_64BIT)
6849         fputs ("@TPOFF", file);
6850       else
6851         fputs ("@NTPOFF", file);
6852       break;
6853     case UNSPEC_DTPOFF:
6854       output_addr_const (file, op);
6855       fputs ("@DTPOFF", file);
6856       break;
6857     case UNSPEC_GOTNTPOFF:
6858       output_addr_const (file, op);
6859       if (TARGET_64BIT)
6860         fputs ("@GOTTPOFF(%rip)", file);
6861       else
6862         fputs ("@GOTNTPOFF", file);
6863       break;
6864     case UNSPEC_INDNTPOFF:
6865       output_addr_const (file, op);
6866       fputs ("@INDNTPOFF", file);
6867       break;
6868
6869     default:
6870       return false;
6871     }
6872
6873   return true;
6874 }
6875 \f
6876 /* Split one or more DImode RTL references into pairs of SImode
6877    references.  The RTL can be REG, offsettable MEM, integer constant, or
6878    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
6879    split and "num" is its length.  lo_half and hi_half are output arrays
6880    that parallel "operands".  */
6881
6882 void
6883 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
6884 {
6885   while (num--)
6886     {
6887       rtx op = operands[num];
6888
6889       /* simplify_subreg refuse to split volatile memory addresses,
6890          but we still have to handle it.  */
6891       if (GET_CODE (op) == MEM)
6892         {
6893           lo_half[num] = adjust_address (op, SImode, 0);
6894           hi_half[num] = adjust_address (op, SImode, 4);
6895         }
6896       else
6897         {
6898           lo_half[num] = simplify_gen_subreg (SImode, op,
6899                                               GET_MODE (op) == VOIDmode
6900                                               ? DImode : GET_MODE (op), 0);
6901           hi_half[num] = simplify_gen_subreg (SImode, op,
6902                                               GET_MODE (op) == VOIDmode
6903                                               ? DImode : GET_MODE (op), 4);
6904         }
6905     }
6906 }
6907 /* Split one or more TImode RTL references into pairs of SImode
6908    references.  The RTL can be REG, offsettable MEM, integer constant, or
6909    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
6910    split and "num" is its length.  lo_half and hi_half are output arrays
6911    that parallel "operands".  */
6912
6913 void
6914 split_ti (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
6915 {
6916   while (num--)
6917     {
6918       rtx op = operands[num];
6919
6920       /* simplify_subreg refuse to split volatile memory addresses, but we
6921          still have to handle it.  */
6922       if (GET_CODE (op) == MEM)
6923         {
6924           lo_half[num] = adjust_address (op, DImode, 0);
6925           hi_half[num] = adjust_address (op, DImode, 8);
6926         }
6927       else
6928         {
6929           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
6930           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
6931         }
6932     }
6933 }
6934 \f
6935 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
6936    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
6937    is the expression of the binary operation.  The output may either be
6938    emitted here, or returned to the caller, like all output_* functions.
6939
6940    There is no guarantee that the operands are the same mode, as they
6941    might be within FLOAT or FLOAT_EXTEND expressions.  */
6942
6943 #ifndef SYSV386_COMPAT
6944 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
6945    wants to fix the assemblers because that causes incompatibility
6946    with gcc.  No-one wants to fix gcc because that causes
6947    incompatibility with assemblers...  You can use the option of
6948    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
6949 #define SYSV386_COMPAT 1
6950 #endif
6951
6952 const char *
6953 output_387_binary_op (rtx insn, rtx *operands)
6954 {
6955   static char buf[30];
6956   const char *p;
6957   const char *ssep;
6958   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
6959
6960 #ifdef ENABLE_CHECKING
6961   /* Even if we do not want to check the inputs, this documents input
6962      constraints.  Which helps in understanding the following code.  */
6963   if (STACK_REG_P (operands[0])
6964       && ((REG_P (operands[1])
6965            && REGNO (operands[0]) == REGNO (operands[1])
6966            && (STACK_REG_P (operands[2]) || GET_CODE (operands[2]) == MEM))
6967           || (REG_P (operands[2])
6968               && REGNO (operands[0]) == REGNO (operands[2])
6969               && (STACK_REG_P (operands[1]) || GET_CODE (operands[1]) == MEM)))
6970       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
6971     ; /* ok */
6972   else if (!is_sse)
6973     abort ();
6974 #endif
6975
6976   switch (GET_CODE (operands[3]))
6977     {
6978     case PLUS:
6979       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
6980           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
6981         p = "fiadd";
6982       else
6983         p = "fadd";
6984       ssep = "add";
6985       break;
6986
6987     case MINUS:
6988       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
6989           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
6990         p = "fisub";
6991       else
6992         p = "fsub";
6993       ssep = "sub";
6994       break;
6995
6996     case MULT:
6997       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
6998           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
6999         p = "fimul";
7000       else
7001         p = "fmul";
7002       ssep = "mul";
7003       break;
7004
7005     case DIV:
7006       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
7007           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
7008         p = "fidiv";
7009       else
7010         p = "fdiv";
7011       ssep = "div";
7012       break;
7013
7014     default:
7015       abort ();
7016     }
7017
7018   if (is_sse)
7019    {
7020       strcpy (buf, ssep);
7021       if (GET_MODE (operands[0]) == SFmode)
7022         strcat (buf, "ss\t{%2, %0|%0, %2}");
7023       else
7024         strcat (buf, "sd\t{%2, %0|%0, %2}");
7025       return buf;
7026    }
7027   strcpy (buf, p);
7028
7029   switch (GET_CODE (operands[3]))
7030     {
7031     case MULT:
7032     case PLUS:
7033       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
7034         {
7035           rtx temp = operands[2];
7036           operands[2] = operands[1];
7037           operands[1] = temp;
7038         }
7039
7040       /* know operands[0] == operands[1].  */
7041
7042       if (GET_CODE (operands[2]) == MEM)
7043         {
7044           p = "%z2\t%2";
7045           break;
7046         }
7047
7048       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
7049         {
7050           if (STACK_TOP_P (operands[0]))
7051             /* How is it that we are storing to a dead operand[2]?
7052                Well, presumably operands[1] is dead too.  We can't
7053                store the result to st(0) as st(0) gets popped on this
7054                instruction.  Instead store to operands[2] (which I
7055                think has to be st(1)).  st(1) will be popped later.
7056                gcc <= 2.8.1 didn't have this check and generated
7057                assembly code that the Unixware assembler rejected.  */
7058             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
7059           else
7060             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
7061           break;
7062         }
7063
7064       if (STACK_TOP_P (operands[0]))
7065         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
7066       else
7067         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
7068       break;
7069
7070     case MINUS:
7071     case DIV:
7072       if (GET_CODE (operands[1]) == MEM)
7073         {
7074           p = "r%z1\t%1";
7075           break;
7076         }
7077
7078       if (GET_CODE (operands[2]) == MEM)
7079         {
7080           p = "%z2\t%2";
7081           break;
7082         }
7083
7084       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
7085         {
7086 #if SYSV386_COMPAT
7087           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
7088              derived assemblers, confusingly reverse the direction of
7089              the operation for fsub{r} and fdiv{r} when the
7090              destination register is not st(0).  The Intel assembler
7091              doesn't have this brain damage.  Read !SYSV386_COMPAT to
7092              figure out what the hardware really does.  */
7093           if (STACK_TOP_P (operands[0]))
7094             p = "{p\t%0, %2|rp\t%2, %0}";
7095           else
7096             p = "{rp\t%2, %0|p\t%0, %2}";
7097 #else
7098           if (STACK_TOP_P (operands[0]))
7099             /* As above for fmul/fadd, we can't store to st(0).  */
7100             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
7101           else
7102             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
7103 #endif
7104           break;
7105         }
7106
7107       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
7108         {
7109 #if SYSV386_COMPAT
7110           if (STACK_TOP_P (operands[0]))
7111             p = "{rp\t%0, %1|p\t%1, %0}";
7112           else
7113             p = "{p\t%1, %0|rp\t%0, %1}";
7114 #else
7115           if (STACK_TOP_P (operands[0]))
7116             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
7117           else
7118             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
7119 #endif
7120           break;
7121         }
7122
7123       if (STACK_TOP_P (operands[0]))
7124         {
7125           if (STACK_TOP_P (operands[1]))
7126             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
7127           else
7128             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
7129           break;
7130         }
7131       else if (STACK_TOP_P (operands[1]))
7132         {
7133 #if SYSV386_COMPAT
7134           p = "{\t%1, %0|r\t%0, %1}";
7135 #else
7136           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
7137 #endif
7138         }
7139       else
7140         {
7141 #if SYSV386_COMPAT
7142           p = "{r\t%2, %0|\t%0, %2}";
7143 #else
7144           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
7145 #endif
7146         }
7147       break;
7148
7149     default:
7150       abort ();
7151     }
7152
7153   strcat (buf, p);
7154   return buf;
7155 }
7156
7157 /* Output code to initialize control word copies used by trunc?f?i and
7158    rounding patterns.  CURRENT_MODE is set to current control word,
7159    while NEW_MODE is set to new control word.  */
7160
7161 void
7162 emit_i387_cw_initialization (rtx current_mode, rtx new_mode, int mode)
7163 {
7164   rtx reg = gen_reg_rtx (HImode);
7165
7166   emit_insn (gen_x86_fnstcw_1 (current_mode));
7167   emit_move_insn (reg, current_mode);
7168
7169   if (!TARGET_PARTIAL_REG_STALL && !optimize_size
7170       && !TARGET_64BIT)
7171     {
7172       switch (mode)
7173         {
7174         case I387_CW_FLOOR:
7175           /* round down toward -oo */
7176           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
7177           break;
7178
7179         case I387_CW_CEIL:
7180           /* round up toward +oo */
7181           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
7182           break;
7183
7184         case I387_CW_TRUNC:
7185           /* round toward zero (truncate) */
7186           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
7187           break;
7188  
7189         case I387_CW_MASK_PM:
7190           /* mask precision exception for nearbyint() */
7191           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
7192           break;
7193
7194         default:
7195           abort();
7196         }
7197     }
7198   else
7199     {
7200       switch (mode)
7201         {
7202         case I387_CW_FLOOR:
7203           /* round down toward -oo */
7204           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
7205           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
7206           break;
7207
7208         case I387_CW_CEIL:
7209           /* round up toward +oo */
7210           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
7211           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
7212           break;
7213
7214         case I387_CW_TRUNC:
7215           /* round toward zero (truncate) */
7216           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
7217           break;
7218
7219         case I387_CW_MASK_PM:
7220           /* mask precision exception for nearbyint() */
7221           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
7222           break;
7223
7224         default:
7225           abort();
7226         }
7227     }
7228
7229   emit_move_insn (new_mode, reg);
7230 }
7231
7232 /* Output code for INSN to convert a float to a signed int.  OPERANDS
7233    are the insn operands.  The output may be [HSD]Imode and the input
7234    operand may be [SDX]Fmode.  */
7235
7236 const char *
7237 output_fix_trunc (rtx insn, rtx *operands)
7238 {
7239   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
7240   int dimode_p = GET_MODE (operands[0]) == DImode;
7241
7242   /* Jump through a hoop or two for DImode, since the hardware has no
7243      non-popping instruction.  We used to do this a different way, but
7244      that was somewhat fragile and broke with post-reload splitters.  */
7245   if (dimode_p && !stack_top_dies)
7246     output_asm_insn ("fld\t%y1", operands);
7247
7248   if (!STACK_TOP_P (operands[1]))
7249     abort ();
7250
7251   if (GET_CODE (operands[0]) != MEM)
7252     abort ();
7253
7254   output_asm_insn ("fldcw\t%3", operands);
7255   if (stack_top_dies || dimode_p)
7256     output_asm_insn ("fistp%z0\t%0", operands);
7257   else
7258     output_asm_insn ("fist%z0\t%0", operands);
7259   output_asm_insn ("fldcw\t%2", operands);
7260
7261   return "";
7262 }
7263
7264 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
7265    should be used.  UNORDERED_P is true when fucom should be used.  */
7266
7267 const char *
7268 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
7269 {
7270   int stack_top_dies;
7271   rtx cmp_op0, cmp_op1;
7272   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
7273
7274   if (eflags_p)
7275     {
7276       cmp_op0 = operands[0];
7277       cmp_op1 = operands[1];
7278     }
7279   else
7280     {
7281       cmp_op0 = operands[1];
7282       cmp_op1 = operands[2];
7283     }
7284
7285   if (is_sse)
7286     {
7287       if (GET_MODE (operands[0]) == SFmode)
7288         if (unordered_p)
7289           return "ucomiss\t{%1, %0|%0, %1}";
7290         else
7291           return "comiss\t{%1, %0|%0, %1}";
7292       else
7293         if (unordered_p)
7294           return "ucomisd\t{%1, %0|%0, %1}";
7295         else
7296           return "comisd\t{%1, %0|%0, %1}";
7297     }
7298
7299   if (! STACK_TOP_P (cmp_op0))
7300     abort ();
7301
7302   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
7303
7304   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
7305     {
7306       if (stack_top_dies)
7307         {
7308           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
7309           return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
7310         }
7311       else
7312         return "ftst\n\tfnstsw\t%0";
7313     }
7314
7315   if (STACK_REG_P (cmp_op1)
7316       && stack_top_dies
7317       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
7318       && REGNO (cmp_op1) != FIRST_STACK_REG)
7319     {
7320       /* If both the top of the 387 stack dies, and the other operand
7321          is also a stack register that dies, then this must be a
7322          `fcompp' float compare */
7323
7324       if (eflags_p)
7325         {
7326           /* There is no double popping fcomi variant.  Fortunately,
7327              eflags is immune from the fstp's cc clobbering.  */
7328           if (unordered_p)
7329             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
7330           else
7331             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
7332           return TARGET_USE_FFREEP ? "ffreep\t%y0" : "fstp\t%y0";
7333         }
7334       else
7335         {
7336           if (unordered_p)
7337             return "fucompp\n\tfnstsw\t%0";
7338           else
7339             return "fcompp\n\tfnstsw\t%0";
7340         }
7341     }
7342   else
7343     {
7344       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
7345
7346       static const char * const alt[16] =
7347       {
7348         "fcom%z2\t%y2\n\tfnstsw\t%0",
7349         "fcomp%z2\t%y2\n\tfnstsw\t%0",
7350         "fucom%z2\t%y2\n\tfnstsw\t%0",
7351         "fucomp%z2\t%y2\n\tfnstsw\t%0",
7352
7353         "ficom%z2\t%y2\n\tfnstsw\t%0",
7354         "ficomp%z2\t%y2\n\tfnstsw\t%0",
7355         NULL,
7356         NULL,
7357
7358         "fcomi\t{%y1, %0|%0, %y1}",
7359         "fcomip\t{%y1, %0|%0, %y1}",
7360         "fucomi\t{%y1, %0|%0, %y1}",
7361         "fucomip\t{%y1, %0|%0, %y1}",
7362
7363         NULL,
7364         NULL,
7365         NULL,
7366         NULL
7367       };
7368
7369       int mask;
7370       const char *ret;
7371
7372       mask  = eflags_p << 3;
7373       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
7374       mask |= unordered_p << 1;
7375       mask |= stack_top_dies;
7376
7377       if (mask >= 16)
7378         abort ();
7379       ret = alt[mask];
7380       if (ret == NULL)
7381         abort ();
7382
7383       return ret;
7384     }
7385 }
7386
7387 void
7388 ix86_output_addr_vec_elt (FILE *file, int value)
7389 {
7390   const char *directive = ASM_LONG;
7391
7392   if (TARGET_64BIT)
7393     {
7394 #ifdef ASM_QUAD
7395       directive = ASM_QUAD;
7396 #else
7397       abort ();
7398 #endif
7399     }
7400
7401   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
7402 }
7403
7404 void
7405 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
7406 {
7407   if (TARGET_64BIT)
7408     fprintf (file, "%s%s%d-%s%d\n",
7409              ASM_LONG, LPREFIX, value, LPREFIX, rel);
7410   else if (HAVE_AS_GOTOFF_IN_DATA)
7411     fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value);
7412 #if TARGET_MACHO
7413   else if (TARGET_MACHO)
7414     {
7415       fprintf (file, "%s%s%d-", ASM_LONG, LPREFIX, value);
7416       machopic_output_function_base_name (file);
7417       fprintf(file, "\n");
7418     }
7419 #endif
7420   else
7421     asm_fprintf (file, "%s%U%s+[.-%s%d]\n",
7422                  ASM_LONG, GOT_SYMBOL_NAME, LPREFIX, value);
7423 }
7424 \f
7425 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
7426    for the target.  */
7427
7428 void
7429 ix86_expand_clear (rtx dest)
7430 {
7431   rtx tmp;
7432
7433   /* We play register width games, which are only valid after reload.  */
7434   if (!reload_completed)
7435     abort ();
7436
7437   /* Avoid HImode and its attendant prefix byte.  */
7438   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
7439     dest = gen_rtx_REG (SImode, REGNO (dest));
7440
7441   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
7442
7443   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
7444   if (reload_completed && (!TARGET_USE_MOV0 || optimize_size))
7445     {
7446       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, 17));
7447       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
7448     }
7449
7450   emit_insn (tmp);
7451 }
7452
7453 /* X is an unchanging MEM.  If it is a constant pool reference, return
7454    the constant pool rtx, else NULL.  */
7455
7456 rtx
7457 maybe_get_pool_constant (rtx x)
7458 {
7459   x = ix86_delegitimize_address (XEXP (x, 0));
7460
7461   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
7462     return get_pool_constant (x);
7463
7464   return NULL_RTX;
7465 }
7466
7467 void
7468 ix86_expand_move (enum machine_mode mode, rtx operands[])
7469 {
7470   int strict = (reload_in_progress || reload_completed);
7471   rtx op0, op1;
7472   enum tls_model model;
7473
7474   op0 = operands[0];
7475   op1 = operands[1];
7476
7477   model = GET_CODE (op1) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (op1) : 0;
7478   if (model)
7479     {
7480       op1 = legitimize_tls_address (op1, model, true);
7481       op1 = force_operand (op1, op0);
7482       if (op1 == op0)
7483         return;
7484     }
7485
7486   if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
7487     {
7488 #if TARGET_MACHO
7489       if (MACHOPIC_PURE)
7490         {
7491           rtx temp = ((reload_in_progress
7492                        || ((op0 && GET_CODE (op0) == REG)
7493                            && mode == Pmode))
7494                       ? op0 : gen_reg_rtx (Pmode));
7495           op1 = machopic_indirect_data_reference (op1, temp);
7496           op1 = machopic_legitimize_pic_address (op1, mode,
7497                                                  temp == op1 ? 0 : temp);
7498         }
7499       else if (MACHOPIC_INDIRECT)
7500         op1 = machopic_indirect_data_reference (op1, 0);
7501       if (op0 == op1)
7502         return;
7503 #else
7504       if (GET_CODE (op0) == MEM)
7505         op1 = force_reg (Pmode, op1);
7506       else
7507         op1 = legitimize_address (op1, op1, Pmode);
7508 #endif /* TARGET_MACHO */
7509     }
7510   else
7511     {
7512       if (GET_CODE (op0) == MEM
7513           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
7514               || !push_operand (op0, mode))
7515           && GET_CODE (op1) == MEM)
7516         op1 = force_reg (mode, op1);
7517
7518       if (push_operand (op0, mode)
7519           && ! general_no_elim_operand (op1, mode))
7520         op1 = copy_to_mode_reg (mode, op1);
7521
7522       /* Force large constants in 64bit compilation into register
7523          to get them CSEed.  */
7524       if (TARGET_64BIT && mode == DImode
7525           && immediate_operand (op1, mode)
7526           && !x86_64_zext_immediate_operand (op1, VOIDmode)
7527           && !register_operand (op0, mode)
7528           && optimize && !reload_completed && !reload_in_progress)
7529         op1 = copy_to_mode_reg (mode, op1);
7530
7531       if (FLOAT_MODE_P (mode))
7532         {
7533           /* If we are loading a floating point constant to a register,
7534              force the value to memory now, since we'll get better code
7535              out the back end.  */
7536
7537           if (strict)
7538             ;
7539           else if (GET_CODE (op1) == CONST_DOUBLE)
7540             {
7541               op1 = validize_mem (force_const_mem (mode, op1));
7542               if (!register_operand (op0, mode))
7543                 {
7544                   rtx temp = gen_reg_rtx (mode);
7545                   emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
7546                   emit_move_insn (op0, temp);
7547                   return;
7548                 }
7549             }
7550         }
7551     }
7552
7553   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
7554 }
7555
7556 void
7557 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
7558 {
7559   /* Force constants other than zero into memory.  We do not know how
7560      the instructions used to build constants modify the upper 64 bits
7561      of the register, once we have that information we may be able
7562      to handle some of them more efficiently.  */
7563   if ((reload_in_progress | reload_completed) == 0
7564       && register_operand (operands[0], mode)
7565       && CONSTANT_P (operands[1]) && operands[1] != CONST0_RTX (mode))
7566     operands[1] = validize_mem (force_const_mem (mode, operands[1]));
7567
7568   /* Make operand1 a register if it isn't already.  */
7569   if (!no_new_pseudos
7570       && !register_operand (operands[0], mode)
7571       && !register_operand (operands[1], mode))
7572     {
7573       rtx temp = force_reg (GET_MODE (operands[1]), operands[1]);
7574       emit_move_insn (operands[0], temp);
7575       return;
7576     }
7577
7578   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7579 }
7580
7581 /* Attempt to expand a binary operator.  Make the expansion closer to the
7582    actual machine, then just general_operand, which will allow 3 separate
7583    memory references (one output, two input) in a single insn.  */
7584
7585 void
7586 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
7587                              rtx operands[])
7588 {
7589   int matching_memory;
7590   rtx src1, src2, dst, op, clob;
7591
7592   dst = operands[0];
7593   src1 = operands[1];
7594   src2 = operands[2];
7595
7596   /* Recognize <var1> = <value> <op> <var1> for commutative operators */
7597   if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
7598       && (rtx_equal_p (dst, src2)
7599           || immediate_operand (src1, mode)))
7600     {
7601       rtx temp = src1;
7602       src1 = src2;
7603       src2 = temp;
7604     }
7605
7606   /* If the destination is memory, and we do not have matching source
7607      operands, do things in registers.  */
7608   matching_memory = 0;
7609   if (GET_CODE (dst) == MEM)
7610     {
7611       if (rtx_equal_p (dst, src1))
7612         matching_memory = 1;
7613       else if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
7614                && rtx_equal_p (dst, src2))
7615         matching_memory = 2;
7616       else
7617         dst = gen_reg_rtx (mode);
7618     }
7619
7620   /* Both source operands cannot be in memory.  */
7621   if (GET_CODE (src1) == MEM && GET_CODE (src2) == MEM)
7622     {
7623       if (matching_memory != 2)
7624         src2 = force_reg (mode, src2);
7625       else
7626         src1 = force_reg (mode, src1);
7627     }
7628
7629   /* If the operation is not commutable, source 1 cannot be a constant
7630      or non-matching memory.  */
7631   if ((CONSTANT_P (src1)
7632        || (!matching_memory && GET_CODE (src1) == MEM))
7633       && GET_RTX_CLASS (code) != RTX_COMM_ARITH)
7634     src1 = force_reg (mode, src1);
7635
7636   /* If optimizing, copy to regs to improve CSE */
7637   if (optimize && ! no_new_pseudos)
7638     {
7639       if (GET_CODE (dst) == MEM)
7640         dst = gen_reg_rtx (mode);
7641       if (GET_CODE (src1) == MEM)
7642         src1 = force_reg (mode, src1);
7643       if (GET_CODE (src2) == MEM)
7644         src2 = force_reg (mode, src2);
7645     }
7646
7647   /* Emit the instruction.  */
7648
7649   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
7650   if (reload_in_progress)
7651     {
7652       /* Reload doesn't know about the flags register, and doesn't know that
7653          it doesn't want to clobber it.  We can only do this with PLUS.  */
7654       if (code != PLUS)
7655         abort ();
7656       emit_insn (op);
7657     }
7658   else
7659     {
7660       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
7661       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
7662     }
7663
7664   /* Fix up the destination if needed.  */
7665   if (dst != operands[0])
7666     emit_move_insn (operands[0], dst);
7667 }
7668
7669 /* Return TRUE or FALSE depending on whether the binary operator meets the
7670    appropriate constraints.  */
7671
7672 int
7673 ix86_binary_operator_ok (enum rtx_code code,
7674                          enum machine_mode mode ATTRIBUTE_UNUSED,
7675                          rtx operands[3])
7676 {
7677   /* Both source operands cannot be in memory.  */
7678   if (GET_CODE (operands[1]) == MEM && GET_CODE (operands[2]) == MEM)
7679     return 0;
7680   /* If the operation is not commutable, source 1 cannot be a constant.  */
7681   if (CONSTANT_P (operands[1]) && GET_RTX_CLASS (code) != RTX_COMM_ARITH)
7682     return 0;
7683   /* If the destination is memory, we must have a matching source operand.  */
7684   if (GET_CODE (operands[0]) == MEM
7685       && ! (rtx_equal_p (operands[0], operands[1])
7686             || (GET_RTX_CLASS (code) == RTX_COMM_ARITH
7687                 && rtx_equal_p (operands[0], operands[2]))))
7688     return 0;
7689   /* If the operation is not commutable and the source 1 is memory, we must
7690      have a matching destination.  */
7691   if (GET_CODE (operands[1]) == MEM
7692       && GET_RTX_CLASS (code) != RTX_COMM_ARITH
7693       && ! rtx_equal_p (operands[0], operands[1]))
7694     return 0;
7695   return 1;
7696 }
7697
7698 /* Attempt to expand a unary operator.  Make the expansion closer to the
7699    actual machine, then just general_operand, which will allow 2 separate
7700    memory references (one output, one input) in a single insn.  */
7701
7702 void
7703 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
7704                             rtx operands[])
7705 {
7706   int matching_memory;
7707   rtx src, dst, op, clob;
7708
7709   dst = operands[0];
7710   src = operands[1];
7711
7712   /* If the destination is memory, and we do not have matching source
7713      operands, do things in registers.  */
7714   matching_memory = 0;
7715   if (MEM_P (dst))
7716     {
7717       if (rtx_equal_p (dst, src))
7718         matching_memory = 1;
7719       else
7720         dst = gen_reg_rtx (mode);
7721     }
7722
7723   /* When source operand is memory, destination must match.  */
7724   if (MEM_P (src) && !matching_memory)
7725     src = force_reg (mode, src);
7726
7727   /* If optimizing, copy to regs to improve CSE.  */
7728   if (optimize && ! no_new_pseudos)
7729     {
7730       if (GET_CODE (dst) == MEM)
7731         dst = gen_reg_rtx (mode);
7732       if (GET_CODE (src) == MEM)
7733         src = force_reg (mode, src);
7734     }
7735
7736   /* Emit the instruction.  */
7737
7738   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
7739   if (reload_in_progress || code == NOT)
7740     {
7741       /* Reload doesn't know about the flags register, and doesn't know that
7742          it doesn't want to clobber it.  */
7743       if (code != NOT)
7744         abort ();
7745       emit_insn (op);
7746     }
7747   else
7748     {
7749       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
7750       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
7751     }
7752
7753   /* Fix up the destination if needed.  */
7754   if (dst != operands[0])
7755     emit_move_insn (operands[0], dst);
7756 }
7757
7758 /* Return TRUE or FALSE depending on whether the unary operator meets the
7759    appropriate constraints.  */
7760
7761 int
7762 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
7763                         enum machine_mode mode ATTRIBUTE_UNUSED,
7764                         rtx operands[2] ATTRIBUTE_UNUSED)
7765 {
7766   /* If one of operands is memory, source and destination must match.  */
7767   if ((GET_CODE (operands[0]) == MEM
7768        || GET_CODE (operands[1]) == MEM)
7769       && ! rtx_equal_p (operands[0], operands[1]))
7770     return FALSE;
7771   return TRUE;
7772 }
7773
7774 /* Generate code for floating point ABS or NEG.  */
7775
7776 void
7777 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
7778                                 rtx operands[])
7779 {
7780   rtx mask, set, use, clob, dst, src;
7781   bool matching_memory;
7782   bool use_sse = false;
7783
7784   if (TARGET_SSE_MATH)
7785     {
7786       if (mode == SFmode)
7787         use_sse = true;
7788       else if (mode == DFmode && TARGET_SSE2)
7789         use_sse = true;
7790     }
7791
7792   /* NEG and ABS performed with SSE use bitwise mask operations.
7793      Create the appropriate mask now.  */
7794   if (use_sse)
7795     {
7796       HOST_WIDE_INT hi, lo;
7797       int shift = 63;
7798
7799       /* Find the sign bit, sign extended to 2*HWI.  */
7800       if (mode == SFmode)
7801         lo = 0x80000000, hi = lo < 0;
7802       else if (HOST_BITS_PER_WIDE_INT >= 64)
7803         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
7804       else
7805         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
7806
7807       /* If we're looking for the absolute value, then we want
7808          the compliment.  */
7809       if (code == ABS)
7810         lo = ~lo, hi = ~hi;
7811
7812       /* Force this value into the low part of a fp vector constant.  */
7813       mask = immed_double_const (lo, hi, mode == SFmode ? SImode : DImode);
7814       mask = gen_lowpart (mode, mask);
7815       if (mode == SFmode)
7816         mask = gen_rtx_CONST_VECTOR (V4SFmode,
7817                                      gen_rtvec (4, mask, CONST0_RTX (SFmode),
7818                                                 CONST0_RTX (SFmode),
7819                                                 CONST0_RTX (SFmode)));
7820       else
7821         mask = gen_rtx_CONST_VECTOR (V2DFmode,
7822                                      gen_rtvec (2, mask, CONST0_RTX (DFmode)));
7823       mask = force_reg (GET_MODE (mask), mask);
7824     }
7825   else
7826     {
7827       /* When not using SSE, we don't use the mask, but prefer to keep the
7828          same general form of the insn pattern to reduce duplication when
7829          it comes time to split.  */
7830       mask = const0_rtx;
7831     }
7832
7833   dst = operands[0];
7834   src = operands[1];
7835
7836   /* If the destination is memory, and we don't have matching source
7837      operands, do things in registers.  */
7838   matching_memory = false;
7839   if (MEM_P (dst))
7840     {
7841       if (rtx_equal_p (dst, src) && (!optimize || no_new_pseudos))
7842         matching_memory = true;
7843       else
7844         dst = gen_reg_rtx (mode);
7845     }
7846   if (MEM_P (src) && !matching_memory)
7847     src = force_reg (mode, src);
7848
7849   set = gen_rtx_fmt_e (code, mode, src);
7850   set = gen_rtx_SET (VOIDmode, dst, set);
7851   use = gen_rtx_USE (VOIDmode, mask);
7852   clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
7853   emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (3, set, use, clob)));
7854
7855   if (dst != operands[0])
7856     emit_move_insn (operands[0], dst);
7857 }
7858
7859 /* Return TRUE or FALSE depending on whether the first SET in INSN
7860    has source and destination with matching CC modes, and that the
7861    CC mode is at least as constrained as REQ_MODE.  */
7862
7863 int
7864 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
7865 {
7866   rtx set;
7867   enum machine_mode set_mode;
7868
7869   set = PATTERN (insn);
7870   if (GET_CODE (set) == PARALLEL)
7871     set = XVECEXP (set, 0, 0);
7872   if (GET_CODE (set) != SET)
7873     abort ();
7874   if (GET_CODE (SET_SRC (set)) != COMPARE)
7875     abort ();
7876
7877   set_mode = GET_MODE (SET_DEST (set));
7878   switch (set_mode)
7879     {
7880     case CCNOmode:
7881       if (req_mode != CCNOmode
7882           && (req_mode != CCmode
7883               || XEXP (SET_SRC (set), 1) != const0_rtx))
7884         return 0;
7885       break;
7886     case CCmode:
7887       if (req_mode == CCGCmode)
7888         return 0;
7889       /* FALLTHRU */
7890     case CCGCmode:
7891       if (req_mode == CCGOCmode || req_mode == CCNOmode)
7892         return 0;
7893       /* FALLTHRU */
7894     case CCGOCmode:
7895       if (req_mode == CCZmode)
7896         return 0;
7897       /* FALLTHRU */
7898     case CCZmode:
7899       break;
7900
7901     default:
7902       abort ();
7903     }
7904
7905   return (GET_MODE (SET_SRC (set)) == set_mode);
7906 }
7907
7908 /* Generate insn patterns to do an integer compare of OPERANDS.  */
7909
7910 static rtx
7911 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
7912 {
7913   enum machine_mode cmpmode;
7914   rtx tmp, flags;
7915
7916   cmpmode = SELECT_CC_MODE (code, op0, op1);
7917   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
7918
7919   /* This is very simple, but making the interface the same as in the
7920      FP case makes the rest of the code easier.  */
7921   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
7922   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
7923
7924   /* Return the test that should be put into the flags user, i.e.
7925      the bcc, scc, or cmov instruction.  */
7926   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
7927 }
7928
7929 /* Figure out whether to use ordered or unordered fp comparisons.
7930    Return the appropriate mode to use.  */
7931
7932 enum machine_mode
7933 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
7934 {
7935   /* ??? In order to make all comparisons reversible, we do all comparisons
7936      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
7937      all forms trapping and nontrapping comparisons, we can make inequality
7938      comparisons trapping again, since it results in better code when using
7939      FCOM based compares.  */
7940   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
7941 }
7942
7943 enum machine_mode
7944 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
7945 {
7946   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
7947     return ix86_fp_compare_mode (code);
7948   switch (code)
7949     {
7950       /* Only zero flag is needed.  */
7951     case EQ:                    /* ZF=0 */
7952     case NE:                    /* ZF!=0 */
7953       return CCZmode;
7954       /* Codes needing carry flag.  */
7955     case GEU:                   /* CF=0 */
7956     case GTU:                   /* CF=0 & ZF=0 */
7957     case LTU:                   /* CF=1 */
7958     case LEU:                   /* CF=1 | ZF=1 */
7959       return CCmode;
7960       /* Codes possibly doable only with sign flag when
7961          comparing against zero.  */
7962     case GE:                    /* SF=OF   or   SF=0 */
7963     case LT:                    /* SF<>OF  or   SF=1 */
7964       if (op1 == const0_rtx)
7965         return CCGOCmode;
7966       else
7967         /* For other cases Carry flag is not required.  */
7968         return CCGCmode;
7969       /* Codes doable only with sign flag when comparing
7970          against zero, but we miss jump instruction for it
7971          so we need to use relational tests against overflow
7972          that thus needs to be zero.  */
7973     case GT:                    /* ZF=0 & SF=OF */
7974     case LE:                    /* ZF=1 | SF<>OF */
7975       if (op1 == const0_rtx)
7976         return CCNOmode;
7977       else
7978         return CCGCmode;
7979       /* strcmp pattern do (use flags) and combine may ask us for proper
7980          mode.  */
7981     case USE:
7982       return CCmode;
7983     default:
7984       abort ();
7985     }
7986 }
7987
7988 /* Return the fixed registers used for condition codes.  */
7989
7990 static bool
7991 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
7992 {
7993   *p1 = FLAGS_REG;
7994   *p2 = FPSR_REG;
7995   return true;
7996 }
7997
7998 /* If two condition code modes are compatible, return a condition code
7999    mode which is compatible with both.  Otherwise, return
8000    VOIDmode.  */
8001
8002 static enum machine_mode
8003 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
8004 {
8005   if (m1 == m2)
8006     return m1;
8007
8008   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
8009     return VOIDmode;
8010
8011   if ((m1 == CCGCmode && m2 == CCGOCmode)
8012       || (m1 == CCGOCmode && m2 == CCGCmode))
8013     return CCGCmode;
8014
8015   switch (m1)
8016     {
8017     default:
8018       abort ();
8019
8020     case CCmode:
8021     case CCGCmode:
8022     case CCGOCmode:
8023     case CCNOmode:
8024     case CCZmode:
8025       switch (m2)
8026         {
8027         default:
8028           return VOIDmode;
8029
8030         case CCmode:
8031         case CCGCmode:
8032         case CCGOCmode:
8033         case CCNOmode:
8034         case CCZmode:
8035           return CCmode;
8036         }
8037
8038     case CCFPmode:
8039     case CCFPUmode:
8040       /* These are only compatible with themselves, which we already
8041          checked above.  */
8042       return VOIDmode;
8043     }
8044 }
8045
8046 /* Return true if we should use an FCOMI instruction for this fp comparison.  */
8047
8048 int
8049 ix86_use_fcomi_compare (enum rtx_code code ATTRIBUTE_UNUSED)
8050 {
8051   enum rtx_code swapped_code = swap_condition (code);
8052   return ((ix86_fp_comparison_cost (code) == ix86_fp_comparison_fcomi_cost (code))
8053           || (ix86_fp_comparison_cost (swapped_code)
8054               == ix86_fp_comparison_fcomi_cost (swapped_code)));
8055 }
8056
8057 /* Swap, force into registers, or otherwise massage the two operands
8058    to a fp comparison.  The operands are updated in place; the new
8059    comparison code is returned.  */
8060
8061 static enum rtx_code
8062 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
8063 {
8064   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
8065   rtx op0 = *pop0, op1 = *pop1;
8066   enum machine_mode op_mode = GET_MODE (op0);
8067   int is_sse = SSE_REG_P (op0) || SSE_REG_P (op1);
8068
8069   /* All of the unordered compare instructions only work on registers.
8070      The same is true of the fcomi compare instructions.  The same is
8071      true of the XFmode compare instructions if not comparing with
8072      zero (ftst insn is used in this case).  */
8073
8074   if (!is_sse
8075       && (fpcmp_mode == CCFPUmode
8076           || (op_mode == XFmode
8077               && ! (standard_80387_constant_p (op0) == 1
8078                     || standard_80387_constant_p (op1) == 1))
8079           || ix86_use_fcomi_compare (code)))
8080     {
8081       op0 = force_reg (op_mode, op0);
8082       op1 = force_reg (op_mode, op1);
8083     }
8084   else
8085     {
8086       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
8087          things around if they appear profitable, otherwise force op0
8088          into a register.  */
8089
8090       if (standard_80387_constant_p (op0) == 0
8091           || (GET_CODE (op0) == MEM
8092               && ! (standard_80387_constant_p (op1) == 0
8093                     || GET_CODE (op1) == MEM)))
8094         {
8095           rtx tmp;
8096           tmp = op0, op0 = op1, op1 = tmp;
8097           code = swap_condition (code);
8098         }
8099
8100       if (GET_CODE (op0) != REG)
8101         op0 = force_reg (op_mode, op0);
8102
8103       if (CONSTANT_P (op1))
8104         {
8105           int tmp = standard_80387_constant_p (op1);
8106           if (tmp == 0)
8107             op1 = validize_mem (force_const_mem (op_mode, op1));
8108           else if (tmp == 1)
8109             {
8110               if (TARGET_CMOVE)
8111                 op1 = force_reg (op_mode, op1);
8112             }
8113           else
8114             op1 = force_reg (op_mode, op1);
8115         }
8116     }
8117
8118   /* Try to rearrange the comparison to make it cheaper.  */
8119   if (ix86_fp_comparison_cost (code)
8120       > ix86_fp_comparison_cost (swap_condition (code))
8121       && (GET_CODE (op1) == REG || !no_new_pseudos))
8122     {
8123       rtx tmp;
8124       tmp = op0, op0 = op1, op1 = tmp;
8125       code = swap_condition (code);
8126       if (GET_CODE (op0) != REG)
8127         op0 = force_reg (op_mode, op0);
8128     }
8129
8130   *pop0 = op0;
8131   *pop1 = op1;
8132   return code;
8133 }
8134
8135 /* Convert comparison codes we use to represent FP comparison to integer
8136    code that will result in proper branch.  Return UNKNOWN if no such code
8137    is available.  */
8138
8139 enum rtx_code
8140 ix86_fp_compare_code_to_integer (enum rtx_code code)
8141 {
8142   switch (code)
8143     {
8144     case GT:
8145       return GTU;
8146     case GE:
8147       return GEU;
8148     case ORDERED:
8149     case UNORDERED:
8150       return code;
8151       break;
8152     case UNEQ:
8153       return EQ;
8154       break;
8155     case UNLT:
8156       return LTU;
8157       break;
8158     case UNLE:
8159       return LEU;
8160       break;
8161     case LTGT:
8162       return NE;
8163       break;
8164     default:
8165       return UNKNOWN;
8166     }
8167 }
8168
8169 /* Split comparison code CODE into comparisons we can do using branch
8170    instructions.  BYPASS_CODE is comparison code for branch that will
8171    branch around FIRST_CODE and SECOND_CODE.  If some of branches
8172    is not required, set value to UNKNOWN.
8173    We never require more than two branches.  */
8174
8175 void
8176 ix86_fp_comparison_codes (enum rtx_code code, enum rtx_code *bypass_code,
8177                           enum rtx_code *first_code,
8178                           enum rtx_code *second_code)
8179 {
8180   *first_code = code;
8181   *bypass_code = UNKNOWN;
8182   *second_code = UNKNOWN;
8183
8184   /* The fcomi comparison sets flags as follows:
8185
8186      cmp    ZF PF CF
8187      >      0  0  0
8188      <      0  0  1
8189      =      1  0  0
8190      un     1  1  1 */
8191
8192   switch (code)
8193     {
8194     case GT:                    /* GTU - CF=0 & ZF=0 */
8195     case GE:                    /* GEU - CF=0 */
8196     case ORDERED:               /* PF=0 */
8197     case UNORDERED:             /* PF=1 */
8198     case UNEQ:                  /* EQ - ZF=1 */
8199     case UNLT:                  /* LTU - CF=1 */
8200     case UNLE:                  /* LEU - CF=1 | ZF=1 */
8201     case LTGT:                  /* EQ - ZF=0 */
8202       break;
8203     case LT:                    /* LTU - CF=1 - fails on unordered */
8204       *first_code = UNLT;
8205       *bypass_code = UNORDERED;
8206       break;
8207     case LE:                    /* LEU - CF=1 | ZF=1 - fails on unordered */
8208       *first_code = UNLE;
8209       *bypass_code = UNORDERED;
8210       break;
8211     case EQ:                    /* EQ - ZF=1 - fails on unordered */
8212       *first_code = UNEQ;
8213       *bypass_code = UNORDERED;
8214       break;
8215     case NE:                    /* NE - ZF=0 - fails on unordered */
8216       *first_code = LTGT;
8217       *second_code = UNORDERED;
8218       break;
8219     case UNGE:                  /* GEU - CF=0 - fails on unordered */
8220       *first_code = GE;
8221       *second_code = UNORDERED;
8222       break;
8223     case UNGT:                  /* GTU - CF=0 & ZF=0 - fails on unordered */
8224       *first_code = GT;
8225       *second_code = UNORDERED;
8226       break;
8227     default:
8228       abort ();
8229     }
8230   if (!TARGET_IEEE_FP)
8231     {
8232       *second_code = UNKNOWN;
8233       *bypass_code = UNKNOWN;
8234     }
8235 }
8236
8237 /* Return cost of comparison done fcom + arithmetics operations on AX.
8238    All following functions do use number of instructions as a cost metrics.
8239    In future this should be tweaked to compute bytes for optimize_size and
8240    take into account performance of various instructions on various CPUs.  */
8241 static int
8242 ix86_fp_comparison_arithmetics_cost (enum rtx_code code)
8243 {
8244   if (!TARGET_IEEE_FP)
8245     return 4;
8246   /* The cost of code output by ix86_expand_fp_compare.  */
8247   switch (code)
8248     {
8249     case UNLE:
8250     case UNLT:
8251     case LTGT:
8252     case GT:
8253     case GE:
8254     case UNORDERED:
8255     case ORDERED:
8256     case UNEQ:
8257       return 4;
8258       break;
8259     case LT:
8260     case NE:
8261     case EQ:
8262     case UNGE:
8263       return 5;
8264       break;
8265     case LE:
8266     case UNGT:
8267       return 6;
8268       break;
8269     default:
8270       abort ();
8271     }
8272 }
8273
8274 /* Return cost of comparison done using fcomi operation.
8275    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
8276 static int
8277 ix86_fp_comparison_fcomi_cost (enum rtx_code code)
8278 {
8279   enum rtx_code bypass_code, first_code, second_code;
8280   /* Return arbitrarily high cost when instruction is not supported - this
8281      prevents gcc from using it.  */
8282   if (!TARGET_CMOVE)
8283     return 1024;
8284   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8285   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 2;
8286 }
8287
8288 /* Return cost of comparison done using sahf operation.
8289    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
8290 static int
8291 ix86_fp_comparison_sahf_cost (enum rtx_code code)
8292 {
8293   enum rtx_code bypass_code, first_code, second_code;
8294   /* Return arbitrarily high cost when instruction is not preferred - this
8295      avoids gcc from using it.  */
8296   if (!TARGET_USE_SAHF && !optimize_size)
8297     return 1024;
8298   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8299   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 3;
8300 }
8301
8302 /* Compute cost of the comparison done using any method.
8303    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
8304 static int
8305 ix86_fp_comparison_cost (enum rtx_code code)
8306 {
8307   int fcomi_cost, sahf_cost, arithmetics_cost = 1024;
8308   int min;
8309
8310   fcomi_cost = ix86_fp_comparison_fcomi_cost (code);
8311   sahf_cost = ix86_fp_comparison_sahf_cost (code);
8312
8313   min = arithmetics_cost = ix86_fp_comparison_arithmetics_cost (code);
8314   if (min > sahf_cost)
8315     min = sahf_cost;
8316   if (min > fcomi_cost)
8317     min = fcomi_cost;
8318   return min;
8319 }
8320
8321 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
8322
8323 static rtx
8324 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch,
8325                         rtx *second_test, rtx *bypass_test)
8326 {
8327   enum machine_mode fpcmp_mode, intcmp_mode;
8328   rtx tmp, tmp2;
8329   int cost = ix86_fp_comparison_cost (code);
8330   enum rtx_code bypass_code, first_code, second_code;
8331
8332   fpcmp_mode = ix86_fp_compare_mode (code);
8333   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
8334
8335   if (second_test)
8336     *second_test = NULL_RTX;
8337   if (bypass_test)
8338     *bypass_test = NULL_RTX;
8339
8340   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8341
8342   /* Do fcomi/sahf based test when profitable.  */
8343   if ((bypass_code == UNKNOWN || bypass_test)
8344       && (second_code == UNKNOWN || second_test)
8345       && ix86_fp_comparison_arithmetics_cost (code) > cost)
8346     {
8347       if (TARGET_CMOVE)
8348         {
8349           tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
8350           tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
8351                              tmp);
8352           emit_insn (tmp);
8353         }
8354       else
8355         {
8356           tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
8357           tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
8358           if (!scratch)
8359             scratch = gen_reg_rtx (HImode);
8360           emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
8361           emit_insn (gen_x86_sahf_1 (scratch));
8362         }
8363
8364       /* The FP codes work out to act like unsigned.  */
8365       intcmp_mode = fpcmp_mode;
8366       code = first_code;
8367       if (bypass_code != UNKNOWN)
8368         *bypass_test = gen_rtx_fmt_ee (bypass_code, VOIDmode,
8369                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
8370                                        const0_rtx);
8371       if (second_code != UNKNOWN)
8372         *second_test = gen_rtx_fmt_ee (second_code, VOIDmode,
8373                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
8374                                        const0_rtx);
8375     }
8376   else
8377     {
8378       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
8379       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
8380       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
8381       if (!scratch)
8382         scratch = gen_reg_rtx (HImode);
8383       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
8384
8385       /* In the unordered case, we have to check C2 for NaN's, which
8386          doesn't happen to work out to anything nice combination-wise.
8387          So do some bit twiddling on the value we've got in AH to come
8388          up with an appropriate set of condition codes.  */
8389
8390       intcmp_mode = CCNOmode;
8391       switch (code)
8392         {
8393         case GT:
8394         case UNGT:
8395           if (code == GT || !TARGET_IEEE_FP)
8396             {
8397               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
8398               code = EQ;
8399             }
8400           else
8401             {
8402               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8403               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
8404               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
8405               intcmp_mode = CCmode;
8406               code = GEU;
8407             }
8408           break;
8409         case LT:
8410         case UNLT:
8411           if (code == LT && TARGET_IEEE_FP)
8412             {
8413               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8414               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x01)));
8415               intcmp_mode = CCmode;
8416               code = EQ;
8417             }
8418           else
8419             {
8420               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x01)));
8421               code = NE;
8422             }
8423           break;
8424         case GE:
8425         case UNGE:
8426           if (code == GE || !TARGET_IEEE_FP)
8427             {
8428               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
8429               code = EQ;
8430             }
8431           else
8432             {
8433               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8434               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
8435                                              GEN_INT (0x01)));
8436               code = NE;
8437             }
8438           break;
8439         case LE:
8440         case UNLE:
8441           if (code == LE && TARGET_IEEE_FP)
8442             {
8443               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8444               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
8445               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
8446               intcmp_mode = CCmode;
8447               code = LTU;
8448             }
8449           else
8450             {
8451               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
8452               code = NE;
8453             }
8454           break;
8455         case EQ:
8456         case UNEQ:
8457           if (code == EQ && TARGET_IEEE_FP)
8458             {
8459               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8460               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
8461               intcmp_mode = CCmode;
8462               code = EQ;
8463             }
8464           else
8465             {
8466               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
8467               code = NE;
8468               break;
8469             }
8470           break;
8471         case NE:
8472         case LTGT:
8473           if (code == NE && TARGET_IEEE_FP)
8474             {
8475               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8476               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
8477                                              GEN_INT (0x40)));
8478               code = NE;
8479             }
8480           else
8481             {
8482               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
8483               code = EQ;
8484             }
8485           break;
8486
8487         case UNORDERED:
8488           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
8489           code = NE;
8490           break;
8491         case ORDERED:
8492           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
8493           code = EQ;
8494           break;
8495
8496         default:
8497           abort ();
8498         }
8499     }
8500
8501   /* Return the test that should be put into the flags user, i.e.
8502      the bcc, scc, or cmov instruction.  */
8503   return gen_rtx_fmt_ee (code, VOIDmode,
8504                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
8505                          const0_rtx);
8506 }
8507
8508 rtx
8509 ix86_expand_compare (enum rtx_code code, rtx *second_test, rtx *bypass_test)
8510 {
8511   rtx op0, op1, ret;
8512   op0 = ix86_compare_op0;
8513   op1 = ix86_compare_op1;
8514
8515   if (second_test)
8516     *second_test = NULL_RTX;
8517   if (bypass_test)
8518     *bypass_test = NULL_RTX;
8519
8520   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
8521     ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
8522                                   second_test, bypass_test);
8523   else
8524     ret = ix86_expand_int_compare (code, op0, op1);
8525
8526   return ret;
8527 }
8528
8529 /* Return true if the CODE will result in nontrivial jump sequence.  */
8530 bool
8531 ix86_fp_jump_nontrivial_p (enum rtx_code code)
8532 {
8533   enum rtx_code bypass_code, first_code, second_code;
8534   if (!TARGET_CMOVE)
8535     return true;
8536   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8537   return bypass_code != UNKNOWN || second_code != UNKNOWN;
8538 }
8539
8540 void
8541 ix86_expand_branch (enum rtx_code code, rtx label)
8542 {
8543   rtx tmp;
8544
8545   switch (GET_MODE (ix86_compare_op0))
8546     {
8547     case QImode:
8548     case HImode:
8549     case SImode:
8550       simple:
8551       tmp = ix86_expand_compare (code, NULL, NULL);
8552       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
8553                                   gen_rtx_LABEL_REF (VOIDmode, label),
8554                                   pc_rtx);
8555       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
8556       return;
8557
8558     case SFmode:
8559     case DFmode:
8560     case XFmode:
8561       {
8562         rtvec vec;
8563         int use_fcomi;
8564         enum rtx_code bypass_code, first_code, second_code;
8565
8566         code = ix86_prepare_fp_compare_args (code, &ix86_compare_op0,
8567                                              &ix86_compare_op1);
8568
8569         ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8570
8571         /* Check whether we will use the natural sequence with one jump.  If
8572            so, we can expand jump early.  Otherwise delay expansion by
8573            creating compound insn to not confuse optimizers.  */
8574         if (bypass_code == UNKNOWN && second_code == UNKNOWN
8575             && TARGET_CMOVE)
8576           {
8577             ix86_split_fp_branch (code, ix86_compare_op0, ix86_compare_op1,
8578                                   gen_rtx_LABEL_REF (VOIDmode, label),
8579                                   pc_rtx, NULL_RTX, NULL_RTX);
8580           }
8581         else
8582           {
8583             tmp = gen_rtx_fmt_ee (code, VOIDmode,
8584                                   ix86_compare_op0, ix86_compare_op1);
8585             tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
8586                                         gen_rtx_LABEL_REF (VOIDmode, label),
8587                                         pc_rtx);
8588             tmp = gen_rtx_SET (VOIDmode, pc_rtx, tmp);
8589
8590             use_fcomi = ix86_use_fcomi_compare (code);
8591             vec = rtvec_alloc (3 + !use_fcomi);
8592             RTVEC_ELT (vec, 0) = tmp;
8593             RTVEC_ELT (vec, 1)
8594               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, 18));
8595             RTVEC_ELT (vec, 2)
8596               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, 17));
8597             if (! use_fcomi)
8598               RTVEC_ELT (vec, 3)
8599                 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (HImode));
8600
8601             emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, vec));
8602           }
8603         return;
8604       }
8605
8606     case DImode:
8607       if (TARGET_64BIT)
8608         goto simple;
8609       /* Expand DImode branch into multiple compare+branch.  */
8610       {
8611         rtx lo[2], hi[2], label2;
8612         enum rtx_code code1, code2, code3;
8613
8614         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
8615           {
8616             tmp = ix86_compare_op0;
8617             ix86_compare_op0 = ix86_compare_op1;
8618             ix86_compare_op1 = tmp;
8619             code = swap_condition (code);
8620           }
8621         split_di (&ix86_compare_op0, 1, lo+0, hi+0);
8622         split_di (&ix86_compare_op1, 1, lo+1, hi+1);
8623
8624         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
8625            avoid two branches.  This costs one extra insn, so disable when
8626            optimizing for size.  */
8627
8628         if ((code == EQ || code == NE)
8629             && (!optimize_size
8630                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
8631           {
8632             rtx xor0, xor1;
8633
8634             xor1 = hi[0];
8635             if (hi[1] != const0_rtx)
8636               xor1 = expand_binop (SImode, xor_optab, xor1, hi[1],
8637                                    NULL_RTX, 0, OPTAB_WIDEN);
8638
8639             xor0 = lo[0];
8640             if (lo[1] != const0_rtx)
8641               xor0 = expand_binop (SImode, xor_optab, xor0, lo[1],
8642                                    NULL_RTX, 0, OPTAB_WIDEN);
8643
8644             tmp = expand_binop (SImode, ior_optab, xor1, xor0,
8645                                 NULL_RTX, 0, OPTAB_WIDEN);
8646
8647             ix86_compare_op0 = tmp;
8648             ix86_compare_op1 = const0_rtx;
8649             ix86_expand_branch (code, label);
8650             return;
8651           }
8652
8653         /* Otherwise, if we are doing less-than or greater-or-equal-than,
8654            op1 is a constant and the low word is zero, then we can just
8655            examine the high word.  */
8656
8657         if (GET_CODE (hi[1]) == CONST_INT && lo[1] == const0_rtx)
8658           switch (code)
8659             {
8660             case LT: case LTU: case GE: case GEU:
8661               ix86_compare_op0 = hi[0];
8662               ix86_compare_op1 = hi[1];
8663               ix86_expand_branch (code, label);
8664               return;
8665             default:
8666               break;
8667             }
8668
8669         /* Otherwise, we need two or three jumps.  */
8670
8671         label2 = gen_label_rtx ();
8672
8673         code1 = code;
8674         code2 = swap_condition (code);
8675         code3 = unsigned_condition (code);
8676
8677         switch (code)
8678           {
8679           case LT: case GT: case LTU: case GTU:
8680             break;
8681
8682           case LE:   code1 = LT;  code2 = GT;  break;
8683           case GE:   code1 = GT;  code2 = LT;  break;
8684           case LEU:  code1 = LTU; code2 = GTU; break;
8685           case GEU:  code1 = GTU; code2 = LTU; break;
8686
8687           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
8688           case NE:   code2 = UNKNOWN; break;
8689
8690           default:
8691             abort ();
8692           }
8693
8694         /*
8695          * a < b =>
8696          *    if (hi(a) < hi(b)) goto true;
8697          *    if (hi(a) > hi(b)) goto false;
8698          *    if (lo(a) < lo(b)) goto true;
8699          *  false:
8700          */
8701
8702         ix86_compare_op0 = hi[0];
8703         ix86_compare_op1 = hi[1];
8704
8705         if (code1 != UNKNOWN)
8706           ix86_expand_branch (code1, label);
8707         if (code2 != UNKNOWN)
8708           ix86_expand_branch (code2, label2);
8709
8710         ix86_compare_op0 = lo[0];
8711         ix86_compare_op1 = lo[1];
8712         ix86_expand_branch (code3, label);
8713
8714         if (code2 != UNKNOWN)
8715           emit_label (label2);
8716         return;
8717       }
8718
8719     default:
8720       abort ();
8721     }
8722 }
8723
8724 /* Split branch based on floating point condition.  */
8725 void
8726 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
8727                       rtx target1, rtx target2, rtx tmp, rtx pushed)
8728 {
8729   rtx second, bypass;
8730   rtx label = NULL_RTX;
8731   rtx condition;
8732   int bypass_probability = -1, second_probability = -1, probability = -1;
8733   rtx i;
8734
8735   if (target2 != pc_rtx)
8736     {
8737       rtx tmp = target2;
8738       code = reverse_condition_maybe_unordered (code);
8739       target2 = target1;
8740       target1 = tmp;
8741     }
8742
8743   condition = ix86_expand_fp_compare (code, op1, op2,
8744                                       tmp, &second, &bypass);
8745
8746   /* Remove pushed operand from stack.  */
8747   if (pushed)
8748     ix86_free_from_memory (GET_MODE (pushed));
8749
8750   if (split_branch_probability >= 0)
8751     {
8752       /* Distribute the probabilities across the jumps.
8753          Assume the BYPASS and SECOND to be always test
8754          for UNORDERED.  */
8755       probability = split_branch_probability;
8756
8757       /* Value of 1 is low enough to make no need for probability
8758          to be updated.  Later we may run some experiments and see
8759          if unordered values are more frequent in practice.  */
8760       if (bypass)
8761         bypass_probability = 1;
8762       if (second)
8763         second_probability = 1;
8764     }
8765   if (bypass != NULL_RTX)
8766     {
8767       label = gen_label_rtx ();
8768       i = emit_jump_insn (gen_rtx_SET
8769                           (VOIDmode, pc_rtx,
8770                            gen_rtx_IF_THEN_ELSE (VOIDmode,
8771                                                  bypass,
8772                                                  gen_rtx_LABEL_REF (VOIDmode,
8773                                                                     label),
8774                                                  pc_rtx)));
8775       if (bypass_probability >= 0)
8776         REG_NOTES (i)
8777           = gen_rtx_EXPR_LIST (REG_BR_PROB,
8778                                GEN_INT (bypass_probability),
8779                                REG_NOTES (i));
8780     }
8781   i = emit_jump_insn (gen_rtx_SET
8782                       (VOIDmode, pc_rtx,
8783                        gen_rtx_IF_THEN_ELSE (VOIDmode,
8784                                              condition, target1, target2)));
8785   if (probability >= 0)
8786     REG_NOTES (i)
8787       = gen_rtx_EXPR_LIST (REG_BR_PROB,
8788                            GEN_INT (probability),
8789                            REG_NOTES (i));
8790   if (second != NULL_RTX)
8791     {
8792       i = emit_jump_insn (gen_rtx_SET
8793                           (VOIDmode, pc_rtx,
8794                            gen_rtx_IF_THEN_ELSE (VOIDmode, second, target1,
8795                                                  target2)));
8796       if (second_probability >= 0)
8797         REG_NOTES (i)
8798           = gen_rtx_EXPR_LIST (REG_BR_PROB,
8799                                GEN_INT (second_probability),
8800                                REG_NOTES (i));
8801     }
8802   if (label != NULL_RTX)
8803     emit_label (label);
8804 }
8805
8806 int
8807 ix86_expand_setcc (enum rtx_code code, rtx dest)
8808 {
8809   rtx ret, tmp, tmpreg, equiv;
8810   rtx second_test, bypass_test;
8811
8812   if (GET_MODE (ix86_compare_op0) == DImode
8813       && !TARGET_64BIT)
8814     return 0; /* FAIL */
8815
8816   if (GET_MODE (dest) != QImode)
8817     abort ();
8818
8819   ret = ix86_expand_compare (code, &second_test, &bypass_test);
8820   PUT_MODE (ret, QImode);
8821
8822   tmp = dest;
8823   tmpreg = dest;
8824
8825   emit_insn (gen_rtx_SET (VOIDmode, tmp, ret));
8826   if (bypass_test || second_test)
8827     {
8828       rtx test = second_test;
8829       int bypass = 0;
8830       rtx tmp2 = gen_reg_rtx (QImode);
8831       if (bypass_test)
8832         {
8833           if (second_test)
8834             abort ();
8835           test = bypass_test;
8836           bypass = 1;
8837           PUT_CODE (test, reverse_condition_maybe_unordered (GET_CODE (test)));
8838         }
8839       PUT_MODE (test, QImode);
8840       emit_insn (gen_rtx_SET (VOIDmode, tmp2, test));
8841
8842       if (bypass)
8843         emit_insn (gen_andqi3 (tmp, tmpreg, tmp2));
8844       else
8845         emit_insn (gen_iorqi3 (tmp, tmpreg, tmp2));
8846     }
8847
8848   /* Attach a REG_EQUAL note describing the comparison result.  */
8849   equiv = simplify_gen_relational (code, QImode,
8850                                    GET_MODE (ix86_compare_op0),
8851                                    ix86_compare_op0, ix86_compare_op1);
8852   set_unique_reg_note (get_last_insn (), REG_EQUAL, equiv);
8853
8854   return 1; /* DONE */
8855 }
8856
8857 /* Expand comparison setting or clearing carry flag.  Return true when
8858    successful and set pop for the operation.  */
8859 static bool
8860 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
8861 {
8862   enum machine_mode mode =
8863     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
8864
8865   /* Do not handle DImode compares that go trought special path.  Also we can't
8866      deal with FP compares yet.  This is possible to add.  */
8867   if ((mode == DImode && !TARGET_64BIT))
8868     return false;
8869   if (FLOAT_MODE_P (mode))
8870     {
8871       rtx second_test = NULL, bypass_test = NULL;
8872       rtx compare_op, compare_seq;
8873
8874       /* Shortcut:  following common codes never translate into carry flag compares.  */
8875       if (code == EQ || code == NE || code == UNEQ || code == LTGT
8876           || code == ORDERED || code == UNORDERED)
8877         return false;
8878
8879       /* These comparisons require zero flag; swap operands so they won't.  */
8880       if ((code == GT || code == UNLE || code == LE || code == UNGT)
8881           && !TARGET_IEEE_FP)
8882         {
8883           rtx tmp = op0;
8884           op0 = op1;
8885           op1 = tmp;
8886           code = swap_condition (code);
8887         }
8888
8889       /* Try to expand the comparison and verify that we end up with carry flag
8890          based comparison.  This is fails to be true only when we decide to expand
8891          comparison using arithmetic that is not too common scenario.  */
8892       start_sequence ();
8893       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
8894                                            &second_test, &bypass_test);
8895       compare_seq = get_insns ();
8896       end_sequence ();
8897
8898       if (second_test || bypass_test)
8899         return false;
8900       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
8901           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
8902         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
8903       else
8904         code = GET_CODE (compare_op);
8905       if (code != LTU && code != GEU)
8906         return false;
8907       emit_insn (compare_seq);
8908       *pop = compare_op;
8909       return true;
8910     }
8911   if (!INTEGRAL_MODE_P (mode))
8912     return false;
8913   switch (code)
8914     {
8915     case LTU:
8916     case GEU:
8917       break;
8918
8919     /* Convert a==0 into (unsigned)a<1.  */
8920     case EQ:
8921     case NE:
8922       if (op1 != const0_rtx)
8923         return false;
8924       op1 = const1_rtx;
8925       code = (code == EQ ? LTU : GEU);
8926       break;
8927
8928     /* Convert a>b into b<a or a>=b-1.  */
8929     case GTU:
8930     case LEU:
8931       if (GET_CODE (op1) == CONST_INT)
8932         {
8933           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
8934           /* Bail out on overflow.  We still can swap operands but that
8935              would force loading of the constant into register.  */
8936           if (op1 == const0_rtx
8937               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
8938             return false;
8939           code = (code == GTU ? GEU : LTU);
8940         }
8941       else
8942         {
8943           rtx tmp = op1;
8944           op1 = op0;
8945           op0 = tmp;
8946           code = (code == GTU ? LTU : GEU);
8947         }
8948       break;
8949
8950     /* Convert a>=0 into (unsigned)a<0x80000000.  */
8951     case LT:
8952     case GE:
8953       if (mode == DImode || op1 != const0_rtx)
8954         return false;
8955       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
8956       code = (code == LT ? GEU : LTU);
8957       break;
8958     case LE:
8959     case GT:
8960       if (mode == DImode || op1 != constm1_rtx)
8961         return false;
8962       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
8963       code = (code == LE ? GEU : LTU);
8964       break;
8965
8966     default:
8967       return false;
8968     }
8969   /* Swapping operands may cause constant to appear as first operand.  */
8970   if (!nonimmediate_operand (op0, VOIDmode))
8971     {
8972       if (no_new_pseudos)
8973         return false;
8974       op0 = force_reg (mode, op0);
8975     }
8976   ix86_compare_op0 = op0;
8977   ix86_compare_op1 = op1;
8978   *pop = ix86_expand_compare (code, NULL, NULL);
8979   if (GET_CODE (*pop) != LTU && GET_CODE (*pop) != GEU)
8980     abort ();
8981   return true;
8982 }
8983
8984 int
8985 ix86_expand_int_movcc (rtx operands[])
8986 {
8987   enum rtx_code code = GET_CODE (operands[1]), compare_code;
8988   rtx compare_seq, compare_op;
8989   rtx second_test, bypass_test;
8990   enum machine_mode mode = GET_MODE (operands[0]);
8991   bool sign_bit_compare_p = false;;
8992
8993   start_sequence ();
8994   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
8995   compare_seq = get_insns ();
8996   end_sequence ();
8997
8998   compare_code = GET_CODE (compare_op);
8999
9000   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
9001       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
9002     sign_bit_compare_p = true;
9003
9004   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
9005      HImode insns, we'd be swallowed in word prefix ops.  */
9006
9007   if ((mode != HImode || TARGET_FAST_PREFIX)
9008       && (mode != DImode || TARGET_64BIT)
9009       && GET_CODE (operands[2]) == CONST_INT
9010       && GET_CODE (operands[3]) == CONST_INT)
9011     {
9012       rtx out = operands[0];
9013       HOST_WIDE_INT ct = INTVAL (operands[2]);
9014       HOST_WIDE_INT cf = INTVAL (operands[3]);
9015       HOST_WIDE_INT diff;
9016
9017       diff = ct - cf;
9018       /*  Sign bit compares are better done using shifts than we do by using
9019           sbb.  */
9020       if (sign_bit_compare_p
9021           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
9022                                              ix86_compare_op1, &compare_op))
9023         {
9024           /* Detect overlap between destination and compare sources.  */
9025           rtx tmp = out;
9026
9027           if (!sign_bit_compare_p)
9028             {
9029               bool fpcmp = false;
9030
9031               compare_code = GET_CODE (compare_op);
9032
9033               if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
9034                   || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
9035                 {
9036                   fpcmp = true;
9037                   compare_code = ix86_fp_compare_code_to_integer (compare_code);
9038                 }
9039
9040               /* To simplify rest of code, restrict to the GEU case.  */
9041               if (compare_code == LTU)
9042                 {
9043                   HOST_WIDE_INT tmp = ct;
9044                   ct = cf;
9045                   cf = tmp;
9046                   compare_code = reverse_condition (compare_code);
9047                   code = reverse_condition (code);
9048                 }
9049               else
9050                 {
9051                   if (fpcmp)
9052                     PUT_CODE (compare_op,
9053                               reverse_condition_maybe_unordered
9054                                 (GET_CODE (compare_op)));
9055                   else
9056                     PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
9057                 }
9058               diff = ct - cf;
9059
9060               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
9061                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
9062                 tmp = gen_reg_rtx (mode);
9063
9064               if (mode == DImode)
9065                 emit_insn (gen_x86_movdicc_0_m1_rex64 (tmp, compare_op));
9066               else
9067                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp), compare_op));
9068             }
9069           else
9070             {
9071               if (code == GT || code == GE)
9072                 code = reverse_condition (code);
9073               else
9074                 {
9075                   HOST_WIDE_INT tmp = ct;
9076                   ct = cf;
9077                   cf = tmp;
9078                   diff = ct - cf;
9079                 }
9080               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
9081                                      ix86_compare_op1, VOIDmode, 0, -1);
9082             }
9083
9084           if (diff == 1)
9085             {
9086               /*
9087                * cmpl op0,op1
9088                * sbbl dest,dest
9089                * [addl dest, ct]
9090                *
9091                * Size 5 - 8.
9092                */
9093               if (ct)
9094                 tmp = expand_simple_binop (mode, PLUS,
9095                                            tmp, GEN_INT (ct),
9096                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
9097             }
9098           else if (cf == -1)
9099             {
9100               /*
9101                * cmpl op0,op1
9102                * sbbl dest,dest
9103                * orl $ct, dest
9104                *
9105                * Size 8.
9106                */
9107               tmp = expand_simple_binop (mode, IOR,
9108                                          tmp, GEN_INT (ct),
9109                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
9110             }
9111           else if (diff == -1 && ct)
9112             {
9113               /*
9114                * cmpl op0,op1
9115                * sbbl dest,dest
9116                * notl dest
9117                * [addl dest, cf]
9118                *
9119                * Size 8 - 11.
9120                */
9121               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
9122               if (cf)
9123                 tmp = expand_simple_binop (mode, PLUS,
9124                                            copy_rtx (tmp), GEN_INT (cf),
9125                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
9126             }
9127           else
9128             {
9129               /*
9130                * cmpl op0,op1
9131                * sbbl dest,dest
9132                * [notl dest]
9133                * andl cf - ct, dest
9134                * [addl dest, ct]
9135                *
9136                * Size 8 - 11.
9137                */
9138
9139               if (cf == 0)
9140                 {
9141                   cf = ct;
9142                   ct = 0;
9143                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
9144                 }
9145
9146               tmp = expand_simple_binop (mode, AND,
9147                                          copy_rtx (tmp),
9148                                          gen_int_mode (cf - ct, mode),
9149                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
9150               if (ct)
9151                 tmp = expand_simple_binop (mode, PLUS,
9152                                            copy_rtx (tmp), GEN_INT (ct),
9153                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
9154             }
9155
9156           if (!rtx_equal_p (tmp, out))
9157             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
9158
9159           return 1; /* DONE */
9160         }
9161
9162       if (diff < 0)
9163         {
9164           HOST_WIDE_INT tmp;
9165           tmp = ct, ct = cf, cf = tmp;
9166           diff = -diff;
9167           if (FLOAT_MODE_P (GET_MODE (ix86_compare_op0)))
9168             {
9169               /* We may be reversing unordered compare to normal compare, that
9170                  is not valid in general (we may convert non-trapping condition
9171                  to trapping one), however on i386 we currently emit all
9172                  comparisons unordered.  */
9173               compare_code = reverse_condition_maybe_unordered (compare_code);
9174               code = reverse_condition_maybe_unordered (code);
9175             }
9176           else
9177             {
9178               compare_code = reverse_condition (compare_code);
9179               code = reverse_condition (code);
9180             }
9181         }
9182
9183       compare_code = UNKNOWN;
9184       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
9185           && GET_CODE (ix86_compare_op1) == CONST_INT)
9186         {
9187           if (ix86_compare_op1 == const0_rtx
9188               && (code == LT || code == GE))
9189             compare_code = code;
9190           else if (ix86_compare_op1 == constm1_rtx)
9191             {
9192               if (code == LE)
9193                 compare_code = LT;
9194               else if (code == GT)
9195                 compare_code = GE;
9196             }
9197         }
9198
9199       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
9200       if (compare_code != UNKNOWN
9201           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
9202           && (cf == -1 || ct == -1))
9203         {
9204           /* If lea code below could be used, only optimize
9205              if it results in a 2 insn sequence.  */
9206
9207           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
9208                  || diff == 3 || diff == 5 || diff == 9)
9209               || (compare_code == LT && ct == -1)
9210               || (compare_code == GE && cf == -1))
9211             {
9212               /*
9213                * notl op1       (if necessary)
9214                * sarl $31, op1
9215                * orl cf, op1
9216                */
9217               if (ct != -1)
9218                 {
9219                   cf = ct;
9220                   ct = -1;
9221                   code = reverse_condition (code);
9222                 }
9223
9224               out = emit_store_flag (out, code, ix86_compare_op0,
9225                                      ix86_compare_op1, VOIDmode, 0, -1);
9226
9227               out = expand_simple_binop (mode, IOR,
9228                                          out, GEN_INT (cf),
9229                                          out, 1, OPTAB_DIRECT);
9230               if (out != operands[0])
9231                 emit_move_insn (operands[0], out);
9232
9233               return 1; /* DONE */
9234             }
9235         }
9236
9237
9238       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
9239            || diff == 3 || diff == 5 || diff == 9)
9240           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
9241           && (mode != DImode
9242               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
9243         {
9244           /*
9245            * xorl dest,dest
9246            * cmpl op1,op2
9247            * setcc dest
9248            * lea cf(dest*(ct-cf)),dest
9249            *
9250            * Size 14.
9251            *
9252            * This also catches the degenerate setcc-only case.
9253            */
9254
9255           rtx tmp;
9256           int nops;
9257
9258           out = emit_store_flag (out, code, ix86_compare_op0,
9259                                  ix86_compare_op1, VOIDmode, 0, 1);
9260
9261           nops = 0;
9262           /* On x86_64 the lea instruction operates on Pmode, so we need
9263              to get arithmetics done in proper mode to match.  */
9264           if (diff == 1)
9265             tmp = copy_rtx (out);
9266           else
9267             {
9268               rtx out1;
9269               out1 = copy_rtx (out);
9270               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
9271               nops++;
9272               if (diff & 1)
9273                 {
9274                   tmp = gen_rtx_PLUS (mode, tmp, out1);
9275                   nops++;
9276                 }
9277             }
9278           if (cf != 0)
9279             {
9280               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
9281               nops++;
9282             }
9283           if (!rtx_equal_p (tmp, out))
9284             {
9285               if (nops == 1)
9286                 out = force_operand (tmp, copy_rtx (out));
9287               else
9288                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
9289             }
9290           if (!rtx_equal_p (out, operands[0]))
9291             emit_move_insn (operands[0], copy_rtx (out));
9292
9293           return 1; /* DONE */
9294         }
9295
9296       /*
9297        * General case:                  Jumpful:
9298        *   xorl dest,dest               cmpl op1, op2
9299        *   cmpl op1, op2                movl ct, dest
9300        *   setcc dest                   jcc 1f
9301        *   decl dest                    movl cf, dest
9302        *   andl (cf-ct),dest            1:
9303        *   addl ct,dest
9304        *
9305        * Size 20.                       Size 14.
9306        *
9307        * This is reasonably steep, but branch mispredict costs are
9308        * high on modern cpus, so consider failing only if optimizing
9309        * for space.
9310        */
9311
9312       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
9313           && BRANCH_COST >= 2)
9314         {
9315           if (cf == 0)
9316             {
9317               cf = ct;
9318               ct = 0;
9319               if (FLOAT_MODE_P (GET_MODE (ix86_compare_op0)))
9320                 /* We may be reversing unordered compare to normal compare,
9321                    that is not valid in general (we may convert non-trapping
9322                    condition to trapping one), however on i386 we currently
9323                    emit all comparisons unordered.  */
9324                 code = reverse_condition_maybe_unordered (code);
9325               else
9326                 {
9327                   code = reverse_condition (code);
9328                   if (compare_code != UNKNOWN)
9329                     compare_code = reverse_condition (compare_code);
9330                 }
9331             }
9332
9333           if (compare_code != UNKNOWN)
9334             {
9335               /* notl op1       (if needed)
9336                  sarl $31, op1
9337                  andl (cf-ct), op1
9338                  addl ct, op1
9339
9340                  For x < 0 (resp. x <= -1) there will be no notl,
9341                  so if possible swap the constants to get rid of the
9342                  complement.
9343                  True/false will be -1/0 while code below (store flag
9344                  followed by decrement) is 0/-1, so the constants need
9345                  to be exchanged once more.  */
9346
9347               if (compare_code == GE || !cf)
9348                 {
9349                   code = reverse_condition (code);
9350                   compare_code = LT;
9351                 }
9352               else
9353                 {
9354                   HOST_WIDE_INT tmp = cf;
9355                   cf = ct;
9356                   ct = tmp;
9357                 }
9358
9359               out = emit_store_flag (out, code, ix86_compare_op0,
9360                                      ix86_compare_op1, VOIDmode, 0, -1);
9361             }
9362           else
9363             {
9364               out = emit_store_flag (out, code, ix86_compare_op0,
9365                                      ix86_compare_op1, VOIDmode, 0, 1);
9366
9367               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
9368                                          copy_rtx (out), 1, OPTAB_DIRECT);
9369             }
9370
9371           out = expand_simple_binop (mode, AND, copy_rtx (out),
9372                                      gen_int_mode (cf - ct, mode),
9373                                      copy_rtx (out), 1, OPTAB_DIRECT);
9374           if (ct)
9375             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
9376                                        copy_rtx (out), 1, OPTAB_DIRECT);
9377           if (!rtx_equal_p (out, operands[0]))
9378             emit_move_insn (operands[0], copy_rtx (out));
9379
9380           return 1; /* DONE */
9381         }
9382     }
9383
9384   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
9385     {
9386       /* Try a few things more with specific constants and a variable.  */
9387
9388       optab op;
9389       rtx var, orig_out, out, tmp;
9390
9391       if (BRANCH_COST <= 2)
9392         return 0; /* FAIL */
9393
9394       /* If one of the two operands is an interesting constant, load a
9395          constant with the above and mask it in with a logical operation.  */
9396
9397       if (GET_CODE (operands[2]) == CONST_INT)
9398         {
9399           var = operands[3];
9400           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
9401             operands[3] = constm1_rtx, op = and_optab;
9402           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
9403             operands[3] = const0_rtx, op = ior_optab;
9404           else
9405             return 0; /* FAIL */
9406         }
9407       else if (GET_CODE (operands[3]) == CONST_INT)
9408         {
9409           var = operands[2];
9410           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
9411             operands[2] = constm1_rtx, op = and_optab;
9412           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
9413             operands[2] = const0_rtx, op = ior_optab;
9414           else
9415             return 0; /* FAIL */
9416         }
9417       else
9418         return 0; /* FAIL */
9419
9420       orig_out = operands[0];
9421       tmp = gen_reg_rtx (mode);
9422       operands[0] = tmp;
9423
9424       /* Recurse to get the constant loaded.  */
9425       if (ix86_expand_int_movcc (operands) == 0)
9426         return 0; /* FAIL */
9427
9428       /* Mask in the interesting variable.  */
9429       out = expand_binop (mode, op, var, tmp, orig_out, 0,
9430                           OPTAB_WIDEN);
9431       if (!rtx_equal_p (out, orig_out))
9432         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
9433
9434       return 1; /* DONE */
9435     }
9436
9437   /*
9438    * For comparison with above,
9439    *
9440    * movl cf,dest
9441    * movl ct,tmp
9442    * cmpl op1,op2
9443    * cmovcc tmp,dest
9444    *
9445    * Size 15.
9446    */
9447
9448   if (! nonimmediate_operand (operands[2], mode))
9449     operands[2] = force_reg (mode, operands[2]);
9450   if (! nonimmediate_operand (operands[3], mode))
9451     operands[3] = force_reg (mode, operands[3]);
9452
9453   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
9454     {
9455       rtx tmp = gen_reg_rtx (mode);
9456       emit_move_insn (tmp, operands[3]);
9457       operands[3] = tmp;
9458     }
9459   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
9460     {
9461       rtx tmp = gen_reg_rtx (mode);
9462       emit_move_insn (tmp, operands[2]);
9463       operands[2] = tmp;
9464     }
9465
9466   if (! register_operand (operands[2], VOIDmode)
9467       && (mode == QImode
9468           || ! register_operand (operands[3], VOIDmode)))
9469     operands[2] = force_reg (mode, operands[2]);
9470
9471   if (mode == QImode
9472       && ! register_operand (operands[3], VOIDmode))
9473     operands[3] = force_reg (mode, operands[3]);
9474
9475   emit_insn (compare_seq);
9476   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9477                           gen_rtx_IF_THEN_ELSE (mode,
9478                                                 compare_op, operands[2],
9479                                                 operands[3])));
9480   if (bypass_test)
9481     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
9482                             gen_rtx_IF_THEN_ELSE (mode,
9483                                   bypass_test,
9484                                   copy_rtx (operands[3]),
9485                                   copy_rtx (operands[0]))));
9486   if (second_test)
9487     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
9488                             gen_rtx_IF_THEN_ELSE (mode,
9489                                   second_test,
9490                                   copy_rtx (operands[2]),
9491                                   copy_rtx (operands[0]))));
9492
9493   return 1; /* DONE */
9494 }
9495
9496 int
9497 ix86_expand_fp_movcc (rtx operands[])
9498 {
9499   enum rtx_code code;
9500   rtx tmp;
9501   rtx compare_op, second_test, bypass_test;
9502
9503   /* For SF/DFmode conditional moves based on comparisons
9504      in same mode, we may want to use SSE min/max instructions.  */
9505   if (((TARGET_SSE_MATH && GET_MODE (operands[0]) == SFmode)
9506        || (TARGET_SSE2 && TARGET_SSE_MATH && GET_MODE (operands[0]) == DFmode))
9507       && GET_MODE (ix86_compare_op0) == GET_MODE (operands[0])
9508       /* The SSE comparisons does not support the LTGT/UNEQ pair.  */
9509       && (!TARGET_IEEE_FP
9510           || (GET_CODE (operands[1]) != LTGT && GET_CODE (operands[1]) != UNEQ))
9511       /* We may be called from the post-reload splitter.  */
9512       && (!REG_P (operands[0])
9513           || SSE_REG_P (operands[0])
9514           || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))
9515     {
9516       rtx op0 = ix86_compare_op0, op1 = ix86_compare_op1;
9517       code = GET_CODE (operands[1]);
9518
9519       /* See if we have (cross) match between comparison operands and
9520          conditional move operands.  */
9521       if (rtx_equal_p (operands[2], op1))
9522         {
9523           rtx tmp = op0;
9524           op0 = op1;
9525           op1 = tmp;
9526           code = reverse_condition_maybe_unordered (code);
9527         }
9528       if (rtx_equal_p (operands[2], op0) && rtx_equal_p (operands[3], op1))
9529         {
9530           /* Check for min operation.  */
9531           if (code == LT || code == UNLE)
9532             {
9533                if (code == UNLE)
9534                 {
9535                   rtx tmp = op0;
9536                   op0 = op1;
9537                   op1 = tmp;
9538                 }
9539                operands[0] = force_reg (GET_MODE (operands[0]), operands[0]);
9540                if (memory_operand (op0, VOIDmode))
9541                  op0 = force_reg (GET_MODE (operands[0]), op0);
9542                if (GET_MODE (operands[0]) == SFmode)
9543                  emit_insn (gen_minsf3 (operands[0], op0, op1));
9544                else
9545                  emit_insn (gen_mindf3 (operands[0], op0, op1));
9546                return 1;
9547             }
9548           /* Check for max operation.  */
9549           if (code == GT || code == UNGE)
9550             {
9551                if (code == UNGE)
9552                 {
9553                   rtx tmp = op0;
9554                   op0 = op1;
9555                   op1 = tmp;
9556                 }
9557                operands[0] = force_reg (GET_MODE (operands[0]), operands[0]);
9558                if (memory_operand (op0, VOIDmode))
9559                  op0 = force_reg (GET_MODE (operands[0]), op0);
9560                if (GET_MODE (operands[0]) == SFmode)
9561                  emit_insn (gen_maxsf3 (operands[0], op0, op1));
9562                else
9563                  emit_insn (gen_maxdf3 (operands[0], op0, op1));
9564                return 1;
9565             }
9566         }
9567       /* Manage condition to be sse_comparison_operator.  In case we are
9568          in non-ieee mode, try to canonicalize the destination operand
9569          to be first in the comparison - this helps reload to avoid extra
9570          moves.  */
9571       if (!sse_comparison_operator (operands[1], VOIDmode)
9572           || (rtx_equal_p (operands[0], ix86_compare_op1) && !TARGET_IEEE_FP))
9573         {
9574           rtx tmp = ix86_compare_op0;
9575           ix86_compare_op0 = ix86_compare_op1;
9576           ix86_compare_op1 = tmp;
9577           operands[1] = gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[1])),
9578                                         VOIDmode, ix86_compare_op0,
9579                                         ix86_compare_op1);
9580         }
9581       /* Similarly try to manage result to be first operand of conditional
9582          move. We also don't support the NE comparison on SSE, so try to
9583          avoid it.  */
9584       if ((rtx_equal_p (operands[0], operands[3])
9585            && (!TARGET_IEEE_FP || GET_CODE (operands[1]) != EQ))
9586           || (GET_CODE (operands[1]) == NE && TARGET_IEEE_FP))
9587         {
9588           rtx tmp = operands[2];
9589           operands[2] = operands[3];
9590           operands[3] = tmp;
9591           operands[1] = gen_rtx_fmt_ee (reverse_condition_maybe_unordered
9592                                           (GET_CODE (operands[1])),
9593                                         VOIDmode, ix86_compare_op0,
9594                                         ix86_compare_op1);
9595         }
9596       if (GET_MODE (operands[0]) == SFmode)
9597         emit_insn (gen_sse_movsfcc (operands[0], operands[1],
9598                                     operands[2], operands[3],
9599                                     ix86_compare_op0, ix86_compare_op1));
9600       else
9601         emit_insn (gen_sse_movdfcc (operands[0], operands[1],
9602                                     operands[2], operands[3],
9603                                     ix86_compare_op0, ix86_compare_op1));
9604       return 1;
9605     }
9606
9607   /* The floating point conditional move instructions don't directly
9608      support conditions resulting from a signed integer comparison.  */
9609
9610   code = GET_CODE (operands[1]);
9611   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
9612
9613   /* The floating point conditional move instructions don't directly
9614      support signed integer comparisons.  */
9615
9616   if (!fcmov_comparison_operator (compare_op, VOIDmode))
9617     {
9618       if (second_test != NULL || bypass_test != NULL)
9619         abort ();
9620       tmp = gen_reg_rtx (QImode);
9621       ix86_expand_setcc (code, tmp);
9622       code = NE;
9623       ix86_compare_op0 = tmp;
9624       ix86_compare_op1 = const0_rtx;
9625       compare_op = ix86_expand_compare (code,  &second_test, &bypass_test);
9626     }
9627   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
9628     {
9629       tmp = gen_reg_rtx (GET_MODE (operands[0]));
9630       emit_move_insn (tmp, operands[3]);
9631       operands[3] = tmp;
9632     }
9633   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
9634     {
9635       tmp = gen_reg_rtx (GET_MODE (operands[0]));
9636       emit_move_insn (tmp, operands[2]);
9637       operands[2] = tmp;
9638     }
9639
9640   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9641                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
9642                                 compare_op,
9643                                 operands[2],
9644                                 operands[3])));
9645   if (bypass_test)
9646     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9647                             gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
9648                                   bypass_test,
9649                                   operands[3],
9650                                   operands[0])));
9651   if (second_test)
9652     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9653                             gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
9654                                   second_test,
9655                                   operands[2],
9656                                   operands[0])));
9657
9658   return 1;
9659 }
9660
9661 /* Expand conditional increment or decrement using adb/sbb instructions.
9662    The default case using setcc followed by the conditional move can be
9663    done by generic code.  */
9664 int
9665 ix86_expand_int_addcc (rtx operands[])
9666 {
9667   enum rtx_code code = GET_CODE (operands[1]);
9668   rtx compare_op;
9669   rtx val = const0_rtx;
9670   bool fpcmp = false;
9671   enum machine_mode mode = GET_MODE (operands[0]);
9672
9673   if (operands[3] != const1_rtx
9674       && operands[3] != constm1_rtx)
9675     return 0;
9676   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
9677                                        ix86_compare_op1, &compare_op))
9678      return 0;
9679   code = GET_CODE (compare_op);
9680
9681   if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
9682       || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
9683     {
9684       fpcmp = true;
9685       code = ix86_fp_compare_code_to_integer (code);
9686     }
9687
9688   if (code != LTU)
9689     {
9690       val = constm1_rtx;
9691       if (fpcmp)
9692         PUT_CODE (compare_op,
9693                   reverse_condition_maybe_unordered
9694                     (GET_CODE (compare_op)));
9695       else
9696         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
9697     }
9698   PUT_MODE (compare_op, mode);
9699
9700   /* Construct either adc or sbb insn.  */
9701   if ((code == LTU) == (operands[3] == constm1_rtx))
9702     {
9703       switch (GET_MODE (operands[0]))
9704         {
9705           case QImode:
9706             emit_insn (gen_subqi3_carry (operands[0], operands[2], val, compare_op));
9707             break;
9708           case HImode:
9709             emit_insn (gen_subhi3_carry (operands[0], operands[2], val, compare_op));
9710             break;
9711           case SImode:
9712             emit_insn (gen_subsi3_carry (operands[0], operands[2], val, compare_op));
9713             break;
9714           case DImode:
9715             emit_insn (gen_subdi3_carry_rex64 (operands[0], operands[2], val, compare_op));
9716             break;
9717           default:
9718             abort ();
9719         }
9720     }
9721   else
9722     {
9723       switch (GET_MODE (operands[0]))
9724         {
9725           case QImode:
9726             emit_insn (gen_addqi3_carry (operands[0], operands[2], val, compare_op));
9727             break;
9728           case HImode:
9729             emit_insn (gen_addhi3_carry (operands[0], operands[2], val, compare_op));
9730             break;
9731           case SImode:
9732             emit_insn (gen_addsi3_carry (operands[0], operands[2], val, compare_op));
9733             break;
9734           case DImode:
9735             emit_insn (gen_adddi3_carry_rex64 (operands[0], operands[2], val, compare_op));
9736             break;
9737           default:
9738             abort ();
9739         }
9740     }
9741   return 1; /* DONE */
9742 }
9743
9744
9745 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
9746    works for floating pointer parameters and nonoffsetable memories.
9747    For pushes, it returns just stack offsets; the values will be saved
9748    in the right order.  Maximally three parts are generated.  */
9749
9750 static int
9751 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
9752 {
9753   int size;
9754
9755   if (!TARGET_64BIT)
9756     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
9757   else
9758     size = (GET_MODE_SIZE (mode) + 4) / 8;
9759
9760   if (GET_CODE (operand) == REG && MMX_REGNO_P (REGNO (operand)))
9761     abort ();
9762   if (size < 2 || size > 3)
9763     abort ();
9764
9765   /* Optimize constant pool reference to immediates.  This is used by fp
9766      moves, that force all constants to memory to allow combining.  */
9767   if (GET_CODE (operand) == MEM && MEM_READONLY_P (operand))
9768     {
9769       rtx tmp = maybe_get_pool_constant (operand);
9770       if (tmp)
9771         operand = tmp;
9772     }
9773
9774   if (GET_CODE (operand) == MEM && !offsettable_memref_p (operand))
9775     {
9776       /* The only non-offsetable memories we handle are pushes.  */
9777       if (! push_operand (operand, VOIDmode))
9778         abort ();
9779
9780       operand = copy_rtx (operand);
9781       PUT_MODE (operand, Pmode);
9782       parts[0] = parts[1] = parts[2] = operand;
9783     }
9784   else if (!TARGET_64BIT)
9785     {
9786       if (mode == DImode)
9787         split_di (&operand, 1, &parts[0], &parts[1]);
9788       else
9789         {
9790           if (REG_P (operand))
9791             {
9792               if (!reload_completed)
9793                 abort ();
9794               parts[0] = gen_rtx_REG (SImode, REGNO (operand) + 0);
9795               parts[1] = gen_rtx_REG (SImode, REGNO (operand) + 1);
9796               if (size == 3)
9797                 parts[2] = gen_rtx_REG (SImode, REGNO (operand) + 2);
9798             }
9799           else if (offsettable_memref_p (operand))
9800             {
9801               operand = adjust_address (operand, SImode, 0);
9802               parts[0] = operand;
9803               parts[1] = adjust_address (operand, SImode, 4);
9804               if (size == 3)
9805                 parts[2] = adjust_address (operand, SImode, 8);
9806             }
9807           else if (GET_CODE (operand) == CONST_DOUBLE)
9808             {
9809               REAL_VALUE_TYPE r;
9810               long l[4];
9811
9812               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
9813               switch (mode)
9814                 {
9815                 case XFmode:
9816                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
9817                   parts[2] = gen_int_mode (l[2], SImode);
9818                   break;
9819                 case DFmode:
9820                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
9821                   break;
9822                 default:
9823                   abort ();
9824                 }
9825               parts[1] = gen_int_mode (l[1], SImode);
9826               parts[0] = gen_int_mode (l[0], SImode);
9827             }
9828           else
9829             abort ();
9830         }
9831     }
9832   else
9833     {
9834       if (mode == TImode)
9835         split_ti (&operand, 1, &parts[0], &parts[1]);
9836       if (mode == XFmode || mode == TFmode)
9837         {
9838           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
9839           if (REG_P (operand))
9840             {
9841               if (!reload_completed)
9842                 abort ();
9843               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
9844               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
9845             }
9846           else if (offsettable_memref_p (operand))
9847             {
9848               operand = adjust_address (operand, DImode, 0);
9849               parts[0] = operand;
9850               parts[1] = adjust_address (operand, upper_mode, 8);
9851             }
9852           else if (GET_CODE (operand) == CONST_DOUBLE)
9853             {
9854               REAL_VALUE_TYPE r;
9855               long l[4];
9856
9857               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
9858               real_to_target (l, &r, mode);
9859
9860               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
9861               if (HOST_BITS_PER_WIDE_INT >= 64)
9862                 parts[0]
9863                   = gen_int_mode
9864                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
9865                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
9866                        DImode);
9867               else
9868                 parts[0] = immed_double_const (l[0], l[1], DImode);
9869
9870               if (upper_mode == SImode)
9871                 parts[1] = gen_int_mode (l[2], SImode);
9872               else if (HOST_BITS_PER_WIDE_INT >= 64)
9873                 parts[1]
9874                   = gen_int_mode
9875                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
9876                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
9877                        DImode);
9878               else
9879                 parts[1] = immed_double_const (l[2], l[3], DImode);
9880             }
9881           else
9882             abort ();
9883         }
9884     }
9885
9886   return size;
9887 }
9888
9889 /* Emit insns to perform a move or push of DI, DF, and XF values.
9890    Return false when normal moves are needed; true when all required
9891    insns have been emitted.  Operands 2-4 contain the input values
9892    int the correct order; operands 5-7 contain the output values.  */
9893
9894 void
9895 ix86_split_long_move (rtx operands[])
9896 {
9897   rtx part[2][3];
9898   int nparts;
9899   int push = 0;
9900   int collisions = 0;
9901   enum machine_mode mode = GET_MODE (operands[0]);
9902
9903   /* The DFmode expanders may ask us to move double.
9904      For 64bit target this is single move.  By hiding the fact
9905      here we simplify i386.md splitters.  */
9906   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
9907     {
9908       /* Optimize constant pool reference to immediates.  This is used by
9909          fp moves, that force all constants to memory to allow combining.  */
9910
9911       if (GET_CODE (operands[1]) == MEM
9912           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
9913           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
9914         operands[1] = get_pool_constant (XEXP (operands[1], 0));
9915       if (push_operand (operands[0], VOIDmode))
9916         {
9917           operands[0] = copy_rtx (operands[0]);
9918           PUT_MODE (operands[0], Pmode);
9919         }
9920       else
9921         operands[0] = gen_lowpart (DImode, operands[0]);
9922       operands[1] = gen_lowpart (DImode, operands[1]);
9923       emit_move_insn (operands[0], operands[1]);
9924       return;
9925     }
9926
9927   /* The only non-offsettable memory we handle is push.  */
9928   if (push_operand (operands[0], VOIDmode))
9929     push = 1;
9930   else if (GET_CODE (operands[0]) == MEM
9931            && ! offsettable_memref_p (operands[0]))
9932     abort ();
9933
9934   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
9935   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
9936
9937   /* When emitting push, take care for source operands on the stack.  */
9938   if (push && GET_CODE (operands[1]) == MEM
9939       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
9940     {
9941       if (nparts == 3)
9942         part[1][1] = change_address (part[1][1], GET_MODE (part[1][1]),
9943                                      XEXP (part[1][2], 0));
9944       part[1][0] = change_address (part[1][0], GET_MODE (part[1][0]),
9945                                    XEXP (part[1][1], 0));
9946     }
9947
9948   /* We need to do copy in the right order in case an address register
9949      of the source overlaps the destination.  */
9950   if (REG_P (part[0][0]) && GET_CODE (part[1][0]) == MEM)
9951     {
9952       if (reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0)))
9953         collisions++;
9954       if (reg_overlap_mentioned_p (part[0][1], XEXP (part[1][0], 0)))
9955         collisions++;
9956       if (nparts == 3
9957           && reg_overlap_mentioned_p (part[0][2], XEXP (part[1][0], 0)))
9958         collisions++;
9959
9960       /* Collision in the middle part can be handled by reordering.  */
9961       if (collisions == 1 && nparts == 3
9962           && reg_overlap_mentioned_p (part[0][1], XEXP (part[1][0], 0)))
9963         {
9964           rtx tmp;
9965           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
9966           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
9967         }
9968
9969       /* If there are more collisions, we can't handle it by reordering.
9970          Do an lea to the last part and use only one colliding move.  */
9971       else if (collisions > 1)
9972         {
9973           rtx base;
9974
9975           collisions = 1;
9976
9977           base = part[0][nparts - 1];
9978
9979           /* Handle the case when the last part isn't valid for lea.
9980              Happens in 64-bit mode storing the 12-byte XFmode.  */
9981           if (GET_MODE (base) != Pmode)
9982             base = gen_rtx_REG (Pmode, REGNO (base));
9983
9984           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
9985           part[1][0] = replace_equiv_address (part[1][0], base);
9986           part[1][1] = replace_equiv_address (part[1][1],
9987                                       plus_constant (base, UNITS_PER_WORD));
9988           if (nparts == 3)
9989             part[1][2] = replace_equiv_address (part[1][2],
9990                                       plus_constant (base, 8));
9991         }
9992     }
9993
9994   if (push)
9995     {
9996       if (!TARGET_64BIT)
9997         {
9998           if (nparts == 3)
9999             {
10000               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
10001                 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, GEN_INT (-4)));
10002               emit_move_insn (part[0][2], part[1][2]);
10003             }
10004         }
10005       else
10006         {
10007           /* In 64bit mode we don't have 32bit push available.  In case this is
10008              register, it is OK - we will just use larger counterpart.  We also
10009              retype memory - these comes from attempt to avoid REX prefix on
10010              moving of second half of TFmode value.  */
10011           if (GET_MODE (part[1][1]) == SImode)
10012             {
10013               if (GET_CODE (part[1][1]) == MEM)
10014                 part[1][1] = adjust_address (part[1][1], DImode, 0);
10015               else if (REG_P (part[1][1]))
10016                 part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
10017               else
10018                 abort ();
10019               if (GET_MODE (part[1][0]) == SImode)
10020                 part[1][0] = part[1][1];
10021             }
10022         }
10023       emit_move_insn (part[0][1], part[1][1]);
10024       emit_move_insn (part[0][0], part[1][0]);
10025       return;
10026     }
10027
10028   /* Choose correct order to not overwrite the source before it is copied.  */
10029   if ((REG_P (part[0][0])
10030        && REG_P (part[1][1])
10031        && (REGNO (part[0][0]) == REGNO (part[1][1])
10032            || (nparts == 3
10033                && REGNO (part[0][0]) == REGNO (part[1][2]))))
10034       || (collisions > 0
10035           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
10036     {
10037       if (nparts == 3)
10038         {
10039           operands[2] = part[0][2];
10040           operands[3] = part[0][1];
10041           operands[4] = part[0][0];
10042           operands[5] = part[1][2];
10043           operands[6] = part[1][1];
10044           operands[7] = part[1][0];
10045         }
10046       else
10047         {
10048           operands[2] = part[0][1];
10049           operands[3] = part[0][0];
10050           operands[5] = part[1][1];
10051           operands[6] = part[1][0];
10052         }
10053     }
10054   else
10055     {
10056       if (nparts == 3)
10057         {
10058           operands[2] = part[0][0];
10059           operands[3] = part[0][1];
10060           operands[4] = part[0][2];
10061           operands[5] = part[1][0];
10062           operands[6] = part[1][1];
10063           operands[7] = part[1][2];
10064         }
10065       else
10066         {
10067           operands[2] = part[0][0];
10068           operands[3] = part[0][1];
10069           operands[5] = part[1][0];
10070           operands[6] = part[1][1];
10071         }
10072     }
10073
10074   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
10075   if (optimize_size)
10076     {
10077       if (GET_CODE (operands[5]) == CONST_INT
10078           && operands[5] != const0_rtx
10079           && REG_P (operands[2]))
10080         {
10081           if (GET_CODE (operands[6]) == CONST_INT
10082               && INTVAL (operands[6]) == INTVAL (operands[5]))
10083             operands[6] = operands[2];
10084
10085           if (nparts == 3
10086               && GET_CODE (operands[7]) == CONST_INT
10087               && INTVAL (operands[7]) == INTVAL (operands[5]))
10088             operands[7] = operands[2];
10089         }
10090
10091       if (nparts == 3
10092           && GET_CODE (operands[6]) == CONST_INT
10093           && operands[6] != const0_rtx
10094           && REG_P (operands[3])
10095           && GET_CODE (operands[7]) == CONST_INT
10096           && INTVAL (operands[7]) == INTVAL (operands[6]))
10097         operands[7] = operands[3];
10098     }
10099
10100   emit_move_insn (operands[2], operands[5]);
10101   emit_move_insn (operands[3], operands[6]);
10102   if (nparts == 3)
10103     emit_move_insn (operands[4], operands[7]);
10104
10105   return;
10106 }
10107
10108 /* Helper function of ix86_split_ashldi used to generate an SImode
10109    left shift by a constant, either using a single shift or
10110    a sequence of add instructions.  */
10111
10112 static void
10113 ix86_expand_ashlsi3_const (rtx operand, int count)
10114 {
10115   if (count == 1)
10116     emit_insn (gen_addsi3 (operand, operand, operand));
10117   else if (!optimize_size
10118            && count * ix86_cost->add <= ix86_cost->shift_const)
10119     {
10120       int i;
10121       for (i=0; i<count; i++)
10122         emit_insn (gen_addsi3 (operand, operand, operand));
10123     }
10124   else
10125     emit_insn (gen_ashlsi3 (operand, operand, GEN_INT (count)));
10126 }
10127
10128 void
10129 ix86_split_ashldi (rtx *operands, rtx scratch)
10130 {
10131   rtx low[2], high[2];
10132   int count;
10133
10134   if (GET_CODE (operands[2]) == CONST_INT)
10135     {
10136       split_di (operands, 2, low, high);
10137       count = INTVAL (operands[2]) & 63;
10138
10139       if (count >= 32)
10140         {
10141           emit_move_insn (high[0], low[1]);
10142           emit_move_insn (low[0], const0_rtx);
10143
10144           if (count > 32)
10145             ix86_expand_ashlsi3_const (high[0], count - 32);
10146         }
10147       else
10148         {
10149           if (!rtx_equal_p (operands[0], operands[1]))
10150             emit_move_insn (operands[0], operands[1]);
10151           emit_insn (gen_x86_shld_1 (high[0], low[0], GEN_INT (count)));
10152           ix86_expand_ashlsi3_const (low[0], count);
10153         }
10154       return;
10155     }
10156
10157   split_di (operands, 1, low, high);
10158
10159   if (operands[1] == const1_rtx)
10160     {
10161       /* Assuming we've chosen a QImode capable registers, then 1LL << N
10162          can be done with two 32-bit shifts, no branches, no cmoves.  */
10163       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
10164         {
10165           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
10166
10167           ix86_expand_clear (low[0]);
10168           ix86_expand_clear (high[0]);
10169           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (32)));
10170           
10171           d = gen_lowpart (QImode, low[0]);
10172           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
10173           s = gen_rtx_EQ (QImode, flags, const0_rtx);
10174           emit_insn (gen_rtx_SET (VOIDmode, d, s));
10175
10176           d = gen_lowpart (QImode, high[0]);
10177           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
10178           s = gen_rtx_NE (QImode, flags, const0_rtx);
10179           emit_insn (gen_rtx_SET (VOIDmode, d, s));
10180         }
10181
10182       /* Otherwise, we can get the same results by manually performing
10183          a bit extract operation on bit 5, and then performing the two
10184          shifts.  The two methods of getting 0/1 into low/high are exactly
10185          the same size.  Avoiding the shift in the bit extract case helps
10186          pentium4 a bit; no one else seems to care much either way.  */
10187       else
10188         {
10189           rtx x;
10190
10191           if (TARGET_PARTIAL_REG_STALL && !optimize_size)
10192             x = gen_rtx_ZERO_EXTEND (SImode, operands[2]);
10193           else
10194             x = gen_lowpart (SImode, operands[2]);
10195           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
10196
10197           emit_insn (gen_lshrsi3 (high[0], high[0], GEN_INT (5)));
10198           emit_insn (gen_andsi3 (high[0], high[0], GEN_INT (1)));
10199           emit_move_insn (low[0], high[0]);
10200           emit_insn (gen_xorsi3 (low[0], low[0], GEN_INT (1)));
10201         }
10202
10203       emit_insn (gen_ashlsi3 (low[0], low[0], operands[2]));
10204       emit_insn (gen_ashlsi3 (high[0], high[0], operands[2]));
10205       return;
10206     }
10207
10208   if (operands[1] == constm1_rtx)
10209     {
10210       /* For -1LL << N, we can avoid the shld instruction, because we
10211          know that we're shifting 0...31 ones into a -1.  */
10212       emit_move_insn (low[0], constm1_rtx);
10213       if (optimize_size)
10214         emit_move_insn (high[0], low[0]);
10215       else
10216         emit_move_insn (high[0], constm1_rtx);
10217     }
10218   else
10219     {
10220       if (!rtx_equal_p (operands[0], operands[1]))
10221         emit_move_insn (operands[0], operands[1]);
10222
10223       split_di (operands, 1, low, high);
10224       emit_insn (gen_x86_shld_1 (high[0], low[0], operands[2]));
10225     }
10226
10227   emit_insn (gen_ashlsi3 (low[0], low[0], operands[2]));
10228
10229   if (TARGET_CMOVE && scratch)
10230     {
10231       ix86_expand_clear (scratch);
10232       emit_insn (gen_x86_shift_adj_1 (high[0], low[0], operands[2], scratch));
10233     }
10234   else
10235     emit_insn (gen_x86_shift_adj_2 (high[0], low[0], operands[2]));
10236 }
10237
10238 void
10239 ix86_split_ashrdi (rtx *operands, rtx scratch)
10240 {
10241   rtx low[2], high[2];
10242   int count;
10243
10244   if (GET_CODE (operands[2]) == CONST_INT)
10245     {
10246       split_di (operands, 2, low, high);
10247       count = INTVAL (operands[2]) & 63;
10248
10249       if (count == 63)
10250         {
10251           emit_move_insn (high[0], high[1]);
10252           emit_insn (gen_ashrsi3 (high[0], high[0], GEN_INT (31)));
10253           emit_move_insn (low[0], high[0]);
10254
10255         }
10256       else if (count >= 32)
10257         {
10258           emit_move_insn (low[0], high[1]);
10259           emit_move_insn (high[0], low[0]);
10260           emit_insn (gen_ashrsi3 (high[0], high[0], GEN_INT (31)));
10261           if (count > 32)
10262             emit_insn (gen_ashrsi3 (low[0], low[0], GEN_INT (count - 32)));
10263         }
10264       else
10265         {
10266           if (!rtx_equal_p (operands[0], operands[1]))
10267             emit_move_insn (operands[0], operands[1]);
10268           emit_insn (gen_x86_shrd_1 (low[0], high[0], GEN_INT (count)));
10269           emit_insn (gen_ashrsi3 (high[0], high[0], GEN_INT (count)));
10270         }
10271     }
10272   else
10273     {
10274       if (!rtx_equal_p (operands[0], operands[1]))
10275         emit_move_insn (operands[0], operands[1]);
10276
10277       split_di (operands, 1, low, high);
10278
10279       emit_insn (gen_x86_shrd_1 (low[0], high[0], operands[2]));
10280       emit_insn (gen_ashrsi3 (high[0], high[0], operands[2]));
10281
10282       if (TARGET_CMOVE && scratch)
10283         {
10284           emit_move_insn (scratch, high[0]);
10285           emit_insn (gen_ashrsi3 (scratch, scratch, GEN_INT (31)));
10286           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
10287                                           scratch));
10288         }
10289       else
10290         emit_insn (gen_x86_shift_adj_3 (low[0], high[0], operands[2]));
10291     }
10292 }
10293
10294 void
10295 ix86_split_lshrdi (rtx *operands, rtx scratch)
10296 {
10297   rtx low[2], high[2];
10298   int count;
10299
10300   if (GET_CODE (operands[2]) == CONST_INT)
10301     {
10302       split_di (operands, 2, low, high);
10303       count = INTVAL (operands[2]) & 63;
10304
10305       if (count >= 32)
10306         {
10307           emit_move_insn (low[0], high[1]);
10308           ix86_expand_clear (high[0]);
10309
10310           if (count > 32)
10311             emit_insn (gen_lshrsi3 (low[0], low[0], GEN_INT (count - 32)));
10312         }
10313       else
10314         {
10315           if (!rtx_equal_p (operands[0], operands[1]))
10316             emit_move_insn (operands[0], operands[1]);
10317           emit_insn (gen_x86_shrd_1 (low[0], high[0], GEN_INT (count)));
10318           emit_insn (gen_lshrsi3 (high[0], high[0], GEN_INT (count)));
10319         }
10320     }
10321   else
10322     {
10323       if (!rtx_equal_p (operands[0], operands[1]))
10324         emit_move_insn (operands[0], operands[1]);
10325
10326       split_di (operands, 1, low, high);
10327
10328       emit_insn (gen_x86_shrd_1 (low[0], high[0], operands[2]));
10329       emit_insn (gen_lshrsi3 (high[0], high[0], operands[2]));
10330
10331       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
10332       if (TARGET_CMOVE && scratch)
10333         {
10334           ix86_expand_clear (scratch);
10335           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
10336                                           scratch));
10337         }
10338       else
10339         emit_insn (gen_x86_shift_adj_2 (low[0], high[0], operands[2]));
10340     }
10341 }
10342
10343 /* Helper function for the string operations below.  Dest VARIABLE whether
10344    it is aligned to VALUE bytes.  If true, jump to the label.  */
10345 static rtx
10346 ix86_expand_aligntest (rtx variable, int value)
10347 {
10348   rtx label = gen_label_rtx ();
10349   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
10350   if (GET_MODE (variable) == DImode)
10351     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
10352   else
10353     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
10354   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
10355                            1, label);
10356   return label;
10357 }
10358
10359 /* Adjust COUNTER by the VALUE.  */
10360 static void
10361 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
10362 {
10363   if (GET_MODE (countreg) == DImode)
10364     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
10365   else
10366     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
10367 }
10368
10369 /* Zero extend possibly SImode EXP to Pmode register.  */
10370 rtx
10371 ix86_zero_extend_to_Pmode (rtx exp)
10372 {
10373   rtx r;
10374   if (GET_MODE (exp) == VOIDmode)
10375     return force_reg (Pmode, exp);
10376   if (GET_MODE (exp) == Pmode)
10377     return copy_to_mode_reg (Pmode, exp);
10378   r = gen_reg_rtx (Pmode);
10379   emit_insn (gen_zero_extendsidi2 (r, exp));
10380   return r;
10381 }
10382
10383 /* Expand string move (memcpy) operation.  Use i386 string operations when
10384    profitable.  expand_clrmem contains similar code.  */
10385 int
10386 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp)
10387 {
10388   rtx srcreg, destreg, countreg, srcexp, destexp;
10389   enum machine_mode counter_mode;
10390   HOST_WIDE_INT align = 0;
10391   unsigned HOST_WIDE_INT count = 0;
10392
10393   if (GET_CODE (align_exp) == CONST_INT)
10394     align = INTVAL (align_exp);
10395
10396   /* Can't use any of this if the user has appropriated esi or edi.  */
10397   if (global_regs[4] || global_regs[5])
10398     return 0;
10399
10400   /* This simple hack avoids all inlining code and simplifies code below.  */
10401   if (!TARGET_ALIGN_STRINGOPS)
10402     align = 64;
10403
10404   if (GET_CODE (count_exp) == CONST_INT)
10405     {
10406       count = INTVAL (count_exp);
10407       if (!TARGET_INLINE_ALL_STRINGOPS && count > 64)
10408         return 0;
10409     }
10410
10411   /* Figure out proper mode for counter.  For 32bits it is always SImode,
10412      for 64bits use SImode when possible, otherwise DImode.
10413      Set count to number of bytes copied when known at compile time.  */
10414   if (!TARGET_64BIT
10415       || GET_MODE (count_exp) == SImode
10416       || x86_64_zext_immediate_operand (count_exp, VOIDmode))
10417     counter_mode = SImode;
10418   else
10419     counter_mode = DImode;
10420
10421   if (counter_mode != SImode && counter_mode != DImode)
10422     abort ();
10423
10424   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
10425   if (destreg != XEXP (dst, 0))
10426     dst = replace_equiv_address_nv (dst, destreg);
10427   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
10428   if (srcreg != XEXP (src, 0))
10429     src = replace_equiv_address_nv (src, srcreg);
10430
10431   /* When optimizing for size emit simple rep ; movsb instruction for
10432      counts not divisible by 4.  */
10433
10434   if ((!optimize || optimize_size) && (count == 0 || (count & 0x03)))
10435     {
10436       emit_insn (gen_cld ());
10437       countreg = ix86_zero_extend_to_Pmode (count_exp);
10438       destexp = gen_rtx_PLUS (Pmode, destreg, countreg);
10439       srcexp = gen_rtx_PLUS (Pmode, srcreg, countreg);
10440       emit_insn (gen_rep_mov (destreg, dst, srcreg, src, countreg,
10441                               destexp, srcexp));
10442     }
10443
10444   /* For constant aligned (or small unaligned) copies use rep movsl
10445      followed by code copying the rest.  For PentiumPro ensure 8 byte
10446      alignment to allow rep movsl acceleration.  */
10447
10448   else if (count != 0
10449            && (align >= 8
10450                || (!TARGET_PENTIUMPRO && !TARGET_64BIT && align >= 4)
10451                || optimize_size || count < (unsigned int) 64))
10452     {
10453       unsigned HOST_WIDE_INT offset = 0;
10454       int size = TARGET_64BIT && !optimize_size ? 8 : 4;
10455       rtx srcmem, dstmem;
10456
10457       emit_insn (gen_cld ());
10458       if (count & ~(size - 1))
10459         {
10460           countreg = copy_to_mode_reg (counter_mode,
10461                                        GEN_INT ((count >> (size == 4 ? 2 : 3))
10462                                                 & (TARGET_64BIT ? -1 : 0x3fffffff)));
10463           countreg = ix86_zero_extend_to_Pmode (countreg);
10464
10465           destexp = gen_rtx_ASHIFT (Pmode, countreg,
10466                                     GEN_INT (size == 4 ? 2 : 3));
10467           srcexp = gen_rtx_PLUS (Pmode, destexp, srcreg);
10468           destexp = gen_rtx_PLUS (Pmode, destexp, destreg);
10469
10470           emit_insn (gen_rep_mov (destreg, dst, srcreg, src,
10471                                   countreg, destexp, srcexp));
10472           offset = count & ~(size - 1);
10473         }
10474       if (size == 8 && (count & 0x04))
10475         {
10476           srcmem = adjust_automodify_address_nv (src, SImode, srcreg,
10477                                                  offset);
10478           dstmem = adjust_automodify_address_nv (dst, SImode, destreg,
10479                                                  offset);
10480           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10481           offset += 4;
10482         }
10483       if (count & 0x02)
10484         {
10485           srcmem = adjust_automodify_address_nv (src, HImode, srcreg,
10486                                                  offset);
10487           dstmem = adjust_automodify_address_nv (dst, HImode, destreg,
10488                                                  offset);
10489           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10490           offset += 2;
10491         }
10492       if (count & 0x01)
10493         {
10494           srcmem = adjust_automodify_address_nv (src, QImode, srcreg,
10495                                                  offset);
10496           dstmem = adjust_automodify_address_nv (dst, QImode, destreg,
10497                                                  offset);
10498           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10499         }
10500     }
10501   /* The generic code based on the glibc implementation:
10502      - align destination to 4 bytes (8 byte alignment is used for PentiumPro
10503      allowing accelerated copying there)
10504      - copy the data using rep movsl
10505      - copy the rest.  */
10506   else
10507     {
10508       rtx countreg2;
10509       rtx label = NULL;
10510       rtx srcmem, dstmem;
10511       int desired_alignment = (TARGET_PENTIUMPRO
10512                                && (count == 0 || count >= (unsigned int) 260)
10513                                ? 8 : UNITS_PER_WORD);
10514       /* Get rid of MEM_OFFSETs, they won't be accurate.  */
10515       dst = change_address (dst, BLKmode, destreg);
10516       src = change_address (src, BLKmode, srcreg);
10517
10518       /* In case we don't know anything about the alignment, default to
10519          library version, since it is usually equally fast and result in
10520          shorter code.
10521
10522          Also emit call when we know that the count is large and call overhead
10523          will not be important.  */
10524       if (!TARGET_INLINE_ALL_STRINGOPS
10525           && (align < UNITS_PER_WORD || !TARGET_REP_MOVL_OPTIMAL))
10526         return 0;
10527
10528       if (TARGET_SINGLE_STRINGOP)
10529         emit_insn (gen_cld ());
10530
10531       countreg2 = gen_reg_rtx (Pmode);
10532       countreg = copy_to_mode_reg (counter_mode, count_exp);
10533
10534       /* We don't use loops to align destination and to copy parts smaller
10535          than 4 bytes, because gcc is able to optimize such code better (in
10536          the case the destination or the count really is aligned, gcc is often
10537          able to predict the branches) and also it is friendlier to the
10538          hardware branch prediction.
10539
10540          Using loops is beneficial for generic case, because we can
10541          handle small counts using the loops.  Many CPUs (such as Athlon)
10542          have large REP prefix setup costs.
10543
10544          This is quite costly.  Maybe we can revisit this decision later or
10545          add some customizability to this code.  */
10546
10547       if (count == 0 && align < desired_alignment)
10548         {
10549           label = gen_label_rtx ();
10550           emit_cmp_and_jump_insns (countreg, GEN_INT (desired_alignment - 1),
10551                                    LEU, 0, counter_mode, 1, label);
10552         }
10553       if (align <= 1)
10554         {
10555           rtx label = ix86_expand_aligntest (destreg, 1);
10556           srcmem = change_address (src, QImode, srcreg);
10557           dstmem = change_address (dst, QImode, destreg);
10558           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10559           ix86_adjust_counter (countreg, 1);
10560           emit_label (label);
10561           LABEL_NUSES (label) = 1;
10562         }
10563       if (align <= 2)
10564         {
10565           rtx label = ix86_expand_aligntest (destreg, 2);
10566           srcmem = change_address (src, HImode, srcreg);
10567           dstmem = change_address (dst, HImode, destreg);
10568           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10569           ix86_adjust_counter (countreg, 2);
10570           emit_label (label);
10571           LABEL_NUSES (label) = 1;
10572         }
10573       if (align <= 4 && desired_alignment > 4)
10574         {
10575           rtx label = ix86_expand_aligntest (destreg, 4);
10576           srcmem = change_address (src, SImode, srcreg);
10577           dstmem = change_address (dst, SImode, destreg);
10578           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10579           ix86_adjust_counter (countreg, 4);
10580           emit_label (label);
10581           LABEL_NUSES (label) = 1;
10582         }
10583
10584       if (label && desired_alignment > 4 && !TARGET_64BIT)
10585         {
10586           emit_label (label);
10587           LABEL_NUSES (label) = 1;
10588           label = NULL_RTX;
10589         }
10590       if (!TARGET_SINGLE_STRINGOP)
10591         emit_insn (gen_cld ());
10592       if (TARGET_64BIT)
10593         {
10594           emit_insn (gen_lshrdi3 (countreg2, ix86_zero_extend_to_Pmode (countreg),
10595                                   GEN_INT (3)));
10596           destexp = gen_rtx_ASHIFT (Pmode, countreg2, GEN_INT (3));
10597         }
10598       else
10599         {
10600           emit_insn (gen_lshrsi3 (countreg2, countreg, const2_rtx));
10601           destexp = gen_rtx_ASHIFT (Pmode, countreg2, const2_rtx);
10602         }
10603       srcexp = gen_rtx_PLUS (Pmode, destexp, srcreg);
10604       destexp = gen_rtx_PLUS (Pmode, destexp, destreg);
10605       emit_insn (gen_rep_mov (destreg, dst, srcreg, src,
10606                               countreg2, destexp, srcexp));
10607
10608       if (label)
10609         {
10610           emit_label (label);
10611           LABEL_NUSES (label) = 1;
10612         }
10613       if (TARGET_64BIT && align > 4 && count != 0 && (count & 4))
10614         {
10615           srcmem = change_address (src, SImode, srcreg);
10616           dstmem = change_address (dst, SImode, destreg);
10617           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10618         }
10619       if ((align <= 4 || count == 0) && TARGET_64BIT)
10620         {
10621           rtx label = ix86_expand_aligntest (countreg, 4);
10622           srcmem = change_address (src, SImode, srcreg);
10623           dstmem = change_address (dst, SImode, destreg);
10624           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10625           emit_label (label);
10626           LABEL_NUSES (label) = 1;
10627         }
10628       if (align > 2 && count != 0 && (count & 2))
10629         {
10630           srcmem = change_address (src, HImode, srcreg);
10631           dstmem = change_address (dst, HImode, destreg);
10632           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10633         }
10634       if (align <= 2 || count == 0)
10635         {
10636           rtx label = ix86_expand_aligntest (countreg, 2);
10637           srcmem = change_address (src, HImode, srcreg);
10638           dstmem = change_address (dst, HImode, destreg);
10639           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10640           emit_label (label);
10641           LABEL_NUSES (label) = 1;
10642         }
10643       if (align > 1 && count != 0 && (count & 1))
10644         {
10645           srcmem = change_address (src, QImode, srcreg);
10646           dstmem = change_address (dst, QImode, destreg);
10647           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10648         }
10649       if (align <= 1 || count == 0)
10650         {
10651           rtx label = ix86_expand_aligntest (countreg, 1);
10652           srcmem = change_address (src, QImode, srcreg);
10653           dstmem = change_address (dst, QImode, destreg);
10654           emit_insn (gen_strmov (destreg, dstmem, srcreg, srcmem));
10655           emit_label (label);
10656           LABEL_NUSES (label) = 1;
10657         }
10658     }
10659
10660   return 1;
10661 }
10662
10663 /* Expand string clear operation (bzero).  Use i386 string operations when
10664    profitable.  expand_movmem contains similar code.  */
10665 int
10666 ix86_expand_clrmem (rtx dst, rtx count_exp, rtx align_exp)
10667 {
10668   rtx destreg, zeroreg, countreg, destexp;
10669   enum machine_mode counter_mode;
10670   HOST_WIDE_INT align = 0;
10671   unsigned HOST_WIDE_INT count = 0;
10672
10673   if (GET_CODE (align_exp) == CONST_INT)
10674     align = INTVAL (align_exp);
10675
10676   /* Can't use any of this if the user has appropriated esi.  */
10677   if (global_regs[4])
10678     return 0;
10679
10680   /* This simple hack avoids all inlining code and simplifies code below.  */
10681   if (!TARGET_ALIGN_STRINGOPS)
10682     align = 32;
10683
10684   if (GET_CODE (count_exp) == CONST_INT)
10685     {
10686       count = INTVAL (count_exp);
10687       if (!TARGET_INLINE_ALL_STRINGOPS && count > 64)
10688         return 0;
10689     }
10690   /* Figure out proper mode for counter.  For 32bits it is always SImode,
10691      for 64bits use SImode when possible, otherwise DImode.
10692      Set count to number of bytes copied when known at compile time.  */
10693   if (!TARGET_64BIT
10694       || GET_MODE (count_exp) == SImode
10695       || x86_64_zext_immediate_operand (count_exp, VOIDmode))
10696     counter_mode = SImode;
10697   else
10698     counter_mode = DImode;
10699
10700   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
10701   if (destreg != XEXP (dst, 0))
10702     dst = replace_equiv_address_nv (dst, destreg);
10703
10704
10705   /* When optimizing for size emit simple rep ; movsb instruction for
10706      counts not divisible by 4.  The movl $N, %ecx; rep; stosb
10707      sequence is 7 bytes long, so if optimizing for size and count is
10708      small enough that some stosl, stosw and stosb instructions without
10709      rep are shorter, fall back into the next if.  */
10710
10711   if ((!optimize || optimize_size)
10712       && (count == 0
10713           || ((count & 0x03)
10714               && (!optimize_size || (count & 0x03) + (count >> 2) > 7))))
10715     {
10716       emit_insn (gen_cld ());
10717
10718       countreg = ix86_zero_extend_to_Pmode (count_exp);
10719       zeroreg = copy_to_mode_reg (QImode, const0_rtx);
10720       destexp = gen_rtx_PLUS (Pmode, destreg, countreg);
10721       emit_insn (gen_rep_stos (destreg, countreg, dst, zeroreg, destexp));
10722     }
10723   else if (count != 0
10724            && (align >= 8
10725                || (!TARGET_PENTIUMPRO && !TARGET_64BIT && align >= 4)
10726                || optimize_size || count < (unsigned int) 64))
10727     {
10728       int size = TARGET_64BIT && !optimize_size ? 8 : 4;
10729       unsigned HOST_WIDE_INT offset = 0;
10730
10731       emit_insn (gen_cld ());
10732
10733       zeroreg = copy_to_mode_reg (size == 4 ? SImode : DImode, const0_rtx);
10734       if (count & ~(size - 1))
10735         {
10736           unsigned HOST_WIDE_INT repcount;
10737           unsigned int max_nonrep;
10738
10739           repcount = count >> (size == 4 ? 2 : 3);
10740           if (!TARGET_64BIT)
10741             repcount &= 0x3fffffff;
10742
10743           /* movl $N, %ecx; rep; stosl is 7 bytes, while N x stosl is N bytes.
10744              movl $N, %ecx; rep; stosq is 8 bytes, while N x stosq is 2xN
10745              bytes.  In both cases the latter seems to be faster for small
10746              values of N.  */
10747           max_nonrep = size == 4 ? 7 : 4;
10748           if (!optimize_size)
10749             switch (ix86_tune)
10750               {
10751               case PROCESSOR_PENTIUM4:
10752               case PROCESSOR_NOCONA:
10753                 max_nonrep = 3;
10754                 break;
10755               default:
10756                 break;
10757               }
10758
10759           if (repcount <= max_nonrep)
10760             while (repcount-- > 0)
10761               {
10762                 rtx mem = adjust_automodify_address_nv (dst,
10763                                                         GET_MODE (zeroreg),
10764                                                         destreg, offset);
10765                 emit_insn (gen_strset (destreg, mem, zeroreg));
10766                 offset += size;
10767               }
10768           else
10769             {
10770               countreg = copy_to_mode_reg (counter_mode, GEN_INT (repcount));
10771               countreg = ix86_zero_extend_to_Pmode (countreg);
10772               destexp = gen_rtx_ASHIFT (Pmode, countreg,
10773                                         GEN_INT (size == 4 ? 2 : 3));
10774               destexp = gen_rtx_PLUS (Pmode, destexp, destreg);
10775               emit_insn (gen_rep_stos (destreg, countreg, dst, zeroreg,
10776                                        destexp));
10777               offset = count & ~(size - 1);
10778             }
10779         }
10780       if (size == 8 && (count & 0x04))
10781         {
10782           rtx mem = adjust_automodify_address_nv (dst, SImode, destreg,
10783                                                   offset);
10784           emit_insn (gen_strset (destreg, mem,
10785                                  gen_rtx_SUBREG (SImode, zeroreg, 0)));
10786           offset += 4;
10787         }
10788       if (count & 0x02)
10789         {
10790           rtx mem = adjust_automodify_address_nv (dst, HImode, destreg,
10791                                                   offset);
10792           emit_insn (gen_strset (destreg, mem,
10793                                  gen_rtx_SUBREG (HImode, zeroreg, 0)));
10794           offset += 2;
10795         }
10796       if (count & 0x01)
10797         {
10798           rtx mem = adjust_automodify_address_nv (dst, QImode, destreg,
10799                                                   offset);
10800           emit_insn (gen_strset (destreg, mem,
10801                                  gen_rtx_SUBREG (QImode, zeroreg, 0)));
10802         }
10803     }
10804   else
10805     {
10806       rtx countreg2;
10807       rtx label = NULL;
10808       /* Compute desired alignment of the string operation.  */
10809       int desired_alignment = (TARGET_PENTIUMPRO
10810                                && (count == 0 || count >= (unsigned int) 260)
10811                                ? 8 : UNITS_PER_WORD);
10812
10813       /* In case we don't know anything about the alignment, default to
10814          library version, since it is usually equally fast and result in
10815          shorter code.
10816
10817          Also emit call when we know that the count is large and call overhead
10818          will not be important.  */
10819       if (!TARGET_INLINE_ALL_STRINGOPS
10820           && (align < UNITS_PER_WORD || !TARGET_REP_MOVL_OPTIMAL))
10821         return 0;
10822
10823       if (TARGET_SINGLE_STRINGOP)
10824         emit_insn (gen_cld ());
10825
10826       countreg2 = gen_reg_rtx (Pmode);
10827       countreg = copy_to_mode_reg (counter_mode, count_exp);
10828       zeroreg = copy_to_mode_reg (Pmode, const0_rtx);
10829       /* Get rid of MEM_OFFSET, it won't be accurate.  */
10830       dst = change_address (dst, BLKmode, destreg);
10831
10832       if (count == 0 && align < desired_alignment)
10833         {
10834           label = gen_label_rtx ();
10835           emit_cmp_and_jump_insns (countreg, GEN_INT (desired_alignment - 1),
10836                                    LEU, 0, counter_mode, 1, label);
10837         }
10838       if (align <= 1)
10839         {
10840           rtx label = ix86_expand_aligntest (destreg, 1);
10841           emit_insn (gen_strset (destreg, dst,
10842                                  gen_rtx_SUBREG (QImode, zeroreg, 0)));
10843           ix86_adjust_counter (countreg, 1);
10844           emit_label (label);
10845           LABEL_NUSES (label) = 1;
10846         }
10847       if (align <= 2)
10848         {
10849           rtx label = ix86_expand_aligntest (destreg, 2);
10850           emit_insn (gen_strset (destreg, dst,
10851                                  gen_rtx_SUBREG (HImode, zeroreg, 0)));
10852           ix86_adjust_counter (countreg, 2);
10853           emit_label (label);
10854           LABEL_NUSES (label) = 1;
10855         }
10856       if (align <= 4 && desired_alignment > 4)
10857         {
10858           rtx label = ix86_expand_aligntest (destreg, 4);
10859           emit_insn (gen_strset (destreg, dst,
10860                                  (TARGET_64BIT
10861                                   ? gen_rtx_SUBREG (SImode, zeroreg, 0)
10862                                   : zeroreg)));
10863           ix86_adjust_counter (countreg, 4);
10864           emit_label (label);
10865           LABEL_NUSES (label) = 1;
10866         }
10867
10868       if (label && desired_alignment > 4 && !TARGET_64BIT)
10869         {
10870           emit_label (label);
10871           LABEL_NUSES (label) = 1;
10872           label = NULL_RTX;
10873         }
10874
10875       if (!TARGET_SINGLE_STRINGOP)
10876         emit_insn (gen_cld ());
10877       if (TARGET_64BIT)
10878         {
10879           emit_insn (gen_lshrdi3 (countreg2, ix86_zero_extend_to_Pmode (countreg),
10880                                   GEN_INT (3)));
10881           destexp = gen_rtx_ASHIFT (Pmode, countreg2, GEN_INT (3));
10882         }
10883       else
10884         {
10885           emit_insn (gen_lshrsi3 (countreg2, countreg, const2_rtx));
10886           destexp = gen_rtx_ASHIFT (Pmode, countreg2, const2_rtx);
10887         }
10888       destexp = gen_rtx_PLUS (Pmode, destexp, destreg);
10889       emit_insn (gen_rep_stos (destreg, countreg2, dst, zeroreg, destexp));
10890
10891       if (label)
10892         {
10893           emit_label (label);
10894           LABEL_NUSES (label) = 1;
10895         }
10896
10897       if (TARGET_64BIT && align > 4 && count != 0 && (count & 4))
10898         emit_insn (gen_strset (destreg, dst,
10899                                gen_rtx_SUBREG (SImode, zeroreg, 0)));
10900       if (TARGET_64BIT && (align <= 4 || count == 0))
10901         {
10902           rtx label = ix86_expand_aligntest (countreg, 4);
10903           emit_insn (gen_strset (destreg, dst,
10904                                  gen_rtx_SUBREG (SImode, zeroreg, 0)));
10905           emit_label (label);
10906           LABEL_NUSES (label) = 1;
10907         }
10908       if (align > 2 && count != 0 && (count & 2))
10909         emit_insn (gen_strset (destreg, dst,
10910                                gen_rtx_SUBREG (HImode, zeroreg, 0)));
10911       if (align <= 2 || count == 0)
10912         {
10913           rtx label = ix86_expand_aligntest (countreg, 2);
10914           emit_insn (gen_strset (destreg, dst,
10915                                  gen_rtx_SUBREG (HImode, zeroreg, 0)));
10916           emit_label (label);
10917           LABEL_NUSES (label) = 1;
10918         }
10919       if (align > 1 && count != 0 && (count & 1))
10920         emit_insn (gen_strset (destreg, dst,
10921                                gen_rtx_SUBREG (QImode, zeroreg, 0)));
10922       if (align <= 1 || count == 0)
10923         {
10924           rtx label = ix86_expand_aligntest (countreg, 1);
10925           emit_insn (gen_strset (destreg, dst,
10926                                  gen_rtx_SUBREG (QImode, zeroreg, 0)));
10927           emit_label (label);
10928           LABEL_NUSES (label) = 1;
10929         }
10930     }
10931   return 1;
10932 }
10933
10934 /* Expand strlen.  */
10935 int
10936 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
10937 {
10938   rtx addr, scratch1, scratch2, scratch3, scratch4;
10939
10940   /* The generic case of strlen expander is long.  Avoid it's
10941      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
10942
10943   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
10944       && !TARGET_INLINE_ALL_STRINGOPS
10945       && !optimize_size
10946       && (GET_CODE (align) != CONST_INT || INTVAL (align) < 4))
10947     return 0;
10948
10949   addr = force_reg (Pmode, XEXP (src, 0));
10950   scratch1 = gen_reg_rtx (Pmode);
10951
10952   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
10953       && !optimize_size)
10954     {
10955       /* Well it seems that some optimizer does not combine a call like
10956          foo(strlen(bar), strlen(bar));
10957          when the move and the subtraction is done here.  It does calculate
10958          the length just once when these instructions are done inside of
10959          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
10960          often used and I use one fewer register for the lifetime of
10961          output_strlen_unroll() this is better.  */
10962
10963       emit_move_insn (out, addr);
10964
10965       ix86_expand_strlensi_unroll_1 (out, src, align);
10966
10967       /* strlensi_unroll_1 returns the address of the zero at the end of
10968          the string, like memchr(), so compute the length by subtracting
10969          the start address.  */
10970       if (TARGET_64BIT)
10971         emit_insn (gen_subdi3 (out, out, addr));
10972       else
10973         emit_insn (gen_subsi3 (out, out, addr));
10974     }
10975   else
10976     {
10977       rtx unspec;
10978       scratch2 = gen_reg_rtx (Pmode);
10979       scratch3 = gen_reg_rtx (Pmode);
10980       scratch4 = force_reg (Pmode, constm1_rtx);
10981
10982       emit_move_insn (scratch3, addr);
10983       eoschar = force_reg (QImode, eoschar);
10984
10985       emit_insn (gen_cld ());
10986       src = replace_equiv_address_nv (src, scratch3);
10987
10988       /* If .md starts supporting :P, this can be done in .md.  */
10989       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
10990                                                  scratch4), UNSPEC_SCAS);
10991       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
10992       if (TARGET_64BIT)
10993         {
10994           emit_insn (gen_one_cmpldi2 (scratch2, scratch1));
10995           emit_insn (gen_adddi3 (out, scratch2, constm1_rtx));
10996         }
10997       else
10998         {
10999           emit_insn (gen_one_cmplsi2 (scratch2, scratch1));
11000           emit_insn (gen_addsi3 (out, scratch2, constm1_rtx));
11001         }
11002     }
11003   return 1;
11004 }
11005
11006 /* Expand the appropriate insns for doing strlen if not just doing
11007    repnz; scasb
11008
11009    out = result, initialized with the start address
11010    align_rtx = alignment of the address.
11011    scratch = scratch register, initialized with the startaddress when
11012         not aligned, otherwise undefined
11013
11014    This is just the body. It needs the initializations mentioned above and
11015    some address computing at the end.  These things are done in i386.md.  */
11016
11017 static void
11018 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
11019 {
11020   int align;
11021   rtx tmp;
11022   rtx align_2_label = NULL_RTX;
11023   rtx align_3_label = NULL_RTX;
11024   rtx align_4_label = gen_label_rtx ();
11025   rtx end_0_label = gen_label_rtx ();
11026   rtx mem;
11027   rtx tmpreg = gen_reg_rtx (SImode);
11028   rtx scratch = gen_reg_rtx (SImode);
11029   rtx cmp;
11030
11031   align = 0;
11032   if (GET_CODE (align_rtx) == CONST_INT)
11033     align = INTVAL (align_rtx);
11034
11035   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
11036
11037   /* Is there a known alignment and is it less than 4?  */
11038   if (align < 4)
11039     {
11040       rtx scratch1 = gen_reg_rtx (Pmode);
11041       emit_move_insn (scratch1, out);
11042       /* Is there a known alignment and is it not 2? */
11043       if (align != 2)
11044         {
11045           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
11046           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
11047
11048           /* Leave just the 3 lower bits.  */
11049           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
11050                                     NULL_RTX, 0, OPTAB_WIDEN);
11051
11052           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
11053                                    Pmode, 1, align_4_label);
11054           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
11055                                    Pmode, 1, align_2_label);
11056           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
11057                                    Pmode, 1, align_3_label);
11058         }
11059       else
11060         {
11061           /* Since the alignment is 2, we have to check 2 or 0 bytes;
11062              check if is aligned to 4 - byte.  */
11063
11064           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
11065                                     NULL_RTX, 0, OPTAB_WIDEN);
11066
11067           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
11068                                    Pmode, 1, align_4_label);
11069         }
11070
11071       mem = change_address (src, QImode, out);
11072
11073       /* Now compare the bytes.  */
11074
11075       /* Compare the first n unaligned byte on a byte per byte basis.  */
11076       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
11077                                QImode, 1, end_0_label);
11078
11079       /* Increment the address.  */
11080       if (TARGET_64BIT)
11081         emit_insn (gen_adddi3 (out, out, const1_rtx));
11082       else
11083         emit_insn (gen_addsi3 (out, out, const1_rtx));
11084
11085       /* Not needed with an alignment of 2 */
11086       if (align != 2)
11087         {
11088           emit_label (align_2_label);
11089
11090           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
11091                                    end_0_label);
11092
11093           if (TARGET_64BIT)
11094             emit_insn (gen_adddi3 (out, out, const1_rtx));
11095           else
11096             emit_insn (gen_addsi3 (out, out, const1_rtx));
11097
11098           emit_label (align_3_label);
11099         }
11100
11101       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
11102                                end_0_label);
11103
11104       if (TARGET_64BIT)
11105         emit_insn (gen_adddi3 (out, out, const1_rtx));
11106       else
11107         emit_insn (gen_addsi3 (out, out, const1_rtx));
11108     }
11109
11110   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
11111      align this loop.  It gives only huge programs, but does not help to
11112      speed up.  */
11113   emit_label (align_4_label);
11114
11115   mem = change_address (src, SImode, out);
11116   emit_move_insn (scratch, mem);
11117   if (TARGET_64BIT)
11118     emit_insn (gen_adddi3 (out, out, GEN_INT (4)));
11119   else
11120     emit_insn (gen_addsi3 (out, out, GEN_INT (4)));
11121
11122   /* This formula yields a nonzero result iff one of the bytes is zero.
11123      This saves three branches inside loop and many cycles.  */
11124
11125   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
11126   emit_insn (gen_one_cmplsi2 (scratch, scratch));
11127   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
11128   emit_insn (gen_andsi3 (tmpreg, tmpreg,
11129                          gen_int_mode (0x80808080, SImode)));
11130   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
11131                            align_4_label);
11132
11133   if (TARGET_CMOVE)
11134     {
11135        rtx reg = gen_reg_rtx (SImode);
11136        rtx reg2 = gen_reg_rtx (Pmode);
11137        emit_move_insn (reg, tmpreg);
11138        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
11139
11140        /* If zero is not in the first two bytes, move two bytes forward.  */
11141        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
11142        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
11143        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
11144        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
11145                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
11146                                                      reg,
11147                                                      tmpreg)));
11148        /* Emit lea manually to avoid clobbering of flags.  */
11149        emit_insn (gen_rtx_SET (SImode, reg2,
11150                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
11151
11152        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
11153        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
11154        emit_insn (gen_rtx_SET (VOIDmode, out,
11155                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
11156                                                      reg2,
11157                                                      out)));
11158
11159     }
11160   else
11161     {
11162        rtx end_2_label = gen_label_rtx ();
11163        /* Is zero in the first two bytes? */
11164
11165        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
11166        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
11167        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
11168        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
11169                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
11170                             pc_rtx);
11171        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
11172        JUMP_LABEL (tmp) = end_2_label;
11173
11174        /* Not in the first two.  Move two bytes forward.  */
11175        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
11176        if (TARGET_64BIT)
11177          emit_insn (gen_adddi3 (out, out, const2_rtx));
11178        else
11179          emit_insn (gen_addsi3 (out, out, const2_rtx));
11180
11181        emit_label (end_2_label);
11182
11183     }
11184
11185   /* Avoid branch in fixing the byte.  */
11186   tmpreg = gen_lowpart (QImode, tmpreg);
11187   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
11188   cmp = gen_rtx_LTU (Pmode, gen_rtx_REG (CCmode, 17), const0_rtx);
11189   if (TARGET_64BIT)
11190     emit_insn (gen_subdi3_carry_rex64 (out, out, GEN_INT (3), cmp));
11191   else
11192     emit_insn (gen_subsi3_carry (out, out, GEN_INT (3), cmp));
11193
11194   emit_label (end_0_label);
11195 }
11196
11197 void
11198 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
11199                   rtx callarg2 ATTRIBUTE_UNUSED,
11200                   rtx pop, int sibcall)
11201 {
11202   rtx use = NULL, call;
11203
11204   if (pop == const0_rtx)
11205     pop = NULL;
11206   if (TARGET_64BIT && pop)
11207     abort ();
11208
11209 #if TARGET_MACHO
11210   if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
11211     fnaddr = machopic_indirect_call_target (fnaddr);
11212 #else
11213   /* Static functions and indirect calls don't need the pic register.  */
11214   if (! TARGET_64BIT && flag_pic
11215       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
11216       && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
11217     use_reg (&use, pic_offset_table_rtx);
11218
11219   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
11220     {
11221       rtx al = gen_rtx_REG (QImode, 0);
11222       emit_move_insn (al, callarg2);
11223       use_reg (&use, al);
11224     }
11225 #endif /* TARGET_MACHO */
11226
11227   if (! call_insn_operand (XEXP (fnaddr, 0), Pmode))
11228     {
11229       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
11230       fnaddr = gen_rtx_MEM (QImode, fnaddr);
11231     }
11232   if (sibcall && TARGET_64BIT
11233       && !constant_call_address_operand (XEXP (fnaddr, 0), Pmode))
11234     {
11235       rtx addr;
11236       addr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
11237       fnaddr = gen_rtx_REG (Pmode, FIRST_REX_INT_REG + 3 /* R11 */);
11238       emit_move_insn (fnaddr, addr);
11239       fnaddr = gen_rtx_MEM (QImode, fnaddr);
11240     }
11241
11242   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
11243   if (retval)
11244     call = gen_rtx_SET (VOIDmode, retval, call);
11245   if (pop)
11246     {
11247       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
11248       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
11249       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
11250     }
11251
11252   call = emit_call_insn (call);
11253   if (use)
11254     CALL_INSN_FUNCTION_USAGE (call) = use;
11255 }
11256
11257 \f
11258 /* Clear stack slot assignments remembered from previous functions.
11259    This is called from INIT_EXPANDERS once before RTL is emitted for each
11260    function.  */
11261
11262 static struct machine_function *
11263 ix86_init_machine_status (void)
11264 {
11265   struct machine_function *f;
11266
11267   f = ggc_alloc_cleared (sizeof (struct machine_function));
11268   f->use_fast_prologue_epilogue_nregs = -1;
11269
11270   return f;
11271 }
11272
11273 /* Return a MEM corresponding to a stack slot with mode MODE.
11274    Allocate a new slot if necessary.
11275
11276    The RTL for a function can have several slots available: N is
11277    which slot to use.  */
11278
11279 rtx
11280 assign_386_stack_local (enum machine_mode mode, int n)
11281 {
11282   struct stack_local_entry *s;
11283
11284   if (n < 0 || n >= MAX_386_STACK_LOCALS)
11285     abort ();
11286
11287   for (s = ix86_stack_locals; s; s = s->next)
11288     if (s->mode == mode && s->n == n)
11289       return s->rtl;
11290
11291   s = (struct stack_local_entry *)
11292     ggc_alloc (sizeof (struct stack_local_entry));
11293   s->n = n;
11294   s->mode = mode;
11295   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
11296
11297   s->next = ix86_stack_locals;
11298   ix86_stack_locals = s;
11299   return s->rtl;
11300 }
11301
11302 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
11303
11304 static GTY(()) rtx ix86_tls_symbol;
11305 rtx
11306 ix86_tls_get_addr (void)
11307 {
11308
11309   if (!ix86_tls_symbol)
11310     {
11311       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
11312                                             (TARGET_GNU_TLS && !TARGET_64BIT)
11313                                             ? "___tls_get_addr"
11314                                             : "__tls_get_addr");
11315     }
11316
11317   return ix86_tls_symbol;
11318 }
11319 \f
11320 /* Calculate the length of the memory address in the instruction
11321    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
11322
11323 int
11324 memory_address_length (rtx addr)
11325 {
11326   struct ix86_address parts;
11327   rtx base, index, disp;
11328   int len;
11329
11330   if (GET_CODE (addr) == PRE_DEC
11331       || GET_CODE (addr) == POST_INC
11332       || GET_CODE (addr) == PRE_MODIFY
11333       || GET_CODE (addr) == POST_MODIFY)
11334     return 0;
11335
11336   if (! ix86_decompose_address (addr, &parts))
11337     abort ();
11338
11339   base = parts.base;
11340   index = parts.index;
11341   disp = parts.disp;
11342   len = 0;
11343
11344   /* Rule of thumb:
11345        - esp as the base always wants an index,
11346        - ebp as the base always wants a displacement.  */
11347
11348   /* Register Indirect.  */
11349   if (base && !index && !disp)
11350     {
11351       /* esp (for its index) and ebp (for its displacement) need
11352          the two-byte modrm form.  */
11353       if (addr == stack_pointer_rtx
11354           || addr == arg_pointer_rtx
11355           || addr == frame_pointer_rtx
11356           || addr == hard_frame_pointer_rtx)
11357         len = 1;
11358     }
11359
11360   /* Direct Addressing.  */
11361   else if (disp && !base && !index)
11362     len = 4;
11363
11364   else
11365     {
11366       /* Find the length of the displacement constant.  */
11367       if (disp)
11368         {
11369           if (GET_CODE (disp) == CONST_INT
11370               && CONST_OK_FOR_LETTER_P (INTVAL (disp), 'K')
11371               && base)
11372             len = 1;
11373           else
11374             len = 4;
11375         }
11376       /* ebp always wants a displacement.  */
11377       else if (base == hard_frame_pointer_rtx)
11378         len = 1;
11379
11380       /* An index requires the two-byte modrm form....  */
11381       if (index
11382           /* ...like esp, which always wants an index.  */
11383           || base == stack_pointer_rtx
11384           || base == arg_pointer_rtx
11385           || base == frame_pointer_rtx)
11386         len += 1;
11387     }
11388
11389   return len;
11390 }
11391
11392 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
11393    is set, expect that insn have 8bit immediate alternative.  */
11394 int
11395 ix86_attr_length_immediate_default (rtx insn, int shortform)
11396 {
11397   int len = 0;
11398   int i;
11399   extract_insn_cached (insn);
11400   for (i = recog_data.n_operands - 1; i >= 0; --i)
11401     if (CONSTANT_P (recog_data.operand[i]))
11402       {
11403         if (len)
11404           abort ();
11405         if (shortform
11406             && GET_CODE (recog_data.operand[i]) == CONST_INT
11407             && CONST_OK_FOR_LETTER_P (INTVAL (recog_data.operand[i]), 'K'))
11408           len = 1;
11409         else
11410           {
11411             switch (get_attr_mode (insn))
11412               {
11413                 case MODE_QI:
11414                   len+=1;
11415                   break;
11416                 case MODE_HI:
11417                   len+=2;
11418                   break;
11419                 case MODE_SI:
11420                   len+=4;
11421                   break;
11422                 /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
11423                 case MODE_DI:
11424                   len+=4;
11425                   break;
11426                 default:
11427                   fatal_insn ("unknown insn mode", insn);
11428               }
11429           }
11430       }
11431   return len;
11432 }
11433 /* Compute default value for "length_address" attribute.  */
11434 int
11435 ix86_attr_length_address_default (rtx insn)
11436 {
11437   int i;
11438
11439   if (get_attr_type (insn) == TYPE_LEA)
11440     {
11441       rtx set = PATTERN (insn);
11442       if (GET_CODE (set) == SET)
11443         ;
11444       else if (GET_CODE (set) == PARALLEL
11445                && GET_CODE (XVECEXP (set, 0, 0)) == SET)
11446         set = XVECEXP (set, 0, 0);
11447       else
11448         {
11449 #ifdef ENABLE_CHECKING
11450           abort ();
11451 #endif
11452           return 0;
11453         }
11454
11455       return memory_address_length (SET_SRC (set));
11456     }
11457
11458   extract_insn_cached (insn);
11459   for (i = recog_data.n_operands - 1; i >= 0; --i)
11460     if (GET_CODE (recog_data.operand[i]) == MEM)
11461       {
11462         return memory_address_length (XEXP (recog_data.operand[i], 0));
11463         break;
11464       }
11465   return 0;
11466 }
11467 \f
11468 /* Return the maximum number of instructions a cpu can issue.  */
11469
11470 static int
11471 ix86_issue_rate (void)
11472 {
11473   switch (ix86_tune)
11474     {
11475     case PROCESSOR_PENTIUM:
11476     case PROCESSOR_K6:
11477       return 2;
11478
11479     case PROCESSOR_PENTIUMPRO:
11480     case PROCESSOR_PENTIUM4:
11481     case PROCESSOR_ATHLON:
11482     case PROCESSOR_K8:
11483     case PROCESSOR_NOCONA:
11484       return 3;
11485
11486     default:
11487       return 1;
11488     }
11489 }
11490
11491 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
11492    by DEP_INSN and nothing set by DEP_INSN.  */
11493
11494 static int
11495 ix86_flags_dependant (rtx insn, rtx dep_insn, enum attr_type insn_type)
11496 {
11497   rtx set, set2;
11498
11499   /* Simplify the test for uninteresting insns.  */
11500   if (insn_type != TYPE_SETCC
11501       && insn_type != TYPE_ICMOV
11502       && insn_type != TYPE_FCMOV
11503       && insn_type != TYPE_IBR)
11504     return 0;
11505
11506   if ((set = single_set (dep_insn)) != 0)
11507     {
11508       set = SET_DEST (set);
11509       set2 = NULL_RTX;
11510     }
11511   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
11512            && XVECLEN (PATTERN (dep_insn), 0) == 2
11513            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
11514            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
11515     {
11516       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
11517       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
11518     }
11519   else
11520     return 0;
11521
11522   if (GET_CODE (set) != REG || REGNO (set) != FLAGS_REG)
11523     return 0;
11524
11525   /* This test is true if the dependent insn reads the flags but
11526      not any other potentially set register.  */
11527   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
11528     return 0;
11529
11530   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
11531     return 0;
11532
11533   return 1;
11534 }
11535
11536 /* A subroutine of ix86_adjust_cost -- return true iff INSN has a memory
11537    address with operands set by DEP_INSN.  */
11538
11539 static int
11540 ix86_agi_dependant (rtx insn, rtx dep_insn, enum attr_type insn_type)
11541 {
11542   rtx addr;
11543
11544   if (insn_type == TYPE_LEA
11545       && TARGET_PENTIUM)
11546     {
11547       addr = PATTERN (insn);
11548       if (GET_CODE (addr) == SET)
11549         ;
11550       else if (GET_CODE (addr) == PARALLEL
11551                && GET_CODE (XVECEXP (addr, 0, 0)) == SET)
11552         addr = XVECEXP (addr, 0, 0);
11553       else
11554         abort ();
11555       addr = SET_SRC (addr);
11556     }
11557   else
11558     {
11559       int i;
11560       extract_insn_cached (insn);
11561       for (i = recog_data.n_operands - 1; i >= 0; --i)
11562         if (GET_CODE (recog_data.operand[i]) == MEM)
11563           {
11564             addr = XEXP (recog_data.operand[i], 0);
11565             goto found;
11566           }
11567       return 0;
11568     found:;
11569     }
11570
11571   return modified_in_p (addr, dep_insn);
11572 }
11573
11574 static int
11575 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
11576 {
11577   enum attr_type insn_type, dep_insn_type;
11578   enum attr_memory memory;
11579   rtx set, set2;
11580   int dep_insn_code_number;
11581
11582   /* Anti and output dependencies have zero cost on all CPUs.  */
11583   if (REG_NOTE_KIND (link) != 0)
11584     return 0;
11585
11586   dep_insn_code_number = recog_memoized (dep_insn);
11587
11588   /* If we can't recognize the insns, we can't really do anything.  */
11589   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
11590     return cost;
11591
11592   insn_type = get_attr_type (insn);
11593   dep_insn_type = get_attr_type (dep_insn);
11594
11595   switch (ix86_tune)
11596     {
11597     case PROCESSOR_PENTIUM:
11598       /* Address Generation Interlock adds a cycle of latency.  */
11599       if (ix86_agi_dependant (insn, dep_insn, insn_type))
11600         cost += 1;
11601
11602       /* ??? Compares pair with jump/setcc.  */
11603       if (ix86_flags_dependant (insn, dep_insn, insn_type))
11604         cost = 0;
11605
11606       /* Floating point stores require value to be ready one cycle earlier.  */
11607       if (insn_type == TYPE_FMOV
11608           && get_attr_memory (insn) == MEMORY_STORE
11609           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11610         cost += 1;
11611       break;
11612
11613     case PROCESSOR_PENTIUMPRO:
11614       memory = get_attr_memory (insn);
11615
11616       /* INT->FP conversion is expensive.  */
11617       if (get_attr_fp_int_src (dep_insn))
11618         cost += 5;
11619
11620       /* There is one cycle extra latency between an FP op and a store.  */
11621       if (insn_type == TYPE_FMOV
11622           && (set = single_set (dep_insn)) != NULL_RTX
11623           && (set2 = single_set (insn)) != NULL_RTX
11624           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
11625           && GET_CODE (SET_DEST (set2)) == MEM)
11626         cost += 1;
11627
11628       /* Show ability of reorder buffer to hide latency of load by executing
11629          in parallel with previous instruction in case
11630          previous instruction is not needed to compute the address.  */
11631       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
11632           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11633         {
11634           /* Claim moves to take one cycle, as core can issue one load
11635              at time and the next load can start cycle later.  */
11636           if (dep_insn_type == TYPE_IMOV
11637               || dep_insn_type == TYPE_FMOV)
11638             cost = 1;
11639           else if (cost > 1)
11640             cost--;
11641         }
11642       break;
11643
11644     case PROCESSOR_K6:
11645       memory = get_attr_memory (insn);
11646
11647       /* The esp dependency is resolved before the instruction is really
11648          finished.  */
11649       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
11650           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
11651         return 1;
11652
11653       /* INT->FP conversion is expensive.  */
11654       if (get_attr_fp_int_src (dep_insn))
11655         cost += 5;
11656
11657       /* Show ability of reorder buffer to hide latency of load by executing
11658          in parallel with previous instruction in case
11659          previous instruction is not needed to compute the address.  */
11660       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
11661           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11662         {
11663           /* Claim moves to take one cycle, as core can issue one load
11664              at time and the next load can start cycle later.  */
11665           if (dep_insn_type == TYPE_IMOV
11666               || dep_insn_type == TYPE_FMOV)
11667             cost = 1;
11668           else if (cost > 2)
11669             cost -= 2;
11670           else
11671             cost = 1;
11672         }
11673       break;
11674
11675     case PROCESSOR_ATHLON:
11676     case PROCESSOR_K8:
11677       memory = get_attr_memory (insn);
11678
11679       /* Show ability of reorder buffer to hide latency of load by executing
11680          in parallel with previous instruction in case
11681          previous instruction is not needed to compute the address.  */
11682       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
11683           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11684         {
11685           enum attr_unit unit = get_attr_unit (insn);
11686           int loadcost = 3;
11687
11688           /* Because of the difference between the length of integer and
11689              floating unit pipeline preparation stages, the memory operands
11690              for floating point are cheaper.
11691
11692              ??? For Athlon it the difference is most probably 2.  */
11693           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
11694             loadcost = 3;
11695           else
11696             loadcost = TARGET_ATHLON ? 2 : 0;
11697
11698           if (cost >= loadcost)
11699             cost -= loadcost;
11700           else
11701             cost = 0;
11702         }
11703
11704     default:
11705       break;
11706     }
11707
11708   return cost;
11709 }
11710
11711 /* How many alternative schedules to try.  This should be as wide as the
11712    scheduling freedom in the DFA, but no wider.  Making this value too
11713    large results extra work for the scheduler.  */
11714
11715 static int
11716 ia32_multipass_dfa_lookahead (void)
11717 {
11718   if (ix86_tune == PROCESSOR_PENTIUM)
11719     return 2;
11720
11721   if (ix86_tune == PROCESSOR_PENTIUMPRO
11722       || ix86_tune == PROCESSOR_K6)
11723     return 1;
11724
11725   else
11726     return 0;
11727 }
11728
11729 \f
11730 /* Implement the target hook targetm.vectorize.misaligned_mem_ok.  */
11731
11732 static bool
11733 ix86_misaligned_mem_ok (enum machine_mode mode)
11734 {
11735   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
11736     return true;
11737   else
11738     return false;
11739 }
11740
11741 /* Compute the alignment given to a constant that is being placed in memory.
11742    EXP is the constant and ALIGN is the alignment that the object would
11743    ordinarily have.
11744    The value of this function is used instead of that alignment to align
11745    the object.  */
11746
11747 int
11748 ix86_constant_alignment (tree exp, int align)
11749 {
11750   if (TREE_CODE (exp) == REAL_CST)
11751     {
11752       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
11753         return 64;
11754       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
11755         return 128;
11756     }
11757   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
11758            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
11759     return BITS_PER_WORD;
11760
11761   return align;
11762 }
11763
11764 /* Compute the alignment for a static variable.
11765    TYPE is the data type, and ALIGN is the alignment that
11766    the object would ordinarily have.  The value of this function is used
11767    instead of that alignment to align the object.  */
11768
11769 int
11770 ix86_data_alignment (tree type, int align)
11771 {
11772   if (AGGREGATE_TYPE_P (type)
11773        && TYPE_SIZE (type)
11774        && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
11775        && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 256
11776            || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 256)
11777     return 256;
11778
11779   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
11780      to 16byte boundary.  */
11781   if (TARGET_64BIT)
11782     {
11783       if (AGGREGATE_TYPE_P (type)
11784            && TYPE_SIZE (type)
11785            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
11786            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
11787                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
11788         return 128;
11789     }
11790
11791   if (TREE_CODE (type) == ARRAY_TYPE)
11792     {
11793       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
11794         return 64;
11795       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
11796         return 128;
11797     }
11798   else if (TREE_CODE (type) == COMPLEX_TYPE)
11799     {
11800
11801       if (TYPE_MODE (type) == DCmode && align < 64)
11802         return 64;
11803       if (TYPE_MODE (type) == XCmode && align < 128)
11804         return 128;
11805     }
11806   else if ((TREE_CODE (type) == RECORD_TYPE
11807             || TREE_CODE (type) == UNION_TYPE
11808             || TREE_CODE (type) == QUAL_UNION_TYPE)
11809            && TYPE_FIELDS (type))
11810     {
11811       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
11812         return 64;
11813       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
11814         return 128;
11815     }
11816   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
11817            || TREE_CODE (type) == INTEGER_TYPE)
11818     {
11819       if (TYPE_MODE (type) == DFmode && align < 64)
11820         return 64;
11821       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
11822         return 128;
11823     }
11824
11825   return align;
11826 }
11827
11828 /* Compute the alignment for a local variable.
11829    TYPE is the data type, and ALIGN is the alignment that
11830    the object would ordinarily have.  The value of this macro is used
11831    instead of that alignment to align the object.  */
11832
11833 int
11834 ix86_local_alignment (tree type, int align)
11835 {
11836   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
11837      to 16byte boundary.  */
11838   if (TARGET_64BIT)
11839     {
11840       if (AGGREGATE_TYPE_P (type)
11841            && TYPE_SIZE (type)
11842            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
11843            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
11844                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
11845         return 128;
11846     }
11847   if (TREE_CODE (type) == ARRAY_TYPE)
11848     {
11849       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
11850         return 64;
11851       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
11852         return 128;
11853     }
11854   else if (TREE_CODE (type) == COMPLEX_TYPE)
11855     {
11856       if (TYPE_MODE (type) == DCmode && align < 64)
11857         return 64;
11858       if (TYPE_MODE (type) == XCmode && align < 128)
11859         return 128;
11860     }
11861   else if ((TREE_CODE (type) == RECORD_TYPE
11862             || TREE_CODE (type) == UNION_TYPE
11863             || TREE_CODE (type) == QUAL_UNION_TYPE)
11864            && TYPE_FIELDS (type))
11865     {
11866       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
11867         return 64;
11868       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
11869         return 128;
11870     }
11871   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
11872            || TREE_CODE (type) == INTEGER_TYPE)
11873     {
11874
11875       if (TYPE_MODE (type) == DFmode && align < 64)
11876         return 64;
11877       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
11878         return 128;
11879     }
11880   return align;
11881 }
11882 \f
11883 /* Emit RTL insns to initialize the variable parts of a trampoline.
11884    FNADDR is an RTX for the address of the function's pure code.
11885    CXT is an RTX for the static chain value for the function.  */
11886 void
11887 x86_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
11888 {
11889   if (!TARGET_64BIT)
11890     {
11891       /* Compute offset from the end of the jmp to the target function.  */
11892       rtx disp = expand_binop (SImode, sub_optab, fnaddr,
11893                                plus_constant (tramp, 10),
11894                                NULL_RTX, 1, OPTAB_DIRECT);
11895       emit_move_insn (gen_rtx_MEM (QImode, tramp),
11896                       gen_int_mode (0xb9, QImode));
11897       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 1)), cxt);
11898       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, 5)),
11899                       gen_int_mode (0xe9, QImode));
11900       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 6)), disp);
11901     }
11902   else
11903     {
11904       int offset = 0;
11905       /* Try to load address using shorter movl instead of movabs.
11906          We may want to support movq for kernel mode, but kernel does not use
11907          trampolines at the moment.  */
11908       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
11909         {
11910           fnaddr = copy_to_mode_reg (DImode, fnaddr);
11911           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
11912                           gen_int_mode (0xbb41, HImode));
11913           emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, offset + 2)),
11914                           gen_lowpart (SImode, fnaddr));
11915           offset += 6;
11916         }
11917       else
11918         {
11919           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
11920                           gen_int_mode (0xbb49, HImode));
11921           emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
11922                           fnaddr);
11923           offset += 10;
11924         }
11925       /* Load static chain using movabs to r10.  */
11926       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
11927                       gen_int_mode (0xba49, HImode));
11928       emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
11929                       cxt);
11930       offset += 10;
11931       /* Jump to the r11 */
11932       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
11933                       gen_int_mode (0xff49, HImode));
11934       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, offset+2)),
11935                       gen_int_mode (0xe3, QImode));
11936       offset += 3;
11937       if (offset > TRAMPOLINE_SIZE)
11938         abort ();
11939     }
11940
11941 #ifdef ENABLE_EXECUTE_STACK
11942   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
11943                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
11944 #endif
11945 }
11946 \f
11947 #define def_builtin(MASK, NAME, TYPE, CODE)                             \
11948 do {                                                                    \
11949   if ((MASK) & target_flags                                             \
11950       && (!((MASK) & MASK_64BIT) || TARGET_64BIT))                      \
11951     lang_hooks.builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD,   \
11952                                  NULL, NULL_TREE);                      \
11953 } while (0)
11954
11955 struct builtin_description
11956 {
11957   const unsigned int mask;
11958   const enum insn_code icode;
11959   const char *const name;
11960   const enum ix86_builtins code;
11961   const enum rtx_code comparison;
11962   const unsigned int flag;
11963 };
11964
11965 static const struct builtin_description bdesc_comi[] =
11966 {
11967   { MASK_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
11968   { MASK_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
11969   { MASK_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
11970   { MASK_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
11971   { MASK_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
11972   { MASK_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
11973   { MASK_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
11974   { MASK_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
11975   { MASK_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
11976   { MASK_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
11977   { MASK_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
11978   { MASK_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
11979   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
11980   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
11981   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
11982   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
11983   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
11984   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
11985   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
11986   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
11987   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
11988   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
11989   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
11990   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
11991 };
11992
11993 static const struct builtin_description bdesc_2arg[] =
11994 {
11995   /* SSE */
11996   { MASK_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, 0, 0 },
11997   { MASK_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, 0, 0 },
11998   { MASK_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, 0, 0 },
11999   { MASK_SSE, CODE_FOR_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, 0, 0 },
12000   { MASK_SSE, CODE_FOR_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, 0, 0 },
12001   { MASK_SSE, CODE_FOR_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, 0, 0 },
12002   { MASK_SSE, CODE_FOR_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, 0, 0 },
12003   { MASK_SSE, CODE_FOR_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, 0, 0 },
12004
12005   { MASK_SSE, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, 0 },
12006   { MASK_SSE, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, 0 },
12007   { MASK_SSE, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, 0 },
12008   { MASK_SSE, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, 1 },
12009   { MASK_SSE, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, 1 },
12010   { MASK_SSE, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, 0 },
12011   { MASK_SSE, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, EQ, 0 },
12012   { MASK_SSE, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, LT, 0 },
12013   { MASK_SSE, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, LE, 0 },
12014   { MASK_SSE, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, LT, 1 },
12015   { MASK_SSE, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, LE, 1 },
12016   { MASK_SSE, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, UNORDERED, 0 },
12017   { MASK_SSE, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, 0 },
12018   { MASK_SSE, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, 0 },
12019   { MASK_SSE, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, 0 },
12020   { MASK_SSE, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, 0 },
12021   { MASK_SSE, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, EQ, 0 },
12022   { MASK_SSE, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, LT, 0 },
12023   { MASK_SSE, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, LE, 0 },
12024   { MASK_SSE, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, UNORDERED, 0 },
12025
12026   { MASK_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, 0, 0 },
12027   { MASK_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, 0, 0 },
12028   { MASK_SSE, CODE_FOR_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, 0, 0 },
12029   { MASK_SSE, CODE_FOR_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, 0, 0 },
12030
12031   { MASK_SSE, CODE_FOR_sse_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, 0, 0 },
12032   { MASK_SSE, CODE_FOR_sse_nandv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, 0, 0 },
12033   { MASK_SSE, CODE_FOR_sse_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, 0, 0 },
12034   { MASK_SSE, CODE_FOR_sse_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, 0, 0 },
12035
12036   { MASK_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, 0, 0 },
12037   { MASK_SSE, CODE_FOR_sse_movhlps,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, 0, 0 },
12038   { MASK_SSE, CODE_FOR_sse_movlhps,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, 0, 0 },
12039   { MASK_SSE, CODE_FOR_sse_unpckhps, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, 0, 0 },
12040   { MASK_SSE, CODE_FOR_sse_unpcklps, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, 0, 0 },
12041
12042   /* MMX */
12043   { MASK_MMX, CODE_FOR_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, 0, 0 },
12044   { MASK_MMX, CODE_FOR_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, 0, 0 },
12045   { MASK_MMX, CODE_FOR_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, 0, 0 },
12046   { MASK_MMX, CODE_FOR_mmx_adddi3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, 0, 0 },
12047   { MASK_MMX, CODE_FOR_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, 0, 0 },
12048   { MASK_MMX, CODE_FOR_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, 0, 0 },
12049   { MASK_MMX, CODE_FOR_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, 0, 0 },
12050   { MASK_MMX, CODE_FOR_mmx_subdi3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, 0, 0 },
12051
12052   { MASK_MMX, CODE_FOR_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, 0, 0 },
12053   { MASK_MMX, CODE_FOR_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, 0, 0 },
12054   { MASK_MMX, CODE_FOR_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, 0, 0 },
12055   { MASK_MMX, CODE_FOR_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, 0, 0 },
12056   { MASK_MMX, CODE_FOR_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, 0, 0 },
12057   { MASK_MMX, CODE_FOR_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, 0, 0 },
12058   { MASK_MMX, CODE_FOR_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, 0, 0 },
12059   { MASK_MMX, CODE_FOR_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, 0, 0 },
12060
12061   { MASK_MMX, CODE_FOR_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, 0, 0 },
12062   { MASK_MMX, CODE_FOR_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, 0, 0 },
12063   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_umulv4hi3_highpart, "__builtin_ia32_pmulhuw", IX86_BUILTIN_PMULHUW, 0, 0 },
12064
12065   { MASK_MMX, CODE_FOR_mmx_anddi3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, 0, 0 },
12066   { MASK_MMX, CODE_FOR_mmx_nanddi3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, 0, 0 },
12067   { MASK_MMX, CODE_FOR_mmx_iordi3, "__builtin_ia32_por", IX86_BUILTIN_POR, 0, 0 },
12068   { MASK_MMX, CODE_FOR_mmx_xordi3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, 0, 0 },
12069
12070   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgb", IX86_BUILTIN_PAVGB, 0, 0 },
12071   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_mmx_uavgv4hi3, "__builtin_ia32_pavgw", IX86_BUILTIN_PAVGW, 0, 0 },
12072
12073   { MASK_MMX, CODE_FOR_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, 0, 0 },
12074   { MASK_MMX, CODE_FOR_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, 0, 0 },
12075   { MASK_MMX, CODE_FOR_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, 0, 0 },
12076   { MASK_MMX, CODE_FOR_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, 0, 0 },
12077   { MASK_MMX, CODE_FOR_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, 0, 0 },
12078   { MASK_MMX, CODE_FOR_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, 0, 0 },
12079
12080   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_umaxv8qi3, "__builtin_ia32_pmaxub", IX86_BUILTIN_PMAXUB, 0, 0 },
12081   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_smaxv4hi3, "__builtin_ia32_pmaxsw", IX86_BUILTIN_PMAXSW, 0, 0 },
12082   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_uminv8qi3, "__builtin_ia32_pminub", IX86_BUILTIN_PMINUB, 0, 0 },
12083   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_sminv4hi3, "__builtin_ia32_pminsw", IX86_BUILTIN_PMINSW, 0, 0 },
12084
12085   { MASK_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, 0, 0 },
12086   { MASK_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, 0, 0 },
12087   { MASK_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, 0, 0 },
12088   { MASK_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, 0, 0 },
12089   { MASK_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, 0, 0 },
12090   { MASK_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, 0, 0 },
12091
12092   /* Special.  */
12093   { MASK_MMX, CODE_FOR_mmx_packsswb, 0, IX86_BUILTIN_PACKSSWB, 0, 0 },
12094   { MASK_MMX, CODE_FOR_mmx_packssdw, 0, IX86_BUILTIN_PACKSSDW, 0, 0 },
12095   { MASK_MMX, CODE_FOR_mmx_packuswb, 0, IX86_BUILTIN_PACKUSWB, 0, 0 },
12096
12097   { MASK_SSE, CODE_FOR_cvtpi2ps, 0, IX86_BUILTIN_CVTPI2PS, 0, 0 },
12098   { MASK_SSE, CODE_FOR_cvtsi2ss, 0, IX86_BUILTIN_CVTSI2SS, 0, 0 },
12099   { MASK_SSE | MASK_64BIT, CODE_FOR_cvtsi2ssq, 0, IX86_BUILTIN_CVTSI642SS, 0, 0 },
12100
12101   { MASK_MMX, CODE_FOR_ashlv4hi3, 0, IX86_BUILTIN_PSLLW, 0, 0 },
12102   { MASK_MMX, CODE_FOR_ashlv4hi3, 0, IX86_BUILTIN_PSLLWI, 0, 0 },
12103   { MASK_MMX, CODE_FOR_ashlv2si3, 0, IX86_BUILTIN_PSLLD, 0, 0 },
12104   { MASK_MMX, CODE_FOR_ashlv2si3, 0, IX86_BUILTIN_PSLLDI, 0, 0 },
12105   { MASK_MMX, CODE_FOR_mmx_ashldi3, 0, IX86_BUILTIN_PSLLQ, 0, 0 },
12106   { MASK_MMX, CODE_FOR_mmx_ashldi3, 0, IX86_BUILTIN_PSLLQI, 0, 0 },
12107
12108   { MASK_MMX, CODE_FOR_lshrv4hi3, 0, IX86_BUILTIN_PSRLW, 0, 0 },
12109   { MASK_MMX, CODE_FOR_lshrv4hi3, 0, IX86_BUILTIN_PSRLWI, 0, 0 },
12110   { MASK_MMX, CODE_FOR_lshrv2si3, 0, IX86_BUILTIN_PSRLD, 0, 0 },
12111   { MASK_MMX, CODE_FOR_lshrv2si3, 0, IX86_BUILTIN_PSRLDI, 0, 0 },
12112   { MASK_MMX, CODE_FOR_mmx_lshrdi3, 0, IX86_BUILTIN_PSRLQ, 0, 0 },
12113   { MASK_MMX, CODE_FOR_mmx_lshrdi3, 0, IX86_BUILTIN_PSRLQI, 0, 0 },
12114
12115   { MASK_MMX, CODE_FOR_ashrv4hi3, 0, IX86_BUILTIN_PSRAW, 0, 0 },
12116   { MASK_MMX, CODE_FOR_ashrv4hi3, 0, IX86_BUILTIN_PSRAWI, 0, 0 },
12117   { MASK_MMX, CODE_FOR_ashrv2si3, 0, IX86_BUILTIN_PSRAD, 0, 0 },
12118   { MASK_MMX, CODE_FOR_ashrv2si3, 0, IX86_BUILTIN_PSRADI, 0, 0 },
12119
12120   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_mmx_psadbw, 0, IX86_BUILTIN_PSADBW, 0, 0 },
12121   { MASK_MMX, CODE_FOR_mmx_pmaddwd, 0, IX86_BUILTIN_PMADDWD, 0, 0 },
12122
12123   /* SSE2 */
12124   { MASK_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, 0, 0 },
12125   { MASK_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, 0, 0 },
12126   { MASK_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, 0, 0 },
12127   { MASK_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, 0, 0 },
12128   { MASK_SSE2, CODE_FOR_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, 0, 0 },
12129   { MASK_SSE2, CODE_FOR_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, 0, 0 },
12130   { MASK_SSE2, CODE_FOR_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, 0, 0 },
12131   { MASK_SSE2, CODE_FOR_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, 0, 0 },
12132
12133   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, 0 },
12134   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, 0 },
12135   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, 0 },
12136   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, 1 },
12137   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, 1 },
12138   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, 0 },
12139   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, EQ, 0 },
12140   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, LT, 0 },
12141   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, LE, 0 },
12142   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, LT, 1 },
12143   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, LE, 1 },
12144   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, UNORDERED, 0 },
12145   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, 0 },
12146   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, 0 },
12147   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, 0 },
12148   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, 0 },
12149   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, EQ, 0 },
12150   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, LT, 0 },
12151   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, LE, 0 },
12152   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, UNORDERED, 0 },
12153
12154   { MASK_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, 0, 0 },
12155   { MASK_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, 0, 0 },
12156   { MASK_SSE2, CODE_FOR_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, 0, 0 },
12157   { MASK_SSE2, CODE_FOR_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, 0, 0 },
12158
12159   { MASK_SSE2, CODE_FOR_sse2_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, 0, 0 },
12160   { MASK_SSE2, CODE_FOR_sse2_nandv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, 0, 0 },
12161   { MASK_SSE2, CODE_FOR_sse2_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, 0, 0 },
12162   { MASK_SSE2, CODE_FOR_sse2_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, 0, 0 },
12163
12164   { MASK_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, 0, 0 },
12165   { MASK_SSE2, CODE_FOR_sse2_unpckhpd, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, 0, 0 },
12166   { MASK_SSE2, CODE_FOR_sse2_unpcklpd, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, 0, 0 },
12167
12168   /* SSE2 MMX */
12169   { MASK_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, 0, 0 },
12170   { MASK_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, 0, 0 },
12171   { MASK_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, 0, 0 },
12172   { MASK_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, 0, 0 },
12173   { MASK_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, 0, 0 },
12174   { MASK_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, 0, 0 },
12175   { MASK_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, 0, 0 },
12176   { MASK_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, 0, 0 },
12177
12178   { MASK_MMX, CODE_FOR_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, 0, 0 },
12179   { MASK_MMX, CODE_FOR_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, 0, 0 },
12180   { MASK_MMX, CODE_FOR_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, 0, 0 },
12181   { MASK_MMX, CODE_FOR_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, 0, 0 },
12182   { MASK_MMX, CODE_FOR_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, 0, 0 },
12183   { MASK_MMX, CODE_FOR_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, 0, 0 },
12184   { MASK_MMX, CODE_FOR_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, 0, 0 },
12185   { MASK_MMX, CODE_FOR_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, 0, 0 },
12186
12187   { MASK_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, 0, 0 },
12188   { MASK_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, 0, 0 },
12189
12190   { MASK_SSE2, CODE_FOR_sse2_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, 0, 0 },
12191   { MASK_SSE2, CODE_FOR_sse2_nandv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, 0, 0 },
12192   { MASK_SSE2, CODE_FOR_sse2_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, 0, 0 },
12193   { MASK_SSE2, CODE_FOR_sse2_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, 0, 0 },
12194
12195   { MASK_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, 0, 0 },
12196   { MASK_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, 0, 0 },
12197
12198   { MASK_SSE2, CODE_FOR_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, 0, 0 },
12199   { MASK_SSE2, CODE_FOR_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, 0, 0 },
12200   { MASK_SSE2, CODE_FOR_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, 0, 0 },
12201   { MASK_SSE2, CODE_FOR_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, 0, 0 },
12202   { MASK_SSE2, CODE_FOR_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, 0, 0 },
12203   { MASK_SSE2, CODE_FOR_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, 0, 0 },
12204
12205   { MASK_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, 0, 0 },
12206   { MASK_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, 0, 0 },
12207   { MASK_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, 0, 0 },
12208   { MASK_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, 0, 0 },
12209
12210   { MASK_SSE2, CODE_FOR_sse2_punpckhbw, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, 0, 0 },
12211   { MASK_SSE2, CODE_FOR_sse2_punpckhwd, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, 0, 0 },
12212   { MASK_SSE2, CODE_FOR_sse2_punpckhdq, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, 0, 0 },
12213   { MASK_SSE2, CODE_FOR_sse2_punpckhqdq, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, 0, 0 },
12214   { MASK_SSE2, CODE_FOR_sse2_punpcklbw, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, 0, 0 },
12215   { MASK_SSE2, CODE_FOR_sse2_punpcklwd, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, 0, 0 },
12216   { MASK_SSE2, CODE_FOR_sse2_punpckldq, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, 0, 0 },
12217   { MASK_SSE2, CODE_FOR_sse2_punpcklqdq, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, 0, 0 },
12218
12219   { MASK_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, 0, 0 },
12220   { MASK_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, 0, 0 },
12221   { MASK_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, 0, 0 },
12222
12223   { MASK_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, 0, 0 },
12224   { MASK_SSE2, CODE_FOR_sse2_psadbw, 0, IX86_BUILTIN_PSADBW128, 0, 0 },
12225
12226   { MASK_SSE2, CODE_FOR_sse2_umulsidi3, 0, IX86_BUILTIN_PMULUDQ, 0, 0 },
12227   { MASK_SSE2, CODE_FOR_sse2_umulv2siv2di3, 0, IX86_BUILTIN_PMULUDQ128, 0, 0 },
12228
12229   { MASK_SSE2, CODE_FOR_ashlv8hi3_ti, 0, IX86_BUILTIN_PSLLW128, 0, 0 },
12230   { MASK_SSE2, CODE_FOR_ashlv8hi3, 0, IX86_BUILTIN_PSLLWI128, 0, 0 },
12231   { MASK_SSE2, CODE_FOR_ashlv4si3_ti, 0, IX86_BUILTIN_PSLLD128, 0, 0 },
12232   { MASK_SSE2, CODE_FOR_ashlv4si3, 0, IX86_BUILTIN_PSLLDI128, 0, 0 },
12233   { MASK_SSE2, CODE_FOR_ashlv2di3_ti, 0, IX86_BUILTIN_PSLLQ128, 0, 0 },
12234   { MASK_SSE2, CODE_FOR_ashlv2di3, 0, IX86_BUILTIN_PSLLQI128, 0, 0 },
12235
12236   { MASK_SSE2, CODE_FOR_lshrv8hi3_ti, 0, IX86_BUILTIN_PSRLW128, 0, 0 },
12237   { MASK_SSE2, CODE_FOR_lshrv8hi3, 0, IX86_BUILTIN_PSRLWI128, 0, 0 },
12238   { MASK_SSE2, CODE_FOR_lshrv4si3_ti, 0, IX86_BUILTIN_PSRLD128, 0, 0 },
12239   { MASK_SSE2, CODE_FOR_lshrv4si3, 0, IX86_BUILTIN_PSRLDI128, 0, 0 },
12240   { MASK_SSE2, CODE_FOR_lshrv2di3_ti, 0, IX86_BUILTIN_PSRLQ128, 0, 0 },
12241   { MASK_SSE2, CODE_FOR_lshrv2di3, 0, IX86_BUILTIN_PSRLQI128, 0, 0 },
12242
12243   { MASK_SSE2, CODE_FOR_ashrv8hi3_ti, 0, IX86_BUILTIN_PSRAW128, 0, 0 },
12244   { MASK_SSE2, CODE_FOR_ashrv8hi3, 0, IX86_BUILTIN_PSRAWI128, 0, 0 },
12245   { MASK_SSE2, CODE_FOR_ashrv4si3_ti, 0, IX86_BUILTIN_PSRAD128, 0, 0 },
12246   { MASK_SSE2, CODE_FOR_ashrv4si3, 0, IX86_BUILTIN_PSRADI128, 0, 0 },
12247
12248   { MASK_SSE2, CODE_FOR_sse2_pmaddwd, 0, IX86_BUILTIN_PMADDWD128, 0, 0 },
12249
12250   { MASK_SSE2, CODE_FOR_cvtsi2sd, 0, IX86_BUILTIN_CVTSI2SD, 0, 0 },
12251   { MASK_SSE2 | MASK_64BIT, CODE_FOR_cvtsi2sdq, 0, IX86_BUILTIN_CVTSI642SD, 0, 0 },
12252   { MASK_SSE2, CODE_FOR_cvtsd2ss, 0, IX86_BUILTIN_CVTSD2SS, 0, 0 },
12253   { MASK_SSE2, CODE_FOR_cvtss2sd, 0, IX86_BUILTIN_CVTSS2SD, 0, 0 },
12254
12255   /* SSE3 MMX */
12256   { MASK_SSE3, CODE_FOR_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, 0, 0 },
12257   { MASK_SSE3, CODE_FOR_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, 0, 0 },
12258   { MASK_SSE3, CODE_FOR_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, 0, 0 },
12259   { MASK_SSE3, CODE_FOR_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, 0, 0 },
12260   { MASK_SSE3, CODE_FOR_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, 0, 0 },
12261   { MASK_SSE3, CODE_FOR_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, 0, 0 }
12262 };
12263
12264 static const struct builtin_description bdesc_1arg[] =
12265 {
12266   { MASK_SSE | MASK_3DNOW_A, CODE_FOR_mmx_pmovmskb, 0, IX86_BUILTIN_PMOVMSKB, 0, 0 },
12267   { MASK_SSE, CODE_FOR_sse_movmskps, 0, IX86_BUILTIN_MOVMSKPS, 0, 0 },
12268
12269   { MASK_SSE, CODE_FOR_sqrtv4sf2, 0, IX86_BUILTIN_SQRTPS, 0, 0 },
12270   { MASK_SSE, CODE_FOR_rsqrtv4sf2, 0, IX86_BUILTIN_RSQRTPS, 0, 0 },
12271   { MASK_SSE, CODE_FOR_rcpv4sf2, 0, IX86_BUILTIN_RCPPS, 0, 0 },
12272
12273   { MASK_SSE, CODE_FOR_cvtps2pi, 0, IX86_BUILTIN_CVTPS2PI, 0, 0 },
12274   { MASK_SSE, CODE_FOR_cvtss2si, 0, IX86_BUILTIN_CVTSS2SI, 0, 0 },
12275   { MASK_SSE | MASK_64BIT, CODE_FOR_cvtss2siq, 0, IX86_BUILTIN_CVTSS2SI64, 0, 0 },
12276   { MASK_SSE, CODE_FOR_cvttps2pi, 0, IX86_BUILTIN_CVTTPS2PI, 0, 0 },
12277   { MASK_SSE, CODE_FOR_cvttss2si, 0, IX86_BUILTIN_CVTTSS2SI, 0, 0 },
12278   { MASK_SSE | MASK_64BIT, CODE_FOR_cvttss2siq, 0, IX86_BUILTIN_CVTTSS2SI64, 0, 0 },
12279
12280   { MASK_SSE2, CODE_FOR_sse2_pmovmskb, 0, IX86_BUILTIN_PMOVMSKB128, 0, 0 },
12281   { MASK_SSE2, CODE_FOR_sse2_movmskpd, 0, IX86_BUILTIN_MOVMSKPD, 0, 0 },
12282   { MASK_SSE2, CODE_FOR_sse2_movq2dq, 0, IX86_BUILTIN_MOVQ2DQ, 0, 0 },
12283   { MASK_SSE2, CODE_FOR_sse2_movdq2q, 0, IX86_BUILTIN_MOVDQ2Q, 0, 0 },
12284
12285   { MASK_SSE2, CODE_FOR_sqrtv2df2, 0, IX86_BUILTIN_SQRTPD, 0, 0 },
12286
12287   { MASK_SSE2, CODE_FOR_cvtdq2pd, 0, IX86_BUILTIN_CVTDQ2PD, 0, 0 },
12288   { MASK_SSE2, CODE_FOR_cvtdq2ps, 0, IX86_BUILTIN_CVTDQ2PS, 0, 0 },
12289
12290   { MASK_SSE2, CODE_FOR_cvtpd2dq, 0, IX86_BUILTIN_CVTPD2DQ, 0, 0 },
12291   { MASK_SSE2, CODE_FOR_cvtpd2pi, 0, IX86_BUILTIN_CVTPD2PI, 0, 0 },
12292   { MASK_SSE2, CODE_FOR_cvtpd2ps, 0, IX86_BUILTIN_CVTPD2PS, 0, 0 },
12293   { MASK_SSE2, CODE_FOR_cvttpd2dq, 0, IX86_BUILTIN_CVTTPD2DQ, 0, 0 },
12294   { MASK_SSE2, CODE_FOR_cvttpd2pi, 0, IX86_BUILTIN_CVTTPD2PI, 0, 0 },
12295
12296   { MASK_SSE2, CODE_FOR_cvtpi2pd, 0, IX86_BUILTIN_CVTPI2PD, 0, 0 },
12297
12298   { MASK_SSE2, CODE_FOR_cvtsd2si, 0, IX86_BUILTIN_CVTSD2SI, 0, 0 },
12299   { MASK_SSE2, CODE_FOR_cvttsd2si, 0, IX86_BUILTIN_CVTTSD2SI, 0, 0 },
12300   { MASK_SSE2 | MASK_64BIT, CODE_FOR_cvtsd2siq, 0, IX86_BUILTIN_CVTSD2SI64, 0, 0 },
12301   { MASK_SSE2 | MASK_64BIT, CODE_FOR_cvttsd2siq, 0, IX86_BUILTIN_CVTTSD2SI64, 0, 0 },
12302
12303   { MASK_SSE2, CODE_FOR_cvtps2dq, 0, IX86_BUILTIN_CVTPS2DQ, 0, 0 },
12304   { MASK_SSE2, CODE_FOR_cvtps2pd, 0, IX86_BUILTIN_CVTPS2PD, 0, 0 },
12305   { MASK_SSE2, CODE_FOR_cvttps2dq, 0, IX86_BUILTIN_CVTTPS2DQ, 0, 0 },
12306
12307   { MASK_SSE2, CODE_FOR_sse2_movq, 0, IX86_BUILTIN_MOVQ, 0, 0 },
12308
12309   /* SSE3 */
12310   { MASK_SSE3, CODE_FOR_movshdup, 0, IX86_BUILTIN_MOVSHDUP, 0, 0 },
12311   { MASK_SSE3, CODE_FOR_movsldup, 0, IX86_BUILTIN_MOVSLDUP, 0, 0 },
12312   { MASK_SSE3, CODE_FOR_movddup,  0, IX86_BUILTIN_MOVDDUP, 0, 0 }
12313 };
12314
12315 void
12316 ix86_init_builtins (void)
12317 {
12318   if (TARGET_MMX)
12319     ix86_init_mmx_sse_builtins ();
12320 }
12321
12322 /* Set up all the MMX/SSE builtins.  This is not called if TARGET_MMX
12323    is zero.  Otherwise, if TARGET_SSE is not set, only expand the MMX
12324    builtins.  */
12325 static void
12326 ix86_init_mmx_sse_builtins (void)
12327 {
12328   const struct builtin_description * d;
12329   size_t i;
12330
12331   tree V16QI_type_node = build_vector_type_for_mode (intQI_type_node, V16QImode);
12332   tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
12333   tree V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
12334   tree V2DI_type_node
12335     = build_vector_type_for_mode (long_long_integer_type_node, V2DImode);
12336   tree V2DF_type_node = build_vector_type_for_mode (double_type_node, V2DFmode);
12337   tree V4SF_type_node = build_vector_type_for_mode (float_type_node, V4SFmode);
12338   tree V4SI_type_node = build_vector_type_for_mode (intSI_type_node, V4SImode);
12339   tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
12340   tree V8QI_type_node = build_vector_type_for_mode (intQI_type_node, V8QImode);
12341   tree V8HI_type_node = build_vector_type_for_mode (intHI_type_node, V8HImode);
12342
12343   tree pchar_type_node = build_pointer_type (char_type_node);
12344   tree pcchar_type_node = build_pointer_type (
12345                              build_type_variant (char_type_node, 1, 0));
12346   tree pfloat_type_node = build_pointer_type (float_type_node);
12347   tree pcfloat_type_node = build_pointer_type (
12348                              build_type_variant (float_type_node, 1, 0));
12349   tree pv2si_type_node = build_pointer_type (V2SI_type_node);
12350   tree pv2di_type_node = build_pointer_type (V2DI_type_node);
12351   tree pdi_type_node = build_pointer_type (long_long_unsigned_type_node);
12352
12353   /* Comparisons.  */
12354   tree int_ftype_v4sf_v4sf
12355     = build_function_type_list (integer_type_node,
12356                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
12357   tree v4si_ftype_v4sf_v4sf
12358     = build_function_type_list (V4SI_type_node,
12359                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
12360   /* MMX/SSE/integer conversions.  */
12361   tree int_ftype_v4sf
12362     = build_function_type_list (integer_type_node,
12363                                 V4SF_type_node, NULL_TREE);
12364   tree int64_ftype_v4sf
12365     = build_function_type_list (long_long_integer_type_node,
12366                                 V4SF_type_node, NULL_TREE);
12367   tree int_ftype_v8qi
12368     = build_function_type_list (integer_type_node, V8QI_type_node, NULL_TREE);
12369   tree v4sf_ftype_v4sf_int
12370     = build_function_type_list (V4SF_type_node,
12371                                 V4SF_type_node, integer_type_node, NULL_TREE);
12372   tree v4sf_ftype_v4sf_int64
12373     = build_function_type_list (V4SF_type_node,
12374                                 V4SF_type_node, long_long_integer_type_node,
12375                                 NULL_TREE);
12376   tree v4sf_ftype_v4sf_v2si
12377     = build_function_type_list (V4SF_type_node,
12378                                 V4SF_type_node, V2SI_type_node, NULL_TREE);
12379   tree int_ftype_v4hi_int
12380     = build_function_type_list (integer_type_node,
12381                                 V4HI_type_node, integer_type_node, NULL_TREE);
12382   tree v4hi_ftype_v4hi_int_int
12383     = build_function_type_list (V4HI_type_node, V4HI_type_node,
12384                                 integer_type_node, integer_type_node,
12385                                 NULL_TREE);
12386   /* Miscellaneous.  */
12387   tree v8qi_ftype_v4hi_v4hi
12388     = build_function_type_list (V8QI_type_node,
12389                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
12390   tree v4hi_ftype_v2si_v2si
12391     = build_function_type_list (V4HI_type_node,
12392                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
12393   tree v4sf_ftype_v4sf_v4sf_int
12394     = build_function_type_list (V4SF_type_node,
12395                                 V4SF_type_node, V4SF_type_node,
12396                                 integer_type_node, NULL_TREE);
12397   tree v2si_ftype_v4hi_v4hi
12398     = build_function_type_list (V2SI_type_node,
12399                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
12400   tree v4hi_ftype_v4hi_int
12401     = build_function_type_list (V4HI_type_node,
12402                                 V4HI_type_node, integer_type_node, NULL_TREE);
12403   tree v4hi_ftype_v4hi_di
12404     = build_function_type_list (V4HI_type_node,
12405                                 V4HI_type_node, long_long_unsigned_type_node,
12406                                 NULL_TREE);
12407   tree v2si_ftype_v2si_di
12408     = build_function_type_list (V2SI_type_node,
12409                                 V2SI_type_node, long_long_unsigned_type_node,
12410                                 NULL_TREE);
12411   tree void_ftype_void
12412     = build_function_type (void_type_node, void_list_node);
12413   tree void_ftype_unsigned
12414     = build_function_type_list (void_type_node, unsigned_type_node, NULL_TREE);
12415   tree void_ftype_unsigned_unsigned
12416     = build_function_type_list (void_type_node, unsigned_type_node,
12417                                 unsigned_type_node, NULL_TREE);
12418   tree void_ftype_pcvoid_unsigned_unsigned
12419     = build_function_type_list (void_type_node, const_ptr_type_node,
12420                                 unsigned_type_node, unsigned_type_node,
12421                                 NULL_TREE);
12422   tree unsigned_ftype_void
12423     = build_function_type (unsigned_type_node, void_list_node);
12424   tree di_ftype_void
12425     = build_function_type (long_long_unsigned_type_node, void_list_node);
12426   tree v4sf_ftype_void
12427     = build_function_type (V4SF_type_node, void_list_node);
12428   tree v2si_ftype_v4sf
12429     = build_function_type_list (V2SI_type_node, V4SF_type_node, NULL_TREE);
12430   /* Loads/stores.  */
12431   tree void_ftype_v8qi_v8qi_pchar
12432     = build_function_type_list (void_type_node,
12433                                 V8QI_type_node, V8QI_type_node,
12434                                 pchar_type_node, NULL_TREE);
12435   tree v4sf_ftype_pcfloat
12436     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
12437   /* @@@ the type is bogus */
12438   tree v4sf_ftype_v4sf_pv2si
12439     = build_function_type_list (V4SF_type_node,
12440                                 V4SF_type_node, pv2si_type_node, NULL_TREE);
12441   tree void_ftype_pv2si_v4sf
12442     = build_function_type_list (void_type_node,
12443                                 pv2si_type_node, V4SF_type_node, NULL_TREE);
12444   tree void_ftype_pfloat_v4sf
12445     = build_function_type_list (void_type_node,
12446                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
12447   tree void_ftype_pdi_di
12448     = build_function_type_list (void_type_node,
12449                                 pdi_type_node, long_long_unsigned_type_node,
12450                                 NULL_TREE);
12451   tree void_ftype_pv2di_v2di
12452     = build_function_type_list (void_type_node,
12453                                 pv2di_type_node, V2DI_type_node, NULL_TREE);
12454   /* Normal vector unops.  */
12455   tree v4sf_ftype_v4sf
12456     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
12457
12458   /* Normal vector binops.  */
12459   tree v4sf_ftype_v4sf_v4sf
12460     = build_function_type_list (V4SF_type_node,
12461                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
12462   tree v8qi_ftype_v8qi_v8qi
12463     = build_function_type_list (V8QI_type_node,
12464                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
12465   tree v4hi_ftype_v4hi_v4hi
12466     = build_function_type_list (V4HI_type_node,
12467                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
12468   tree v2si_ftype_v2si_v2si
12469     = build_function_type_list (V2SI_type_node,
12470                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
12471   tree di_ftype_di_di
12472     = build_function_type_list (long_long_unsigned_type_node,
12473                                 long_long_unsigned_type_node,
12474                                 long_long_unsigned_type_node, NULL_TREE);
12475
12476   tree v2si_ftype_v2sf
12477     = build_function_type_list (V2SI_type_node, V2SF_type_node, NULL_TREE);
12478   tree v2sf_ftype_v2si
12479     = build_function_type_list (V2SF_type_node, V2SI_type_node, NULL_TREE);
12480   tree v2si_ftype_v2si
12481     = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
12482   tree v2sf_ftype_v2sf
12483     = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
12484   tree v2sf_ftype_v2sf_v2sf
12485     = build_function_type_list (V2SF_type_node,
12486                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
12487   tree v2si_ftype_v2sf_v2sf
12488     = build_function_type_list (V2SI_type_node,
12489                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
12490   tree pint_type_node    = build_pointer_type (integer_type_node);
12491   tree pcint_type_node = build_pointer_type (
12492                              build_type_variant (integer_type_node, 1, 0));
12493   tree pdouble_type_node = build_pointer_type (double_type_node);
12494   tree pcdouble_type_node = build_pointer_type (
12495                                 build_type_variant (double_type_node, 1, 0));
12496   tree int_ftype_v2df_v2df
12497     = build_function_type_list (integer_type_node,
12498                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
12499
12500   tree ti_ftype_void
12501     = build_function_type (intTI_type_node, void_list_node);
12502   tree v2di_ftype_void
12503     = build_function_type (V2DI_type_node, void_list_node);
12504   tree ti_ftype_ti_ti
12505     = build_function_type_list (intTI_type_node,
12506                                 intTI_type_node, intTI_type_node, NULL_TREE);
12507   tree void_ftype_pcvoid
12508     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
12509   tree v2di_ftype_di
12510     = build_function_type_list (V2DI_type_node,
12511                                 long_long_unsigned_type_node, NULL_TREE);
12512   tree di_ftype_v2di
12513     = build_function_type_list (long_long_unsigned_type_node,
12514                                 V2DI_type_node, NULL_TREE);
12515   tree v4sf_ftype_v4si
12516     = build_function_type_list (V4SF_type_node, V4SI_type_node, NULL_TREE);
12517   tree v4si_ftype_v4sf
12518     = build_function_type_list (V4SI_type_node, V4SF_type_node, NULL_TREE);
12519   tree v2df_ftype_v4si
12520     = build_function_type_list (V2DF_type_node, V4SI_type_node, NULL_TREE);
12521   tree v4si_ftype_v2df
12522     = build_function_type_list (V4SI_type_node, V2DF_type_node, NULL_TREE);
12523   tree v2si_ftype_v2df
12524     = build_function_type_list (V2SI_type_node, V2DF_type_node, NULL_TREE);
12525   tree v4sf_ftype_v2df
12526     = build_function_type_list (V4SF_type_node, V2DF_type_node, NULL_TREE);
12527   tree v2df_ftype_v2si
12528     = build_function_type_list (V2DF_type_node, V2SI_type_node, NULL_TREE);
12529   tree v2df_ftype_v4sf
12530     = build_function_type_list (V2DF_type_node, V4SF_type_node, NULL_TREE);
12531   tree int_ftype_v2df
12532     = build_function_type_list (integer_type_node, V2DF_type_node, NULL_TREE);
12533   tree int64_ftype_v2df
12534     = build_function_type_list (long_long_integer_type_node,
12535                                 V2DF_type_node, NULL_TREE);
12536   tree v2df_ftype_v2df_int
12537     = build_function_type_list (V2DF_type_node,
12538                                 V2DF_type_node, integer_type_node, NULL_TREE);
12539   tree v2df_ftype_v2df_int64
12540     = build_function_type_list (V2DF_type_node,
12541                                 V2DF_type_node, long_long_integer_type_node,
12542                                 NULL_TREE);
12543   tree v4sf_ftype_v4sf_v2df
12544     = build_function_type_list (V4SF_type_node,
12545                                 V4SF_type_node, V2DF_type_node, NULL_TREE);
12546   tree v2df_ftype_v2df_v4sf
12547     = build_function_type_list (V2DF_type_node,
12548                                 V2DF_type_node, V4SF_type_node, NULL_TREE);
12549   tree v2df_ftype_v2df_v2df_int
12550     = build_function_type_list (V2DF_type_node,
12551                                 V2DF_type_node, V2DF_type_node,
12552                                 integer_type_node,
12553                                 NULL_TREE);
12554   tree v2df_ftype_v2df_pcdouble
12555     = build_function_type_list (V2DF_type_node,
12556                                 V2DF_type_node, pcdouble_type_node, NULL_TREE);
12557   tree void_ftype_pdouble_v2df
12558     = build_function_type_list (void_type_node,
12559                                 pdouble_type_node, V2DF_type_node, NULL_TREE);
12560   tree void_ftype_pint_int
12561     = build_function_type_list (void_type_node,
12562                                 pint_type_node, integer_type_node, NULL_TREE);
12563   tree void_ftype_v16qi_v16qi_pchar
12564     = build_function_type_list (void_type_node,
12565                                 V16QI_type_node, V16QI_type_node,
12566                                 pchar_type_node, NULL_TREE);
12567   tree v2df_ftype_pcdouble
12568     = build_function_type_list (V2DF_type_node, pcdouble_type_node, NULL_TREE);
12569   tree v2df_ftype_v2df_v2df
12570     = build_function_type_list (V2DF_type_node,
12571                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
12572   tree v16qi_ftype_v16qi_v16qi
12573     = build_function_type_list (V16QI_type_node,
12574                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
12575   tree v8hi_ftype_v8hi_v8hi
12576     = build_function_type_list (V8HI_type_node,
12577                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
12578   tree v4si_ftype_v4si_v4si
12579     = build_function_type_list (V4SI_type_node,
12580                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
12581   tree v2di_ftype_v2di_v2di
12582     = build_function_type_list (V2DI_type_node,
12583                                 V2DI_type_node, V2DI_type_node, NULL_TREE);
12584   tree v2di_ftype_v2df_v2df
12585     = build_function_type_list (V2DI_type_node,
12586                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
12587   tree v2df_ftype_v2df
12588     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
12589   tree v2df_ftype_double
12590     = build_function_type_list (V2DF_type_node, double_type_node, NULL_TREE);
12591   tree v2df_ftype_double_double
12592     = build_function_type_list (V2DF_type_node,
12593                                 double_type_node, double_type_node, NULL_TREE);
12594   tree int_ftype_v8hi_int
12595     = build_function_type_list (integer_type_node,
12596                                 V8HI_type_node, integer_type_node, NULL_TREE);
12597   tree v8hi_ftype_v8hi_int_int
12598     = build_function_type_list (V8HI_type_node,
12599                                 V8HI_type_node, integer_type_node,
12600                                 integer_type_node, NULL_TREE);
12601   tree v2di_ftype_v2di_int
12602     = build_function_type_list (V2DI_type_node,
12603                                 V2DI_type_node, integer_type_node, NULL_TREE);
12604   tree v4si_ftype_v4si_int
12605     = build_function_type_list (V4SI_type_node,
12606                                 V4SI_type_node, integer_type_node, NULL_TREE);
12607   tree v8hi_ftype_v8hi_int
12608     = build_function_type_list (V8HI_type_node,
12609                                 V8HI_type_node, integer_type_node, NULL_TREE);
12610   tree v8hi_ftype_v8hi_v2di
12611     = build_function_type_list (V8HI_type_node,
12612                                 V8HI_type_node, V2DI_type_node, NULL_TREE);
12613   tree v4si_ftype_v4si_v2di
12614     = build_function_type_list (V4SI_type_node,
12615                                 V4SI_type_node, V2DI_type_node, NULL_TREE);
12616   tree v4si_ftype_v8hi_v8hi
12617     = build_function_type_list (V4SI_type_node,
12618                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
12619   tree di_ftype_v8qi_v8qi
12620     = build_function_type_list (long_long_unsigned_type_node,
12621                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
12622   tree di_ftype_v2si_v2si
12623     = build_function_type_list (long_long_unsigned_type_node,
12624                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
12625   tree v2di_ftype_v16qi_v16qi
12626     = build_function_type_list (V2DI_type_node,
12627                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
12628   tree v2di_ftype_v4si_v4si
12629     = build_function_type_list (V2DI_type_node,
12630                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
12631   tree int_ftype_v16qi
12632     = build_function_type_list (integer_type_node, V16QI_type_node, NULL_TREE);
12633   tree v16qi_ftype_pcchar
12634     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
12635   tree void_ftype_pchar_v16qi
12636     = build_function_type_list (void_type_node,
12637                                 pchar_type_node, V16QI_type_node, NULL_TREE);
12638   tree v4si_ftype_pcint
12639     = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
12640   tree void_ftype_pcint_v4si
12641     = build_function_type_list (void_type_node,
12642                                 pcint_type_node, V4SI_type_node, NULL_TREE);
12643   tree v2di_ftype_v2di
12644     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
12645
12646   tree float80_type;
12647   tree float128_type;
12648
12649   /* The __float80 type.  */
12650   if (TYPE_MODE (long_double_type_node) == XFmode)
12651     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
12652                                                "__float80");
12653   else
12654     {
12655       /* The __float80 type.  */
12656       float80_type = make_node (REAL_TYPE);
12657       TYPE_PRECISION (float80_type) = 80;
12658       layout_type (float80_type);
12659       (*lang_hooks.types.register_builtin_type) (float80_type, "__float80");
12660     }
12661
12662   float128_type = make_node (REAL_TYPE);
12663   TYPE_PRECISION (float128_type) = 128;
12664   layout_type (float128_type);
12665   (*lang_hooks.types.register_builtin_type) (float128_type, "__float128");
12666
12667   /* Add all builtins that are more or less simple operations on two
12668      operands.  */
12669   for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
12670     {
12671       /* Use one of the operands; the target can have a different mode for
12672          mask-generating compares.  */
12673       enum machine_mode mode;
12674       tree type;
12675
12676       if (d->name == 0)
12677         continue;
12678       mode = insn_data[d->icode].operand[1].mode;
12679
12680       switch (mode)
12681         {
12682         case V16QImode:
12683           type = v16qi_ftype_v16qi_v16qi;
12684           break;
12685         case V8HImode:
12686           type = v8hi_ftype_v8hi_v8hi;
12687           break;
12688         case V4SImode:
12689           type = v4si_ftype_v4si_v4si;
12690           break;
12691         case V2DImode:
12692           type = v2di_ftype_v2di_v2di;
12693           break;
12694         case V2DFmode:
12695           type = v2df_ftype_v2df_v2df;
12696           break;
12697         case TImode:
12698           type = ti_ftype_ti_ti;
12699           break;
12700         case V4SFmode:
12701           type = v4sf_ftype_v4sf_v4sf;
12702           break;
12703         case V8QImode:
12704           type = v8qi_ftype_v8qi_v8qi;
12705           break;
12706         case V4HImode:
12707           type = v4hi_ftype_v4hi_v4hi;
12708           break;
12709         case V2SImode:
12710           type = v2si_ftype_v2si_v2si;
12711           break;
12712         case DImode:
12713           type = di_ftype_di_di;
12714           break;
12715
12716         default:
12717           abort ();
12718         }
12719
12720       /* Override for comparisons.  */
12721       if (d->icode == CODE_FOR_maskcmpv4sf3
12722           || d->icode == CODE_FOR_maskncmpv4sf3
12723           || d->icode == CODE_FOR_vmmaskcmpv4sf3
12724           || d->icode == CODE_FOR_vmmaskncmpv4sf3)
12725         type = v4si_ftype_v4sf_v4sf;
12726
12727       if (d->icode == CODE_FOR_maskcmpv2df3
12728           || d->icode == CODE_FOR_maskncmpv2df3
12729           || d->icode == CODE_FOR_vmmaskcmpv2df3
12730           || d->icode == CODE_FOR_vmmaskncmpv2df3)
12731         type = v2di_ftype_v2df_v2df;
12732
12733       def_builtin (d->mask, d->name, type, d->code);
12734     }
12735
12736   /* Add the remaining MMX insns with somewhat more complicated types.  */
12737   def_builtin (MASK_MMX, "__builtin_ia32_mmx_zero", di_ftype_void, IX86_BUILTIN_MMX_ZERO);
12738   def_builtin (MASK_MMX, "__builtin_ia32_emms", void_ftype_void, IX86_BUILTIN_EMMS);
12739   def_builtin (MASK_MMX, "__builtin_ia32_psllw", v4hi_ftype_v4hi_di, IX86_BUILTIN_PSLLW);
12740   def_builtin (MASK_MMX, "__builtin_ia32_pslld", v2si_ftype_v2si_di, IX86_BUILTIN_PSLLD);
12741   def_builtin (MASK_MMX, "__builtin_ia32_psllq", di_ftype_di_di, IX86_BUILTIN_PSLLQ);
12742
12743   def_builtin (MASK_MMX, "__builtin_ia32_psrlw", v4hi_ftype_v4hi_di, IX86_BUILTIN_PSRLW);
12744   def_builtin (MASK_MMX, "__builtin_ia32_psrld", v2si_ftype_v2si_di, IX86_BUILTIN_PSRLD);
12745   def_builtin (MASK_MMX, "__builtin_ia32_psrlq", di_ftype_di_di, IX86_BUILTIN_PSRLQ);
12746
12747   def_builtin (MASK_MMX, "__builtin_ia32_psraw", v4hi_ftype_v4hi_di, IX86_BUILTIN_PSRAW);
12748   def_builtin (MASK_MMX, "__builtin_ia32_psrad", v2si_ftype_v2si_di, IX86_BUILTIN_PSRAD);
12749
12750   def_builtin (MASK_MMX, "__builtin_ia32_pshufw", v4hi_ftype_v4hi_int, IX86_BUILTIN_PSHUFW);
12751   def_builtin (MASK_MMX, "__builtin_ia32_pmaddwd", v2si_ftype_v4hi_v4hi, IX86_BUILTIN_PMADDWD);
12752
12753   /* comi/ucomi insns.  */
12754   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
12755     if (d->mask == MASK_SSE2)
12756       def_builtin (d->mask, d->name, int_ftype_v2df_v2df, d->code);
12757     else
12758       def_builtin (d->mask, d->name, int_ftype_v4sf_v4sf, d->code);
12759
12760   def_builtin (MASK_MMX, "__builtin_ia32_packsswb", v8qi_ftype_v4hi_v4hi, IX86_BUILTIN_PACKSSWB);
12761   def_builtin (MASK_MMX, "__builtin_ia32_packssdw", v4hi_ftype_v2si_v2si, IX86_BUILTIN_PACKSSDW);
12762   def_builtin (MASK_MMX, "__builtin_ia32_packuswb", v8qi_ftype_v4hi_v4hi, IX86_BUILTIN_PACKUSWB);
12763
12764   def_builtin (MASK_SSE, "__builtin_ia32_ldmxcsr", void_ftype_unsigned, IX86_BUILTIN_LDMXCSR);
12765   def_builtin (MASK_SSE, "__builtin_ia32_stmxcsr", unsigned_ftype_void, IX86_BUILTIN_STMXCSR);
12766   def_builtin (MASK_SSE, "__builtin_ia32_cvtpi2ps", v4sf_ftype_v4sf_v2si, IX86_BUILTIN_CVTPI2PS);
12767   def_builtin (MASK_SSE, "__builtin_ia32_cvtps2pi", v2si_ftype_v4sf, IX86_BUILTIN_CVTPS2PI);
12768   def_builtin (MASK_SSE, "__builtin_ia32_cvtsi2ss", v4sf_ftype_v4sf_int, IX86_BUILTIN_CVTSI2SS);
12769   def_builtin (MASK_SSE | MASK_64BIT, "__builtin_ia32_cvtsi642ss", v4sf_ftype_v4sf_int64, IX86_BUILTIN_CVTSI642SS);
12770   def_builtin (MASK_SSE, "__builtin_ia32_cvtss2si", int_ftype_v4sf, IX86_BUILTIN_CVTSS2SI);
12771   def_builtin (MASK_SSE | MASK_64BIT, "__builtin_ia32_cvtss2si64", int64_ftype_v4sf, IX86_BUILTIN_CVTSS2SI64);
12772   def_builtin (MASK_SSE, "__builtin_ia32_cvttps2pi", v2si_ftype_v4sf, IX86_BUILTIN_CVTTPS2PI);
12773   def_builtin (MASK_SSE, "__builtin_ia32_cvttss2si", int_ftype_v4sf, IX86_BUILTIN_CVTTSS2SI);
12774   def_builtin (MASK_SSE | MASK_64BIT, "__builtin_ia32_cvttss2si64", int64_ftype_v4sf, IX86_BUILTIN_CVTTSS2SI64);
12775
12776   def_builtin (MASK_SSE | MASK_3DNOW_A, "__builtin_ia32_pextrw", int_ftype_v4hi_int, IX86_BUILTIN_PEXTRW);
12777   def_builtin (MASK_SSE | MASK_3DNOW_A, "__builtin_ia32_pinsrw", v4hi_ftype_v4hi_int_int, IX86_BUILTIN_PINSRW);
12778
12779   def_builtin (MASK_SSE | MASK_3DNOW_A, "__builtin_ia32_maskmovq", void_ftype_v8qi_v8qi_pchar, IX86_BUILTIN_MASKMOVQ);
12780
12781   def_builtin (MASK_SSE, "__builtin_ia32_loadaps", v4sf_ftype_pcfloat, IX86_BUILTIN_LOADAPS);
12782   def_builtin (MASK_SSE, "__builtin_ia32_loadups", v4sf_ftype_pcfloat, IX86_BUILTIN_LOADUPS);
12783   def_builtin (MASK_SSE, "__builtin_ia32_loadss", v4sf_ftype_pcfloat, IX86_BUILTIN_LOADSS);
12784   def_builtin (MASK_SSE, "__builtin_ia32_storeaps", void_ftype_pfloat_v4sf, IX86_BUILTIN_STOREAPS);
12785   def_builtin (MASK_SSE, "__builtin_ia32_storeups", void_ftype_pfloat_v4sf, IX86_BUILTIN_STOREUPS);
12786   def_builtin (MASK_SSE, "__builtin_ia32_storess", void_ftype_pfloat_v4sf, IX86_BUILTIN_STORESS);
12787
12788   def_builtin (MASK_SSE, "__builtin_ia32_loadhps", v4sf_ftype_v4sf_pv2si, IX86_BUILTIN_LOADHPS);
12789   def_builtin (MASK_SSE, "__builtin_ia32_loadlps", v4sf_ftype_v4sf_pv2si, IX86_BUILTIN_LOADLPS);
12790   def_builtin (MASK_SSE, "__builtin_ia32_storehps", void_ftype_pv2si_v4sf, IX86_BUILTIN_STOREHPS);
12791   def_builtin (MASK_SSE, "__builtin_ia32_storelps", void_ftype_pv2si_v4sf, IX86_BUILTIN_STORELPS);
12792
12793   def_builtin (MASK_SSE, "__builtin_ia32_movmskps", int_ftype_v4sf, IX86_BUILTIN_MOVMSKPS);
12794   def_builtin (MASK_SSE | MASK_3DNOW_A, "__builtin_ia32_pmovmskb", int_ftype_v8qi, IX86_BUILTIN_PMOVMSKB);
12795   def_builtin (MASK_SSE, "__builtin_ia32_movntps", void_ftype_pfloat_v4sf, IX86_BUILTIN_MOVNTPS);
12796   def_builtin (MASK_SSE | MASK_3DNOW_A, "__builtin_ia32_movntq", void_ftype_pdi_di, IX86_BUILTIN_MOVNTQ);
12797
12798   def_builtin (MASK_SSE | MASK_3DNOW_A, "__builtin_ia32_sfence", void_ftype_void, IX86_BUILTIN_SFENCE);
12799
12800   def_builtin (MASK_SSE | MASK_3DNOW_A, "__builtin_ia32_psadbw", di_ftype_v8qi_v8qi, IX86_BUILTIN_PSADBW);
12801
12802   def_builtin (MASK_SSE, "__builtin_ia32_rcpps", v4sf_ftype_v4sf, IX86_BUILTIN_RCPPS);
12803   def_builtin (MASK_SSE, "__builtin_ia32_rcpss", v4sf_ftype_v4sf, IX86_BUILTIN_RCPSS);
12804   def_builtin (MASK_SSE, "__builtin_ia32_rsqrtps", v4sf_ftype_v4sf, IX86_BUILTIN_RSQRTPS);
12805   def_builtin (MASK_SSE, "__builtin_ia32_rsqrtss", v4sf_ftype_v4sf, IX86_BUILTIN_RSQRTSS);
12806   def_builtin (MASK_SSE, "__builtin_ia32_sqrtps", v4sf_ftype_v4sf, IX86_BUILTIN_SQRTPS);
12807   def_builtin (MASK_SSE, "__builtin_ia32_sqrtss", v4sf_ftype_v4sf, IX86_BUILTIN_SQRTSS);
12808
12809   def_builtin (MASK_SSE, "__builtin_ia32_shufps", v4sf_ftype_v4sf_v4sf_int, IX86_BUILTIN_SHUFPS);
12810
12811   /* Original 3DNow!  */
12812   def_builtin (MASK_3DNOW, "__builtin_ia32_femms", void_ftype_void, IX86_BUILTIN_FEMMS);
12813   def_builtin (MASK_3DNOW, "__builtin_ia32_pavgusb", v8qi_ftype_v8qi_v8qi, IX86_BUILTIN_PAVGUSB);
12814   def_builtin (MASK_3DNOW, "__builtin_ia32_pf2id", v2si_ftype_v2sf, IX86_BUILTIN_PF2ID);
12815   def_builtin (MASK_3DNOW, "__builtin_ia32_pfacc", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFACC);
12816   def_builtin (MASK_3DNOW, "__builtin_ia32_pfadd", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFADD);
12817   def_builtin (MASK_3DNOW, "__builtin_ia32_pfcmpeq", v2si_ftype_v2sf_v2sf, IX86_BUILTIN_PFCMPEQ);
12818   def_builtin (MASK_3DNOW, "__builtin_ia32_pfcmpge", v2si_ftype_v2sf_v2sf, IX86_BUILTIN_PFCMPGE);
12819   def_builtin (MASK_3DNOW, "__builtin_ia32_pfcmpgt", v2si_ftype_v2sf_v2sf, IX86_BUILTIN_PFCMPGT);
12820   def_builtin (MASK_3DNOW, "__builtin_ia32_pfmax", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFMAX);
12821   def_builtin (MASK_3DNOW, "__builtin_ia32_pfmin", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFMIN);
12822   def_builtin (MASK_3DNOW, "__builtin_ia32_pfmul", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFMUL);
12823   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrcp", v2sf_ftype_v2sf, IX86_BUILTIN_PFRCP);
12824   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrcpit1", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFRCPIT1);
12825   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrcpit2", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFRCPIT2);
12826   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrsqrt", v2sf_ftype_v2sf, IX86_BUILTIN_PFRSQRT);
12827   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrsqit1", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFRSQIT1);
12828   def_builtin (MASK_3DNOW, "__builtin_ia32_pfsub", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFSUB);
12829   def_builtin (MASK_3DNOW, "__builtin_ia32_pfsubr", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFSUBR);
12830   def_builtin (MASK_3DNOW, "__builtin_ia32_pi2fd", v2sf_ftype_v2si, IX86_BUILTIN_PI2FD);
12831   def_builtin (MASK_3DNOW, "__builtin_ia32_pmulhrw", v4hi_ftype_v4hi_v4hi, IX86_BUILTIN_PMULHRW);
12832
12833   /* 3DNow! extension as used in the Athlon CPU.  */
12834   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pf2iw", v2si_ftype_v2sf, IX86_BUILTIN_PF2IW);
12835   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pfnacc", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFNACC);
12836   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pfpnacc", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFPNACC);
12837   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pi2fw", v2sf_ftype_v2si, IX86_BUILTIN_PI2FW);
12838   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pswapdsf", v2sf_ftype_v2sf, IX86_BUILTIN_PSWAPDSF);
12839   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pswapdsi", v2si_ftype_v2si, IX86_BUILTIN_PSWAPDSI);
12840
12841   def_builtin (MASK_SSE, "__builtin_ia32_setzerops", v4sf_ftype_void, IX86_BUILTIN_SSE_ZERO);
12842
12843   /* SSE2 */
12844   def_builtin (MASK_SSE2, "__builtin_ia32_pextrw128", int_ftype_v8hi_int, IX86_BUILTIN_PEXTRW128);
12845   def_builtin (MASK_SSE2, "__builtin_ia32_pinsrw128", v8hi_ftype_v8hi_int_int, IX86_BUILTIN_PINSRW128);
12846
12847   def_builtin (MASK_SSE2, "__builtin_ia32_maskmovdqu", void_ftype_v16qi_v16qi_pchar, IX86_BUILTIN_MASKMOVDQU);
12848   def_builtin (MASK_SSE2, "__builtin_ia32_movq2dq", v2di_ftype_di, IX86_BUILTIN_MOVQ2DQ);
12849   def_builtin (MASK_SSE2, "__builtin_ia32_movdq2q", di_ftype_v2di, IX86_BUILTIN_MOVDQ2Q);
12850
12851   def_builtin (MASK_SSE2, "__builtin_ia32_loadapd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADAPD);
12852   def_builtin (MASK_SSE2, "__builtin_ia32_loadupd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADUPD);
12853   def_builtin (MASK_SSE2, "__builtin_ia32_loadsd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADSD);
12854   def_builtin (MASK_SSE2, "__builtin_ia32_storeapd", void_ftype_pdouble_v2df, IX86_BUILTIN_STOREAPD);
12855   def_builtin (MASK_SSE2, "__builtin_ia32_storeupd", void_ftype_pdouble_v2df, IX86_BUILTIN_STOREUPD);
12856   def_builtin (MASK_SSE2, "__builtin_ia32_storesd", void_ftype_pdouble_v2df, IX86_BUILTIN_STORESD);
12857
12858   def_builtin (MASK_SSE2, "__builtin_ia32_loadhpd", v2df_ftype_v2df_pcdouble, IX86_BUILTIN_LOADHPD);
12859   def_builtin (MASK_SSE2, "__builtin_ia32_loadlpd", v2df_ftype_v2df_pcdouble, IX86_BUILTIN_LOADLPD);
12860   def_builtin (MASK_SSE2, "__builtin_ia32_storehpd", void_ftype_pdouble_v2df, IX86_BUILTIN_STOREHPD);
12861   def_builtin (MASK_SSE2, "__builtin_ia32_storelpd", void_ftype_pdouble_v2df, IX86_BUILTIN_STORELPD);
12862
12863   def_builtin (MASK_SSE2, "__builtin_ia32_movmskpd", int_ftype_v2df, IX86_BUILTIN_MOVMSKPD);
12864   def_builtin (MASK_SSE2, "__builtin_ia32_pmovmskb128", int_ftype_v16qi, IX86_BUILTIN_PMOVMSKB128);
12865   def_builtin (MASK_SSE2, "__builtin_ia32_movnti", void_ftype_pint_int, IX86_BUILTIN_MOVNTI);
12866   def_builtin (MASK_SSE2, "__builtin_ia32_movntpd", void_ftype_pdouble_v2df, IX86_BUILTIN_MOVNTPD);
12867   def_builtin (MASK_SSE2, "__builtin_ia32_movntdq", void_ftype_pv2di_v2di, IX86_BUILTIN_MOVNTDQ);
12868
12869   def_builtin (MASK_SSE2, "__builtin_ia32_pshufd", v4si_ftype_v4si_int, IX86_BUILTIN_PSHUFD);
12870   def_builtin (MASK_SSE2, "__builtin_ia32_pshuflw", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSHUFLW);
12871   def_builtin (MASK_SSE2, "__builtin_ia32_pshufhw", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSHUFHW);
12872   def_builtin (MASK_SSE2, "__builtin_ia32_psadbw128", v2di_ftype_v16qi_v16qi, IX86_BUILTIN_PSADBW128);
12873
12874   def_builtin (MASK_SSE2, "__builtin_ia32_sqrtpd", v2df_ftype_v2df, IX86_BUILTIN_SQRTPD);
12875   def_builtin (MASK_SSE2, "__builtin_ia32_sqrtsd", v2df_ftype_v2df, IX86_BUILTIN_SQRTSD);
12876
12877   def_builtin (MASK_SSE2, "__builtin_ia32_shufpd", v2df_ftype_v2df_v2df_int, IX86_BUILTIN_SHUFPD);
12878
12879   def_builtin (MASK_SSE2, "__builtin_ia32_cvtdq2pd", v2df_ftype_v4si, IX86_BUILTIN_CVTDQ2PD);
12880   def_builtin (MASK_SSE2, "__builtin_ia32_cvtdq2ps", v4sf_ftype_v4si, IX86_BUILTIN_CVTDQ2PS);
12881
12882   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpd2dq", v4si_ftype_v2df, IX86_BUILTIN_CVTPD2DQ);
12883   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpd2pi", v2si_ftype_v2df, IX86_BUILTIN_CVTPD2PI);
12884   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpd2ps", v4sf_ftype_v2df, IX86_BUILTIN_CVTPD2PS);
12885   def_builtin (MASK_SSE2, "__builtin_ia32_cvttpd2dq", v4si_ftype_v2df, IX86_BUILTIN_CVTTPD2DQ);
12886   def_builtin (MASK_SSE2, "__builtin_ia32_cvttpd2pi", v2si_ftype_v2df, IX86_BUILTIN_CVTTPD2PI);
12887
12888   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpi2pd", v2df_ftype_v2si, IX86_BUILTIN_CVTPI2PD);
12889
12890   def_builtin (MASK_SSE2, "__builtin_ia32_cvtsd2si", int_ftype_v2df, IX86_BUILTIN_CVTSD2SI);
12891   def_builtin (MASK_SSE2, "__builtin_ia32_cvttsd2si", int_ftype_v2df, IX86_BUILTIN_CVTTSD2SI);
12892   def_builtin (MASK_SSE2 | MASK_64BIT, "__builtin_ia32_cvtsd2si64", int64_ftype_v2df, IX86_BUILTIN_CVTSD2SI64);
12893   def_builtin (MASK_SSE2 | MASK_64BIT, "__builtin_ia32_cvttsd2si64", int64_ftype_v2df, IX86_BUILTIN_CVTTSD2SI64);
12894
12895   def_builtin (MASK_SSE2, "__builtin_ia32_cvtps2dq", v4si_ftype_v4sf, IX86_BUILTIN_CVTPS2DQ);
12896   def_builtin (MASK_SSE2, "__builtin_ia32_cvtps2pd", v2df_ftype_v4sf, IX86_BUILTIN_CVTPS2PD);
12897   def_builtin (MASK_SSE2, "__builtin_ia32_cvttps2dq", v4si_ftype_v4sf, IX86_BUILTIN_CVTTPS2DQ);
12898
12899   def_builtin (MASK_SSE2, "__builtin_ia32_cvtsi2sd", v2df_ftype_v2df_int, IX86_BUILTIN_CVTSI2SD);
12900   def_builtin (MASK_SSE2 | MASK_64BIT, "__builtin_ia32_cvtsi642sd", v2df_ftype_v2df_int64, IX86_BUILTIN_CVTSI642SD);
12901   def_builtin (MASK_SSE2, "__builtin_ia32_cvtsd2ss", v4sf_ftype_v4sf_v2df, IX86_BUILTIN_CVTSD2SS);
12902   def_builtin (MASK_SSE2, "__builtin_ia32_cvtss2sd", v2df_ftype_v2df_v4sf, IX86_BUILTIN_CVTSS2SD);
12903
12904   def_builtin (MASK_SSE2, "__builtin_ia32_setpd1", v2df_ftype_double, IX86_BUILTIN_SETPD1);
12905   def_builtin (MASK_SSE2, "__builtin_ia32_setpd", v2df_ftype_double_double, IX86_BUILTIN_SETPD);
12906   def_builtin (MASK_SSE2, "__builtin_ia32_setzeropd", ti_ftype_void, IX86_BUILTIN_CLRPD);
12907   def_builtin (MASK_SSE2, "__builtin_ia32_loadpd1", v2df_ftype_pcdouble, IX86_BUILTIN_LOADPD1);
12908   def_builtin (MASK_SSE2, "__builtin_ia32_loadrpd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADRPD);
12909   def_builtin (MASK_SSE2, "__builtin_ia32_storepd1", void_ftype_pdouble_v2df, IX86_BUILTIN_STOREPD1);
12910   def_builtin (MASK_SSE2, "__builtin_ia32_storerpd", void_ftype_pdouble_v2df, IX86_BUILTIN_STORERPD);
12911
12912   def_builtin (MASK_SSE2, "__builtin_ia32_clflush", void_ftype_pcvoid, IX86_BUILTIN_CLFLUSH);
12913   def_builtin (MASK_SSE2, "__builtin_ia32_lfence", void_ftype_void, IX86_BUILTIN_LFENCE);
12914   def_builtin (MASK_SSE2, "__builtin_ia32_mfence", void_ftype_void, IX86_BUILTIN_MFENCE);
12915
12916   def_builtin (MASK_SSE2, "__builtin_ia32_loaddqa", v16qi_ftype_pcchar, IX86_BUILTIN_LOADDQA);
12917   def_builtin (MASK_SSE2, "__builtin_ia32_loaddqu", v16qi_ftype_pcchar, IX86_BUILTIN_LOADDQU);
12918   def_builtin (MASK_SSE2, "__builtin_ia32_loadd", v4si_ftype_pcint, IX86_BUILTIN_LOADD);
12919   def_builtin (MASK_SSE2, "__builtin_ia32_storedqa", void_ftype_pchar_v16qi, IX86_BUILTIN_STOREDQA);
12920   def_builtin (MASK_SSE2, "__builtin_ia32_storedqu", void_ftype_pchar_v16qi, IX86_BUILTIN_STOREDQU);
12921   def_builtin (MASK_SSE2, "__builtin_ia32_stored", void_ftype_pcint_v4si, IX86_BUILTIN_STORED);
12922   def_builtin (MASK_SSE2, "__builtin_ia32_movq", v2di_ftype_v2di, IX86_BUILTIN_MOVQ);
12923
12924   def_builtin (MASK_SSE, "__builtin_ia32_setzero128", v2di_ftype_void, IX86_BUILTIN_CLRTI);
12925
12926   def_builtin (MASK_SSE2, "__builtin_ia32_pmuludq", di_ftype_v2si_v2si, IX86_BUILTIN_PMULUDQ);
12927   def_builtin (MASK_SSE2, "__builtin_ia32_pmuludq128", v2di_ftype_v4si_v4si, IX86_BUILTIN_PMULUDQ128);
12928
12929   def_builtin (MASK_SSE2, "__builtin_ia32_psllw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSLLW128);
12930   def_builtin (MASK_SSE2, "__builtin_ia32_pslld128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSLLD128);
12931   def_builtin (MASK_SSE2, "__builtin_ia32_psllq128", v2di_ftype_v2di_v2di, IX86_BUILTIN_PSLLQ128);
12932
12933   def_builtin (MASK_SSE2, "__builtin_ia32_psrlw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSRLW128);
12934   def_builtin (MASK_SSE2, "__builtin_ia32_psrld128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSRLD128);
12935   def_builtin (MASK_SSE2, "__builtin_ia32_psrlq128", v2di_ftype_v2di_v2di, IX86_BUILTIN_PSRLQ128);
12936
12937   def_builtin (MASK_SSE2, "__builtin_ia32_psraw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSRAW128);
12938   def_builtin (MASK_SSE2, "__builtin_ia32_psrad128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSRAD128);
12939
12940   def_builtin (MASK_SSE2, "__builtin_ia32_pslldqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSLLDQI128);
12941   def_builtin (MASK_SSE2, "__builtin_ia32_psllwi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSLLWI128);
12942   def_builtin (MASK_SSE2, "__builtin_ia32_pslldi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSLLDI128);
12943   def_builtin (MASK_SSE2, "__builtin_ia32_psllqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSLLQI128);
12944
12945   def_builtin (MASK_SSE2, "__builtin_ia32_psrldqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSRLDQI128);
12946   def_builtin (MASK_SSE2, "__builtin_ia32_psrlwi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSRLWI128);
12947   def_builtin (MASK_SSE2, "__builtin_ia32_psrldi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSRLDI128);
12948   def_builtin (MASK_SSE2, "__builtin_ia32_psrlqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSRLQI128);
12949
12950   def_builtin (MASK_SSE2, "__builtin_ia32_psrawi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSRAWI128);
12951   def_builtin (MASK_SSE2, "__builtin_ia32_psradi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSRADI128);
12952
12953   def_builtin (MASK_SSE2, "__builtin_ia32_pmaddwd128", v4si_ftype_v8hi_v8hi, IX86_BUILTIN_PMADDWD128);
12954
12955   /* Prescott New Instructions.  */
12956   def_builtin (MASK_SSE3, "__builtin_ia32_monitor",
12957                void_ftype_pcvoid_unsigned_unsigned,
12958                IX86_BUILTIN_MONITOR);
12959   def_builtin (MASK_SSE3, "__builtin_ia32_mwait",
12960                void_ftype_unsigned_unsigned,
12961                IX86_BUILTIN_MWAIT);
12962   def_builtin (MASK_SSE3, "__builtin_ia32_movshdup",
12963                v4sf_ftype_v4sf,
12964                IX86_BUILTIN_MOVSHDUP);
12965   def_builtin (MASK_SSE3, "__builtin_ia32_movsldup",
12966                v4sf_ftype_v4sf,
12967                IX86_BUILTIN_MOVSLDUP);
12968   def_builtin (MASK_SSE3, "__builtin_ia32_lddqu",
12969                v16qi_ftype_pcchar, IX86_BUILTIN_LDDQU);
12970   def_builtin (MASK_SSE3, "__builtin_ia32_loadddup",
12971                v2df_ftype_pcdouble, IX86_BUILTIN_LOADDDUP);
12972   def_builtin (MASK_SSE3, "__builtin_ia32_movddup",
12973                v2df_ftype_v2df, IX86_BUILTIN_MOVDDUP);
12974 }
12975
12976 /* Errors in the source file can cause expand_expr to return const0_rtx
12977    where we expect a vector.  To avoid crashing, use one of the vector
12978    clear instructions.  */
12979 static rtx
12980 safe_vector_operand (rtx x, enum machine_mode mode)
12981 {
12982   if (x != const0_rtx)
12983     return x;
12984   x = gen_reg_rtx (mode);
12985
12986   if (VALID_MMX_REG_MODE (mode) || VALID_MMX_REG_MODE_3DNOW (mode))
12987     emit_insn (gen_mmx_clrdi (mode == DImode ? x
12988                               : gen_rtx_SUBREG (DImode, x, 0)));
12989   else
12990     emit_insn (gen_sse_clrv4sf (mode == V4SFmode ? x
12991                                 : gen_rtx_SUBREG (V4SFmode, x, 0),
12992                                 CONST0_RTX (V4SFmode)));
12993   return x;
12994 }
12995
12996 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
12997
12998 static rtx
12999 ix86_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target)
13000 {
13001   rtx pat;
13002   tree arg0 = TREE_VALUE (arglist);
13003   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13004   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13005   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13006   enum machine_mode tmode = insn_data[icode].operand[0].mode;
13007   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
13008   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
13009
13010   if (VECTOR_MODE_P (mode0))
13011     op0 = safe_vector_operand (op0, mode0);
13012   if (VECTOR_MODE_P (mode1))
13013     op1 = safe_vector_operand (op1, mode1);
13014
13015   if (! target
13016       || GET_MODE (target) != tmode
13017       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13018     target = gen_reg_rtx (tmode);
13019
13020   if (GET_MODE (op1) == SImode && mode1 == TImode)
13021     {
13022       rtx x = gen_reg_rtx (V4SImode);
13023       emit_insn (gen_sse2_loadd (x, op1));
13024       op1 = gen_lowpart (TImode, x);
13025     }
13026
13027   /* In case the insn wants input operands in modes different from
13028      the result, abort.  */
13029   if ((GET_MODE (op0) != mode0 && GET_MODE (op0) != VOIDmode)
13030       || (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode))
13031     abort ();
13032
13033   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13034     op0 = copy_to_mode_reg (mode0, op0);
13035   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13036     op1 = copy_to_mode_reg (mode1, op1);
13037
13038   /* In the commutative cases, both op0 and op1 are nonimmediate_operand,
13039      yet one of the two must not be a memory.  This is normally enforced
13040      by expanders, but we didn't bother to create one here.  */
13041   if (GET_CODE (op0) == MEM && GET_CODE (op1) == MEM)
13042     op0 = copy_to_mode_reg (mode0, op0);
13043
13044   pat = GEN_FCN (icode) (target, op0, op1);
13045   if (! pat)
13046     return 0;
13047   emit_insn (pat);
13048   return target;
13049 }
13050
13051 /* Subroutine of ix86_expand_builtin to take care of stores.  */
13052
13053 static rtx
13054 ix86_expand_store_builtin (enum insn_code icode, tree arglist)
13055 {
13056   rtx pat;
13057   tree arg0 = TREE_VALUE (arglist);
13058   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13059   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13060   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13061   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
13062   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
13063
13064   if (VECTOR_MODE_P (mode1))
13065     op1 = safe_vector_operand (op1, mode1);
13066
13067   op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
13068   op1 = copy_to_mode_reg (mode1, op1);
13069
13070   pat = GEN_FCN (icode) (op0, op1);
13071   if (pat)
13072     emit_insn (pat);
13073   return 0;
13074 }
13075
13076 /* Subroutine of ix86_expand_builtin to take care of unop insns.  */
13077
13078 static rtx
13079 ix86_expand_unop_builtin (enum insn_code icode, tree arglist,
13080                           rtx target, int do_load)
13081 {
13082   rtx pat;
13083   tree arg0 = TREE_VALUE (arglist);
13084   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13085   enum machine_mode tmode = insn_data[icode].operand[0].mode;
13086   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
13087
13088   if (! target
13089       || GET_MODE (target) != tmode
13090       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13091     target = gen_reg_rtx (tmode);
13092   if (do_load)
13093     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
13094   else
13095     {
13096       if (VECTOR_MODE_P (mode0))
13097         op0 = safe_vector_operand (op0, mode0);
13098
13099       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13100         op0 = copy_to_mode_reg (mode0, op0);
13101     }
13102
13103   pat = GEN_FCN (icode) (target, op0);
13104   if (! pat)
13105     return 0;
13106   emit_insn (pat);
13107   return target;
13108 }
13109
13110 /* Subroutine of ix86_expand_builtin to take care of three special unop insns:
13111    sqrtss, rsqrtss, rcpss.  */
13112
13113 static rtx
13114 ix86_expand_unop1_builtin (enum insn_code icode, tree arglist, rtx target)
13115 {
13116   rtx pat;
13117   tree arg0 = TREE_VALUE (arglist);
13118   rtx op1, op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13119   enum machine_mode tmode = insn_data[icode].operand[0].mode;
13120   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
13121
13122   if (! target
13123       || GET_MODE (target) != tmode
13124       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13125     target = gen_reg_rtx (tmode);
13126
13127   if (VECTOR_MODE_P (mode0))
13128     op0 = safe_vector_operand (op0, mode0);
13129
13130   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13131     op0 = copy_to_mode_reg (mode0, op0);
13132
13133   op1 = op0;
13134   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
13135     op1 = copy_to_mode_reg (mode0, op1);
13136
13137   pat = GEN_FCN (icode) (target, op0, op1);
13138   if (! pat)
13139     return 0;
13140   emit_insn (pat);
13141   return target;
13142 }
13143
13144 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
13145
13146 static rtx
13147 ix86_expand_sse_compare (const struct builtin_description *d, tree arglist,
13148                          rtx target)
13149 {
13150   rtx pat;
13151   tree arg0 = TREE_VALUE (arglist);
13152   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13153   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13154   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13155   rtx op2;
13156   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
13157   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
13158   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
13159   enum rtx_code comparison = d->comparison;
13160
13161   if (VECTOR_MODE_P (mode0))
13162     op0 = safe_vector_operand (op0, mode0);
13163   if (VECTOR_MODE_P (mode1))
13164     op1 = safe_vector_operand (op1, mode1);
13165
13166   /* Swap operands if we have a comparison that isn't available in
13167      hardware.  */
13168   if (d->flag)
13169     {
13170       rtx tmp = gen_reg_rtx (mode1);
13171       emit_move_insn (tmp, op1);
13172       op1 = op0;
13173       op0 = tmp;
13174     }
13175
13176   if (! target
13177       || GET_MODE (target) != tmode
13178       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
13179     target = gen_reg_rtx (tmode);
13180
13181   if (! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
13182     op0 = copy_to_mode_reg (mode0, op0);
13183   if (! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
13184     op1 = copy_to_mode_reg (mode1, op1);
13185
13186   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
13187   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
13188   if (! pat)
13189     return 0;
13190   emit_insn (pat);
13191   return target;
13192 }
13193
13194 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
13195
13196 static rtx
13197 ix86_expand_sse_comi (const struct builtin_description *d, tree arglist,
13198                       rtx target)
13199 {
13200   rtx pat;
13201   tree arg0 = TREE_VALUE (arglist);
13202   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13203   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13204   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13205   rtx op2;
13206   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
13207   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
13208   enum rtx_code comparison = d->comparison;
13209
13210   if (VECTOR_MODE_P (mode0))
13211     op0 = safe_vector_operand (op0, mode0);
13212   if (VECTOR_MODE_P (mode1))
13213     op1 = safe_vector_operand (op1, mode1);
13214
13215   /* Swap operands if we have a comparison that isn't available in
13216      hardware.  */
13217   if (d->flag)
13218     {
13219       rtx tmp = op1;
13220       op1 = op0;
13221       op0 = tmp;
13222     }
13223
13224   target = gen_reg_rtx (SImode);
13225   emit_move_insn (target, const0_rtx);
13226   target = gen_rtx_SUBREG (QImode, target, 0);
13227
13228   if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
13229     op0 = copy_to_mode_reg (mode0, op0);
13230   if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
13231     op1 = copy_to_mode_reg (mode1, op1);
13232
13233   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
13234   pat = GEN_FCN (d->icode) (op0, op1);
13235   if (! pat)
13236     return 0;
13237   emit_insn (pat);
13238   emit_insn (gen_rtx_SET (VOIDmode,
13239                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
13240                           gen_rtx_fmt_ee (comparison, QImode,
13241                                           SET_DEST (pat),
13242                                           const0_rtx)));
13243
13244   return SUBREG_REG (target);
13245 }
13246
13247 /* Expand an expression EXP that calls a built-in function,
13248    with result going to TARGET if that's convenient
13249    (and in mode MODE if that's convenient).
13250    SUBTARGET may be used as the target for computing one of EXP's operands.
13251    IGNORE is nonzero if the value is to be ignored.  */
13252
13253 rtx
13254 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
13255                      enum machine_mode mode ATTRIBUTE_UNUSED,
13256                      int ignore ATTRIBUTE_UNUSED)
13257 {
13258   const struct builtin_description *d;
13259   size_t i;
13260   enum insn_code icode;
13261   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
13262   tree arglist = TREE_OPERAND (exp, 1);
13263   tree arg0, arg1, arg2;
13264   rtx op0, op1, op2, pat;
13265   enum machine_mode tmode, mode0, mode1, mode2;
13266   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
13267
13268   switch (fcode)
13269     {
13270     case IX86_BUILTIN_EMMS:
13271       emit_insn (gen_emms ());
13272       return 0;
13273
13274     case IX86_BUILTIN_SFENCE:
13275       emit_insn (gen_sfence ());
13276       return 0;
13277
13278     case IX86_BUILTIN_PEXTRW:
13279     case IX86_BUILTIN_PEXTRW128:
13280       icode = (fcode == IX86_BUILTIN_PEXTRW
13281                ? CODE_FOR_mmx_pextrw
13282                : CODE_FOR_sse2_pextrw);
13283       arg0 = TREE_VALUE (arglist);
13284       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13285       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13286       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13287       tmode = insn_data[icode].operand[0].mode;
13288       mode0 = insn_data[icode].operand[1].mode;
13289       mode1 = insn_data[icode].operand[2].mode;
13290
13291       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13292         op0 = copy_to_mode_reg (mode0, op0);
13293       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13294         {
13295           error ("selector must be an integer constant in the range 0..%i",
13296                   fcode == IX86_BUILTIN_PEXTRW ? 3:7);
13297           return gen_reg_rtx (tmode);
13298         }
13299       if (target == 0
13300           || GET_MODE (target) != tmode
13301           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13302         target = gen_reg_rtx (tmode);
13303       pat = GEN_FCN (icode) (target, op0, op1);
13304       if (! pat)
13305         return 0;
13306       emit_insn (pat);
13307       return target;
13308
13309     case IX86_BUILTIN_PINSRW:
13310     case IX86_BUILTIN_PINSRW128:
13311       icode = (fcode == IX86_BUILTIN_PINSRW
13312                ? CODE_FOR_mmx_pinsrw
13313                : CODE_FOR_sse2_pinsrw);
13314       arg0 = TREE_VALUE (arglist);
13315       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13316       arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
13317       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13318       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13319       op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
13320       tmode = insn_data[icode].operand[0].mode;
13321       mode0 = insn_data[icode].operand[1].mode;
13322       mode1 = insn_data[icode].operand[2].mode;
13323       mode2 = insn_data[icode].operand[3].mode;
13324
13325       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13326         op0 = copy_to_mode_reg (mode0, op0);
13327       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13328         op1 = copy_to_mode_reg (mode1, op1);
13329       if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
13330         {
13331           error ("selector must be an integer constant in the range 0..%i",
13332                   fcode == IX86_BUILTIN_PINSRW ? 15:255);
13333           return const0_rtx;
13334         }
13335       if (target == 0
13336           || GET_MODE (target) != tmode
13337           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13338         target = gen_reg_rtx (tmode);
13339       pat = GEN_FCN (icode) (target, op0, op1, op2);
13340       if (! pat)
13341         return 0;
13342       emit_insn (pat);
13343       return target;
13344
13345     case IX86_BUILTIN_MASKMOVQ:
13346     case IX86_BUILTIN_MASKMOVDQU:
13347       icode = (fcode == IX86_BUILTIN_MASKMOVQ
13348                ? (TARGET_64BIT ? CODE_FOR_mmx_maskmovq_rex : CODE_FOR_mmx_maskmovq)
13349                : (TARGET_64BIT ? CODE_FOR_sse2_maskmovdqu_rex64
13350                   : CODE_FOR_sse2_maskmovdqu));
13351       /* Note the arg order is different from the operand order.  */
13352       arg1 = TREE_VALUE (arglist);
13353       arg2 = TREE_VALUE (TREE_CHAIN (arglist));
13354       arg0 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
13355       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13356       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13357       op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
13358       mode0 = insn_data[icode].operand[0].mode;
13359       mode1 = insn_data[icode].operand[1].mode;
13360       mode2 = insn_data[icode].operand[2].mode;
13361
13362       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13363         op0 = copy_to_mode_reg (mode0, op0);
13364       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
13365         op1 = copy_to_mode_reg (mode1, op1);
13366       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
13367         op2 = copy_to_mode_reg (mode2, op2);
13368       pat = GEN_FCN (icode) (op0, op1, op2);
13369       if (! pat)
13370         return 0;
13371       emit_insn (pat);
13372       return 0;
13373
13374     case IX86_BUILTIN_SQRTSS:
13375       return ix86_expand_unop1_builtin (CODE_FOR_vmsqrtv4sf2, arglist, target);
13376     case IX86_BUILTIN_RSQRTSS:
13377       return ix86_expand_unop1_builtin (CODE_FOR_vmrsqrtv4sf2, arglist, target);
13378     case IX86_BUILTIN_RCPSS:
13379       return ix86_expand_unop1_builtin (CODE_FOR_vmrcpv4sf2, arglist, target);
13380
13381     case IX86_BUILTIN_LOADAPS:
13382       return ix86_expand_unop_builtin (CODE_FOR_sse_movaps, arglist, target, 1);
13383
13384     case IX86_BUILTIN_LOADUPS:
13385       return ix86_expand_unop_builtin (CODE_FOR_sse_movups, arglist, target, 1);
13386
13387     case IX86_BUILTIN_STOREAPS:
13388       return ix86_expand_store_builtin (CODE_FOR_sse_movaps, arglist);
13389
13390     case IX86_BUILTIN_STOREUPS:
13391       return ix86_expand_store_builtin (CODE_FOR_sse_movups, arglist);
13392
13393     case IX86_BUILTIN_LOADSS:
13394       return ix86_expand_unop_builtin (CODE_FOR_sse_loadss, arglist, target, 1);
13395
13396     case IX86_BUILTIN_STORESS:
13397       return ix86_expand_store_builtin (CODE_FOR_sse_storess, arglist);
13398
13399     case IX86_BUILTIN_LOADHPS:
13400     case IX86_BUILTIN_LOADLPS:
13401     case IX86_BUILTIN_LOADHPD:
13402     case IX86_BUILTIN_LOADLPD:
13403       icode = (fcode == IX86_BUILTIN_LOADHPS ? CODE_FOR_sse_movhps
13404                : fcode == IX86_BUILTIN_LOADLPS ? CODE_FOR_sse_movlps
13405                : fcode == IX86_BUILTIN_LOADHPD ? CODE_FOR_sse2_loadhpd
13406                : CODE_FOR_sse2_loadlpd);
13407       arg0 = TREE_VALUE (arglist);
13408       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13409       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13410       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13411       tmode = insn_data[icode].operand[0].mode;
13412       mode0 = insn_data[icode].operand[1].mode;
13413       mode1 = insn_data[icode].operand[2].mode;
13414
13415       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13416         op0 = copy_to_mode_reg (mode0, op0);
13417       op1 = gen_rtx_MEM (mode1, copy_to_mode_reg (Pmode, op1));
13418       if (target == 0
13419           || GET_MODE (target) != tmode
13420           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13421         target = gen_reg_rtx (tmode);
13422       pat = GEN_FCN (icode) (target, op0, op1);
13423       if (! pat)
13424         return 0;
13425       emit_insn (pat);
13426       return target;
13427
13428     case IX86_BUILTIN_STOREHPS:
13429     case IX86_BUILTIN_STORELPS:
13430       icode = (fcode == IX86_BUILTIN_STOREHPS ? CODE_FOR_sse_movhps
13431                : CODE_FOR_sse_movlps);
13432       arg0 = TREE_VALUE (arglist);
13433       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13434       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13435       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13436       mode0 = insn_data[icode].operand[1].mode;
13437       mode1 = insn_data[icode].operand[2].mode;
13438
13439       op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
13440       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13441         op1 = copy_to_mode_reg (mode1, op1);
13442
13443       pat = GEN_FCN (icode) (op0, op0, op1);
13444       if (! pat)
13445         return 0;
13446       emit_insn (pat);
13447       return const0_rtx;
13448
13449     case IX86_BUILTIN_STOREHPD:
13450     case IX86_BUILTIN_STORELPD:
13451       icode = (fcode == IX86_BUILTIN_STOREHPD ? CODE_FOR_sse2_storehpd
13452                : CODE_FOR_sse2_storelpd);
13453       arg0 = TREE_VALUE (arglist);
13454       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13455       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13456       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13457       mode0 = insn_data[icode].operand[0].mode;
13458       mode1 = insn_data[icode].operand[1].mode;
13459
13460       op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
13461       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
13462         op1 = copy_to_mode_reg (mode1, op1);
13463
13464       pat = GEN_FCN (icode) (op0, op1);
13465       if (! pat)
13466         return 0;
13467       emit_insn (pat);
13468       return const0_rtx;
13469
13470     case IX86_BUILTIN_MOVNTPS:
13471       return ix86_expand_store_builtin (CODE_FOR_sse_movntv4sf, arglist);
13472     case IX86_BUILTIN_MOVNTQ:
13473       return ix86_expand_store_builtin (CODE_FOR_sse_movntdi, arglist);
13474
13475     case IX86_BUILTIN_LDMXCSR:
13476       op0 = expand_expr (TREE_VALUE (arglist), NULL_RTX, VOIDmode, 0);
13477       target = assign_386_stack_local (SImode, 0);
13478       emit_move_insn (target, op0);
13479       emit_insn (gen_ldmxcsr (target));
13480       return 0;
13481
13482     case IX86_BUILTIN_STMXCSR:
13483       target = assign_386_stack_local (SImode, 0);
13484       emit_insn (gen_stmxcsr (target));
13485       return copy_to_mode_reg (SImode, target);
13486
13487     case IX86_BUILTIN_SHUFPS:
13488     case IX86_BUILTIN_SHUFPD:
13489       icode = (fcode == IX86_BUILTIN_SHUFPS
13490                ? CODE_FOR_sse_shufps
13491                : CODE_FOR_sse2_shufpd);
13492       arg0 = TREE_VALUE (arglist);
13493       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13494       arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
13495       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13496       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13497       op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
13498       tmode = insn_data[icode].operand[0].mode;
13499       mode0 = insn_data[icode].operand[1].mode;
13500       mode1 = insn_data[icode].operand[2].mode;
13501       mode2 = insn_data[icode].operand[3].mode;
13502
13503       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13504         op0 = copy_to_mode_reg (mode0, op0);
13505       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13506         op1 = copy_to_mode_reg (mode1, op1);
13507       if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
13508         {
13509           /* @@@ better error message */
13510           error ("mask must be an immediate");
13511           return gen_reg_rtx (tmode);
13512         }
13513       if (target == 0
13514           || GET_MODE (target) != tmode
13515           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13516         target = gen_reg_rtx (tmode);
13517       pat = GEN_FCN (icode) (target, op0, op1, op2);
13518       if (! pat)
13519         return 0;
13520       emit_insn (pat);
13521       return target;
13522
13523     case IX86_BUILTIN_PSHUFW:
13524     case IX86_BUILTIN_PSHUFD:
13525     case IX86_BUILTIN_PSHUFHW:
13526     case IX86_BUILTIN_PSHUFLW:
13527       icode = (  fcode == IX86_BUILTIN_PSHUFHW ? CODE_FOR_sse2_pshufhw
13528                : fcode == IX86_BUILTIN_PSHUFLW ? CODE_FOR_sse2_pshuflw
13529                : fcode == IX86_BUILTIN_PSHUFD ? CODE_FOR_sse2_pshufd
13530                : CODE_FOR_mmx_pshufw);
13531       arg0 = TREE_VALUE (arglist);
13532       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13533       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13534       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13535       tmode = insn_data[icode].operand[0].mode;
13536       mode1 = insn_data[icode].operand[1].mode;
13537       mode2 = insn_data[icode].operand[2].mode;
13538
13539       if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
13540         op0 = copy_to_mode_reg (mode1, op0);
13541       if (! (*insn_data[icode].operand[2].predicate) (op1, mode2))
13542         {
13543           /* @@@ better error message */
13544           error ("mask must be an immediate");
13545           return const0_rtx;
13546         }
13547       if (target == 0
13548           || GET_MODE (target) != tmode
13549           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13550         target = gen_reg_rtx (tmode);
13551       pat = GEN_FCN (icode) (target, op0, op1);
13552       if (! pat)
13553         return 0;
13554       emit_insn (pat);
13555       return target;
13556
13557     case IX86_BUILTIN_PSLLDQI128:
13558     case IX86_BUILTIN_PSRLDQI128:
13559       icode = (  fcode == IX86_BUILTIN_PSLLDQI128 ? CODE_FOR_sse2_ashlti3
13560                : CODE_FOR_sse2_lshrti3);
13561       arg0 = TREE_VALUE (arglist);
13562       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13563       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13564       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13565       tmode = insn_data[icode].operand[0].mode;
13566       mode1 = insn_data[icode].operand[1].mode;
13567       mode2 = insn_data[icode].operand[2].mode;
13568
13569       if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
13570         {
13571           op0 = copy_to_reg (op0);
13572           op0 = simplify_gen_subreg (mode1, op0, GET_MODE (op0), 0);
13573         }
13574       if (! (*insn_data[icode].operand[2].predicate) (op1, mode2))
13575         {
13576           error ("shift must be an immediate");
13577           return const0_rtx;
13578         }
13579       target = gen_reg_rtx (V2DImode);
13580       pat = GEN_FCN (icode) (simplify_gen_subreg (tmode, target, V2DImode, 0), op0, op1);
13581       if (! pat)
13582         return 0;
13583       emit_insn (pat);
13584       return target;
13585
13586     case IX86_BUILTIN_FEMMS:
13587       emit_insn (gen_femms ());
13588       return NULL_RTX;
13589
13590     case IX86_BUILTIN_PAVGUSB:
13591       return ix86_expand_binop_builtin (CODE_FOR_pavgusb, arglist, target);
13592
13593     case IX86_BUILTIN_PF2ID:
13594       return ix86_expand_unop_builtin (CODE_FOR_pf2id, arglist, target, 0);
13595
13596     case IX86_BUILTIN_PFACC:
13597       return ix86_expand_binop_builtin (CODE_FOR_pfacc, arglist, target);
13598
13599     case IX86_BUILTIN_PFADD:
13600      return ix86_expand_binop_builtin (CODE_FOR_addv2sf3, arglist, target);
13601
13602     case IX86_BUILTIN_PFCMPEQ:
13603       return ix86_expand_binop_builtin (CODE_FOR_eqv2sf3, arglist, target);
13604
13605     case IX86_BUILTIN_PFCMPGE:
13606       return ix86_expand_binop_builtin (CODE_FOR_gev2sf3, arglist, target);
13607
13608     case IX86_BUILTIN_PFCMPGT:
13609       return ix86_expand_binop_builtin (CODE_FOR_gtv2sf3, arglist, target);
13610
13611     case IX86_BUILTIN_PFMAX:
13612       return ix86_expand_binop_builtin (CODE_FOR_pfmaxv2sf3, arglist, target);
13613
13614     case IX86_BUILTIN_PFMIN:
13615       return ix86_expand_binop_builtin (CODE_FOR_pfminv2sf3, arglist, target);
13616
13617     case IX86_BUILTIN_PFMUL:
13618       return ix86_expand_binop_builtin (CODE_FOR_mulv2sf3, arglist, target);
13619
13620     case IX86_BUILTIN_PFRCP:
13621       return ix86_expand_unop_builtin (CODE_FOR_pfrcpv2sf2, arglist, target, 0);
13622
13623     case IX86_BUILTIN_PFRCPIT1:
13624       return ix86_expand_binop_builtin (CODE_FOR_pfrcpit1v2sf3, arglist, target);
13625
13626     case IX86_BUILTIN_PFRCPIT2:
13627       return ix86_expand_binop_builtin (CODE_FOR_pfrcpit2v2sf3, arglist, target);
13628
13629     case IX86_BUILTIN_PFRSQIT1:
13630       return ix86_expand_binop_builtin (CODE_FOR_pfrsqit1v2sf3, arglist, target);
13631
13632     case IX86_BUILTIN_PFRSQRT:
13633       return ix86_expand_unop_builtin (CODE_FOR_pfrsqrtv2sf2, arglist, target, 0);
13634
13635     case IX86_BUILTIN_PFSUB:
13636       return ix86_expand_binop_builtin (CODE_FOR_subv2sf3, arglist, target);
13637
13638     case IX86_BUILTIN_PFSUBR:
13639       return ix86_expand_binop_builtin (CODE_FOR_subrv2sf3, arglist, target);
13640
13641     case IX86_BUILTIN_PI2FD:
13642       return ix86_expand_unop_builtin (CODE_FOR_floatv2si2, arglist, target, 0);
13643
13644     case IX86_BUILTIN_PMULHRW:
13645       return ix86_expand_binop_builtin (CODE_FOR_pmulhrwv4hi3, arglist, target);
13646
13647     case IX86_BUILTIN_PF2IW:
13648       return ix86_expand_unop_builtin (CODE_FOR_pf2iw, arglist, target, 0);
13649
13650     case IX86_BUILTIN_PFNACC:
13651       return ix86_expand_binop_builtin (CODE_FOR_pfnacc, arglist, target);
13652
13653     case IX86_BUILTIN_PFPNACC:
13654       return ix86_expand_binop_builtin (CODE_FOR_pfpnacc, arglist, target);
13655
13656     case IX86_BUILTIN_PI2FW:
13657       return ix86_expand_unop_builtin (CODE_FOR_pi2fw, arglist, target, 0);
13658
13659     case IX86_BUILTIN_PSWAPDSI:
13660       return ix86_expand_unop_builtin (CODE_FOR_pswapdv2si2, arglist, target, 0);
13661
13662     case IX86_BUILTIN_PSWAPDSF:
13663       return ix86_expand_unop_builtin (CODE_FOR_pswapdv2sf2, arglist, target, 0);
13664
13665     case IX86_BUILTIN_SSE_ZERO:
13666       target = gen_reg_rtx (V4SFmode);
13667       emit_insn (gen_sse_clrv4sf (target, CONST0_RTX (V4SFmode)));
13668       return target;
13669
13670     case IX86_BUILTIN_MMX_ZERO:
13671       target = gen_reg_rtx (DImode);
13672       emit_insn (gen_mmx_clrdi (target));
13673       return target;
13674
13675     case IX86_BUILTIN_CLRTI:
13676       target = gen_reg_rtx (V2DImode);
13677       emit_insn (gen_sse2_clrti (simplify_gen_subreg (TImode, target, V2DImode, 0)));
13678       return target;
13679
13680
13681     case IX86_BUILTIN_SQRTSD:
13682       return ix86_expand_unop1_builtin (CODE_FOR_vmsqrtv2df2, arglist, target);
13683     case IX86_BUILTIN_LOADAPD:
13684       return ix86_expand_unop_builtin (CODE_FOR_sse2_movapd, arglist, target, 1);
13685     case IX86_BUILTIN_LOADUPD:
13686       return ix86_expand_unop_builtin (CODE_FOR_sse2_movupd, arglist, target, 1);
13687
13688     case IX86_BUILTIN_STOREAPD:
13689       return ix86_expand_store_builtin (CODE_FOR_sse2_movapd, arglist);
13690     case IX86_BUILTIN_STOREUPD:
13691       return ix86_expand_store_builtin (CODE_FOR_sse2_movupd, arglist);
13692
13693     case IX86_BUILTIN_LOADSD:
13694       return ix86_expand_unop_builtin (CODE_FOR_sse2_loadsd, arglist, target, 1);
13695
13696     case IX86_BUILTIN_STORESD:
13697       return ix86_expand_store_builtin (CODE_FOR_sse2_storesd, arglist);
13698
13699     case IX86_BUILTIN_SETPD1:
13700       target = assign_386_stack_local (DFmode, 0);
13701       arg0 = TREE_VALUE (arglist);
13702       emit_move_insn (adjust_address (target, DFmode, 0),
13703                       expand_expr (arg0, NULL_RTX, VOIDmode, 0));
13704       op0 = gen_reg_rtx (V2DFmode);
13705       emit_insn (gen_sse2_loadsd (op0, adjust_address (target, V2DFmode, 0)));
13706       emit_insn (gen_sse2_shufpd (op0, op0, op0, const0_rtx));
13707       return op0;
13708
13709     case IX86_BUILTIN_SETPD:
13710       target = assign_386_stack_local (V2DFmode, 0);
13711       arg0 = TREE_VALUE (arglist);
13712       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13713       emit_move_insn (adjust_address (target, DFmode, 0),
13714                       expand_expr (arg0, NULL_RTX, VOIDmode, 0));
13715       emit_move_insn (adjust_address (target, DFmode, 8),
13716                       expand_expr (arg1, NULL_RTX, VOIDmode, 0));
13717       op0 = gen_reg_rtx (V2DFmode);
13718       emit_insn (gen_sse2_movapd (op0, target));
13719       return op0;
13720
13721     case IX86_BUILTIN_LOADRPD:
13722       target = ix86_expand_unop_builtin (CODE_FOR_sse2_movapd, arglist,
13723                                          gen_reg_rtx (V2DFmode), 1);
13724       emit_insn (gen_sse2_shufpd (target, target, target, const1_rtx));
13725       return target;
13726
13727     case IX86_BUILTIN_LOADPD1:
13728       target = ix86_expand_unop_builtin (CODE_FOR_sse2_loadsd, arglist,
13729                                          gen_reg_rtx (V2DFmode), 1);
13730       emit_insn (gen_sse2_shufpd (target, target, target, const0_rtx));
13731       return target;
13732
13733     case IX86_BUILTIN_STOREPD1:
13734       return ix86_expand_store_builtin (CODE_FOR_sse2_movapd, arglist);
13735     case IX86_BUILTIN_STORERPD:
13736       return ix86_expand_store_builtin (CODE_FOR_sse2_movapd, arglist);
13737
13738     case IX86_BUILTIN_CLRPD:
13739       target = gen_reg_rtx (V2DFmode);
13740       emit_insn (gen_sse_clrv2df (target));
13741       return target;
13742
13743     case IX86_BUILTIN_MFENCE:
13744         emit_insn (gen_sse2_mfence ());
13745         return 0;
13746     case IX86_BUILTIN_LFENCE:
13747         emit_insn (gen_sse2_lfence ());
13748         return 0;
13749
13750     case IX86_BUILTIN_CLFLUSH:
13751         arg0 = TREE_VALUE (arglist);
13752         op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13753         icode = CODE_FOR_sse2_clflush;
13754         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
13755             op0 = copy_to_mode_reg (Pmode, op0);
13756
13757         emit_insn (gen_sse2_clflush (op0));
13758         return 0;
13759
13760     case IX86_BUILTIN_MOVNTPD:
13761       return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2df, arglist);
13762     case IX86_BUILTIN_MOVNTDQ:
13763       return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2di, arglist);
13764     case IX86_BUILTIN_MOVNTI:
13765       return ix86_expand_store_builtin (CODE_FOR_sse2_movntsi, arglist);
13766
13767     case IX86_BUILTIN_LOADDQA:
13768       return ix86_expand_unop_builtin (CODE_FOR_sse2_movdqa, arglist, target, 1);
13769     case IX86_BUILTIN_LOADDQU:
13770       return ix86_expand_unop_builtin (CODE_FOR_sse2_movdqu, arglist, target, 1);
13771     case IX86_BUILTIN_LOADD:
13772       return ix86_expand_unop_builtin (CODE_FOR_sse2_loadd, arglist, target, 1);
13773
13774     case IX86_BUILTIN_STOREDQA:
13775       return ix86_expand_store_builtin (CODE_FOR_sse2_movdqa, arglist);
13776     case IX86_BUILTIN_STOREDQU:
13777       return ix86_expand_store_builtin (CODE_FOR_sse2_movdqu, arglist);
13778     case IX86_BUILTIN_STORED:
13779       return ix86_expand_store_builtin (CODE_FOR_sse2_stored, arglist);
13780
13781     case IX86_BUILTIN_MONITOR:
13782       arg0 = TREE_VALUE (arglist);
13783       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13784       arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
13785       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13786       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13787       op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
13788       if (!REG_P (op0))
13789         op0 = copy_to_mode_reg (SImode, op0);
13790       if (!REG_P (op1))
13791         op1 = copy_to_mode_reg (SImode, op1);
13792       if (!REG_P (op2))
13793         op2 = copy_to_mode_reg (SImode, op2);
13794       emit_insn (gen_monitor (op0, op1, op2));
13795       return 0;
13796
13797     case IX86_BUILTIN_MWAIT:
13798       arg0 = TREE_VALUE (arglist);
13799       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13800       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13801       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13802       if (!REG_P (op0))
13803         op0 = copy_to_mode_reg (SImode, op0);
13804       if (!REG_P (op1))
13805         op1 = copy_to_mode_reg (SImode, op1);
13806       emit_insn (gen_mwait (op0, op1));
13807       return 0;
13808
13809     case IX86_BUILTIN_LOADDDUP:
13810       return ix86_expand_unop_builtin (CODE_FOR_loadddup, arglist, target, 1);
13811
13812     case IX86_BUILTIN_LDDQU:
13813       return ix86_expand_unop_builtin (CODE_FOR_lddqu, arglist, target,
13814                                        1);
13815
13816     default:
13817       break;
13818     }
13819
13820   for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
13821     if (d->code == fcode)
13822       {
13823         /* Compares are treated specially.  */
13824         if (d->icode == CODE_FOR_maskcmpv4sf3
13825             || d->icode == CODE_FOR_vmmaskcmpv4sf3
13826             || d->icode == CODE_FOR_maskncmpv4sf3
13827             || d->icode == CODE_FOR_vmmaskncmpv4sf3
13828             || d->icode == CODE_FOR_maskcmpv2df3
13829             || d->icode == CODE_FOR_vmmaskcmpv2df3
13830             || d->icode == CODE_FOR_maskncmpv2df3
13831             || d->icode == CODE_FOR_vmmaskncmpv2df3)
13832           return ix86_expand_sse_compare (d, arglist, target);
13833
13834         return ix86_expand_binop_builtin (d->icode, arglist, target);
13835       }
13836
13837   for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
13838     if (d->code == fcode)
13839       return ix86_expand_unop_builtin (d->icode, arglist, target, 0);
13840
13841   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
13842     if (d->code == fcode)
13843       return ix86_expand_sse_comi (d, arglist, target);
13844
13845   /* @@@ Should really do something sensible here.  */
13846   return 0;
13847 }
13848
13849 /* Store OPERAND to the memory after reload is completed.  This means
13850    that we can't easily use assign_stack_local.  */
13851 rtx
13852 ix86_force_to_memory (enum machine_mode mode, rtx operand)
13853 {
13854   rtx result;
13855   if (!reload_completed)
13856     abort ();
13857   if (TARGET_RED_ZONE)
13858     {
13859       result = gen_rtx_MEM (mode,
13860                             gen_rtx_PLUS (Pmode,
13861                                           stack_pointer_rtx,
13862                                           GEN_INT (-RED_ZONE_SIZE)));
13863       emit_move_insn (result, operand);
13864     }
13865   else if (!TARGET_RED_ZONE && TARGET_64BIT)
13866     {
13867       switch (mode)
13868         {
13869         case HImode:
13870         case SImode:
13871           operand = gen_lowpart (DImode, operand);
13872           /* FALLTHRU */
13873         case DImode:
13874           emit_insn (
13875                       gen_rtx_SET (VOIDmode,
13876                                    gen_rtx_MEM (DImode,
13877                                                 gen_rtx_PRE_DEC (DImode,
13878                                                         stack_pointer_rtx)),
13879                                    operand));
13880           break;
13881         default:
13882           abort ();
13883         }
13884       result = gen_rtx_MEM (mode, stack_pointer_rtx);
13885     }
13886   else
13887     {
13888       switch (mode)
13889         {
13890         case DImode:
13891           {
13892             rtx operands[2];
13893             split_di (&operand, 1, operands, operands + 1);
13894             emit_insn (
13895                         gen_rtx_SET (VOIDmode,
13896                                      gen_rtx_MEM (SImode,
13897                                                   gen_rtx_PRE_DEC (Pmode,
13898                                                         stack_pointer_rtx)),
13899                                      operands[1]));
13900             emit_insn (
13901                         gen_rtx_SET (VOIDmode,
13902                                      gen_rtx_MEM (SImode,
13903                                                   gen_rtx_PRE_DEC (Pmode,
13904                                                         stack_pointer_rtx)),
13905                                      operands[0]));
13906           }
13907           break;
13908         case HImode:
13909           /* It is better to store HImodes as SImodes.  */
13910           if (!TARGET_PARTIAL_REG_STALL)
13911             operand = gen_lowpart (SImode, operand);
13912           /* FALLTHRU */
13913         case SImode:
13914           emit_insn (
13915                       gen_rtx_SET (VOIDmode,
13916                                    gen_rtx_MEM (GET_MODE (operand),
13917                                                 gen_rtx_PRE_DEC (SImode,
13918                                                         stack_pointer_rtx)),
13919                                    operand));
13920           break;
13921         default:
13922           abort ();
13923         }
13924       result = gen_rtx_MEM (mode, stack_pointer_rtx);
13925     }
13926   return result;
13927 }
13928
13929 /* Free operand from the memory.  */
13930 void
13931 ix86_free_from_memory (enum machine_mode mode)
13932 {
13933   if (!TARGET_RED_ZONE)
13934     {
13935       int size;
13936
13937       if (mode == DImode || TARGET_64BIT)
13938         size = 8;
13939       else if (mode == HImode && TARGET_PARTIAL_REG_STALL)
13940         size = 2;
13941       else
13942         size = 4;
13943       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
13944          to pop or add instruction if registers are available.  */
13945       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
13946                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
13947                                             GEN_INT (size))));
13948     }
13949 }
13950
13951 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
13952    QImode must go into class Q_REGS.
13953    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
13954    movdf to do mem-to-mem moves through integer regs.  */
13955 enum reg_class
13956 ix86_preferred_reload_class (rtx x, enum reg_class class)
13957 {
13958   if (GET_CODE (x) == CONST_VECTOR && x != CONST0_RTX (GET_MODE (x)))
13959     return NO_REGS;
13960   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
13961     {
13962       /* SSE can't load any constant directly yet.  */
13963       if (SSE_CLASS_P (class))
13964         return NO_REGS;
13965       /* Floats can load 0 and 1.  */
13966       if (MAYBE_FLOAT_CLASS_P (class) && standard_80387_constant_p (x))
13967         {
13968           /* Limit class to non-SSE.  Use GENERAL_REGS if possible.  */
13969           if (MAYBE_SSE_CLASS_P (class))
13970             return (reg_class_subset_p (class, GENERAL_REGS)
13971                     ? GENERAL_REGS : FLOAT_REGS);
13972           else
13973             return class;
13974         }
13975       /* General regs can load everything.  */
13976       if (reg_class_subset_p (class, GENERAL_REGS))
13977         return GENERAL_REGS;
13978       /* In case we haven't resolved FLOAT or SSE yet, give up.  */
13979       if (MAYBE_FLOAT_CLASS_P (class) || MAYBE_SSE_CLASS_P (class))
13980         return NO_REGS;
13981     }
13982   if (MAYBE_MMX_CLASS_P (class) && CONSTANT_P (x))
13983     return NO_REGS;
13984   if (GET_MODE (x) == QImode && ! reg_class_subset_p (class, Q_REGS))
13985     return Q_REGS;
13986   return class;
13987 }
13988
13989 /* If we are copying between general and FP registers, we need a memory
13990    location. The same is true for SSE and MMX registers.
13991
13992    The macro can't work reliably when one of the CLASSES is class containing
13993    registers from multiple units (SSE, MMX, integer).  We avoid this by never
13994    combining those units in single alternative in the machine description.
13995    Ensure that this constraint holds to avoid unexpected surprises.
13996
13997    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
13998    enforce these sanity checks.  */
13999 int
14000 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
14001                               enum machine_mode mode, int strict)
14002 {
14003   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
14004       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
14005       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
14006       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
14007       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
14008       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
14009     {
14010       if (strict)
14011         abort ();
14012       else
14013         return 1;
14014     }
14015   return (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2)
14016           || ((SSE_CLASS_P (class1) != SSE_CLASS_P (class2)
14017                || MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
14018               && ((mode != SImode && (mode != DImode || !TARGET_64BIT))
14019                   || (!TARGET_INTER_UNIT_MOVES && !optimize_size))));
14020 }
14021 /* Return the cost of moving data from a register in class CLASS1 to
14022    one in class CLASS2.
14023
14024    It is not required that the cost always equal 2 when FROM is the same as TO;
14025    on some machines it is expensive to move between registers if they are not
14026    general registers.  */
14027 int
14028 ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
14029                          enum reg_class class2)
14030 {
14031   /* In case we require secondary memory, compute cost of the store followed
14032      by load.  In order to avoid bad register allocation choices, we need
14033      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
14034
14035   if (ix86_secondary_memory_needed (class1, class2, mode, 0))
14036     {
14037       int cost = 1;
14038
14039       cost += MAX (MEMORY_MOVE_COST (mode, class1, 0),
14040                    MEMORY_MOVE_COST (mode, class1, 1));
14041       cost += MAX (MEMORY_MOVE_COST (mode, class2, 0),
14042                    MEMORY_MOVE_COST (mode, class2, 1));
14043
14044       /* In case of copying from general_purpose_register we may emit multiple
14045          stores followed by single load causing memory size mismatch stall.
14046          Count this as arbitrarily high cost of 20.  */
14047       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
14048         cost += 20;
14049
14050       /* In the case of FP/MMX moves, the registers actually overlap, and we
14051          have to switch modes in order to treat them differently.  */
14052       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
14053           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
14054         cost += 20;
14055
14056       return cost;
14057     }
14058
14059   /* Moves between SSE/MMX and integer unit are expensive.  */
14060   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
14061       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
14062     return ix86_cost->mmxsse_to_integer;
14063   if (MAYBE_FLOAT_CLASS_P (class1))
14064     return ix86_cost->fp_move;
14065   if (MAYBE_SSE_CLASS_P (class1))
14066     return ix86_cost->sse_move;
14067   if (MAYBE_MMX_CLASS_P (class1))
14068     return ix86_cost->mmx_move;
14069   return 2;
14070 }
14071
14072 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
14073 int
14074 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
14075 {
14076   /* Flags and only flags can only hold CCmode values.  */
14077   if (CC_REGNO_P (regno))
14078     return GET_MODE_CLASS (mode) == MODE_CC;
14079   if (GET_MODE_CLASS (mode) == MODE_CC
14080       || GET_MODE_CLASS (mode) == MODE_RANDOM
14081       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
14082     return 0;
14083   if (FP_REGNO_P (regno))
14084     return VALID_FP_MODE_P (mode);
14085   if (SSE_REGNO_P (regno))
14086     {
14087       /* We implement the move patterns for all vector modes into and
14088          out of SSE registers, even when no operation instructions
14089          are available.  */
14090       return (VALID_SSE_REG_MODE (mode)
14091               || VALID_SSE2_REG_MODE (mode)
14092               || VALID_MMX_REG_MODE (mode)
14093               || VALID_MMX_REG_MODE_3DNOW (mode));
14094     }
14095   if (MMX_REGNO_P (regno))
14096     {
14097       /* We implement the move patterns for 3DNOW modes even in MMX mode,
14098          so if the register is available at all, then we can move data of
14099          the given mode into or out of it.  */
14100       return (VALID_MMX_REG_MODE (mode)
14101               || VALID_MMX_REG_MODE_3DNOW (mode));
14102     }
14103   /* We handle both integer and floats in the general purpose registers.
14104      In future we should be able to handle vector modes as well.  */
14105   if (!VALID_INT_MODE_P (mode) && !VALID_FP_MODE_P (mode))
14106     return 0;
14107   /* Take care for QImode values - they can be in non-QI regs, but then
14108      they do cause partial register stalls.  */
14109   if (regno < 4 || mode != QImode || TARGET_64BIT)
14110     return 1;
14111   return reload_in_progress || reload_completed || !TARGET_PARTIAL_REG_STALL;
14112 }
14113
14114 /* Return the cost of moving data of mode M between a
14115    register and memory.  A value of 2 is the default; this cost is
14116    relative to those in `REGISTER_MOVE_COST'.
14117
14118    If moving between registers and memory is more expensive than
14119    between two registers, you should define this macro to express the
14120    relative cost.
14121
14122    Model also increased moving costs of QImode registers in non
14123    Q_REGS classes.
14124  */
14125 int
14126 ix86_memory_move_cost (enum machine_mode mode, enum reg_class class, int in)
14127 {
14128   if (FLOAT_CLASS_P (class))
14129     {
14130       int index;
14131       switch (mode)
14132         {
14133           case SFmode:
14134             index = 0;
14135             break;
14136           case DFmode:
14137             index = 1;
14138             break;
14139           case XFmode:
14140             index = 2;
14141             break;
14142           default:
14143             return 100;
14144         }
14145       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
14146     }
14147   if (SSE_CLASS_P (class))
14148     {
14149       int index;
14150       switch (GET_MODE_SIZE (mode))
14151         {
14152           case 4:
14153             index = 0;
14154             break;
14155           case 8:
14156             index = 1;
14157             break;
14158           case 16:
14159             index = 2;
14160             break;
14161           default:
14162             return 100;
14163         }
14164       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
14165     }
14166   if (MMX_CLASS_P (class))
14167     {
14168       int index;
14169       switch (GET_MODE_SIZE (mode))
14170         {
14171           case 4:
14172             index = 0;
14173             break;
14174           case 8:
14175             index = 1;
14176             break;
14177           default:
14178             return 100;
14179         }
14180       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
14181     }
14182   switch (GET_MODE_SIZE (mode))
14183     {
14184       case 1:
14185         if (in)
14186           return (Q_CLASS_P (class) ? ix86_cost->int_load[0]
14187                   : ix86_cost->movzbl_load);
14188         else
14189           return (Q_CLASS_P (class) ? ix86_cost->int_store[0]
14190                   : ix86_cost->int_store[0] + 4);
14191         break;
14192       case 2:
14193         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
14194       default:
14195         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
14196         if (mode == TFmode)
14197           mode = XFmode;
14198         return ((in ? ix86_cost->int_load[2] : ix86_cost->int_store[2])
14199                 * (((int) GET_MODE_SIZE (mode)
14200                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
14201     }
14202 }
14203
14204 /* Compute a (partial) cost for rtx X.  Return true if the complete
14205    cost has been computed, and false if subexpressions should be
14206    scanned.  In either case, *TOTAL contains the cost result.  */
14207
14208 static bool
14209 ix86_rtx_costs (rtx x, int code, int outer_code, int *total)
14210 {
14211   enum machine_mode mode = GET_MODE (x);
14212
14213   switch (code)
14214     {
14215     case CONST_INT:
14216     case CONST:
14217     case LABEL_REF:
14218     case SYMBOL_REF:
14219       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
14220         *total = 3;
14221       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
14222         *total = 2;
14223       else if (flag_pic && SYMBOLIC_CONST (x)
14224                && (!TARGET_64BIT
14225                    || (!GET_CODE (x) != LABEL_REF
14226                        && (GET_CODE (x) != SYMBOL_REF
14227                            || !SYMBOL_REF_LOCAL_P (x)))))
14228         *total = 1;
14229       else
14230         *total = 0;
14231       return true;
14232
14233     case CONST_DOUBLE:
14234       if (mode == VOIDmode)
14235         *total = 0;
14236       else
14237         switch (standard_80387_constant_p (x))
14238           {
14239           case 1: /* 0.0 */
14240             *total = 1;
14241             break;
14242           default: /* Other constants */
14243             *total = 2;
14244             break;
14245           case 0:
14246           case -1:
14247             /* Start with (MEM (SYMBOL_REF)), since that's where
14248                it'll probably end up.  Add a penalty for size.  */
14249             *total = (COSTS_N_INSNS (1)
14250                       + (flag_pic != 0 && !TARGET_64BIT)
14251                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
14252             break;
14253           }
14254       return true;
14255
14256     case ZERO_EXTEND:
14257       /* The zero extensions is often completely free on x86_64, so make
14258          it as cheap as possible.  */
14259       if (TARGET_64BIT && mode == DImode
14260           && GET_MODE (XEXP (x, 0)) == SImode)
14261         *total = 1;
14262       else if (TARGET_ZERO_EXTEND_WITH_AND)
14263         *total = COSTS_N_INSNS (ix86_cost->add);
14264       else
14265         *total = COSTS_N_INSNS (ix86_cost->movzx);
14266       return false;
14267
14268     case SIGN_EXTEND:
14269       *total = COSTS_N_INSNS (ix86_cost->movsx);
14270       return false;
14271
14272     case ASHIFT:
14273       if (GET_CODE (XEXP (x, 1)) == CONST_INT
14274           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
14275         {
14276           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
14277           if (value == 1)
14278             {
14279               *total = COSTS_N_INSNS (ix86_cost->add);
14280               return false;
14281             }
14282           if ((value == 2 || value == 3)
14283               && ix86_cost->lea <= ix86_cost->shift_const)
14284             {
14285               *total = COSTS_N_INSNS (ix86_cost->lea);
14286               return false;
14287             }
14288         }
14289       /* FALLTHRU */
14290
14291     case ROTATE:
14292     case ASHIFTRT:
14293     case LSHIFTRT:
14294     case ROTATERT:
14295       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
14296         {
14297           if (GET_CODE (XEXP (x, 1)) == CONST_INT)
14298             {
14299               if (INTVAL (XEXP (x, 1)) > 32)
14300                 *total = COSTS_N_INSNS(ix86_cost->shift_const + 2);
14301               else
14302                 *total = COSTS_N_INSNS(ix86_cost->shift_const * 2);
14303             }
14304           else
14305             {
14306               if (GET_CODE (XEXP (x, 1)) == AND)
14307                 *total = COSTS_N_INSNS(ix86_cost->shift_var * 2);
14308               else
14309                 *total = COSTS_N_INSNS(ix86_cost->shift_var * 6 + 2);
14310             }
14311         }
14312       else
14313         {
14314           if (GET_CODE (XEXP (x, 1)) == CONST_INT)
14315             *total = COSTS_N_INSNS (ix86_cost->shift_const);
14316           else
14317             *total = COSTS_N_INSNS (ix86_cost->shift_var);
14318         }
14319       return false;
14320
14321     case MULT:
14322       if (FLOAT_MODE_P (mode))
14323         {
14324           *total = COSTS_N_INSNS (ix86_cost->fmul);
14325           return false;
14326         }
14327       else
14328         {
14329           rtx op0 = XEXP (x, 0);
14330           rtx op1 = XEXP (x, 1);
14331           int nbits;
14332           if (GET_CODE (XEXP (x, 1)) == CONST_INT)
14333             {
14334               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
14335               for (nbits = 0; value != 0; value &= value - 1)
14336                 nbits++;
14337             }
14338           else
14339             /* This is arbitrary.  */
14340             nbits = 7;
14341
14342           /* Compute costs correctly for widening multiplication.  */
14343           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op1) == ZERO_EXTEND)
14344               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
14345                  == GET_MODE_SIZE (mode))
14346             {
14347               int is_mulwiden = 0;
14348               enum machine_mode inner_mode = GET_MODE (op0);
14349
14350               if (GET_CODE (op0) == GET_CODE (op1))
14351                 is_mulwiden = 1, op1 = XEXP (op1, 0);
14352               else if (GET_CODE (op1) == CONST_INT)
14353                 {
14354                   if (GET_CODE (op0) == SIGN_EXTEND)
14355                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
14356                                   == INTVAL (op1);
14357                   else
14358                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
14359                 }
14360
14361               if (is_mulwiden)
14362                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
14363             }
14364
14365           *total = COSTS_N_INSNS (ix86_cost->mult_init[MODE_INDEX (mode)]
14366                                   + nbits * ix86_cost->mult_bit)
14367                    + rtx_cost (op0, outer_code) + rtx_cost (op1, outer_code);
14368
14369           return true;
14370         }
14371
14372     case DIV:
14373     case UDIV:
14374     case MOD:
14375     case UMOD:
14376       if (FLOAT_MODE_P (mode))
14377         *total = COSTS_N_INSNS (ix86_cost->fdiv);
14378       else
14379         *total = COSTS_N_INSNS (ix86_cost->divide[MODE_INDEX (mode)]);
14380       return false;
14381
14382     case PLUS:
14383       if (FLOAT_MODE_P (mode))
14384         *total = COSTS_N_INSNS (ix86_cost->fadd);
14385       else if (GET_MODE_CLASS (mode) == MODE_INT
14386                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
14387         {
14388           if (GET_CODE (XEXP (x, 0)) == PLUS
14389               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
14390               && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
14391               && CONSTANT_P (XEXP (x, 1)))
14392             {
14393               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
14394               if (val == 2 || val == 4 || val == 8)
14395                 {
14396                   *total = COSTS_N_INSNS (ix86_cost->lea);
14397                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code);
14398                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
14399                                       outer_code);
14400                   *total += rtx_cost (XEXP (x, 1), outer_code);
14401                   return true;
14402                 }
14403             }
14404           else if (GET_CODE (XEXP (x, 0)) == MULT
14405                    && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
14406             {
14407               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
14408               if (val == 2 || val == 4 || val == 8)
14409                 {
14410                   *total = COSTS_N_INSNS (ix86_cost->lea);
14411                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code);
14412                   *total += rtx_cost (XEXP (x, 1), outer_code);
14413                   return true;
14414                 }
14415             }
14416           else if (GET_CODE (XEXP (x, 0)) == PLUS)
14417             {
14418               *total = COSTS_N_INSNS (ix86_cost->lea);
14419               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code);
14420               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code);
14421               *total += rtx_cost (XEXP (x, 1), outer_code);
14422               return true;
14423             }
14424         }
14425       /* FALLTHRU */
14426
14427     case MINUS:
14428       if (FLOAT_MODE_P (mode))
14429         {
14430           *total = COSTS_N_INSNS (ix86_cost->fadd);
14431           return false;
14432         }
14433       /* FALLTHRU */
14434
14435     case AND:
14436     case IOR:
14437     case XOR:
14438       if (!TARGET_64BIT && mode == DImode)
14439         {
14440           *total = (COSTS_N_INSNS (ix86_cost->add) * 2
14441                     + (rtx_cost (XEXP (x, 0), outer_code)
14442                        << (GET_MODE (XEXP (x, 0)) != DImode))
14443                     + (rtx_cost (XEXP (x, 1), outer_code)
14444                        << (GET_MODE (XEXP (x, 1)) != DImode)));
14445           return true;
14446         }
14447       /* FALLTHRU */
14448
14449     case NEG:
14450       if (FLOAT_MODE_P (mode))
14451         {
14452           *total = COSTS_N_INSNS (ix86_cost->fchs);
14453           return false;
14454         }
14455       /* FALLTHRU */
14456
14457     case NOT:
14458       if (!TARGET_64BIT && mode == DImode)
14459         *total = COSTS_N_INSNS (ix86_cost->add * 2);
14460       else
14461         *total = COSTS_N_INSNS (ix86_cost->add);
14462       return false;
14463
14464     case COMPARE:
14465       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
14466           && XEXP (XEXP (x, 0), 1) == const1_rtx
14467           && GET_CODE (XEXP (XEXP (x, 0), 2)) == CONST_INT
14468           && XEXP (x, 1) == const0_rtx)
14469         {
14470           /* This kind of construct is implemented using test[bwl].
14471              Treat it as if we had an AND.  */
14472           *total = (COSTS_N_INSNS (ix86_cost->add)
14473                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code)
14474                     + rtx_cost (const1_rtx, outer_code));
14475           return true;
14476         }
14477       return false;
14478
14479     case FLOAT_EXTEND:
14480       if (!TARGET_SSE_MATH
14481           || mode == XFmode
14482           || (mode == DFmode && !TARGET_SSE2))
14483         *total = 0;
14484       return false;
14485
14486     case ABS:
14487       if (FLOAT_MODE_P (mode))
14488         *total = COSTS_N_INSNS (ix86_cost->fabs);
14489       return false;
14490
14491     case SQRT:
14492       if (FLOAT_MODE_P (mode))
14493         *total = COSTS_N_INSNS (ix86_cost->fsqrt);
14494       return false;
14495
14496     case UNSPEC:
14497       if (XINT (x, 1) == UNSPEC_TP)
14498         *total = 0;
14499       return false;
14500
14501     default:
14502       return false;
14503     }
14504 }
14505
14506 #if TARGET_MACHO
14507
14508 static int current_machopic_label_num;
14509
14510 /* Given a symbol name and its associated stub, write out the
14511    definition of the stub.  */
14512
14513 void
14514 machopic_output_stub (FILE *file, const char *symb, const char *stub)
14515 {
14516   unsigned int length;
14517   char *binder_name, *symbol_name, lazy_ptr_name[32];
14518   int label = ++current_machopic_label_num;
14519
14520   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
14521   symb = (*targetm.strip_name_encoding) (symb);
14522
14523   length = strlen (stub);
14524   binder_name = alloca (length + 32);
14525   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
14526
14527   length = strlen (symb);
14528   symbol_name = alloca (length + 32);
14529   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
14530
14531   sprintf (lazy_ptr_name, "L%d$lz", label);
14532
14533   if (MACHOPIC_PURE)
14534     machopic_picsymbol_stub_section ();
14535   else
14536     machopic_symbol_stub_section ();
14537
14538   fprintf (file, "%s:\n", stub);
14539   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
14540
14541   if (MACHOPIC_PURE)
14542     {
14543       fprintf (file, "\tcall LPC$%d\nLPC$%d:\tpopl %%eax\n", label, label);
14544       fprintf (file, "\tmovl %s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
14545       fprintf (file, "\tjmp %%edx\n");
14546     }
14547   else
14548     fprintf (file, "\tjmp *%s\n", lazy_ptr_name);
14549
14550   fprintf (file, "%s:\n", binder_name);
14551
14552   if (MACHOPIC_PURE)
14553     {
14554       fprintf (file, "\tlea %s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
14555       fprintf (file, "\tpushl %%eax\n");
14556     }
14557   else
14558     fprintf (file, "\t pushl $%s\n", lazy_ptr_name);
14559
14560   fprintf (file, "\tjmp dyld_stub_binding_helper\n");
14561
14562   machopic_lazy_symbol_ptr_section ();
14563   fprintf (file, "%s:\n", lazy_ptr_name);
14564   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
14565   fprintf (file, "\t.long %s\n", binder_name);
14566 }
14567 #endif /* TARGET_MACHO */
14568
14569 /* Order the registers for register allocator.  */
14570
14571 void
14572 x86_order_regs_for_local_alloc (void)
14573 {
14574    int pos = 0;
14575    int i;
14576
14577    /* First allocate the local general purpose registers.  */
14578    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
14579      if (GENERAL_REGNO_P (i) && call_used_regs[i])
14580         reg_alloc_order [pos++] = i;
14581
14582    /* Global general purpose registers.  */
14583    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
14584      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
14585         reg_alloc_order [pos++] = i;
14586
14587    /* x87 registers come first in case we are doing FP math
14588       using them.  */
14589    if (!TARGET_SSE_MATH)
14590      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
14591        reg_alloc_order [pos++] = i;
14592
14593    /* SSE registers.  */
14594    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
14595      reg_alloc_order [pos++] = i;
14596    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
14597      reg_alloc_order [pos++] = i;
14598
14599    /* x87 registers.  */
14600    if (TARGET_SSE_MATH)
14601      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
14602        reg_alloc_order [pos++] = i;
14603
14604    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
14605      reg_alloc_order [pos++] = i;
14606
14607    /* Initialize the rest of array as we do not allocate some registers
14608       at all.  */
14609    while (pos < FIRST_PSEUDO_REGISTER)
14610      reg_alloc_order [pos++] = 0;
14611 }
14612
14613 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
14614 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
14615 #endif
14616
14617 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
14618    struct attribute_spec.handler.  */
14619 static tree
14620 ix86_handle_struct_attribute (tree *node, tree name,
14621                               tree args ATTRIBUTE_UNUSED,
14622                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
14623 {
14624   tree *type = NULL;
14625   if (DECL_P (*node))
14626     {
14627       if (TREE_CODE (*node) == TYPE_DECL)
14628         type = &TREE_TYPE (*node);
14629     }
14630   else
14631     type = node;
14632
14633   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
14634                  || TREE_CODE (*type) == UNION_TYPE)))
14635     {
14636       warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
14637       *no_add_attrs = true;
14638     }
14639
14640   else if ((is_attribute_p ("ms_struct", name)
14641             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
14642            || ((is_attribute_p ("gcc_struct", name)
14643                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
14644     {
14645       warning ("%qs incompatible attribute ignored",
14646                IDENTIFIER_POINTER (name));
14647       *no_add_attrs = true;
14648     }
14649
14650   return NULL_TREE;
14651 }
14652
14653 static bool
14654 ix86_ms_bitfield_layout_p (tree record_type)
14655 {
14656   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
14657           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
14658     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
14659 }
14660
14661 /* Returns an expression indicating where the this parameter is
14662    located on entry to the FUNCTION.  */
14663
14664 static rtx
14665 x86_this_parameter (tree function)
14666 {
14667   tree type = TREE_TYPE (function);
14668
14669   if (TARGET_64BIT)
14670     {
14671       int n = aggregate_value_p (TREE_TYPE (type), type) != 0;
14672       return gen_rtx_REG (DImode, x86_64_int_parameter_registers[n]);
14673     }
14674
14675   if (ix86_function_regparm (type, function) > 0)
14676     {
14677       tree parm;
14678
14679       parm = TYPE_ARG_TYPES (type);
14680       /* Figure out whether or not the function has a variable number of
14681          arguments.  */
14682       for (; parm; parm = TREE_CHAIN (parm))
14683         if (TREE_VALUE (parm) == void_type_node)
14684           break;
14685       /* If not, the this parameter is in the first argument.  */
14686       if (parm)
14687         {
14688           int regno = 0;
14689           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
14690             regno = 2;
14691           return gen_rtx_REG (SImode, regno);
14692         }
14693     }
14694
14695   if (aggregate_value_p (TREE_TYPE (type), type))
14696     return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 8));
14697   else
14698     return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 4));
14699 }
14700
14701 /* Determine whether x86_output_mi_thunk can succeed.  */
14702
14703 static bool
14704 x86_can_output_mi_thunk (tree thunk ATTRIBUTE_UNUSED,
14705                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
14706                          HOST_WIDE_INT vcall_offset, tree function)
14707 {
14708   /* 64-bit can handle anything.  */
14709   if (TARGET_64BIT)
14710     return true;
14711
14712   /* For 32-bit, everything's fine if we have one free register.  */
14713   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
14714     return true;
14715
14716   /* Need a free register for vcall_offset.  */
14717   if (vcall_offset)
14718     return false;
14719
14720   /* Need a free register for GOT references.  */
14721   if (flag_pic && !(*targetm.binds_local_p) (function))
14722     return false;
14723
14724   /* Otherwise ok.  */
14725   return true;
14726 }
14727
14728 /* Output the assembler code for a thunk function.  THUNK_DECL is the
14729    declaration for the thunk function itself, FUNCTION is the decl for
14730    the target function.  DELTA is an immediate constant offset to be
14731    added to THIS.  If VCALL_OFFSET is nonzero, the word at
14732    *(*this + vcall_offset) should be added to THIS.  */
14733
14734 static void
14735 x86_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
14736                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
14737                      HOST_WIDE_INT vcall_offset, tree function)
14738 {
14739   rtx xops[3];
14740   rtx this = x86_this_parameter (function);
14741   rtx this_reg, tmp;
14742
14743   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
14744      pull it in now and let DELTA benefit.  */
14745   if (REG_P (this))
14746     this_reg = this;
14747   else if (vcall_offset)
14748     {
14749       /* Put the this parameter into %eax.  */
14750       xops[0] = this;
14751       xops[1] = this_reg = gen_rtx_REG (Pmode, 0);
14752       output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
14753     }
14754   else
14755     this_reg = NULL_RTX;
14756
14757   /* Adjust the this parameter by a fixed constant.  */
14758   if (delta)
14759     {
14760       xops[0] = GEN_INT (delta);
14761       xops[1] = this_reg ? this_reg : this;
14762       if (TARGET_64BIT)
14763         {
14764           if (!x86_64_general_operand (xops[0], DImode))
14765             {
14766               tmp = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 2 /* R10 */);
14767               xops[1] = tmp;
14768               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
14769               xops[0] = tmp;
14770               xops[1] = this;
14771             }
14772           output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
14773         }
14774       else
14775         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
14776     }
14777
14778   /* Adjust the this parameter by a value stored in the vtable.  */
14779   if (vcall_offset)
14780     {
14781       if (TARGET_64BIT)
14782         tmp = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 2 /* R10 */);
14783       else
14784         {
14785           int tmp_regno = 2 /* ECX */;
14786           if (lookup_attribute ("fastcall",
14787               TYPE_ATTRIBUTES (TREE_TYPE (function))))
14788             tmp_regno = 0 /* EAX */;
14789           tmp = gen_rtx_REG (SImode, tmp_regno);
14790         }
14791
14792       xops[0] = gen_rtx_MEM (Pmode, this_reg);
14793       xops[1] = tmp;
14794       if (TARGET_64BIT)
14795         output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
14796       else
14797         output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
14798
14799       /* Adjust the this parameter.  */
14800       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
14801       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
14802         {
14803           rtx tmp2 = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 3 /* R11 */);
14804           xops[0] = GEN_INT (vcall_offset);
14805           xops[1] = tmp2;
14806           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
14807           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
14808         }
14809       xops[1] = this_reg;
14810       if (TARGET_64BIT)
14811         output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
14812       else
14813         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
14814     }
14815
14816   /* If necessary, drop THIS back to its stack slot.  */
14817   if (this_reg && this_reg != this)
14818     {
14819       xops[0] = this_reg;
14820       xops[1] = this;
14821       output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
14822     }
14823
14824   xops[0] = XEXP (DECL_RTL (function), 0);
14825   if (TARGET_64BIT)
14826     {
14827       if (!flag_pic || (*targetm.binds_local_p) (function))
14828         output_asm_insn ("jmp\t%P0", xops);
14829       else
14830         {
14831           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
14832           tmp = gen_rtx_CONST (Pmode, tmp);
14833           tmp = gen_rtx_MEM (QImode, tmp);
14834           xops[0] = tmp;
14835           output_asm_insn ("jmp\t%A0", xops);
14836         }
14837     }
14838   else
14839     {
14840       if (!flag_pic || (*targetm.binds_local_p) (function))
14841         output_asm_insn ("jmp\t%P0", xops);
14842       else
14843 #if TARGET_MACHO
14844         if (TARGET_MACHO)
14845           {
14846             rtx sym_ref = XEXP (DECL_RTL (function), 0);
14847             tmp = (gen_rtx_SYMBOL_REF
14848                    (Pmode,
14849                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
14850             tmp = gen_rtx_MEM (QImode, tmp);
14851             xops[0] = tmp;
14852             output_asm_insn ("jmp\t%0", xops);
14853           }
14854         else
14855 #endif /* TARGET_MACHO */
14856         {
14857           tmp = gen_rtx_REG (SImode, 2 /* ECX */);
14858           output_set_got (tmp);
14859
14860           xops[1] = tmp;
14861           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
14862           output_asm_insn ("jmp\t{*}%1", xops);
14863         }
14864     }
14865 }
14866
14867 static void
14868 x86_file_start (void)
14869 {
14870   default_file_start ();
14871   if (X86_FILE_START_VERSION_DIRECTIVE)
14872     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
14873   if (X86_FILE_START_FLTUSED)
14874     fputs ("\t.global\t__fltused\n", asm_out_file);
14875   if (ix86_asm_dialect == ASM_INTEL)
14876     fputs ("\t.intel_syntax\n", asm_out_file);
14877 }
14878
14879 int
14880 x86_field_alignment (tree field, int computed)
14881 {
14882   enum machine_mode mode;
14883   tree type = TREE_TYPE (field);
14884
14885   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
14886     return computed;
14887   mode = TYPE_MODE (TREE_CODE (type) == ARRAY_TYPE
14888                     ? get_inner_array_type (type) : type);
14889   if (mode == DFmode || mode == DCmode
14890       || GET_MODE_CLASS (mode) == MODE_INT
14891       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
14892     return MIN (32, computed);
14893   return computed;
14894 }
14895
14896 /* Output assembler code to FILE to increment profiler label # LABELNO
14897    for profiling a function entry.  */
14898 void
14899 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
14900 {
14901   if (TARGET_64BIT)
14902     if (flag_pic)
14903       {
14904 #ifndef NO_PROFILE_COUNTERS
14905         fprintf (file, "\tleaq\t%sP%d@(%%rip),%%r11\n", LPREFIX, labelno);
14906 #endif
14907         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", MCOUNT_NAME);
14908       }
14909     else
14910       {
14911 #ifndef NO_PROFILE_COUNTERS
14912         fprintf (file, "\tmovq\t$%sP%d,%%r11\n", LPREFIX, labelno);
14913 #endif
14914         fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
14915       }
14916   else if (flag_pic)
14917     {
14918 #ifndef NO_PROFILE_COUNTERS
14919       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%%s\n",
14920                LPREFIX, labelno, PROFILE_COUNT_REGISTER);
14921 #endif
14922       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", MCOUNT_NAME);
14923     }
14924   else
14925     {
14926 #ifndef NO_PROFILE_COUNTERS
14927       fprintf (file, "\tmovl\t$%sP%d,%%%s\n", LPREFIX, labelno,
14928                PROFILE_COUNT_REGISTER);
14929 #endif
14930       fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
14931     }
14932 }
14933
14934 /* We don't have exact information about the insn sizes, but we may assume
14935    quite safely that we are informed about all 1 byte insns and memory
14936    address sizes.  This is enough to eliminate unnecessary padding in
14937    99% of cases.  */
14938
14939 static int
14940 min_insn_size (rtx insn)
14941 {
14942   int l = 0;
14943
14944   if (!INSN_P (insn) || !active_insn_p (insn))
14945     return 0;
14946
14947   /* Discard alignments we've emit and jump instructions.  */
14948   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
14949       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
14950     return 0;
14951   if (GET_CODE (insn) == JUMP_INSN
14952       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
14953           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
14954     return 0;
14955
14956   /* Important case - calls are always 5 bytes.
14957      It is common to have many calls in the row.  */
14958   if (GET_CODE (insn) == CALL_INSN
14959       && symbolic_reference_mentioned_p (PATTERN (insn))
14960       && !SIBLING_CALL_P (insn))
14961     return 5;
14962   if (get_attr_length (insn) <= 1)
14963     return 1;
14964
14965   /* For normal instructions we may rely on the sizes of addresses
14966      and the presence of symbol to require 4 bytes of encoding.
14967      This is not the case for jumps where references are PC relative.  */
14968   if (GET_CODE (insn) != JUMP_INSN)
14969     {
14970       l = get_attr_length_address (insn);
14971       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
14972         l = 4;
14973     }
14974   if (l)
14975     return 1+l;
14976   else
14977     return 2;
14978 }
14979
14980 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
14981    window.  */
14982
14983 static void
14984 ix86_avoid_jump_misspredicts (void)
14985 {
14986   rtx insn, start = get_insns ();
14987   int nbytes = 0, njumps = 0;
14988   int isjump = 0;
14989
14990   /* Look for all minimal intervals of instructions containing 4 jumps.
14991      The intervals are bounded by START and INSN.  NBYTES is the total
14992      size of instructions in the interval including INSN and not including
14993      START.  When the NBYTES is smaller than 16 bytes, it is possible
14994      that the end of START and INSN ends up in the same 16byte page.
14995
14996      The smallest offset in the page INSN can start is the case where START
14997      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
14998      We add p2align to 16byte window with maxskip 17 - NBYTES + sizeof (INSN).
14999      */
15000   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
15001     {
15002
15003       nbytes += min_insn_size (insn);
15004       if (dump_file)
15005         fprintf(dump_file, "Insn %i estimated to %i bytes\n",
15006                 INSN_UID (insn), min_insn_size (insn));
15007       if ((GET_CODE (insn) == JUMP_INSN
15008            && GET_CODE (PATTERN (insn)) != ADDR_VEC
15009            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
15010           || GET_CODE (insn) == CALL_INSN)
15011         njumps++;
15012       else
15013         continue;
15014
15015       while (njumps > 3)
15016         {
15017           start = NEXT_INSN (start);
15018           if ((GET_CODE (start) == JUMP_INSN
15019                && GET_CODE (PATTERN (start)) != ADDR_VEC
15020                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
15021               || GET_CODE (start) == CALL_INSN)
15022             njumps--, isjump = 1;
15023           else
15024             isjump = 0;
15025           nbytes -= min_insn_size (start);
15026         }
15027       if (njumps < 0)
15028         abort ();
15029       if (dump_file)
15030         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
15031                 INSN_UID (start), INSN_UID (insn), nbytes);
15032
15033       if (njumps == 3 && isjump && nbytes < 16)
15034         {
15035           int padsize = 15 - nbytes + min_insn_size (insn);
15036
15037           if (dump_file)
15038             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
15039                      INSN_UID (insn), padsize);
15040           emit_insn_before (gen_align (GEN_INT (padsize)), insn);
15041         }
15042     }
15043 }
15044
15045 /* AMD Athlon works faster
15046    when RET is not destination of conditional jump or directly preceded
15047    by other jump instruction.  We avoid the penalty by inserting NOP just
15048    before the RET instructions in such cases.  */
15049 static void
15050 ix86_pad_returns (void)
15051 {
15052   edge e;
15053   edge_iterator ei;
15054
15055   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
15056     {
15057       basic_block bb = e->src;
15058       rtx ret = BB_END (bb);
15059       rtx prev;
15060       bool replace = false;
15061
15062       if (GET_CODE (ret) != JUMP_INSN || GET_CODE (PATTERN (ret)) != RETURN
15063           || !maybe_hot_bb_p (bb))
15064         continue;
15065       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
15066         if (active_insn_p (prev) || GET_CODE (prev) == CODE_LABEL)
15067           break;
15068       if (prev && GET_CODE (prev) == CODE_LABEL)
15069         {
15070           edge e;
15071           edge_iterator ei;
15072
15073           FOR_EACH_EDGE (e, ei, bb->preds)
15074             if (EDGE_FREQUENCY (e) && e->src->index >= 0
15075                 && !(e->flags & EDGE_FALLTHRU))
15076               replace = true;
15077         }
15078       if (!replace)
15079         {
15080           prev = prev_active_insn (ret);
15081           if (prev
15082               && ((GET_CODE (prev) == JUMP_INSN && any_condjump_p (prev))
15083                   || GET_CODE (prev) == CALL_INSN))
15084             replace = true;
15085           /* Empty functions get branch mispredict even when the jump destination
15086              is not visible to us.  */
15087           if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
15088             replace = true;
15089         }
15090       if (replace)
15091         {
15092           emit_insn_before (gen_return_internal_long (), ret);
15093           delete_insn (ret);
15094         }
15095     }
15096 }
15097
15098 /* Implement machine specific optimizations.  We implement padding of returns
15099    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
15100 static void
15101 ix86_reorg (void)
15102 {
15103   if (TARGET_ATHLON_K8 && optimize && !optimize_size)
15104     ix86_pad_returns ();
15105   if (TARGET_FOUR_JUMP_LIMIT && optimize && !optimize_size)
15106     ix86_avoid_jump_misspredicts ();
15107 }
15108
15109 /* Return nonzero when QImode register that must be represented via REX prefix
15110    is used.  */
15111 bool
15112 x86_extended_QIreg_mentioned_p (rtx insn)
15113 {
15114   int i;
15115   extract_insn_cached (insn);
15116   for (i = 0; i < recog_data.n_operands; i++)
15117     if (REG_P (recog_data.operand[i])
15118         && REGNO (recog_data.operand[i]) >= 4)
15119        return true;
15120   return false;
15121 }
15122
15123 /* Return nonzero when P points to register encoded via REX prefix.
15124    Called via for_each_rtx.  */
15125 static int
15126 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
15127 {
15128    unsigned int regno;
15129    if (!REG_P (*p))
15130      return 0;
15131    regno = REGNO (*p);
15132    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
15133 }
15134
15135 /* Return true when INSN mentions register that must be encoded using REX
15136    prefix.  */
15137 bool
15138 x86_extended_reg_mentioned_p (rtx insn)
15139 {
15140   return for_each_rtx (&PATTERN (insn), extended_reg_mentioned_1, NULL);
15141 }
15142
15143 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
15144    optabs would emit if we didn't have TFmode patterns.  */
15145
15146 void
15147 x86_emit_floatuns (rtx operands[2])
15148 {
15149   rtx neglab, donelab, i0, i1, f0, in, out;
15150   enum machine_mode mode, inmode;
15151
15152   inmode = GET_MODE (operands[1]);
15153   if (inmode != SImode
15154       && inmode != DImode)
15155     abort ();
15156
15157   out = operands[0];
15158   in = force_reg (inmode, operands[1]);
15159   mode = GET_MODE (out);
15160   neglab = gen_label_rtx ();
15161   donelab = gen_label_rtx ();
15162   i1 = gen_reg_rtx (Pmode);
15163   f0 = gen_reg_rtx (mode);
15164
15165   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, Pmode, 0, neglab);
15166
15167   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
15168   emit_jump_insn (gen_jump (donelab));
15169   emit_barrier ();
15170
15171   emit_label (neglab);
15172
15173   i0 = expand_simple_binop (Pmode, LSHIFTRT, in, const1_rtx, NULL, 1, OPTAB_DIRECT);
15174   i1 = expand_simple_binop (Pmode, AND, in, const1_rtx, NULL, 1, OPTAB_DIRECT);
15175   i0 = expand_simple_binop (Pmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
15176   expand_float (f0, i0, 0);
15177   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
15178
15179   emit_label (donelab);
15180 }
15181
15182 /* Initialize vector TARGET via VALS.  */
15183 void
15184 ix86_expand_vector_init (rtx target, rtx vals)
15185 {
15186   enum machine_mode mode = GET_MODE (target);
15187   int elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode));
15188   int n_elts = (GET_MODE_SIZE (mode) / elt_size);
15189   int i;
15190
15191   for (i = n_elts - 1; i >= 0; i--)
15192     if (GET_CODE (XVECEXP (vals, 0, i)) != CONST_INT
15193         && GET_CODE (XVECEXP (vals, 0, i)) != CONST_DOUBLE)
15194       break;
15195
15196   /* Few special cases first...
15197      ... constants are best loaded from constant pool.  */
15198   if (i < 0)
15199     {
15200       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
15201       return;
15202     }
15203
15204   /* ... values where only first field is non-constant are best loaded
15205      from the pool and overwritten via move later.  */
15206   if (i == 0)
15207     {
15208       XVECEXP (vals, 0, 0) = CONST0_RTX (GET_MODE_INNER (mode));
15209       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
15210
15211       switch (GET_MODE (target))
15212         {
15213         case V2DFmode:
15214           emit_insn (gen_sse2_loadlpd (target, target, XVECEXP (vals, 0, 0)));
15215           break;
15216
15217         case V4SFmode:
15218           {
15219             /* ??? We can represent this better.  */
15220             rtx op = simplify_gen_subreg (mode, XVECEXP (vals, 0, 0),
15221                                           GET_MODE_INNER (mode), 0);
15222             op = force_reg (mode, op);
15223             emit_insn (gen_sse_movss (target, target, op));
15224           }
15225           break;
15226
15227         default:
15228           break;
15229         }
15230       return;
15231     }
15232
15233   /* And the busy sequence doing rotations.  */
15234   switch (GET_MODE (target))
15235     {
15236       case V2DFmode:
15237         {
15238           rtx vecop0 =
15239             simplify_gen_subreg (V2DFmode, XVECEXP (vals, 0, 0), DFmode, 0);
15240           rtx vecop1 =
15241             simplify_gen_subreg (V2DFmode, XVECEXP (vals, 0, 1), DFmode, 0);
15242
15243           vecop0 = force_reg (V2DFmode, vecop0);
15244           vecop1 = force_reg (V2DFmode, vecop1);
15245           emit_insn (gen_sse2_unpcklpd (target, vecop0, vecop1));
15246         }
15247         break;
15248       case V4SFmode:
15249         {
15250           rtx vecop0 =
15251             simplify_gen_subreg (V4SFmode, XVECEXP (vals, 0, 0), SFmode, 0);
15252           rtx vecop1 =
15253             simplify_gen_subreg (V4SFmode, XVECEXP (vals, 0, 1), SFmode, 0);
15254           rtx vecop2 =
15255             simplify_gen_subreg (V4SFmode, XVECEXP (vals, 0, 2), SFmode, 0);
15256           rtx vecop3 =
15257             simplify_gen_subreg (V4SFmode, XVECEXP (vals, 0, 3), SFmode, 0);
15258           rtx tmp1 = gen_reg_rtx (V4SFmode);
15259           rtx tmp2 = gen_reg_rtx (V4SFmode);
15260
15261           vecop0 = force_reg (V4SFmode, vecop0);
15262           vecop1 = force_reg (V4SFmode, vecop1);
15263           vecop2 = force_reg (V4SFmode, vecop2);
15264           vecop3 = force_reg (V4SFmode, vecop3);
15265           emit_insn (gen_sse_unpcklps (tmp1, vecop1, vecop3));
15266           emit_insn (gen_sse_unpcklps (tmp2, vecop0, vecop2));
15267           emit_insn (gen_sse_unpcklps (target, tmp2, tmp1));
15268         }
15269         break;
15270       default:
15271         abort ();
15272     }
15273 }
15274
15275 /* Implements target hook vector_mode_supported_p.  */
15276 static bool
15277 ix86_vector_mode_supported_p (enum machine_mode mode)
15278 {
15279   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
15280     return true;
15281   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
15282     return true;
15283   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
15284     return true;
15285   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
15286     return true;
15287   return false;
15288 }
15289
15290 /* Worker function for TARGET_MD_ASM_CLOBBERS.
15291
15292    We do this in the new i386 backend to maintain source compatibility
15293    with the old cc0-based compiler.  */
15294
15295 static tree
15296 ix86_md_asm_clobbers (tree clobbers)
15297 {
15298   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
15299                         clobbers);
15300   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
15301                         clobbers);
15302   clobbers = tree_cons (NULL_TREE, build_string (7, "dirflag"),
15303                         clobbers);
15304   return clobbers;
15305 }
15306
15307 /* Worker function for REVERSE_CONDITION.  */
15308
15309 enum rtx_code
15310 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
15311 {
15312   return (mode != CCFPmode && mode != CCFPUmode
15313           ? reverse_condition (code)
15314           : reverse_condition_maybe_unordered (code));
15315 }
15316
15317 /* Output code to perform an x87 FP register move, from OPERANDS[1]
15318    to OPERANDS[0].  */
15319
15320 const char *
15321 output_387_reg_move (rtx insn, rtx *operands)
15322 {
15323   if (REG_P (operands[1])
15324       && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
15325     {
15326       if (REGNO (operands[0]) == FIRST_STACK_REG
15327           && TARGET_USE_FFREEP)
15328         return "ffreep\t%y0";
15329       return "fstp\t%y0";
15330     }
15331   if (STACK_TOP_P (operands[0]))
15332     return "fld%z1\t%y1";
15333   return "fst\t%y0";
15334 }
15335
15336 /* Output code to perform a conditional jump to LABEL, if C2 flag in
15337    FP status register is set.  */
15338
15339 void
15340 ix86_emit_fp_unordered_jump (rtx label)
15341 {
15342   rtx reg = gen_reg_rtx (HImode);
15343   rtx temp;
15344
15345   emit_insn (gen_x86_fnstsw_1 (reg));
15346
15347   if (TARGET_USE_SAHF)
15348     {
15349       emit_insn (gen_x86_sahf_1 (reg));
15350
15351       temp = gen_rtx_REG (CCmode, FLAGS_REG);
15352       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
15353     }
15354   else
15355     {
15356       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
15357
15358       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
15359       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
15360     }
15361
15362   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
15363                               gen_rtx_LABEL_REF (VOIDmode, label),
15364                               pc_rtx);
15365   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
15366   emit_jump_insn (temp);
15367 }
15368
15369 /* Output code to perform a log1p XFmode calculation.  */
15370
15371 void ix86_emit_i387_log1p (rtx op0, rtx op1)
15372 {
15373   rtx label1 = gen_label_rtx ();
15374   rtx label2 = gen_label_rtx ();
15375
15376   rtx tmp = gen_reg_rtx (XFmode);
15377   rtx tmp2 = gen_reg_rtx (XFmode);
15378
15379   emit_insn (gen_absxf2 (tmp, op1));
15380   emit_insn (gen_cmpxf (tmp,
15381     CONST_DOUBLE_FROM_REAL_VALUE (
15382        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
15383        XFmode)));
15384   emit_jump_insn (gen_bge (label1));
15385
15386   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
15387   emit_insn (gen_fyl2xp1_xf3 (op0, tmp2, op1));
15388   emit_jump (label2);
15389
15390   emit_label (label1);
15391   emit_move_insn (tmp, CONST1_RTX (XFmode));
15392   emit_insn (gen_addxf3 (tmp, op1, tmp));
15393   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
15394   emit_insn (gen_fyl2x_xf3 (op0, tmp2, tmp));
15395
15396   emit_label (label2);
15397 }
15398
15399 /* Solaris named-section hook.  Parameters are as for
15400    named_section_real.  */
15401
15402 static void
15403 i386_solaris_elf_named_section (const char *name, unsigned int flags,
15404                                 tree decl)
15405 {
15406   /* With Binutils 2.15, the "@unwind" marker must be specified on
15407      every occurrence of the ".eh_frame" section, not just the first
15408      one.  */
15409   if (TARGET_64BIT
15410       && strcmp (name, ".eh_frame") == 0)
15411     {
15412       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
15413                flags & SECTION_WRITE ? "aw" : "a");
15414       return;
15415     }
15416   default_elf_asm_named_section (name, flags, decl);
15417 }
15418
15419 #include "gt-i386.h"