OSDN Git Service

db361d9791604e2689a494268d6cc9c3c43f9917
[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 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC 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 GNU CC 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 GNU CC; 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-attr.h"
36 #include "flags.h"
37 #include "except.h"
38 #include "function.h"
39 #include "recog.h"
40 #include "expr.h"
41 #include "optabs.h"
42 #include "toplev.h"
43 #include "basic-block.h"
44 #include "ggc.h"
45 #include "target.h"
46 #include "target-def.h"
47 #include "langhooks.h"
48
49 #ifndef CHECK_STACK_LIMIT
50 #define CHECK_STACK_LIMIT (-1)
51 #endif
52
53 /* Processor costs (relative to an add) */
54 static const
55 struct processor_costs size_cost = {    /* costs for tunning for size */
56   2,                                    /* cost of an add instruction */
57   3,                                    /* cost of a lea instruction */
58   2,                                    /* variable shift costs */
59   3,                                    /* constant shift costs */
60   {3, 3, 3, 3, 5},                      /* cost of starting a multiply */
61   0,                                    /* cost of multiply per each bit set */
62   {3, 3, 3, 3, 5},                      /* cost of a divide/mod */
63   3,                                    /* cost of movsx */
64   3,                                    /* cost of movzx */
65   0,                                    /* "large" insn */
66   2,                                    /* MOVE_RATIO */
67   2,                                    /* cost for loading QImode using movzbl */
68   {2, 2, 2},                            /* cost of loading integer registers
69                                            in QImode, HImode and SImode.
70                                            Relative to reg-reg move (2).  */
71   {2, 2, 2},                            /* cost of storing integer registers */
72   2,                                    /* cost of reg,reg fld/fst */
73   {2, 2, 2},                            /* cost of loading fp registers
74                                            in SFmode, DFmode and XFmode */
75   {2, 2, 2},                            /* cost of loading integer registers */
76   3,                                    /* cost of moving MMX register */
77   {3, 3},                               /* cost of loading MMX registers
78                                            in SImode and DImode */
79   {3, 3},                               /* cost of storing MMX registers
80                                            in SImode and DImode */
81   3,                                    /* cost of moving SSE register */
82   {3, 3, 3},                            /* cost of loading SSE registers
83                                            in SImode, DImode and TImode */
84   {3, 3, 3},                            /* cost of storing SSE registers
85                                            in SImode, DImode and TImode */
86   3,                                    /* MMX or SSE register to integer */
87   0,                                    /* size of prefetch block */
88   0,                                    /* number of parallel prefetches */
89   1,                                    /* Branch cost */
90   2,                                    /* cost of FADD and FSUB insns.  */
91   2,                                    /* cost of FMUL instruction.  */
92   2,                                    /* cost of FDIV instruction.  */
93   2,                                    /* cost of FABS instruction.  */
94   2,                                    /* cost of FCHS instruction.  */
95   2,                                    /* cost of FSQRT instruction.  */
96 };
97
98 /* Processor costs (relative to an add) */
99 static const
100 struct processor_costs i386_cost = {    /* 386 specific costs */
101   1,                                    /* cost of an add instruction */
102   1,                                    /* cost of a lea instruction */
103   3,                                    /* variable shift costs */
104   2,                                    /* constant shift costs */
105   {6, 6, 6, 6, 6},                      /* cost of starting a multiply */
106   1,                                    /* cost of multiply per each bit set */
107   {23, 23, 23, 23, 23},                 /* cost of a divide/mod */
108   3,                                    /* cost of movsx */
109   2,                                    /* cost of movzx */
110   15,                                   /* "large" insn */
111   3,                                    /* MOVE_RATIO */
112   4,                                    /* cost for loading QImode using movzbl */
113   {2, 4, 2},                            /* cost of loading integer registers
114                                            in QImode, HImode and SImode.
115                                            Relative to reg-reg move (2).  */
116   {2, 4, 2},                            /* cost of storing integer registers */
117   2,                                    /* cost of reg,reg fld/fst */
118   {8, 8, 8},                            /* cost of loading fp registers
119                                            in SFmode, DFmode and XFmode */
120   {8, 8, 8},                            /* cost of loading integer registers */
121   2,                                    /* cost of moving MMX register */
122   {4, 8},                               /* cost of loading MMX registers
123                                            in SImode and DImode */
124   {4, 8},                               /* cost of storing MMX registers
125                                            in SImode and DImode */
126   2,                                    /* cost of moving SSE register */
127   {4, 8, 16},                           /* cost of loading SSE registers
128                                            in SImode, DImode and TImode */
129   {4, 8, 16},                           /* cost of storing SSE registers
130                                            in SImode, DImode and TImode */
131   3,                                    /* MMX or SSE register to integer */
132   0,                                    /* size of prefetch block */
133   0,                                    /* number of parallel prefetches */
134   1,                                    /* Branch cost */
135   23,                                   /* cost of FADD and FSUB insns.  */
136   27,                                   /* cost of FMUL instruction.  */
137   88,                                   /* cost of FDIV instruction.  */
138   22,                                   /* cost of FABS instruction.  */
139   24,                                   /* cost of FCHS instruction.  */
140   122,                                  /* cost of FSQRT instruction.  */
141 };
142
143 static const
144 struct processor_costs i486_cost = {    /* 486 specific costs */
145   1,                                    /* cost of an add instruction */
146   1,                                    /* cost of a lea instruction */
147   3,                                    /* variable shift costs */
148   2,                                    /* constant shift costs */
149   {12, 12, 12, 12, 12},                 /* cost of starting a multiply */
150   1,                                    /* cost of multiply per each bit set */
151   {40, 40, 40, 40, 40},                 /* cost of a divide/mod */
152   3,                                    /* cost of movsx */
153   2,                                    /* cost of movzx */
154   15,                                   /* "large" insn */
155   3,                                    /* MOVE_RATIO */
156   4,                                    /* cost for loading QImode using movzbl */
157   {2, 4, 2},                            /* cost of loading integer registers
158                                            in QImode, HImode and SImode.
159                                            Relative to reg-reg move (2).  */
160   {2, 4, 2},                            /* cost of storing integer registers */
161   2,                                    /* cost of reg,reg fld/fst */
162   {8, 8, 8},                            /* cost of loading fp registers
163                                            in SFmode, DFmode and XFmode */
164   {8, 8, 8},                            /* cost of loading integer registers */
165   2,                                    /* cost of moving MMX register */
166   {4, 8},                               /* cost of loading MMX registers
167                                            in SImode and DImode */
168   {4, 8},                               /* cost of storing MMX registers
169                                            in SImode and DImode */
170   2,                                    /* cost of moving SSE register */
171   {4, 8, 16},                           /* cost of loading SSE registers
172                                            in SImode, DImode and TImode */
173   {4, 8, 16},                           /* cost of storing SSE registers
174                                            in SImode, DImode and TImode */
175   3,                                    /* MMX or SSE register to integer */
176   0,                                    /* size of prefetch block */
177   0,                                    /* number of parallel prefetches */
178   1,                                    /* Branch cost */
179   8,                                    /* cost of FADD and FSUB insns.  */
180   16,                                   /* cost of FMUL instruction.  */
181   73,                                   /* cost of FDIV instruction.  */
182   3,                                    /* cost of FABS instruction.  */
183   3,                                    /* cost of FCHS instruction.  */
184   83,                                   /* cost of FSQRT instruction.  */
185 };
186
187 static const
188 struct processor_costs pentium_cost = {
189   1,                                    /* cost of an add instruction */
190   1,                                    /* cost of a lea instruction */
191   4,                                    /* variable shift costs */
192   1,                                    /* constant shift costs */
193   {11, 11, 11, 11, 11},                 /* cost of starting a multiply */
194   0,                                    /* cost of multiply per each bit set */
195   {25, 25, 25, 25, 25},                 /* cost of a divide/mod */
196   3,                                    /* cost of movsx */
197   2,                                    /* cost of movzx */
198   8,                                    /* "large" insn */
199   6,                                    /* MOVE_RATIO */
200   6,                                    /* cost for loading QImode using movzbl */
201   {2, 4, 2},                            /* cost of loading integer registers
202                                            in QImode, HImode and SImode.
203                                            Relative to reg-reg move (2).  */
204   {2, 4, 2},                            /* cost of storing integer registers */
205   2,                                    /* cost of reg,reg fld/fst */
206   {2, 2, 6},                            /* cost of loading fp registers
207                                            in SFmode, DFmode and XFmode */
208   {4, 4, 6},                            /* cost of loading integer registers */
209   8,                                    /* cost of moving MMX register */
210   {8, 8},                               /* cost of loading MMX registers
211                                            in SImode and DImode */
212   {8, 8},                               /* cost of storing MMX registers
213                                            in SImode and DImode */
214   2,                                    /* cost of moving SSE register */
215   {4, 8, 16},                           /* cost of loading SSE registers
216                                            in SImode, DImode and TImode */
217   {4, 8, 16},                           /* cost of storing SSE registers
218                                            in SImode, DImode and TImode */
219   3,                                    /* MMX or SSE register to integer */
220   0,                                    /* size of prefetch block */
221   0,                                    /* number of parallel prefetches */
222   2,                                    /* Branch cost */
223   3,                                    /* cost of FADD and FSUB insns.  */
224   3,                                    /* cost of FMUL instruction.  */
225   39,                                   /* cost of FDIV instruction.  */
226   1,                                    /* cost of FABS instruction.  */
227   1,                                    /* cost of FCHS instruction.  */
228   70,                                   /* cost of FSQRT instruction.  */
229 };
230
231 static const
232 struct processor_costs pentiumpro_cost = {
233   1,                                    /* cost of an add instruction */
234   1,                                    /* cost of a lea instruction */
235   1,                                    /* variable shift costs */
236   1,                                    /* constant shift costs */
237   {4, 4, 4, 4, 4},                      /* cost of starting a multiply */
238   0,                                    /* cost of multiply per each bit set */
239   {17, 17, 17, 17, 17},                 /* cost of a divide/mod */
240   1,                                    /* cost of movsx */
241   1,                                    /* cost of movzx */
242   8,                                    /* "large" insn */
243   6,                                    /* MOVE_RATIO */
244   2,                                    /* cost for loading QImode using movzbl */
245   {4, 4, 4},                            /* cost of loading integer registers
246                                            in QImode, HImode and SImode.
247                                            Relative to reg-reg move (2).  */
248   {2, 2, 2},                            /* cost of storing integer registers */
249   2,                                    /* cost of reg,reg fld/fst */
250   {2, 2, 6},                            /* cost of loading fp registers
251                                            in SFmode, DFmode and XFmode */
252   {4, 4, 6},                            /* cost of loading integer registers */
253   2,                                    /* cost of moving MMX register */
254   {2, 2},                               /* cost of loading MMX registers
255                                            in SImode and DImode */
256   {2, 2},                               /* cost of storing MMX registers
257                                            in SImode and DImode */
258   2,                                    /* cost of moving SSE register */
259   {2, 2, 8},                            /* cost of loading SSE registers
260                                            in SImode, DImode and TImode */
261   {2, 2, 8},                            /* cost of storing SSE registers
262                                            in SImode, DImode and TImode */
263   3,                                    /* MMX or SSE register to integer */
264   32,                                   /* size of prefetch block */
265   6,                                    /* number of parallel prefetches */
266   2,                                    /* Branch cost */
267   3,                                    /* cost of FADD and FSUB insns.  */
268   5,                                    /* cost of FMUL instruction.  */
269   56,                                   /* cost of FDIV instruction.  */
270   2,                                    /* cost of FABS instruction.  */
271   2,                                    /* cost of FCHS instruction.  */
272   56,                                   /* cost of FSQRT instruction.  */
273 };
274
275 static const
276 struct processor_costs k6_cost = {
277   1,                                    /* cost of an add instruction */
278   2,                                    /* cost of a lea instruction */
279   1,                                    /* variable shift costs */
280   1,                                    /* constant shift costs */
281   {3, 3, 3, 3, 3},                      /* cost of starting a multiply */
282   0,                                    /* cost of multiply per each bit set */
283   {18, 18, 18, 18, 18},                 /* cost of a divide/mod */
284   2,                                    /* cost of movsx */
285   2,                                    /* cost of movzx */
286   8,                                    /* "large" insn */
287   4,                                    /* MOVE_RATIO */
288   3,                                    /* cost for loading QImode using movzbl */
289   {4, 5, 4},                            /* cost of loading integer registers
290                                            in QImode, HImode and SImode.
291                                            Relative to reg-reg move (2).  */
292   {2, 3, 2},                            /* cost of storing integer registers */
293   4,                                    /* cost of reg,reg fld/fst */
294   {6, 6, 6},                            /* cost of loading fp registers
295                                            in SFmode, DFmode and XFmode */
296   {4, 4, 4},                            /* cost of loading integer registers */
297   2,                                    /* cost of moving MMX register */
298   {2, 2},                               /* cost of loading MMX registers
299                                            in SImode and DImode */
300   {2, 2},                               /* cost of storing MMX registers
301                                            in SImode and DImode */
302   2,                                    /* cost of moving SSE register */
303   {2, 2, 8},                            /* cost of loading SSE registers
304                                            in SImode, DImode and TImode */
305   {2, 2, 8},                            /* cost of storing SSE registers
306                                            in SImode, DImode and TImode */
307   6,                                    /* MMX or SSE register to integer */
308   32,                                   /* size of prefetch block */
309   1,                                    /* number of parallel prefetches */
310   1,                                    /* Branch cost */
311   2,                                    /* cost of FADD and FSUB insns.  */
312   2,                                    /* cost of FMUL instruction.  */
313   56,                                   /* cost of FDIV instruction.  */
314   2,                                    /* cost of FABS instruction.  */
315   2,                                    /* cost of FCHS instruction.  */
316   56,                                   /* cost of FSQRT instruction.  */
317 };
318
319 static const
320 struct processor_costs athlon_cost = {
321   1,                                    /* cost of an add instruction */
322   2,                                    /* cost of a lea instruction */
323   1,                                    /* variable shift costs */
324   1,                                    /* constant shift costs */
325   {5, 5, 5, 5, 5},                      /* cost of starting a multiply */
326   0,                                    /* cost of multiply per each bit set */
327   {18, 26, 42, 74, 74},                 /* cost of a divide/mod */
328   1,                                    /* cost of movsx */
329   1,                                    /* cost of movzx */
330   8,                                    /* "large" insn */
331   9,                                    /* MOVE_RATIO */
332   4,                                    /* cost for loading QImode using movzbl */
333   {3, 4, 3},                            /* cost of loading integer registers
334                                            in QImode, HImode and SImode.
335                                            Relative to reg-reg move (2).  */
336   {3, 4, 3},                            /* cost of storing integer registers */
337   4,                                    /* cost of reg,reg fld/fst */
338   {4, 4, 12},                           /* cost of loading fp registers
339                                            in SFmode, DFmode and XFmode */
340   {6, 6, 8},                            /* cost of loading integer registers */
341   2,                                    /* cost of moving MMX register */
342   {4, 4},                               /* cost of loading MMX registers
343                                            in SImode and DImode */
344   {4, 4},                               /* cost of storing MMX registers
345                                            in SImode and DImode */
346   2,                                    /* cost of moving SSE register */
347   {4, 4, 6},                            /* cost of loading SSE registers
348                                            in SImode, DImode and TImode */
349   {4, 4, 5},                            /* cost of storing SSE registers
350                                            in SImode, DImode and TImode */
351   5,                                    /* MMX or SSE register to integer */
352   64,                                   /* size of prefetch block */
353   6,                                    /* number of parallel prefetches */
354   2,                                    /* Branch cost */
355   4,                                    /* cost of FADD and FSUB insns.  */
356   4,                                    /* cost of FMUL instruction.  */
357   24,                                   /* cost of FDIV instruction.  */
358   2,                                    /* cost of FABS instruction.  */
359   2,                                    /* cost of FCHS instruction.  */
360   35,                                   /* cost of FSQRT instruction.  */
361 };
362
363 static const
364 struct processor_costs k8_cost = {
365   1,                                    /* cost of an add instruction */
366   2,                                    /* cost of a lea instruction */
367   1,                                    /* variable shift costs */
368   1,                                    /* constant shift costs */
369   {3, 4, 3, 4, 5},                      /* cost of starting a multiply */
370   0,                                    /* cost of multiply per each bit set */
371   {18, 26, 42, 74, 74},                 /* cost of a divide/mod */
372   1,                                    /* cost of movsx */
373   1,                                    /* cost of movzx */
374   8,                                    /* "large" insn */
375   9,                                    /* MOVE_RATIO */
376   4,                                    /* cost for loading QImode using movzbl */
377   {3, 4, 3},                            /* cost of loading integer registers
378                                            in QImode, HImode and SImode.
379                                            Relative to reg-reg move (2).  */
380   {3, 4, 3},                            /* cost of storing integer registers */
381   4,                                    /* cost of reg,reg fld/fst */
382   {4, 4, 12},                           /* cost of loading fp registers
383                                            in SFmode, DFmode and XFmode */
384   {6, 6, 8},                            /* cost of loading integer registers */
385   2,                                    /* cost of moving MMX register */
386   {3, 3},                               /* cost of loading MMX registers
387                                            in SImode and DImode */
388   {4, 4},                               /* cost of storing MMX registers
389                                            in SImode and DImode */
390   2,                                    /* cost of moving SSE register */
391   {4, 3, 6},                            /* cost of loading SSE registers
392                                            in SImode, DImode and TImode */
393   {4, 4, 5},                            /* cost of storing SSE registers
394                                            in SImode, DImode and TImode */
395   5,                                    /* MMX or SSE register to integer */
396   64,                                   /* size of prefetch block */
397   6,                                    /* number of parallel prefetches */
398   2,                                    /* Branch cost */
399   4,                                    /* cost of FADD and FSUB insns.  */
400   4,                                    /* cost of FMUL instruction.  */
401   19,                                   /* cost of FDIV instruction.  */
402   2,                                    /* cost of FABS instruction.  */
403   2,                                    /* cost of FCHS instruction.  */
404   35,                                   /* cost of FSQRT instruction.  */
405 };
406
407 static const
408 struct processor_costs pentium4_cost = {
409   1,                                    /* cost of an add instruction */
410   1,                                    /* cost of a lea instruction */
411   4,                                    /* variable shift costs */
412   4,                                    /* constant shift costs */
413   {15, 15, 15, 15, 15},                 /* cost of starting a multiply */
414   0,                                    /* cost of multiply per each bit set */
415   {56, 56, 56, 56, 56},                 /* cost of a divide/mod */
416   1,                                    /* cost of movsx */
417   1,                                    /* cost of movzx */
418   16,                                   /* "large" insn */
419   6,                                    /* MOVE_RATIO */
420   2,                                    /* cost for loading QImode using movzbl */
421   {4, 5, 4},                            /* cost of loading integer registers
422                                            in QImode, HImode and SImode.
423                                            Relative to reg-reg move (2).  */
424   {2, 3, 2},                            /* cost of storing integer registers */
425   2,                                    /* cost of reg,reg fld/fst */
426   {2, 2, 6},                            /* cost of loading fp registers
427                                            in SFmode, DFmode and XFmode */
428   {4, 4, 6},                            /* cost of loading integer registers */
429   2,                                    /* cost of moving MMX register */
430   {2, 2},                               /* cost of loading MMX registers
431                                            in SImode and DImode */
432   {2, 2},                               /* cost of storing MMX registers
433                                            in SImode and DImode */
434   12,                                   /* cost of moving SSE register */
435   {12, 12, 12},                         /* cost of loading SSE registers
436                                            in SImode, DImode and TImode */
437   {2, 2, 8},                            /* cost of storing SSE registers
438                                            in SImode, DImode and TImode */
439   10,                                   /* MMX or SSE register to integer */
440   64,                                   /* size of prefetch block */
441   6,                                    /* number of parallel prefetches */
442   2,                                    /* Branch cost */
443   5,                                    /* cost of FADD and FSUB insns.  */
444   7,                                    /* cost of FMUL instruction.  */
445   43,                                   /* cost of FDIV instruction.  */
446   2,                                    /* cost of FABS instruction.  */
447   2,                                    /* cost of FCHS instruction.  */
448   43,                                   /* cost of FSQRT instruction.  */
449 };
450
451 const struct processor_costs *ix86_cost = &pentium_cost;
452
453 /* Processor feature/optimization bitmasks.  */
454 #define m_386 (1<<PROCESSOR_I386)
455 #define m_486 (1<<PROCESSOR_I486)
456 #define m_PENT (1<<PROCESSOR_PENTIUM)
457 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
458 #define m_K6  (1<<PROCESSOR_K6)
459 #define m_ATHLON  (1<<PROCESSOR_ATHLON)
460 #define m_PENT4  (1<<PROCESSOR_PENTIUM4)
461 #define m_K8  (1<<PROCESSOR_K8)
462 #define m_ATHLON_K8  (m_K8 | m_ATHLON)
463
464 const int x86_use_leave = m_386 | m_K6 | m_ATHLON_K8;
465 const int x86_push_memory = m_386 | m_K6 | m_ATHLON_K8 | m_PENT4;
466 const int x86_zero_extend_with_and = m_486 | m_PENT;
467 const int x86_movx = m_ATHLON_K8 | m_PPRO | m_PENT4 /* m_386 | m_K6 */;
468 const int x86_double_with_add = ~m_386;
469 const int x86_use_bit_test = m_386;
470 const int x86_unroll_strlen = m_486 | m_PENT | m_PPRO | m_ATHLON_K8 | m_K6;
471 const int x86_cmove = m_PPRO | m_ATHLON_K8 | m_PENT4;
472 const int x86_3dnow_a = m_ATHLON_K8;
473 const int x86_deep_branch = m_PPRO | m_K6 | m_ATHLON_K8 | m_PENT4;
474 const int x86_branch_hints = m_PENT4;
475 const int x86_use_sahf = m_PPRO | m_K6 | m_PENT4;
476 const int x86_partial_reg_stall = m_PPRO;
477 const int x86_use_loop = m_K6;
478 const int x86_use_fiop = ~(m_PPRO | m_ATHLON_K8 | m_PENT);
479 const int x86_use_mov0 = m_K6;
480 const int x86_use_cltd = ~(m_PENT | m_K6);
481 const int x86_read_modify_write = ~m_PENT;
482 const int x86_read_modify = ~(m_PENT | m_PPRO);
483 const int x86_split_long_moves = m_PPRO;
484 const int x86_promote_QImode = m_K6 | m_PENT | m_386 | m_486 | m_ATHLON_K8;
485 const int x86_fast_prefix = ~(m_PENT | m_486 | m_386);
486 const int x86_single_stringop = m_386 | m_PENT4;
487 const int x86_qimode_math = ~(0);
488 const int x86_promote_qi_regs = 0;
489 const int x86_himode_math = ~(m_PPRO);
490 const int x86_promote_hi_regs = m_PPRO;
491 const int x86_sub_esp_4 = m_ATHLON_K8 | m_PPRO | m_PENT4;
492 const int x86_sub_esp_8 = m_ATHLON_K8 | m_PPRO | m_386 | m_486 | m_PENT4;
493 const int x86_add_esp_4 = m_ATHLON_K8 | m_K6 | m_PENT4;
494 const int x86_add_esp_8 = m_ATHLON_K8 | m_PPRO | m_K6 | m_386 | m_486 | m_PENT4;
495 const int x86_integer_DFmode_moves = ~(m_ATHLON_K8 | m_PENT4 | m_PPRO);
496 const int x86_partial_reg_dependency = m_ATHLON_K8 | m_PENT4;
497 const int x86_memory_mismatch_stall = m_ATHLON_K8 | m_PENT4;
498 const int x86_accumulate_outgoing_args = m_ATHLON_K8 | m_PENT4 | m_PPRO;
499 const int x86_prologue_using_move = m_ATHLON_K8 | m_PENT4 | m_PPRO;
500 const int x86_epilogue_using_move = m_ATHLON_K8 | m_PENT4 | m_PPRO;
501 const int x86_decompose_lea = m_PENT4;
502 const int x86_shift1 = ~m_486;
503 const int x86_arch_always_fancy_math_387 = m_PENT | m_PPRO | m_ATHLON_K8 | m_PENT4;
504 const int x86_sse_partial_reg_dependency = m_PENT4 | m_PPRO;
505 /* Set for machines where the type and dependencies are resolved on SSE register
506    parts instead of whole registers, so we may maintain just lower part of
507    scalar values in proper format leaving the upper part undefined.  */
508 const int x86_sse_partial_regs = m_ATHLON_K8;
509 /* Athlon optimizes partial-register FPS special case, thus avoiding the
510    need for extra instructions beforehand  */
511 const int x86_sse_partial_regs_for_cvtsd2ss = 0;
512 const int x86_sse_typeless_stores = m_ATHLON_K8;
513 const int x86_sse_load0_by_pxor = m_PPRO | m_PENT4;
514 const int x86_use_ffreep = m_ATHLON_K8;
515 const int x86_rep_movl_optimal = m_386 | m_PENT | m_PPRO | m_K6;
516
517 /* In case the average insn count for single function invocation is
518    lower than this constant, emit fast (but longer) prologue and
519    epilogue code.  */
520 #define FAST_PROLOGUE_INSN_COUNT 20
521
522 /* Set by prologue expander and used by epilogue expander to determine
523    the style used.  */
524 static int use_fast_prologue_epilogue;
525
526 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
527 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
528 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
529 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
530
531 /* Array of the smallest class containing reg number REGNO, indexed by
532    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
533
534 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
535 {
536   /* ax, dx, cx, bx */
537   AREG, DREG, CREG, BREG,
538   /* si, di, bp, sp */
539   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
540   /* FP registers */
541   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
542   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
543   /* arg pointer */
544   NON_Q_REGS,
545   /* flags, fpsr, dirflag, frame */
546   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
547   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
548   SSE_REGS, SSE_REGS,
549   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
550   MMX_REGS, MMX_REGS,
551   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
552   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
553   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
554   SSE_REGS, SSE_REGS,
555 };
556
557 /* The "default" register map used in 32bit mode.  */
558
559 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
560 {
561   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
562   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
563   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, dir, frame */
564   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
565   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
566   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
567   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
568 };
569
570 static int const x86_64_int_parameter_registers[6] =
571 {
572   5 /*RDI*/, 4 /*RSI*/, 1 /*RDX*/, 2 /*RCX*/,
573   FIRST_REX_INT_REG /*R8 */, FIRST_REX_INT_REG + 1 /*R9 */
574 };
575
576 static int const x86_64_int_return_registers[4] =
577 {
578   0 /*RAX*/, 1 /*RDI*/, 5 /*RDI*/, 4 /*RSI*/
579 };
580
581 /* The "default" register map used in 64bit mode.  */
582 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
583 {
584   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
585   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
586   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, dir, frame */
587   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
588   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
589   8,9,10,11,12,13,14,15,                /* extended integer registers */
590   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
591 };
592
593 /* Define the register numbers to be used in Dwarf debugging information.
594    The SVR4 reference port C compiler uses the following register numbers
595    in its Dwarf output code:
596         0 for %eax (gcc regno = 0)
597         1 for %ecx (gcc regno = 2)
598         2 for %edx (gcc regno = 1)
599         3 for %ebx (gcc regno = 3)
600         4 for %esp (gcc regno = 7)
601         5 for %ebp (gcc regno = 6)
602         6 for %esi (gcc regno = 4)
603         7 for %edi (gcc regno = 5)
604    The following three DWARF register numbers are never generated by
605    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
606    believes these numbers have these meanings.
607         8  for %eip    (no gcc equivalent)
608         9  for %eflags (gcc regno = 17)
609         10 for %trapno (no gcc equivalent)
610    It is not at all clear how we should number the FP stack registers
611    for the x86 architecture.  If the version of SDB on x86/svr4 were
612    a bit less brain dead with respect to floating-point then we would
613    have a precedent to follow with respect to DWARF register numbers
614    for x86 FP registers, but the SDB on x86/svr4 is so completely
615    broken with respect to FP registers that it is hardly worth thinking
616    of it as something to strive for compatibility with.
617    The version of x86/svr4 SDB I have at the moment does (partially)
618    seem to believe that DWARF register number 11 is associated with
619    the x86 register %st(0), but that's about all.  Higher DWARF
620    register numbers don't seem to be associated with anything in
621    particular, and even for DWARF regno 11, SDB only seems to under-
622    stand that it should say that a variable lives in %st(0) (when
623    asked via an `=' command) if we said it was in DWARF regno 11,
624    but SDB still prints garbage when asked for the value of the
625    variable in question (via a `/' command).
626    (Also note that the labels SDB prints for various FP stack regs
627    when doing an `x' command are all wrong.)
628    Note that these problems generally don't affect the native SVR4
629    C compiler because it doesn't allow the use of -O with -g and
630    because when it is *not* optimizing, it allocates a memory
631    location for each floating-point variable, and the memory
632    location is what gets described in the DWARF AT_location
633    attribute for the variable in question.
634    Regardless of the severe mental illness of the x86/svr4 SDB, we
635    do something sensible here and we use the following DWARF
636    register numbers.  Note that these are all stack-top-relative
637    numbers.
638         11 for %st(0) (gcc regno = 8)
639         12 for %st(1) (gcc regno = 9)
640         13 for %st(2) (gcc regno = 10)
641         14 for %st(3) (gcc regno = 11)
642         15 for %st(4) (gcc regno = 12)
643         16 for %st(5) (gcc regno = 13)
644         17 for %st(6) (gcc regno = 14)
645         18 for %st(7) (gcc regno = 15)
646 */
647 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
648 {
649   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
650   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
651   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, dir, frame */
652   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
653   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
654   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
655   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
656 };
657
658 /* Test and compare insns in i386.md store the information needed to
659    generate branch and scc insns here.  */
660
661 rtx ix86_compare_op0 = NULL_RTX;
662 rtx ix86_compare_op1 = NULL_RTX;
663
664 /* The encoding characters for the four TLS models present in ELF.  */
665
666 static char const tls_model_chars[] = " GLil";
667
668 #define MAX_386_STACK_LOCALS 3
669 /* Size of the register save area.  */
670 #define X86_64_VARARGS_SIZE (REGPARM_MAX * UNITS_PER_WORD + SSE_REGPARM_MAX * 16)
671
672 /* Define the structure for the machine field in struct function.  */
673 struct machine_function GTY(())
674 {
675   rtx stack_locals[(int) MAX_MACHINE_MODE][MAX_386_STACK_LOCALS];
676   const char *some_ld_name;
677   int save_varrargs_registers;
678   int accesses_prev_frame;
679 };
680
681 #define ix86_stack_locals (cfun->machine->stack_locals)
682 #define ix86_save_varrargs_registers (cfun->machine->save_varrargs_registers)
683
684 /* Structure describing stack frame layout.
685    Stack grows downward:
686
687    [arguments]
688                                               <- ARG_POINTER
689    saved pc
690
691    saved frame pointer if frame_pointer_needed
692                                               <- HARD_FRAME_POINTER
693    [saved regs]
694
695    [padding1]          \
696                         )
697    [va_arg registers]  (
698                         > to_allocate         <- FRAME_POINTER
699    [frame]             (
700                         )
701    [padding2]          /
702   */
703 struct ix86_frame
704 {
705   int nregs;
706   int padding1;
707   int va_arg_size;
708   HOST_WIDE_INT frame;
709   int padding2;
710   int outgoing_arguments_size;
711   int red_zone_size;
712
713   HOST_WIDE_INT to_allocate;
714   /* The offsets relative to ARG_POINTER.  */
715   HOST_WIDE_INT frame_pointer_offset;
716   HOST_WIDE_INT hard_frame_pointer_offset;
717   HOST_WIDE_INT stack_pointer_offset;
718 };
719
720 /* Used to enable/disable debugging features.  */
721 const char *ix86_debug_arg_string, *ix86_debug_addr_string;
722 /* Code model option as passed by user.  */
723 const char *ix86_cmodel_string;
724 /* Parsed value.  */
725 enum cmodel ix86_cmodel;
726 /* Asm dialect.  */
727 const char *ix86_asm_string;
728 enum asm_dialect ix86_asm_dialect = ASM_ATT;
729 /* TLS dialext.  */
730 const char *ix86_tls_dialect_string;
731 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
732
733 /* Which unit we are generating floating point math for.  */
734 enum fpmath_unit ix86_fpmath;
735
736 /* Which cpu are we scheduling for.  */
737 enum processor_type ix86_cpu;
738 /* Which instruction set architecture to use.  */
739 enum processor_type ix86_arch;
740
741 /* Strings to hold which cpu and instruction set architecture  to use.  */
742 const char *ix86_cpu_string;            /* for -mcpu=<xxx> */
743 const char *ix86_arch_string;           /* for -march=<xxx> */
744 const char *ix86_fpmath_string;         /* for -mfpmath=<xxx> */
745
746 /* # of registers to use to pass arguments.  */
747 const char *ix86_regparm_string;
748
749 /* true if sse prefetch instruction is not NOOP.  */
750 int x86_prefetch_sse;
751
752 /* ix86_regparm_string as a number */
753 int ix86_regparm;
754
755 /* Alignment to use for loops and jumps:  */
756
757 /* Power of two alignment for loops.  */
758 const char *ix86_align_loops_string;
759
760 /* Power of two alignment for non-loop jumps.  */
761 const char *ix86_align_jumps_string;
762
763 /* Power of two alignment for stack boundary in bytes.  */
764 const char *ix86_preferred_stack_boundary_string;
765
766 /* Preferred alignment for stack boundary in bits.  */
767 int ix86_preferred_stack_boundary;
768
769 /* Values 1-5: see jump.c */
770 int ix86_branch_cost;
771 const char *ix86_branch_cost_string;
772
773 /* Power of two alignment for functions.  */
774 const char *ix86_align_funcs_string;
775
776 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
777 static char internal_label_prefix[16];
778 static int internal_label_prefix_len;
779 \f
780 static int local_symbolic_operand PARAMS ((rtx, enum machine_mode));
781 static int tls_symbolic_operand_1 PARAMS ((rtx, enum tls_model));
782 static void output_pic_addr_const PARAMS ((FILE *, rtx, int));
783 static void put_condition_code PARAMS ((enum rtx_code, enum machine_mode,
784                                        int, int, FILE *));
785 static const char *get_some_local_dynamic_name PARAMS ((void));
786 static int get_some_local_dynamic_name_1 PARAMS ((rtx *, void *));
787 static rtx maybe_get_pool_constant PARAMS ((rtx));
788 static rtx ix86_expand_int_compare PARAMS ((enum rtx_code, rtx, rtx));
789 static enum rtx_code ix86_prepare_fp_compare_args PARAMS ((enum rtx_code,
790                                                            rtx *, rtx *));
791 static rtx get_thread_pointer PARAMS ((void));
792 static void get_pc_thunk_name PARAMS ((char [32], unsigned int));
793 static rtx gen_push PARAMS ((rtx));
794 static int memory_address_length PARAMS ((rtx addr));
795 static int ix86_flags_dependant PARAMS ((rtx, rtx, enum attr_type));
796 static int ix86_agi_dependant PARAMS ((rtx, rtx, enum attr_type));
797 static enum attr_ppro_uops ix86_safe_ppro_uops PARAMS ((rtx));
798 static void ix86_dump_ppro_packet PARAMS ((FILE *));
799 static void ix86_reorder_insn PARAMS ((rtx *, rtx *));
800 static struct machine_function * ix86_init_machine_status PARAMS ((void));
801 static int ix86_split_to_parts PARAMS ((rtx, rtx *, enum machine_mode));
802 static int ix86_nsaved_regs PARAMS ((void));
803 static void ix86_emit_save_regs PARAMS ((void));
804 static void ix86_emit_save_regs_using_mov PARAMS ((rtx, HOST_WIDE_INT));
805 static void ix86_emit_restore_regs_using_mov PARAMS ((rtx, int, int));
806 static void ix86_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
807 static void ix86_set_move_mem_attrs_1 PARAMS ((rtx, rtx, rtx, rtx, rtx));
808 static void ix86_sched_reorder_ppro PARAMS ((rtx *, rtx *));
809 static HOST_WIDE_INT ix86_GOT_alias_set PARAMS ((void));
810 static void ix86_adjust_counter PARAMS ((rtx, HOST_WIDE_INT));
811 static rtx ix86_expand_aligntest PARAMS ((rtx, int));
812 static void ix86_expand_strlensi_unroll_1 PARAMS ((rtx, rtx));
813 static int ix86_issue_rate PARAMS ((void));
814 static int ix86_adjust_cost PARAMS ((rtx, rtx, rtx, int));
815 static void ix86_sched_init PARAMS ((FILE *, int, int));
816 static int ix86_sched_reorder PARAMS ((FILE *, int, rtx *, int *, int));
817 static int ix86_variable_issue PARAMS ((FILE *, int, rtx, int));
818 static int ia32_use_dfa_pipeline_interface PARAMS ((void));
819 static int ia32_multipass_dfa_lookahead PARAMS ((void));
820 static void ix86_init_mmx_sse_builtins PARAMS ((void));
821 static rtx x86_this_parameter PARAMS ((tree));
822 static void x86_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT,
823                                          HOST_WIDE_INT, tree));
824 static bool x86_can_output_mi_thunk PARAMS ((tree, HOST_WIDE_INT,
825                                              HOST_WIDE_INT, tree));
826 bool ix86_expand_carry_flag_compare PARAMS ((enum rtx_code, rtx, rtx, rtx*));
827
828 struct ix86_address
829 {
830   rtx base, index, disp;
831   HOST_WIDE_INT scale;
832 };
833
834 static int ix86_decompose_address PARAMS ((rtx, struct ix86_address *));
835 static bool ix86_cannot_force_const_mem PARAMS ((rtx));
836
837 static void ix86_encode_section_info PARAMS ((tree, int)) ATTRIBUTE_UNUSED;
838 static const char *ix86_strip_name_encoding PARAMS ((const char *))
839      ATTRIBUTE_UNUSED;
840
841 struct builtin_description;
842 static rtx ix86_expand_sse_comi PARAMS ((const struct builtin_description *,
843                                          tree, rtx));
844 static rtx ix86_expand_sse_compare PARAMS ((const struct builtin_description *,
845                                             tree, rtx));
846 static rtx ix86_expand_unop1_builtin PARAMS ((enum insn_code, tree, rtx));
847 static rtx ix86_expand_unop_builtin PARAMS ((enum insn_code, tree, rtx, int));
848 static rtx ix86_expand_binop_builtin PARAMS ((enum insn_code, tree, rtx));
849 static rtx ix86_expand_store_builtin PARAMS ((enum insn_code, tree));
850 static rtx safe_vector_operand PARAMS ((rtx, enum machine_mode));
851 static enum rtx_code ix86_fp_compare_code_to_integer PARAMS ((enum rtx_code));
852 static void ix86_fp_comparison_codes PARAMS ((enum rtx_code code,
853                                               enum rtx_code *,
854                                               enum rtx_code *,
855                                               enum rtx_code *));
856 static rtx ix86_expand_fp_compare PARAMS ((enum rtx_code, rtx, rtx, rtx,
857                                           rtx *, rtx *));
858 static int ix86_fp_comparison_arithmetics_cost PARAMS ((enum rtx_code code));
859 static int ix86_fp_comparison_fcomi_cost PARAMS ((enum rtx_code code));
860 static int ix86_fp_comparison_sahf_cost PARAMS ((enum rtx_code code));
861 static int ix86_fp_comparison_cost PARAMS ((enum rtx_code code));
862 static unsigned int ix86_select_alt_pic_regnum PARAMS ((void));
863 static int ix86_save_reg PARAMS ((unsigned int, int));
864 static void ix86_compute_frame_layout PARAMS ((struct ix86_frame *));
865 static int ix86_comp_type_attributes PARAMS ((tree, tree));
866 static int ix86_fntype_regparm PARAMS ((tree));
867 const struct attribute_spec ix86_attribute_table[];
868 static bool ix86_function_ok_for_sibcall PARAMS ((tree, tree));
869 static tree ix86_handle_cdecl_attribute PARAMS ((tree *, tree, tree, int, bool *));
870 static tree ix86_handle_regparm_attribute PARAMS ((tree *, tree, tree, int, bool *));
871 static int ix86_value_regno PARAMS ((enum machine_mode));
872 static bool ix86_ms_bitfield_layout_p PARAMS ((tree));
873 static int extended_reg_mentioned_1 PARAMS ((rtx *, void *));
874
875 #if defined (DO_GLOBAL_CTORS_BODY) && defined (HAS_INIT_SECTION)
876 static void ix86_svr3_asm_out_constructor PARAMS ((rtx, int));
877 #endif
878
879 /* Register class used for passing given 64bit part of the argument.
880    These represent classes as documented by the PS ABI, with the exception
881    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
882    use SF or DFmode move instead of DImode to avoid reformatting penalties.
883
884    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
885    whenever possible (upper half does contain padding).
886  */
887 enum x86_64_reg_class
888   {
889     X86_64_NO_CLASS,
890     X86_64_INTEGER_CLASS,
891     X86_64_INTEGERSI_CLASS,
892     X86_64_SSE_CLASS,
893     X86_64_SSESF_CLASS,
894     X86_64_SSEDF_CLASS,
895     X86_64_SSEUP_CLASS,
896     X86_64_X87_CLASS,
897     X86_64_X87UP_CLASS,
898     X86_64_MEMORY_CLASS
899   };
900 static const char * const x86_64_reg_class_name[] =
901    {"no", "integer", "integerSI", "sse", "sseSF", "sseDF", "sseup", "x87", "x87up", "no"};
902
903 #define MAX_CLASSES 4
904 static int classify_argument PARAMS ((enum machine_mode, tree,
905                                       enum x86_64_reg_class [MAX_CLASSES],
906                                       int));
907 static int examine_argument PARAMS ((enum machine_mode, tree, int, int *,
908                                      int *));
909 static rtx construct_container PARAMS ((enum machine_mode, tree, int, int, int,
910                                         const int *, int));
911 static enum x86_64_reg_class merge_classes PARAMS ((enum x86_64_reg_class,
912                                                     enum x86_64_reg_class));
913 \f
914 /* Initialize the GCC target structure.  */
915 #undef TARGET_ATTRIBUTE_TABLE
916 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
917 #ifdef TARGET_DLLIMPORT_DECL_ATTRIBUTES
918 #  undef TARGET_MERGE_DECL_ATTRIBUTES
919 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
920 #endif
921
922 #undef TARGET_COMP_TYPE_ATTRIBUTES
923 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
924
925 #undef TARGET_INIT_BUILTINS
926 #define TARGET_INIT_BUILTINS ix86_init_builtins
927
928 #undef TARGET_EXPAND_BUILTIN
929 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
930
931 #undef TARGET_ASM_FUNCTION_EPILOGUE
932 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
933
934 #undef TARGET_ASM_OPEN_PAREN
935 #define TARGET_ASM_OPEN_PAREN ""
936 #undef TARGET_ASM_CLOSE_PAREN
937 #define TARGET_ASM_CLOSE_PAREN ""
938
939 #undef TARGET_ASM_ALIGNED_HI_OP
940 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
941 #undef TARGET_ASM_ALIGNED_SI_OP
942 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
943 #ifdef ASM_QUAD
944 #undef TARGET_ASM_ALIGNED_DI_OP
945 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
946 #endif
947
948 #undef TARGET_ASM_UNALIGNED_HI_OP
949 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
950 #undef TARGET_ASM_UNALIGNED_SI_OP
951 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
952 #undef TARGET_ASM_UNALIGNED_DI_OP
953 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
954
955 #undef TARGET_SCHED_ADJUST_COST
956 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
957 #undef TARGET_SCHED_ISSUE_RATE
958 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
959 #undef TARGET_SCHED_VARIABLE_ISSUE
960 #define TARGET_SCHED_VARIABLE_ISSUE ix86_variable_issue
961 #undef TARGET_SCHED_INIT
962 #define TARGET_SCHED_INIT ix86_sched_init
963 #undef TARGET_SCHED_REORDER
964 #define TARGET_SCHED_REORDER ix86_sched_reorder
965 #undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE
966 #define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE \
967   ia32_use_dfa_pipeline_interface
968 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
969 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
970   ia32_multipass_dfa_lookahead
971
972 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
973 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
974
975 #ifdef HAVE_AS_TLS
976 #undef TARGET_HAVE_TLS
977 #define TARGET_HAVE_TLS true
978 #endif
979 #undef TARGET_CANNOT_FORCE_CONST_MEM
980 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
981
982 #undef TARGET_MS_BITFIELD_LAYOUT_P
983 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
984
985 #undef TARGET_ASM_OUTPUT_MI_THUNK
986 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
987 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
988 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
989
990 struct gcc_target targetm = TARGET_INITIALIZER;
991 \f
992 /* Sometimes certain combinations of command options do not make
993    sense on a particular target machine.  You can define a macro
994    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
995    defined, is executed once just after all the command options have
996    been parsed.
997
998    Don't use this macro to turn on various extra optimizations for
999    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
1000
1001 void
1002 override_options ()
1003 {
1004   int i;
1005   /* Comes from final.c -- no real reason to change it.  */
1006 #define MAX_CODE_ALIGN 16
1007
1008   static struct ptt
1009     {
1010       const struct processor_costs *cost;       /* Processor costs */
1011       const int target_enable;                  /* Target flags to enable.  */
1012       const int target_disable;                 /* Target flags to disable.  */
1013       const int align_loop;                     /* Default alignments.  */
1014       const int align_loop_max_skip;
1015       const int align_jump;
1016       const int align_jump_max_skip;
1017       const int align_func;
1018     }
1019   const processor_target_table[PROCESSOR_max] =
1020     {
1021       {&i386_cost, 0, 0, 4, 3, 4, 3, 4},
1022       {&i486_cost, 0, 0, 16, 15, 16, 15, 16},
1023       {&pentium_cost, 0, 0, 16, 7, 16, 7, 16},
1024       {&pentiumpro_cost, 0, 0, 16, 15, 16, 7, 16},
1025       {&k6_cost, 0, 0, 32, 7, 32, 7, 32},
1026       {&athlon_cost, 0, 0, 16, 7, 16, 7, 16},
1027       {&pentium4_cost, 0, 0, 0, 0, 0, 0, 0},
1028       {&k8_cost, 0, 0, 16, 7, 16, 7, 16}
1029     };
1030
1031   static const char * const cpu_names[] = TARGET_CPU_DEFAULT_NAMES;
1032   static struct pta
1033     {
1034       const char *const name;           /* processor name or nickname.  */
1035       const enum processor_type processor;
1036       const enum pta_flags
1037         {
1038           PTA_SSE = 1,
1039           PTA_SSE2 = 2,
1040           PTA_MMX = 4,
1041           PTA_PREFETCH_SSE = 8,
1042           PTA_3DNOW = 16,
1043           PTA_3DNOW_A = 64,
1044           PTA_64BIT = 128
1045         } flags;
1046     }
1047   const processor_alias_table[] =
1048     {
1049       {"i386", PROCESSOR_I386, 0},
1050       {"i486", PROCESSOR_I486, 0},
1051       {"i586", PROCESSOR_PENTIUM, 0},
1052       {"pentium", PROCESSOR_PENTIUM, 0},
1053       {"pentium-mmx", PROCESSOR_PENTIUM, PTA_MMX},
1054       {"winchip-c6", PROCESSOR_I486, PTA_MMX},
1055       {"winchip2", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
1056       {"c3", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
1057       {"i686", PROCESSOR_PENTIUMPRO, 0},
1058       {"pentiumpro", PROCESSOR_PENTIUMPRO, 0},
1059       {"pentium2", PROCESSOR_PENTIUMPRO, PTA_MMX},
1060       {"pentium3", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE},
1061       {"pentium4", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 |
1062                                        PTA_MMX | PTA_PREFETCH_SSE},
1063       {"k6", PROCESSOR_K6, PTA_MMX},
1064       {"k6-2", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
1065       {"k6-3", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
1066       {"athlon", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1067                                    | PTA_3DNOW_A},
1068       {"athlon-tbird", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE
1069                                          | PTA_3DNOW | PTA_3DNOW_A},
1070       {"athlon-4", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1071                                     | PTA_3DNOW_A | PTA_SSE},
1072       {"athlon-xp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1073                                       | PTA_3DNOW_A | PTA_SSE},
1074       {"athlon-mp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
1075                                       | PTA_3DNOW_A | PTA_SSE},
1076       {"k8", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
1077                                       | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
1078     };
1079
1080   int const pta_size = ARRAY_SIZE (processor_alias_table);
1081
1082   /* By default our XFmode is the 80-bit extended format.  If we have
1083      use TFmode instead, it's also the 80-bit format, but with padding.  */
1084   real_format_for_mode[XFmode - QFmode] = &ieee_extended_intel_96_format;
1085   real_format_for_mode[TFmode - QFmode] = &ieee_extended_intel_128_format;
1086
1087   /* Set the default values for switches whose default depends on TARGET_64BIT
1088      in case they weren't overwritten by command line options.  */
1089   if (TARGET_64BIT)
1090     {
1091       if (flag_omit_frame_pointer == 2)
1092         flag_omit_frame_pointer = 1;
1093       if (flag_asynchronous_unwind_tables == 2)
1094         flag_asynchronous_unwind_tables = 1;
1095       if (flag_pcc_struct_return == 2)
1096         flag_pcc_struct_return = 0;
1097     }
1098   else
1099     {
1100       if (flag_omit_frame_pointer == 2)
1101         flag_omit_frame_pointer = 0;
1102       if (flag_asynchronous_unwind_tables == 2)
1103         flag_asynchronous_unwind_tables = 0;
1104       if (flag_pcc_struct_return == 2)
1105         flag_pcc_struct_return = 1;
1106     }
1107
1108 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1109   SUBTARGET_OVERRIDE_OPTIONS;
1110 #endif
1111
1112   if (!ix86_cpu_string && ix86_arch_string)
1113     ix86_cpu_string = ix86_arch_string;
1114   if (!ix86_cpu_string)
1115     ix86_cpu_string = cpu_names [TARGET_CPU_DEFAULT];
1116   if (!ix86_arch_string)
1117     ix86_arch_string = TARGET_64BIT ? "k8" : "i386";
1118
1119   if (ix86_cmodel_string != 0)
1120     {
1121       if (!strcmp (ix86_cmodel_string, "small"))
1122         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
1123       else if (flag_pic)
1124         sorry ("code model %s not supported in PIC mode", ix86_cmodel_string);
1125       else if (!strcmp (ix86_cmodel_string, "32"))
1126         ix86_cmodel = CM_32;
1127       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
1128         ix86_cmodel = CM_KERNEL;
1129       else if (!strcmp (ix86_cmodel_string, "medium") && !flag_pic)
1130         ix86_cmodel = CM_MEDIUM;
1131       else if (!strcmp (ix86_cmodel_string, "large") && !flag_pic)
1132         ix86_cmodel = CM_LARGE;
1133       else
1134         error ("bad value (%s) for -mcmodel= switch", ix86_cmodel_string);
1135     }
1136   else
1137     {
1138       ix86_cmodel = CM_32;
1139       if (TARGET_64BIT)
1140         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
1141     }
1142   if (ix86_asm_string != 0)
1143     {
1144       if (!strcmp (ix86_asm_string, "intel"))
1145         ix86_asm_dialect = ASM_INTEL;
1146       else if (!strcmp (ix86_asm_string, "att"))
1147         ix86_asm_dialect = ASM_ATT;
1148       else
1149         error ("bad value (%s) for -masm= switch", ix86_asm_string);
1150     }
1151   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
1152     error ("code model `%s' not supported in the %s bit mode",
1153            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
1154   if (ix86_cmodel == CM_LARGE)
1155     sorry ("code model `large' not supported yet");
1156   if ((TARGET_64BIT != 0) != ((target_flags & MASK_64BIT) != 0))
1157     sorry ("%i-bit mode not compiled in",
1158            (target_flags & MASK_64BIT) ? 64 : 32);
1159
1160   for (i = 0; i < pta_size; i++)
1161     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
1162       {
1163         ix86_arch = processor_alias_table[i].processor;
1164         /* Default cpu tuning to the architecture.  */
1165         ix86_cpu = ix86_arch;
1166         if (processor_alias_table[i].flags & PTA_MMX
1167             && !(target_flags_explicit & MASK_MMX))
1168           target_flags |= MASK_MMX;
1169         if (processor_alias_table[i].flags & PTA_3DNOW
1170             && !(target_flags_explicit & MASK_3DNOW))
1171           target_flags |= MASK_3DNOW;
1172         if (processor_alias_table[i].flags & PTA_3DNOW_A
1173             && !(target_flags_explicit & MASK_3DNOW_A))
1174           target_flags |= MASK_3DNOW_A;
1175         if (processor_alias_table[i].flags & PTA_SSE
1176             && !(target_flags_explicit & MASK_SSE))
1177           target_flags |= MASK_SSE;
1178         if (processor_alias_table[i].flags & PTA_SSE2
1179             && !(target_flags_explicit & MASK_SSE2))
1180           target_flags |= MASK_SSE2;
1181         if (processor_alias_table[i].flags & PTA_PREFETCH_SSE)
1182           x86_prefetch_sse = true;
1183         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
1184           error ("CPU you selected does not support x86-64 instruction set");
1185         break;
1186       }
1187
1188   if (i == pta_size)
1189     error ("bad value (%s) for -march= switch", ix86_arch_string);
1190
1191   for (i = 0; i < pta_size; i++)
1192     if (! strcmp (ix86_cpu_string, processor_alias_table[i].name))
1193       {
1194         ix86_cpu = processor_alias_table[i].processor;
1195         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
1196           error ("CPU you selected does not support x86-64 instruction set");
1197         break;
1198       }
1199   if (processor_alias_table[i].flags & PTA_PREFETCH_SSE)
1200     x86_prefetch_sse = true;
1201   if (i == pta_size)
1202     error ("bad value (%s) for -mcpu= switch", ix86_cpu_string);
1203
1204   if (optimize_size)
1205     ix86_cost = &size_cost;
1206   else
1207     ix86_cost = processor_target_table[ix86_cpu].cost;
1208   target_flags |= processor_target_table[ix86_cpu].target_enable;
1209   target_flags &= ~processor_target_table[ix86_cpu].target_disable;
1210
1211   /* Arrange to set up i386_stack_locals for all functions.  */
1212   init_machine_status = ix86_init_machine_status;
1213
1214   /* Validate -mregparm= value.  */
1215   if (ix86_regparm_string)
1216     {
1217       i = atoi (ix86_regparm_string);
1218       if (i < 0 || i > REGPARM_MAX)
1219         error ("-mregparm=%d is not between 0 and %d", i, REGPARM_MAX);
1220       else
1221         ix86_regparm = i;
1222     }
1223   else
1224    if (TARGET_64BIT)
1225      ix86_regparm = REGPARM_MAX;
1226
1227   /* If the user has provided any of the -malign-* options,
1228      warn and use that value only if -falign-* is not set.
1229      Remove this code in GCC 3.2 or later.  */
1230   if (ix86_align_loops_string)
1231     {
1232       warning ("-malign-loops is obsolete, use -falign-loops");
1233       if (align_loops == 0)
1234         {
1235           i = atoi (ix86_align_loops_string);
1236           if (i < 0 || i > MAX_CODE_ALIGN)
1237             error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);
1238           else
1239             align_loops = 1 << i;
1240         }
1241     }
1242
1243   if (ix86_align_jumps_string)
1244     {
1245       warning ("-malign-jumps is obsolete, use -falign-jumps");
1246       if (align_jumps == 0)
1247         {
1248           i = atoi (ix86_align_jumps_string);
1249           if (i < 0 || i > MAX_CODE_ALIGN)
1250             error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);
1251           else
1252             align_jumps = 1 << i;
1253         }
1254     }
1255
1256   if (ix86_align_funcs_string)
1257     {
1258       warning ("-malign-functions is obsolete, use -falign-functions");
1259       if (align_functions == 0)
1260         {
1261           i = atoi (ix86_align_funcs_string);
1262           if (i < 0 || i > MAX_CODE_ALIGN)
1263             error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);
1264           else
1265             align_functions = 1 << i;
1266         }
1267     }
1268
1269   /* Default align_* from the processor table.  */
1270   if (align_loops == 0)
1271     {
1272       align_loops = processor_target_table[ix86_cpu].align_loop;
1273       align_loops_max_skip = processor_target_table[ix86_cpu].align_loop_max_skip;
1274     }
1275   if (align_jumps == 0)
1276     {
1277       align_jumps = processor_target_table[ix86_cpu].align_jump;
1278       align_jumps_max_skip = processor_target_table[ix86_cpu].align_jump_max_skip;
1279     }
1280   if (align_functions == 0)
1281     {
1282       align_functions = processor_target_table[ix86_cpu].align_func;
1283     }
1284
1285   /* Validate -mpreferred-stack-boundary= value, or provide default.
1286      The default of 128 bits is for Pentium III's SSE __m128, but we
1287      don't want additional code to keep the stack aligned when
1288      optimizing for code size.  */
1289   ix86_preferred_stack_boundary = (optimize_size
1290                                    ? TARGET_64BIT ? 128 : 32
1291                                    : 128);
1292   if (ix86_preferred_stack_boundary_string)
1293     {
1294       i = atoi (ix86_preferred_stack_boundary_string);
1295       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
1296         error ("-mpreferred-stack-boundary=%d is not between %d and 12", i,
1297                TARGET_64BIT ? 4 : 2);
1298       else
1299         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
1300     }
1301
1302   /* Validate -mbranch-cost= value, or provide default.  */
1303   ix86_branch_cost = processor_target_table[ix86_cpu].cost->branch_cost;
1304   if (ix86_branch_cost_string)
1305     {
1306       i = atoi (ix86_branch_cost_string);
1307       if (i < 0 || i > 5)
1308         error ("-mbranch-cost=%d is not between 0 and 5", i);
1309       else
1310         ix86_branch_cost = i;
1311     }
1312
1313   if (ix86_tls_dialect_string)
1314     {
1315       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
1316         ix86_tls_dialect = TLS_DIALECT_GNU;
1317       else if (strcmp (ix86_tls_dialect_string, "sun") == 0)
1318         ix86_tls_dialect = TLS_DIALECT_SUN;
1319       else
1320         error ("bad value (%s) for -mtls-dialect= switch",
1321                ix86_tls_dialect_string);
1322     }
1323
1324   /* Keep nonleaf frame pointers.  */
1325   if (TARGET_OMIT_LEAF_FRAME_POINTER)
1326     flag_omit_frame_pointer = 1;
1327
1328   /* If we're doing fast math, we don't care about comparison order
1329      wrt NaNs.  This lets us use a shorter comparison sequence.  */
1330   if (flag_unsafe_math_optimizations)
1331     target_flags &= ~MASK_IEEE_FP;
1332
1333   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
1334      since the insns won't need emulation.  */
1335   if (x86_arch_always_fancy_math_387 & (1 << ix86_arch))
1336     target_flags &= ~MASK_NO_FANCY_MATH_387;
1337
1338   if (TARGET_64BIT)
1339     {
1340       if (TARGET_ALIGN_DOUBLE)
1341         error ("-malign-double makes no sense in the 64bit mode");
1342       if (TARGET_RTD)
1343         error ("-mrtd calling convention not supported in the 64bit mode");
1344       /* Enable by default the SSE and MMX builtins.  */
1345       target_flags |= (MASK_SSE2 | MASK_SSE | MASK_MMX | MASK_128BIT_LONG_DOUBLE);
1346       ix86_fpmath = FPMATH_SSE;
1347      }
1348   else
1349     ix86_fpmath = FPMATH_387;
1350
1351   if (ix86_fpmath_string != 0)
1352     {
1353       if (! strcmp (ix86_fpmath_string, "387"))
1354         ix86_fpmath = FPMATH_387;
1355       else if (! strcmp (ix86_fpmath_string, "sse"))
1356         {
1357           if (!TARGET_SSE)
1358             {
1359               warning ("SSE instruction set disabled, using 387 arithmetics");
1360               ix86_fpmath = FPMATH_387;
1361             }
1362           else
1363             ix86_fpmath = FPMATH_SSE;
1364         }
1365       else if (! strcmp (ix86_fpmath_string, "387,sse")
1366                || ! strcmp (ix86_fpmath_string, "sse,387"))
1367         {
1368           if (!TARGET_SSE)
1369             {
1370               warning ("SSE instruction set disabled, using 387 arithmetics");
1371               ix86_fpmath = FPMATH_387;
1372             }
1373           else if (!TARGET_80387)
1374             {
1375               warning ("387 instruction set disabled, using SSE arithmetics");
1376               ix86_fpmath = FPMATH_SSE;
1377             }
1378           else
1379             ix86_fpmath = FPMATH_SSE | FPMATH_387;
1380         }
1381       else
1382         error ("bad value (%s) for -mfpmath= switch", ix86_fpmath_string);
1383     }
1384
1385   /* It makes no sense to ask for just SSE builtins, so MMX is also turned
1386      on by -msse.  */
1387   if (TARGET_SSE)
1388     {
1389       target_flags |= MASK_MMX;
1390       x86_prefetch_sse = true;
1391     }
1392
1393   /* If it has 3DNow! it also has MMX so MMX is also turned on by -m3dnow */
1394   if (TARGET_3DNOW)
1395     {
1396       target_flags |= MASK_MMX;
1397       /* If we are targeting the Athlon architecture, enable the 3Dnow/MMX
1398          extensions it adds.  */
1399       if (x86_3dnow_a & (1 << ix86_arch))
1400         target_flags |= MASK_3DNOW_A;
1401     }
1402   if ((x86_accumulate_outgoing_args & CPUMASK)
1403       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
1404       && !optimize_size)
1405     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
1406
1407   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
1408   {
1409     char *p;
1410     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
1411     p = strchr (internal_label_prefix, 'X');
1412     internal_label_prefix_len = p - internal_label_prefix;
1413     *p = '\0';
1414   }
1415 }
1416 \f
1417 void
1418 optimization_options (level, size)
1419      int level;
1420      int size ATTRIBUTE_UNUSED;
1421 {
1422   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
1423      make the problem with not enough registers even worse.  */
1424 #ifdef INSN_SCHEDULING
1425   if (level > 1)
1426     flag_schedule_insns = 0;
1427 #endif
1428
1429   /* The default values of these switches depend on the TARGET_64BIT
1430      that is not known at this moment.  Mark these values with 2 and
1431      let user the to override these.  In case there is no command line option
1432      specifying them, we will set the defaults in override_options.  */
1433   if (optimize >= 1)
1434     flag_omit_frame_pointer = 2;
1435   flag_pcc_struct_return = 2;
1436   flag_asynchronous_unwind_tables = 2;
1437 }
1438 \f
1439 /* Table of valid machine attributes.  */
1440 const struct attribute_spec ix86_attribute_table[] =
1441 {
1442   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
1443   /* Stdcall attribute says callee is responsible for popping arguments
1444      if they are not variable.  */
1445   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cdecl_attribute },
1446   /* Fastcall attribute says callee is responsible for popping arguments
1447      if they are not variable.  */
1448   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cdecl_attribute },
1449   /* Cdecl attribute says the callee is a normal C declaration */
1450   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cdecl_attribute },
1451   /* Regparm attribute specifies how many integer arguments are to be
1452      passed in registers.  */
1453   { "regparm",   1, 1, false, true,  true,  ix86_handle_regparm_attribute },
1454 #ifdef TARGET_DLLIMPORT_DECL_ATTRIBUTES
1455   { "dllimport", 0, 0, false, false, false, ix86_handle_dll_attribute },
1456   { "dllexport", 0, 0, false, false, false, ix86_handle_dll_attribute },
1457   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
1458 #endif
1459   { NULL,        0, 0, false, false, false, NULL }
1460 };
1461
1462 /* If PIC, we cannot make sibling calls to global functions
1463    because the PLT requires %ebx live.
1464    If we are returning floats on the register stack, we cannot make
1465    sibling calls to functions that return floats.  (The stack adjust
1466    instruction will wind up after the sibcall jump, and not be executed.)  */
1467
1468 static bool
1469 ix86_function_ok_for_sibcall (decl, exp)
1470      tree decl;
1471      tree exp;
1472 {
1473   /* If we are generating position-independent code, we cannot sibcall
1474      optimize any indirect call, or a direct call to a global function,
1475      as the PLT requires %ebx be live.  */
1476   if (!TARGET_64BIT && flag_pic && (!decl || TREE_PUBLIC (decl)))
1477     return false;
1478
1479   /* If we are returning floats on the 80387 register stack, we cannot
1480      make a sibcall from a function that doesn't return a float to a
1481      function that does; the necessary stack adjustment will not be
1482      executed.  */
1483   if (STACK_REG_P (ix86_function_value (TREE_TYPE (exp)))
1484       && ! STACK_REG_P (ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)))))
1485     return false;
1486
1487   /* If this call is indirect, we'll need to be able to use a call-clobbered
1488      register for the address of the target function.  Make sure that all 
1489      such registers are not used for passing parameters.  */
1490   if (!decl && !TARGET_64BIT)
1491     {
1492       int regparm = ix86_regparm;
1493       tree attr, type;
1494
1495       /* We're looking at the CALL_EXPR, we need the type of the function.  */
1496       type = TREE_OPERAND (exp, 0);             /* pointer expression */
1497       type = TREE_TYPE (type);                  /* pointer type */
1498       type = TREE_TYPE (type);                  /* function type */
1499
1500       attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
1501       if (attr)
1502         regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
1503
1504       if (regparm >= 3)
1505         {
1506           /* ??? Need to count the actual number of registers to be used,
1507              not the possible number of registers.  Fix later.  */
1508           return false;
1509         }
1510     }
1511
1512   /* Otherwise okay.  That also includes certain types of indirect calls.  */
1513   return true;
1514 }
1515
1516 /* Handle a "cdecl", "stdcall", or "fastcall" attribute;
1517    arguments as in struct attribute_spec.handler.  */
1518 static tree
1519 ix86_handle_cdecl_attribute (node, name, args, flags, no_add_attrs)
1520      tree *node;
1521      tree name;
1522      tree args ATTRIBUTE_UNUSED;
1523      int flags ATTRIBUTE_UNUSED;
1524      bool *no_add_attrs;
1525 {
1526   if (TREE_CODE (*node) != FUNCTION_TYPE
1527       && TREE_CODE (*node) != METHOD_TYPE
1528       && TREE_CODE (*node) != FIELD_DECL
1529       && TREE_CODE (*node) != TYPE_DECL)
1530     {
1531       warning ("`%s' attribute only applies to functions",
1532                IDENTIFIER_POINTER (name));
1533       *no_add_attrs = true;
1534     }
1535   else
1536     {
1537       if (is_attribute_p ("fastcall", name))
1538         {
1539           if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
1540             {
1541               error ("fastcall and stdcall attributes are not compatible");
1542             }
1543            else if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
1544             {
1545               error ("fastcall and regparm attributes are not compatible");
1546             }
1547         }
1548       else if (is_attribute_p ("stdcall", name))
1549         {
1550           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
1551             {
1552               error ("fastcall and stdcall attributes are not compatible");
1553             }
1554         }
1555     }
1556
1557   if (TARGET_64BIT)
1558     {
1559       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
1560       *no_add_attrs = true;
1561     }
1562
1563   return NULL_TREE;
1564 }
1565
1566 /* Handle a "regparm" attribute;
1567    arguments as in struct attribute_spec.handler.  */
1568 static tree
1569 ix86_handle_regparm_attribute (node, name, args, flags, no_add_attrs)
1570      tree *node;
1571      tree name;
1572      tree args;
1573      int flags ATTRIBUTE_UNUSED;
1574      bool *no_add_attrs;
1575 {
1576   if (TREE_CODE (*node) != FUNCTION_TYPE
1577       && TREE_CODE (*node) != METHOD_TYPE
1578       && TREE_CODE (*node) != FIELD_DECL
1579       && TREE_CODE (*node) != TYPE_DECL)
1580     {
1581       warning ("`%s' attribute only applies to functions",
1582                IDENTIFIER_POINTER (name));
1583       *no_add_attrs = true;
1584     }
1585   else
1586     {
1587       tree cst;
1588
1589       cst = TREE_VALUE (args);
1590       if (TREE_CODE (cst) != INTEGER_CST)
1591         {
1592           warning ("`%s' attribute requires an integer constant argument",
1593                    IDENTIFIER_POINTER (name));
1594           *no_add_attrs = true;
1595         }
1596       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
1597         {
1598           warning ("argument to `%s' attribute larger than %d",
1599                    IDENTIFIER_POINTER (name), REGPARM_MAX);
1600           *no_add_attrs = true;
1601         }
1602
1603       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
1604     {
1605       error ("fastcall and regparm attributes are not compatible");
1606     }
1607     }
1608
1609   return NULL_TREE;
1610 }
1611
1612 /* Return 0 if the attributes for two types are incompatible, 1 if they
1613    are compatible, and 2 if they are nearly compatible (which causes a
1614    warning to be generated).  */
1615
1616 static int
1617 ix86_comp_type_attributes (type1, type2)
1618      tree type1;
1619      tree type2;
1620 {
1621   /* Check for mismatch of non-default calling convention.  */
1622   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
1623
1624   if (TREE_CODE (type1) != FUNCTION_TYPE)
1625     return 1;
1626
1627   /*  Check for mismatched fastcall types */ 
1628   if (!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
1629       != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
1630     return 0; 
1631
1632   /* Check for mismatched return types (cdecl vs stdcall).  */
1633   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
1634       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
1635     return 0;
1636   return 1;
1637 }
1638 \f
1639 /* Return the regparm value for a fuctio with the indicated TYPE.  */
1640
1641 static int
1642 ix86_fntype_regparm (type)
1643      tree type;
1644 {
1645   tree attr;
1646
1647   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
1648   if (attr)
1649     return TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
1650   else
1651     return ix86_regparm;
1652 }
1653
1654 /* Value is the number of bytes of arguments automatically
1655    popped when returning from a subroutine call.
1656    FUNDECL is the declaration node of the function (as a tree),
1657    FUNTYPE is the data type of the function (as a tree),
1658    or for a library call it is an identifier node for the subroutine name.
1659    SIZE is the number of bytes of arguments passed on the stack.
1660
1661    On the 80386, the RTD insn may be used to pop them if the number
1662      of args is fixed, but if the number is variable then the caller
1663      must pop them all.  RTD can't be used for library calls now
1664      because the library is compiled with the Unix compiler.
1665    Use of RTD is a selectable option, since it is incompatible with
1666    standard Unix calling sequences.  If the option is not selected,
1667    the caller must always pop the args.
1668
1669    The attribute stdcall is equivalent to RTD on a per module basis.  */
1670
1671 int
1672 ix86_return_pops_args (fundecl, funtype, size)
1673      tree fundecl;
1674      tree funtype;
1675      int size;
1676 {
1677   int rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
1678
1679     /* Cdecl functions override -mrtd, and never pop the stack.  */
1680   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype))) {
1681
1682     /* Stdcall and fastcall functions will pop the stack if not variable args. */
1683     if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
1684         || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
1685       rtd = 1;
1686
1687     if (rtd
1688         && (TYPE_ARG_TYPES (funtype) == NULL_TREE
1689             || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (funtype)))
1690                 == void_type_node)))
1691       return size;
1692   }
1693
1694   /* Lose any fake structure return argument if it is passed on the stack.  */
1695   if (aggregate_value_p (TREE_TYPE (funtype))
1696       && !TARGET_64BIT)
1697     {
1698       int nregs = ix86_fntype_regparm (funtype);
1699
1700       if (!nregs)
1701         return GET_MODE_SIZE (Pmode);
1702     }
1703
1704   return 0;
1705 }
1706 \f
1707 /* Argument support functions.  */
1708
1709 /* Return true when register may be used to pass function parameters.  */
1710 bool
1711 ix86_function_arg_regno_p (regno)
1712      int regno;
1713 {
1714   int i;
1715   if (!TARGET_64BIT)
1716     return (regno < REGPARM_MAX
1717             || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
1718   if (SSE_REGNO_P (regno) && TARGET_SSE)
1719     return true;
1720   /* RAX is used as hidden argument to va_arg functions.  */
1721   if (!regno)
1722     return true;
1723   for (i = 0; i < REGPARM_MAX; i++)
1724     if (regno == x86_64_int_parameter_registers[i])
1725       return true;
1726   return false;
1727 }
1728
1729 /* Initialize a variable CUM of type CUMULATIVE_ARGS
1730    for a call to a function whose data type is FNTYPE.
1731    For a library call, FNTYPE is 0.  */
1732
1733 void
1734 init_cumulative_args (cum, fntype, libname)
1735      CUMULATIVE_ARGS *cum;      /* Argument info to initialize */
1736      tree fntype;               /* tree ptr for function decl */
1737      rtx libname;               /* SYMBOL_REF of library name or 0 */
1738 {
1739   static CUMULATIVE_ARGS zero_cum;
1740   tree param, next_param;
1741
1742   if (TARGET_DEBUG_ARG)
1743     {
1744       fprintf (stderr, "\ninit_cumulative_args (");
1745       if (fntype)
1746         fprintf (stderr, "fntype code = %s, ret code = %s",
1747                  tree_code_name[(int) TREE_CODE (fntype)],
1748                  tree_code_name[(int) TREE_CODE (TREE_TYPE (fntype))]);
1749       else
1750         fprintf (stderr, "no fntype");
1751
1752       if (libname)
1753         fprintf (stderr, ", libname = %s", XSTR (libname, 0));
1754     }
1755
1756   *cum = zero_cum;
1757
1758   /* Set up the number of registers to use for passing arguments.  */
1759   cum->nregs = ix86_regparm;
1760   cum->sse_nregs = SSE_REGPARM_MAX;
1761   if (fntype && !TARGET_64BIT)
1762     {
1763       tree attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (fntype));
1764
1765       if (attr)
1766         cum->nregs = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
1767     }
1768   cum->maybe_vaarg = false;
1769
1770   /* Use ecx and edx registers if function has fastcall attribute */
1771   if (fntype && !TARGET_64BIT)
1772     {
1773       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
1774         {
1775           cum->nregs = 2;
1776           cum->fastcall = 1;
1777         }
1778     }
1779
1780
1781   /* Determine if this function has variable arguments.  This is
1782      indicated by the last argument being 'void_type_mode' if there
1783      are no variable arguments.  If there are variable arguments, then
1784      we won't pass anything in registers */
1785
1786   if (cum->nregs)
1787     {
1788       for (param = (fntype) ? TYPE_ARG_TYPES (fntype) : 0;
1789            param != 0; param = next_param)
1790         {
1791           next_param = TREE_CHAIN (param);
1792           if (next_param == 0 && TREE_VALUE (param) != void_type_node)
1793             {
1794               if (!TARGET_64BIT)
1795                 {
1796                   cum->nregs = 0;
1797                   cum->fastcall = 0;
1798                 }
1799               cum->maybe_vaarg = true;
1800             }
1801         }
1802     }
1803   if ((!fntype && !libname)
1804       || (fntype && !TYPE_ARG_TYPES (fntype)))
1805     cum->maybe_vaarg = 1;
1806
1807   if (TARGET_DEBUG_ARG)
1808     fprintf (stderr, ", nregs=%d )\n", cum->nregs);
1809
1810   return;
1811 }
1812
1813 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
1814    of this code is to classify each 8bytes of incoming argument by the register
1815    class and assign registers accordingly.  */
1816
1817 /* Return the union class of CLASS1 and CLASS2.
1818    See the x86-64 PS ABI for details.  */
1819
1820 static enum x86_64_reg_class
1821 merge_classes (class1, class2)
1822      enum x86_64_reg_class class1, class2;
1823 {
1824   /* Rule #1: If both classes are equal, this is the resulting class.  */
1825   if (class1 == class2)
1826     return class1;
1827
1828   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
1829      the other class.  */
1830   if (class1 == X86_64_NO_CLASS)
1831     return class2;
1832   if (class2 == X86_64_NO_CLASS)
1833     return class1;
1834
1835   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
1836   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
1837     return X86_64_MEMORY_CLASS;
1838
1839   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
1840   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
1841       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
1842     return X86_64_INTEGERSI_CLASS;
1843   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
1844       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
1845     return X86_64_INTEGER_CLASS;
1846
1847   /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used.  */
1848   if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS
1849       || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS)
1850     return X86_64_MEMORY_CLASS;
1851
1852   /* Rule #6: Otherwise class SSE is used.  */
1853   return X86_64_SSE_CLASS;
1854 }
1855
1856 /* Classify the argument of type TYPE and mode MODE.
1857    CLASSES will be filled by the register class used to pass each word
1858    of the operand.  The number of words is returned.  In case the parameter
1859    should be passed in memory, 0 is returned. As a special case for zero
1860    sized containers, classes[0] will be NO_CLASS and 1 is returned.
1861
1862    BIT_OFFSET is used internally for handling records and specifies offset
1863    of the offset in bits modulo 256 to avoid overflow cases.
1864
1865    See the x86-64 PS ABI for details.
1866 */
1867
1868 static int
1869 classify_argument (mode, type, classes, bit_offset)
1870      enum machine_mode mode;
1871      tree type;
1872      enum x86_64_reg_class classes[MAX_CLASSES];
1873      int bit_offset;
1874 {
1875   int bytes =
1876     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
1877   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1878
1879   /* Variable sized entities are always passed/returned in memory.  */
1880   if (bytes < 0)
1881     return 0;
1882
1883   if (type && AGGREGATE_TYPE_P (type))
1884     {
1885       int i;
1886       tree field;
1887       enum x86_64_reg_class subclasses[MAX_CLASSES];
1888
1889       /* On x86-64 we pass structures larger than 16 bytes on the stack.  */
1890       if (bytes > 16)
1891         return 0;
1892
1893       for (i = 0; i < words; i++)
1894         classes[i] = X86_64_NO_CLASS;
1895
1896       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
1897          signalize memory class, so handle it as special case.  */
1898       if (!words)
1899         {
1900           classes[0] = X86_64_NO_CLASS;
1901           return 1;
1902         }
1903
1904       /* Classify each field of record and merge classes.  */
1905       if (TREE_CODE (type) == RECORD_TYPE)
1906         {
1907           /* For classes first merge in the field of the subclasses.  */
1908           if (TYPE_BINFO (type) != NULL && TYPE_BINFO_BASETYPES (type) != NULL)
1909             {
1910               tree bases = TYPE_BINFO_BASETYPES (type);
1911               int n_bases = TREE_VEC_LENGTH (bases);
1912               int i;
1913
1914               for (i = 0; i < n_bases; ++i)
1915                 {
1916                    tree binfo = TREE_VEC_ELT (bases, i);
1917                    int num;
1918                    int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8;
1919                    tree type = BINFO_TYPE (binfo);
1920
1921                    num = classify_argument (TYPE_MODE (type),
1922                                             type, subclasses,
1923                                             (offset + bit_offset) % 256);
1924                    if (!num)
1925                      return 0;
1926                    for (i = 0; i < num; i++)
1927                      {
1928                        int pos = (offset + (bit_offset % 64)) / 8 / 8;
1929                        classes[i + pos] =
1930                          merge_classes (subclasses[i], classes[i + pos]);
1931                      }
1932                 }
1933             }
1934           /* And now merge the fields of structure.   */
1935           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1936             {
1937               if (TREE_CODE (field) == FIELD_DECL)
1938                 {
1939                   int num;
1940
1941                   /* Bitfields are always classified as integer.  Handle them
1942                      early, since later code would consider them to be
1943                      misaligned integers.  */
1944                   if (DECL_BIT_FIELD (field))
1945                     {
1946                       for (i = int_bit_position (field) / 8 / 8;
1947                            i < (int_bit_position (field)
1948                                 + tree_low_cst (DECL_SIZE (field), 0)
1949                                 + 63) / 8 / 8; i++)
1950                         classes[i] =
1951                           merge_classes (X86_64_INTEGER_CLASS,
1952                                          classes[i]);
1953                     }
1954                   else
1955                     {
1956                       num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
1957                                                TREE_TYPE (field), subclasses,
1958                                                (int_bit_position (field)
1959                                                 + bit_offset) % 256);
1960                       if (!num)
1961                         return 0;
1962                       for (i = 0; i < num; i++)
1963                         {
1964                           int pos =
1965                             (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
1966                           classes[i + pos] =
1967                             merge_classes (subclasses[i], classes[i + pos]);
1968                         }
1969                     }
1970                 }
1971             }
1972         }
1973       /* Arrays are handled as small records.  */
1974       else if (TREE_CODE (type) == ARRAY_TYPE)
1975         {
1976           int num;
1977           num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
1978                                    TREE_TYPE (type), subclasses, bit_offset);
1979           if (!num)
1980             return 0;
1981
1982           /* The partial classes are now full classes.  */
1983           if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
1984             subclasses[0] = X86_64_SSE_CLASS;
1985           if (subclasses[0] == X86_64_INTEGERSI_CLASS && bytes != 4)
1986             subclasses[0] = X86_64_INTEGER_CLASS;
1987
1988           for (i = 0; i < words; i++)
1989             classes[i] = subclasses[i % num];
1990         }
1991       /* Unions are similar to RECORD_TYPE but offset is always 0.  */
1992       else if (TREE_CODE (type) == UNION_TYPE
1993                || TREE_CODE (type) == QUAL_UNION_TYPE)
1994         {
1995           /* For classes first merge in the field of the subclasses.  */
1996           if (TYPE_BINFO (type) != NULL && TYPE_BINFO_BASETYPES (type) != NULL)
1997             {
1998               tree bases = TYPE_BINFO_BASETYPES (type);
1999               int n_bases = TREE_VEC_LENGTH (bases);
2000               int i;
2001
2002               for (i = 0; i < n_bases; ++i)
2003                 {
2004                    tree binfo = TREE_VEC_ELT (bases, i);
2005                    int num;
2006                    int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8;
2007                    tree type = BINFO_TYPE (binfo);
2008
2009                    num = classify_argument (TYPE_MODE (type),
2010                                             type, subclasses,
2011                                             (offset + (bit_offset % 64)) % 256);
2012                    if (!num)
2013                      return 0;
2014                    for (i = 0; i < num; i++)
2015                      {
2016                        int pos = (offset + (bit_offset % 64)) / 8 / 8;
2017                        classes[i + pos] =
2018                          merge_classes (subclasses[i], classes[i + pos]);
2019                      }
2020                 }
2021             }
2022           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2023             {
2024               if (TREE_CODE (field) == FIELD_DECL)
2025                 {
2026                   int num;
2027                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
2028                                            TREE_TYPE (field), subclasses,
2029                                            bit_offset);
2030                   if (!num)
2031                     return 0;
2032                   for (i = 0; i < num; i++)
2033                     classes[i] = merge_classes (subclasses[i], classes[i]);
2034                 }
2035             }
2036         }
2037       else
2038         abort ();
2039
2040       /* Final merger cleanup.  */
2041       for (i = 0; i < words; i++)
2042         {
2043           /* If one class is MEMORY, everything should be passed in
2044              memory.  */
2045           if (classes[i] == X86_64_MEMORY_CLASS)
2046             return 0;
2047
2048           /* The X86_64_SSEUP_CLASS should be always preceded by
2049              X86_64_SSE_CLASS.  */
2050           if (classes[i] == X86_64_SSEUP_CLASS
2051               && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
2052             classes[i] = X86_64_SSE_CLASS;
2053
2054           /*  X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS.  */
2055           if (classes[i] == X86_64_X87UP_CLASS
2056               && (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
2057             classes[i] = X86_64_SSE_CLASS;
2058         }
2059       return words;
2060     }
2061
2062   /* Compute alignment needed.  We align all types to natural boundaries with
2063      exception of XFmode that is aligned to 64bits.  */
2064   if (mode != VOIDmode && mode != BLKmode)
2065     {
2066       int mode_alignment = GET_MODE_BITSIZE (mode);
2067
2068       if (mode == XFmode)
2069         mode_alignment = 128;
2070       else if (mode == XCmode)
2071         mode_alignment = 256;
2072       /* Misaligned fields are always returned in memory.  */
2073       if (bit_offset % mode_alignment)
2074         return 0;
2075     }
2076
2077   /* Classification of atomic types.  */
2078   switch (mode)
2079     {
2080     case DImode:
2081     case SImode:
2082     case HImode:
2083     case QImode:
2084     case CSImode:
2085     case CHImode:
2086     case CQImode:
2087       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
2088         classes[0] = X86_64_INTEGERSI_CLASS;
2089       else
2090         classes[0] = X86_64_INTEGER_CLASS;
2091       return 1;
2092     case CDImode:
2093     case TImode:
2094       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
2095       return 2;
2096     case CTImode:
2097       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
2098       classes[2] = classes[3] = X86_64_INTEGER_CLASS;
2099       return 4;
2100     case SFmode:
2101       if (!(bit_offset % 64))
2102         classes[0] = X86_64_SSESF_CLASS;
2103       else
2104         classes[0] = X86_64_SSE_CLASS;
2105       return 1;
2106     case DFmode:
2107       classes[0] = X86_64_SSEDF_CLASS;
2108       return 1;
2109     case TFmode:
2110       classes[0] = X86_64_X87_CLASS;
2111       classes[1] = X86_64_X87UP_CLASS;
2112       return 2;
2113     case TCmode:
2114       classes[0] = X86_64_X87_CLASS;
2115       classes[1] = X86_64_X87UP_CLASS;
2116       classes[2] = X86_64_X87_CLASS;
2117       classes[3] = X86_64_X87UP_CLASS;
2118       return 4;
2119     case DCmode:
2120       classes[0] = X86_64_SSEDF_CLASS;
2121       classes[1] = X86_64_SSEDF_CLASS;
2122       return 2;
2123     case SCmode:
2124       classes[0] = X86_64_SSE_CLASS;
2125       return 1;
2126     case V4SFmode:
2127     case V4SImode:
2128     case V16QImode:
2129     case V8HImode:
2130     case V2DFmode:
2131     case V2DImode:
2132       classes[0] = X86_64_SSE_CLASS;
2133       classes[1] = X86_64_SSEUP_CLASS;
2134       return 2;
2135     case V2SFmode:
2136     case V2SImode:
2137     case V4HImode:
2138     case V8QImode:
2139       return 0;
2140     case BLKmode:
2141     case VOIDmode:
2142       return 0;
2143     default:
2144       abort ();
2145     }
2146 }
2147
2148 /* Examine the argument and return set number of register required in each
2149    class.  Return 0 iff parameter should be passed in memory.  */
2150 static int
2151 examine_argument (mode, type, in_return, int_nregs, sse_nregs)
2152      enum machine_mode mode;
2153      tree type;
2154      int *int_nregs, *sse_nregs;
2155      int in_return;
2156 {
2157   enum x86_64_reg_class class[MAX_CLASSES];
2158   int n = classify_argument (mode, type, class, 0);
2159
2160   *int_nregs = 0;
2161   *sse_nregs = 0;
2162   if (!n)
2163     return 0;
2164   for (n--; n >= 0; n--)
2165     switch (class[n])
2166       {
2167       case X86_64_INTEGER_CLASS:
2168       case X86_64_INTEGERSI_CLASS:
2169         (*int_nregs)++;
2170         break;
2171       case X86_64_SSE_CLASS:
2172       case X86_64_SSESF_CLASS:
2173       case X86_64_SSEDF_CLASS:
2174         (*sse_nregs)++;
2175         break;
2176       case X86_64_NO_CLASS:
2177       case X86_64_SSEUP_CLASS:
2178         break;
2179       case X86_64_X87_CLASS:
2180       case X86_64_X87UP_CLASS:
2181         if (!in_return)
2182           return 0;
2183         break;
2184       case X86_64_MEMORY_CLASS:
2185         abort ();
2186       }
2187   return 1;
2188 }
2189 /* Construct container for the argument used by GCC interface.  See
2190    FUNCTION_ARG for the detailed description.  */
2191 static rtx
2192 construct_container (mode, type, in_return, nintregs, nsseregs, intreg, sse_regno)
2193      enum machine_mode mode;
2194      tree type;
2195      int in_return;
2196      int nintregs, nsseregs;
2197      const int * intreg;
2198      int sse_regno;
2199 {
2200   enum machine_mode tmpmode;
2201   int bytes =
2202     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
2203   enum x86_64_reg_class class[MAX_CLASSES];
2204   int n;
2205   int i;
2206   int nexps = 0;
2207   int needed_sseregs, needed_intregs;
2208   rtx exp[MAX_CLASSES];
2209   rtx ret;
2210
2211   n = classify_argument (mode, type, class, 0);
2212   if (TARGET_DEBUG_ARG)
2213     {
2214       if (!n)
2215         fprintf (stderr, "Memory class\n");
2216       else
2217         {
2218           fprintf (stderr, "Classes:");
2219           for (i = 0; i < n; i++)
2220             {
2221               fprintf (stderr, " %s", x86_64_reg_class_name[class[i]]);
2222             }
2223            fprintf (stderr, "\n");
2224         }
2225     }
2226   if (!n)
2227     return NULL;
2228   if (!examine_argument (mode, type, in_return, &needed_intregs, &needed_sseregs))
2229     return NULL;
2230   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
2231     return NULL;
2232
2233   /* First construct simple cases.  Avoid SCmode, since we want to use
2234      single register to pass this type.  */
2235   if (n == 1 && mode != SCmode)
2236     switch (class[0])
2237       {
2238       case X86_64_INTEGER_CLASS:
2239       case X86_64_INTEGERSI_CLASS:
2240         return gen_rtx_REG (mode, intreg[0]);
2241       case X86_64_SSE_CLASS:
2242       case X86_64_SSESF_CLASS:
2243       case X86_64_SSEDF_CLASS:
2244         return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
2245       case X86_64_X87_CLASS:
2246         return gen_rtx_REG (mode, FIRST_STACK_REG);
2247       case X86_64_NO_CLASS:
2248         /* Zero sized array, struct or class.  */
2249         return NULL;
2250       default:
2251         abort ();
2252       }
2253   if (n == 2 && class[0] == X86_64_SSE_CLASS && class[1] == X86_64_SSEUP_CLASS)
2254     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
2255   if (n == 2
2256       && class[0] == X86_64_X87_CLASS && class[1] == X86_64_X87UP_CLASS)
2257     return gen_rtx_REG (TFmode, FIRST_STACK_REG);
2258   if (n == 2 && class[0] == X86_64_INTEGER_CLASS
2259       && class[1] == X86_64_INTEGER_CLASS
2260       && (mode == CDImode || mode == TImode)
2261       && intreg[0] + 1 == intreg[1])
2262     return gen_rtx_REG (mode, intreg[0]);
2263   if (n == 4
2264       && class[0] == X86_64_X87_CLASS && class[1] == X86_64_X87UP_CLASS
2265       && class[2] == X86_64_X87_CLASS && class[3] == X86_64_X87UP_CLASS)
2266     return gen_rtx_REG (TCmode, FIRST_STACK_REG);
2267
2268   /* Otherwise figure out the entries of the PARALLEL.  */
2269   for (i = 0; i < n; i++)
2270     {
2271       switch (class[i])
2272         {
2273           case X86_64_NO_CLASS:
2274             break;
2275           case X86_64_INTEGER_CLASS:
2276           case X86_64_INTEGERSI_CLASS:
2277             /* Merge TImodes on aligned occasions here too.  */
2278             if (i * 8 + 8 > bytes)
2279               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
2280             else if (class[i] == X86_64_INTEGERSI_CLASS)
2281               tmpmode = SImode;
2282             else
2283               tmpmode = DImode;
2284             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
2285             if (tmpmode == BLKmode)
2286               tmpmode = DImode;
2287             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2288                                                gen_rtx_REG (tmpmode, *intreg),
2289                                                GEN_INT (i*8));
2290             intreg++;
2291             break;
2292           case X86_64_SSESF_CLASS:
2293             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2294                                                gen_rtx_REG (SFmode,
2295                                                             SSE_REGNO (sse_regno)),
2296                                                GEN_INT (i*8));
2297             sse_regno++;
2298             break;
2299           case X86_64_SSEDF_CLASS:
2300             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2301                                                gen_rtx_REG (DFmode,
2302                                                             SSE_REGNO (sse_regno)),
2303                                                GEN_INT (i*8));
2304             sse_regno++;
2305             break;
2306           case X86_64_SSE_CLASS:
2307             if (i < n - 1 && class[i + 1] == X86_64_SSEUP_CLASS)
2308               tmpmode = TImode;
2309             else
2310               tmpmode = DImode;
2311             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
2312                                                gen_rtx_REG (tmpmode,
2313                                                             SSE_REGNO (sse_regno)),
2314                                                GEN_INT (i*8));
2315             if (tmpmode == TImode)
2316               i++;
2317             sse_regno++;
2318             break;
2319           default:
2320             abort ();
2321         }
2322     }
2323   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
2324   for (i = 0; i < nexps; i++)
2325     XVECEXP (ret, 0, i) = exp [i];
2326   return ret;
2327 }
2328
2329 /* Update the data in CUM to advance over an argument
2330    of mode MODE and data type TYPE.
2331    (TYPE is null for libcalls where that information may not be available.)  */
2332
2333 void
2334 function_arg_advance (cum, mode, type, named)
2335      CUMULATIVE_ARGS *cum;      /* current arg information */
2336      enum machine_mode mode;    /* current arg mode */
2337      tree type;                 /* type of the argument or 0 if lib support */
2338      int named;                 /* whether or not the argument was named */
2339 {
2340   int bytes =
2341     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
2342   int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2343
2344   if (TARGET_DEBUG_ARG)
2345     fprintf (stderr,
2346              "function_adv (sz=%d, wds=%2d, nregs=%d, mode=%s, named=%d)\n\n",
2347              words, cum->words, cum->nregs, GET_MODE_NAME (mode), named);
2348   if (TARGET_64BIT)
2349     {
2350       int int_nregs, sse_nregs;
2351       if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
2352         cum->words += words;
2353       else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
2354         {
2355           cum->nregs -= int_nregs;
2356           cum->sse_nregs -= sse_nregs;
2357           cum->regno += int_nregs;
2358           cum->sse_regno += sse_nregs;
2359         }
2360       else
2361         cum->words += words;
2362     }
2363   else
2364     {
2365       if (TARGET_SSE && mode == TImode)
2366         {
2367           cum->sse_words += words;
2368           cum->sse_nregs -= 1;
2369           cum->sse_regno += 1;
2370           if (cum->sse_nregs <= 0)
2371             {
2372               cum->sse_nregs = 0;
2373               cum->sse_regno = 0;
2374             }
2375         }
2376       else
2377         {
2378           cum->words += words;
2379           cum->nregs -= words;
2380           cum->regno += words;
2381
2382           if (cum->nregs <= 0)
2383             {
2384               cum->nregs = 0;
2385               cum->regno = 0;
2386             }
2387         }
2388     }
2389   return;
2390 }
2391
2392 /* Define where to put the arguments to a function.
2393    Value is zero to push the argument on the stack,
2394    or a hard register in which to store the argument.
2395
2396    MODE is the argument's machine mode.
2397    TYPE is the data type of the argument (as a tree).
2398     This is null for libcalls where that information may
2399     not be available.
2400    CUM is a variable of type CUMULATIVE_ARGS which gives info about
2401     the preceding args and about the function being called.
2402    NAMED is nonzero if this argument is a named parameter
2403     (otherwise it is an extra parameter matching an ellipsis).  */
2404
2405 rtx
2406 function_arg (cum, mode, type, named)
2407      CUMULATIVE_ARGS *cum;      /* current arg information */
2408      enum machine_mode mode;    /* current arg mode */
2409      tree type;                 /* type of the argument or 0 if lib support */
2410      int named;                 /* != 0 for normal args, == 0 for ... args */
2411 {
2412   rtx ret   = NULL_RTX;
2413   int bytes =
2414     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
2415   int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2416
2417   /* Handle a hidden AL argument containing number of registers for varargs
2418      x86-64 functions.  For i386 ABI just return constm1_rtx to avoid
2419      any AL settings.  */
2420   if (mode == VOIDmode)
2421     {
2422       if (TARGET_64BIT)
2423         return GEN_INT (cum->maybe_vaarg
2424                         ? (cum->sse_nregs < 0
2425                            ? SSE_REGPARM_MAX
2426                            : cum->sse_regno)
2427                         : -1);
2428       else
2429         return constm1_rtx;
2430     }
2431   if (TARGET_64BIT)
2432     ret = construct_container (mode, type, 0, cum->nregs, cum->sse_nregs,
2433                                &x86_64_int_parameter_registers [cum->regno],
2434                                cum->sse_regno);
2435   else
2436     switch (mode)
2437       {
2438         /* For now, pass fp/complex values on the stack.  */
2439       default:
2440         break;
2441
2442       case BLKmode:
2443       case DImode:
2444       case SImode:
2445       case HImode:
2446       case QImode:
2447         if (words <= cum->nregs)
2448           {
2449             int regno = cum->regno;
2450
2451             /* Fastcall allocates the first two DWORD (SImode) or
2452                smaller arguments to ECX and EDX.  */
2453             if (cum->fastcall)
2454               {
2455                 if (mode == BLKmode || mode == DImode)
2456                   break;
2457  
2458                 /* ECX not EAX is the first allocated register.  */
2459                 if (regno == 0)
2460                       regno = 2;
2461               }
2462             ret = gen_rtx_REG (mode, regno);
2463           }
2464         break;
2465       case TImode:
2466         if (cum->sse_nregs)
2467           ret = gen_rtx_REG (mode, cum->sse_regno);
2468         break;
2469       }
2470
2471   if (TARGET_DEBUG_ARG)
2472     {
2473       fprintf (stderr,
2474                "function_arg (size=%d, wds=%2d, nregs=%d, mode=%4s, named=%d, ",
2475                words, cum->words, cum->nregs, GET_MODE_NAME (mode), named);
2476
2477       if (ret)
2478         print_simple_rtl (stderr, ret);
2479       else
2480         fprintf (stderr, ", stack");
2481
2482       fprintf (stderr, " )\n");
2483     }
2484
2485   return ret;
2486 }
2487
2488 /* Gives the alignment boundary, in bits, of an argument with the specified mode
2489    and type.   */
2490
2491 int
2492 ix86_function_arg_boundary (mode, type)
2493      enum machine_mode mode;
2494      tree type;
2495 {
2496   int align;
2497   if (!TARGET_64BIT)
2498     return PARM_BOUNDARY;
2499   if (type)
2500     align = TYPE_ALIGN (type);
2501   else
2502     align = GET_MODE_ALIGNMENT (mode);
2503   if (align < PARM_BOUNDARY)
2504     align = PARM_BOUNDARY;
2505   if (align > 128)
2506     align = 128;
2507   return align;
2508 }
2509
2510 /* Return true if N is a possible register number of function value.  */
2511 bool
2512 ix86_function_value_regno_p (regno)
2513      int regno;
2514 {
2515   if (!TARGET_64BIT)
2516     {
2517       return ((regno) == 0
2518               || ((regno) == FIRST_FLOAT_REG && TARGET_FLOAT_RETURNS_IN_80387)
2519               || ((regno) == FIRST_SSE_REG && TARGET_SSE));
2520     }
2521   return ((regno) == 0 || (regno) == FIRST_FLOAT_REG
2522           || ((regno) == FIRST_SSE_REG && TARGET_SSE)
2523           || ((regno) == FIRST_FLOAT_REG && TARGET_FLOAT_RETURNS_IN_80387));
2524 }
2525
2526 /* Define how to find the value returned by a function.
2527    VALTYPE is the data type of the value (as a tree).
2528    If the precise function being called is known, FUNC is its FUNCTION_DECL;
2529    otherwise, FUNC is 0.  */
2530 rtx
2531 ix86_function_value (valtype)
2532      tree valtype;
2533 {
2534   if (TARGET_64BIT)
2535     {
2536       rtx ret = construct_container (TYPE_MODE (valtype), valtype, 1,
2537                                      REGPARM_MAX, SSE_REGPARM_MAX,
2538                                      x86_64_int_return_registers, 0);
2539       /* For zero sized structures, construct_container return NULL, but we need
2540          to keep rest of compiler happy by returning meaningful value.  */
2541       if (!ret)
2542         ret = gen_rtx_REG (TYPE_MODE (valtype), 0);
2543       return ret;
2544     }
2545   else
2546     return gen_rtx_REG (TYPE_MODE (valtype),
2547                         ix86_value_regno (TYPE_MODE (valtype)));
2548 }
2549
2550 /* Return false iff type is returned in memory.  */
2551 int
2552 ix86_return_in_memory (type)
2553      tree type;
2554 {
2555   int needed_intregs, needed_sseregs;
2556   if (TARGET_64BIT)
2557     {
2558       return !examine_argument (TYPE_MODE (type), type, 1,
2559                                 &needed_intregs, &needed_sseregs);
2560     }
2561   else
2562     {
2563       if (TYPE_MODE (type) == BLKmode
2564           || (VECTOR_MODE_P (TYPE_MODE (type))
2565               && int_size_in_bytes (type) == 8)
2566           || (int_size_in_bytes (type) > 12 && TYPE_MODE (type) != TImode
2567               && TYPE_MODE (type) != TFmode
2568               && !VECTOR_MODE_P (TYPE_MODE (type))))
2569         return 1;
2570       return 0;
2571     }
2572 }
2573
2574 /* Define how to find the value returned by a library function
2575    assuming the value has mode MODE.  */
2576 rtx
2577 ix86_libcall_value (mode)
2578    enum machine_mode mode;
2579 {
2580   if (TARGET_64BIT)
2581     {
2582       switch (mode)
2583         {
2584           case SFmode:
2585           case SCmode:
2586           case DFmode:
2587           case DCmode:
2588             return gen_rtx_REG (mode, FIRST_SSE_REG);
2589           case TFmode:
2590           case TCmode:
2591             return gen_rtx_REG (mode, FIRST_FLOAT_REG);
2592           default:
2593             return gen_rtx_REG (mode, 0);
2594         }
2595     }
2596   else
2597    return gen_rtx_REG (mode, ix86_value_regno (mode));
2598 }
2599
2600 /* Given a mode, return the register to use for a return value.  */
2601
2602 static int
2603 ix86_value_regno (mode)
2604      enum machine_mode mode;
2605 {
2606   if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_FLOAT_RETURNS_IN_80387)
2607     return FIRST_FLOAT_REG;
2608   if (mode == TImode || VECTOR_MODE_P (mode))
2609     return FIRST_SSE_REG;
2610   return 0;
2611 }
2612 \f
2613 /* Create the va_list data type.  */
2614
2615 tree
2616 ix86_build_va_list ()
2617 {
2618   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
2619
2620   /* For i386 we use plain pointer to argument area.  */
2621   if (!TARGET_64BIT)
2622     return build_pointer_type (char_type_node);
2623
2624   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
2625   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
2626
2627   f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"),
2628                       unsigned_type_node);
2629   f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"),
2630                       unsigned_type_node);
2631   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
2632                       ptr_type_node);
2633   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
2634                       ptr_type_node);
2635
2636   DECL_FIELD_CONTEXT (f_gpr) = record;
2637   DECL_FIELD_CONTEXT (f_fpr) = record;
2638   DECL_FIELD_CONTEXT (f_ovf) = record;
2639   DECL_FIELD_CONTEXT (f_sav) = record;
2640
2641   TREE_CHAIN (record) = type_decl;
2642   TYPE_NAME (record) = type_decl;
2643   TYPE_FIELDS (record) = f_gpr;
2644   TREE_CHAIN (f_gpr) = f_fpr;
2645   TREE_CHAIN (f_fpr) = f_ovf;
2646   TREE_CHAIN (f_ovf) = f_sav;
2647
2648   layout_type (record);
2649
2650   /* The correct type is an array type of one element.  */
2651   return build_array_type (record, build_index_type (size_zero_node));
2652 }
2653
2654 /* Perform any needed actions needed for a function that is receiving a
2655    variable number of arguments.
2656
2657    CUM is as above.
2658
2659    MODE and TYPE are the mode and type of the current parameter.
2660
2661    PRETEND_SIZE is a variable that should be set to the amount of stack
2662    that must be pushed by the prolog to pretend that our caller pushed
2663    it.
2664
2665    Normally, this macro will push all remaining incoming registers on the
2666    stack and set PRETEND_SIZE to the length of the registers pushed.  */
2667
2668 void
2669 ix86_setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
2670      CUMULATIVE_ARGS *cum;
2671      enum machine_mode mode;
2672      tree type;
2673      int *pretend_size ATTRIBUTE_UNUSED;
2674      int no_rtl;
2675
2676 {
2677   CUMULATIVE_ARGS next_cum;
2678   rtx save_area = NULL_RTX, mem;
2679   rtx label;
2680   rtx label_ref;
2681   rtx tmp_reg;
2682   rtx nsse_reg;
2683   int set;
2684   tree fntype;
2685   int stdarg_p;
2686   int i;
2687
2688   if (!TARGET_64BIT)
2689     return;
2690
2691   /* Indicate to allocate space on the stack for varargs save area.  */
2692   ix86_save_varrargs_registers = 1;
2693
2694   fntype = TREE_TYPE (current_function_decl);
2695   stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
2696               && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
2697                   != void_type_node));
2698
2699   /* For varargs, we do not want to skip the dummy va_dcl argument.
2700      For stdargs, we do want to skip the last named argument.  */
2701   next_cum = *cum;
2702   if (stdarg_p)
2703     function_arg_advance (&next_cum, mode, type, 1);
2704
2705   if (!no_rtl)
2706     save_area = frame_pointer_rtx;
2707
2708   set = get_varargs_alias_set ();
2709
2710   for (i = next_cum.regno; i < ix86_regparm; i++)
2711     {
2712       mem = gen_rtx_MEM (Pmode,
2713                          plus_constant (save_area, i * UNITS_PER_WORD));
2714       set_mem_alias_set (mem, set);
2715       emit_move_insn (mem, gen_rtx_REG (Pmode,
2716                                         x86_64_int_parameter_registers[i]));
2717     }
2718
2719   if (next_cum.sse_nregs)
2720     {
2721       /* Now emit code to save SSE registers.  The AX parameter contains number
2722          of SSE parameter registers used to call this function.  We use
2723          sse_prologue_save insn template that produces computed jump across
2724          SSE saves.  We need some preparation work to get this working.  */
2725
2726       label = gen_label_rtx ();
2727       label_ref = gen_rtx_LABEL_REF (Pmode, label);
2728
2729       /* Compute address to jump to :
2730          label - 5*eax + nnamed_sse_arguments*5  */
2731       tmp_reg = gen_reg_rtx (Pmode);
2732       nsse_reg = gen_reg_rtx (Pmode);
2733       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, 0)));
2734       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
2735                               gen_rtx_MULT (Pmode, nsse_reg,
2736                                             GEN_INT (4))));
2737       if (next_cum.sse_regno)
2738         emit_move_insn
2739           (nsse_reg,
2740            gen_rtx_CONST (DImode,
2741                           gen_rtx_PLUS (DImode,
2742                                         label_ref,
2743                                         GEN_INT (next_cum.sse_regno * 4))));
2744       else
2745         emit_move_insn (nsse_reg, label_ref);
2746       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
2747
2748       /* Compute address of memory block we save into.  We always use pointer
2749          pointing 127 bytes after first byte to store - this is needed to keep
2750          instruction size limited by 4 bytes.  */
2751       tmp_reg = gen_reg_rtx (Pmode);
2752       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
2753                               plus_constant (save_area,
2754                                              8 * REGPARM_MAX + 127)));
2755       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
2756       set_mem_alias_set (mem, set);
2757       set_mem_align (mem, BITS_PER_WORD);
2758
2759       /* And finally do the dirty job!  */
2760       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
2761                                         GEN_INT (next_cum.sse_regno), label));
2762     }
2763
2764 }
2765
2766 /* Implement va_start.  */
2767
2768 void
2769 ix86_va_start (valist, nextarg)
2770      tree valist;
2771      rtx nextarg;
2772 {
2773   HOST_WIDE_INT words, n_gpr, n_fpr;
2774   tree f_gpr, f_fpr, f_ovf, f_sav;
2775   tree gpr, fpr, ovf, sav, t;
2776
2777   /* Only 64bit target needs something special.  */
2778   if (!TARGET_64BIT)
2779     {
2780       std_expand_builtin_va_start (valist, nextarg);
2781       return;
2782     }
2783
2784   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
2785   f_fpr = TREE_CHAIN (f_gpr);
2786   f_ovf = TREE_CHAIN (f_fpr);
2787   f_sav = TREE_CHAIN (f_ovf);
2788
2789   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
2790   gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
2791   fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
2792   ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
2793   sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
2794
2795   /* Count number of gp and fp argument registers used.  */
2796   words = current_function_args_info.words;
2797   n_gpr = current_function_args_info.regno;
2798   n_fpr = current_function_args_info.sse_regno;
2799
2800   if (TARGET_DEBUG_ARG)
2801     fprintf (stderr, "va_start: words = %d, n_gpr = %d, n_fpr = %d\n",
2802              (int) words, (int) n_gpr, (int) n_fpr);
2803
2804   t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
2805              build_int_2 (n_gpr * 8, 0));
2806   TREE_SIDE_EFFECTS (t) = 1;
2807   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2808
2809   t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
2810              build_int_2 (n_fpr * 16 + 8*REGPARM_MAX, 0));
2811   TREE_SIDE_EFFECTS (t) = 1;
2812   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2813
2814   /* Find the overflow area.  */
2815   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
2816   if (words != 0)
2817     t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
2818                build_int_2 (words * UNITS_PER_WORD, 0));
2819   t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
2820   TREE_SIDE_EFFECTS (t) = 1;
2821   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2822
2823   /* Find the register save area.
2824      Prologue of the function save it right above stack frame.  */
2825   t = make_tree (TREE_TYPE (sav), frame_pointer_rtx);
2826   t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
2827   TREE_SIDE_EFFECTS (t) = 1;
2828   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2829 }
2830
2831 /* Implement va_arg.  */
2832 rtx
2833 ix86_va_arg (valist, type)
2834      tree valist, type;
2835 {
2836   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
2837   tree f_gpr, f_fpr, f_ovf, f_sav;
2838   tree gpr, fpr, ovf, sav, t;
2839   int size, rsize;
2840   rtx lab_false, lab_over = NULL_RTX;
2841   rtx addr_rtx, r;
2842   rtx container;
2843
2844   /* Only 64bit target needs something special.  */
2845   if (!TARGET_64BIT)
2846     {
2847       return std_expand_builtin_va_arg (valist, type);
2848     }
2849
2850   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
2851   f_fpr = TREE_CHAIN (f_gpr);
2852   f_ovf = TREE_CHAIN (f_fpr);
2853   f_sav = TREE_CHAIN (f_ovf);
2854
2855   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
2856   gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
2857   fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
2858   ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
2859   sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
2860
2861   size = int_size_in_bytes (type);
2862   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2863
2864   container = construct_container (TYPE_MODE (type), type, 0,
2865                                    REGPARM_MAX, SSE_REGPARM_MAX, intreg, 0);
2866   /*
2867    * Pull the value out of the saved registers ...
2868    */
2869
2870   addr_rtx = gen_reg_rtx (Pmode);
2871
2872   if (container)
2873     {
2874       rtx int_addr_rtx, sse_addr_rtx;
2875       int needed_intregs, needed_sseregs;
2876       int need_temp;
2877
2878       lab_over = gen_label_rtx ();
2879       lab_false = gen_label_rtx ();
2880
2881       examine_argument (TYPE_MODE (type), type, 0,
2882                         &needed_intregs, &needed_sseregs);
2883
2884
2885       need_temp = ((needed_intregs && TYPE_ALIGN (type) > 64)
2886                    || TYPE_ALIGN (type) > 128);
2887
2888       /* In case we are passing structure, verify that it is consecutive block
2889          on the register save area.  If not we need to do moves.  */
2890       if (!need_temp && !REG_P (container))
2891         {
2892           /* Verify that all registers are strictly consecutive  */
2893           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
2894             {
2895               int i;
2896
2897               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
2898                 {
2899                   rtx slot = XVECEXP (container, 0, i);
2900                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
2901                       || INTVAL (XEXP (slot, 1)) != i * 16)
2902                     need_temp = 1;
2903                 }
2904             }
2905           else
2906             {
2907               int i;
2908
2909               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
2910                 {
2911                   rtx slot = XVECEXP (container, 0, i);
2912                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
2913                       || INTVAL (XEXP (slot, 1)) != i * 8)
2914                     need_temp = 1;
2915                 }
2916             }
2917         }
2918       if (!need_temp)
2919         {
2920           int_addr_rtx = addr_rtx;
2921           sse_addr_rtx = addr_rtx;
2922         }
2923       else
2924         {
2925           int_addr_rtx = gen_reg_rtx (Pmode);
2926           sse_addr_rtx = gen_reg_rtx (Pmode);
2927         }
2928       /* First ensure that we fit completely in registers.  */
2929       if (needed_intregs)
2930         {
2931           emit_cmp_and_jump_insns (expand_expr
2932                                    (gpr, NULL_RTX, SImode, EXPAND_NORMAL),
2933                                    GEN_INT ((REGPARM_MAX - needed_intregs +
2934                                              1) * 8), GE, const1_rtx, SImode,
2935                                    1, lab_false);
2936         }
2937       if (needed_sseregs)
2938         {
2939           emit_cmp_and_jump_insns (expand_expr
2940                                    (fpr, NULL_RTX, SImode, EXPAND_NORMAL),
2941                                    GEN_INT ((SSE_REGPARM_MAX -
2942                                              needed_sseregs + 1) * 16 +
2943                                             REGPARM_MAX * 8), GE, const1_rtx,
2944                                    SImode, 1, lab_false);
2945         }
2946
2947       /* Compute index to start of area used for integer regs.  */
2948       if (needed_intregs)
2949         {
2950           t = build (PLUS_EXPR, ptr_type_node, sav, gpr);
2951           r = expand_expr (t, int_addr_rtx, Pmode, EXPAND_NORMAL);
2952           if (r != int_addr_rtx)
2953             emit_move_insn (int_addr_rtx, r);
2954         }
2955       if (needed_sseregs)
2956         {
2957           t = build (PLUS_EXPR, ptr_type_node, sav, fpr);
2958           r = expand_expr (t, sse_addr_rtx, Pmode, EXPAND_NORMAL);
2959           if (r != sse_addr_rtx)
2960             emit_move_insn (sse_addr_rtx, r);
2961         }
2962       if (need_temp)
2963         {
2964           int i;
2965           rtx mem;
2966
2967           /* Never use the memory itself, as it has the alias set.  */
2968           addr_rtx = XEXP (assign_temp (type, 0, 1, 0), 0);
2969           mem = gen_rtx_MEM (BLKmode, addr_rtx);
2970           set_mem_alias_set (mem, get_varargs_alias_set ());
2971           set_mem_align (mem, BITS_PER_UNIT);
2972
2973           for (i = 0; i < XVECLEN (container, 0); i++)
2974             {
2975               rtx slot = XVECEXP (container, 0, i);
2976               rtx reg = XEXP (slot, 0);
2977               enum machine_mode mode = GET_MODE (reg);
2978               rtx src_addr;
2979               rtx src_mem;
2980               int src_offset;
2981               rtx dest_mem;
2982
2983               if (SSE_REGNO_P (REGNO (reg)))
2984                 {
2985                   src_addr = sse_addr_rtx;
2986                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
2987                 }
2988               else
2989                 {
2990                   src_addr = int_addr_rtx;
2991                   src_offset = REGNO (reg) * 8;
2992                 }
2993               src_mem = gen_rtx_MEM (mode, src_addr);
2994               set_mem_alias_set (src_mem, get_varargs_alias_set ());
2995               src_mem = adjust_address (src_mem, mode, src_offset);
2996               dest_mem = adjust_address (mem, mode, INTVAL (XEXP (slot, 1)));
2997               emit_move_insn (dest_mem, src_mem);
2998             }
2999         }
3000
3001       if (needed_intregs)
3002         {
3003           t =
3004             build (PLUS_EXPR, TREE_TYPE (gpr), gpr,
3005                    build_int_2 (needed_intregs * 8, 0));
3006           t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr, t);
3007           TREE_SIDE_EFFECTS (t) = 1;
3008           expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3009         }
3010       if (needed_sseregs)
3011         {
3012           t =
3013             build (PLUS_EXPR, TREE_TYPE (fpr), fpr,
3014                    build_int_2 (needed_sseregs * 16, 0));
3015           t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr, t);
3016           TREE_SIDE_EFFECTS (t) = 1;
3017           expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3018         }
3019
3020       emit_jump_insn (gen_jump (lab_over));
3021       emit_barrier ();
3022       emit_label (lab_false);
3023     }
3024
3025   /* ... otherwise out of the overflow area.  */
3026
3027   /* Care for on-stack alignment if needed.  */
3028   if (FUNCTION_ARG_BOUNDARY (VOIDmode, type) <= 64)
3029     t = ovf;
3030   else
3031     {
3032       HOST_WIDE_INT align = FUNCTION_ARG_BOUNDARY (VOIDmode, type) / 8;
3033       t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf, build_int_2 (align - 1, 0));
3034       t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-align, -1));
3035     }
3036   t = save_expr (t);
3037
3038   r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
3039   if (r != addr_rtx)
3040     emit_move_insn (addr_rtx, r);
3041
3042   t =
3043     build (PLUS_EXPR, TREE_TYPE (t), t,
3044            build_int_2 (rsize * UNITS_PER_WORD, 0));
3045   t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
3046   TREE_SIDE_EFFECTS (t) = 1;
3047   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3048
3049   if (container)
3050     emit_label (lab_over);
3051
3052   return addr_rtx;
3053 }
3054 \f
3055 /* Return nonzero if OP is either a i387 or SSE fp register.  */
3056 int
3057 any_fp_register_operand (op, mode)
3058      rtx op;
3059      enum machine_mode mode ATTRIBUTE_UNUSED;
3060 {
3061   return ANY_FP_REG_P (op);
3062 }
3063
3064 /* Return nonzero if OP is an i387 fp register.  */
3065 int
3066 fp_register_operand (op, mode)
3067      rtx op;
3068      enum machine_mode mode ATTRIBUTE_UNUSED;
3069 {
3070   return FP_REG_P (op);
3071 }
3072
3073 /* Return nonzero if OP is a non-fp register_operand.  */
3074 int
3075 register_and_not_any_fp_reg_operand (op, mode)
3076      rtx op;
3077      enum machine_mode mode;
3078 {
3079   return register_operand (op, mode) && !ANY_FP_REG_P (op);
3080 }
3081
3082 /* Return nonzero if OP is a register operand other than an
3083    i387 fp register.  */
3084 int
3085 register_and_not_fp_reg_operand (op, mode)
3086      rtx op;
3087      enum machine_mode mode;
3088 {
3089   return register_operand (op, mode) && !FP_REG_P (op);
3090 }
3091
3092 /* Return nonzero if OP is general operand representable on x86_64.  */
3093
3094 int
3095 x86_64_general_operand (op, mode)
3096      rtx op;
3097      enum machine_mode mode;
3098 {
3099   if (!TARGET_64BIT)
3100     return general_operand (op, mode);
3101   if (nonimmediate_operand (op, mode))
3102     return 1;
3103   return x86_64_sign_extended_value (op);
3104 }
3105
3106 /* Return nonzero if OP is general operand representable on x86_64
3107    as either sign extended or zero extended constant.  */
3108
3109 int
3110 x86_64_szext_general_operand (op, mode)
3111      rtx op;
3112      enum machine_mode mode;
3113 {
3114   if (!TARGET_64BIT)
3115     return general_operand (op, mode);
3116   if (nonimmediate_operand (op, mode))
3117     return 1;
3118   return x86_64_sign_extended_value (op) || x86_64_zero_extended_value (op);
3119 }
3120
3121 /* Return nonzero if OP is nonmemory operand representable on x86_64.  */
3122
3123 int
3124 x86_64_nonmemory_operand (op, mode)
3125      rtx op;
3126      enum machine_mode mode;
3127 {
3128   if (!TARGET_64BIT)
3129     return nonmemory_operand (op, mode);
3130   if (register_operand (op, mode))
3131     return 1;
3132   return x86_64_sign_extended_value (op);
3133 }
3134
3135 /* Return nonzero if OP is nonmemory operand acceptable by movabs patterns.  */
3136
3137 int
3138 x86_64_movabs_operand (op, mode)
3139      rtx op;
3140      enum machine_mode mode;
3141 {
3142   if (!TARGET_64BIT || !flag_pic)
3143     return nonmemory_operand (op, mode);
3144   if (register_operand (op, mode) || x86_64_sign_extended_value (op))
3145     return 1;
3146   if (CONSTANT_P (op) && !symbolic_reference_mentioned_p (op))
3147     return 1;
3148   return 0;
3149 }
3150
3151 /* Return nonzero if OP is nonmemory operand representable on x86_64.  */
3152
3153 int
3154 x86_64_szext_nonmemory_operand (op, mode)
3155      rtx op;
3156      enum machine_mode mode;
3157 {
3158   if (!TARGET_64BIT)
3159     return nonmemory_operand (op, mode);
3160   if (register_operand (op, mode))
3161     return 1;
3162   return x86_64_sign_extended_value (op) || x86_64_zero_extended_value (op);
3163 }
3164
3165 /* Return nonzero if OP is immediate operand representable on x86_64.  */
3166
3167 int
3168 x86_64_immediate_operand (op, mode)
3169      rtx op;
3170      enum machine_mode mode;
3171 {
3172   if (!TARGET_64BIT)
3173     return immediate_operand (op, mode);
3174   return x86_64_sign_extended_value (op);
3175 }
3176
3177 /* Return nonzero if OP is immediate operand representable on x86_64.  */
3178
3179 int
3180 x86_64_zext_immediate_operand (op, mode)
3181      rtx op;
3182      enum machine_mode mode ATTRIBUTE_UNUSED;
3183 {
3184   return x86_64_zero_extended_value (op);
3185 }
3186
3187 /* Return nonzero if OP is (const_int 1), else return zero.  */
3188
3189 int
3190 const_int_1_operand (op, mode)
3191      rtx op;
3192      enum machine_mode mode ATTRIBUTE_UNUSED;
3193 {
3194   return (GET_CODE (op) == CONST_INT && INTVAL (op) == 1);
3195 }
3196
3197 /* Return nonzero if OP is CONST_INT >= 1 and <= 31 (a valid operand
3198    for shift & compare patterns, as shifting by 0 does not change flags),
3199    else return zero.  */
3200
3201 int
3202 const_int_1_31_operand (op, mode)
3203      rtx op;
3204      enum machine_mode mode ATTRIBUTE_UNUSED;
3205 {
3206   return (GET_CODE (op) == CONST_INT && INTVAL (op) >= 1 && INTVAL (op) <= 31);
3207 }
3208
3209 /* Returns 1 if OP is either a symbol reference or a sum of a symbol
3210    reference and a constant.  */
3211
3212 int
3213 symbolic_operand (op, mode)
3214      register rtx op;
3215      enum machine_mode mode ATTRIBUTE_UNUSED;
3216 {
3217   switch (GET_CODE (op))
3218     {
3219     case SYMBOL_REF:
3220     case LABEL_REF:
3221       return 1;
3222
3223     case CONST:
3224       op = XEXP (op, 0);
3225       if (GET_CODE (op) == SYMBOL_REF
3226           || GET_CODE (op) == LABEL_REF
3227           || (GET_CODE (op) == UNSPEC
3228               && (XINT (op, 1) == UNSPEC_GOT
3229                   || XINT (op, 1) == UNSPEC_GOTOFF
3230                   || XINT (op, 1) == UNSPEC_GOTPCREL)))
3231         return 1;
3232       if (GET_CODE (op) != PLUS
3233           || GET_CODE (XEXP (op, 1)) != CONST_INT)
3234         return 0;
3235
3236       op = XEXP (op, 0);
3237       if (GET_CODE (op) == SYMBOL_REF
3238           || GET_CODE (op) == LABEL_REF)
3239         return 1;
3240       /* Only @GOTOFF gets offsets.  */
3241       if (GET_CODE (op) != UNSPEC
3242           || XINT (op, 1) != UNSPEC_GOTOFF)
3243         return 0;
3244
3245       op = XVECEXP (op, 0, 0);
3246       if (GET_CODE (op) == SYMBOL_REF
3247           || GET_CODE (op) == LABEL_REF)
3248         return 1;
3249       return 0;
3250
3251     default:
3252       return 0;
3253     }
3254 }
3255
3256 /* Return true if the operand contains a @GOT or @GOTOFF reference.  */
3257
3258 int
3259 pic_symbolic_operand (op, mode)
3260      register rtx op;
3261      enum machine_mode mode ATTRIBUTE_UNUSED;
3262 {
3263   if (GET_CODE (op) != CONST)
3264     return 0;
3265   op = XEXP (op, 0);
3266   if (TARGET_64BIT)
3267     {
3268       if (GET_CODE (XEXP (op, 0)) == UNSPEC)
3269         return 1;
3270     }
3271   else
3272     {
3273       if (GET_CODE (op) == UNSPEC)
3274         return 1;
3275       if (GET_CODE (op) != PLUS
3276           || GET_CODE (XEXP (op, 1)) != CONST_INT)
3277         return 0;
3278       op = XEXP (op, 0);
3279       if (GET_CODE (op) == UNSPEC)
3280         return 1;
3281     }
3282   return 0;
3283 }
3284
3285 /* Return true if OP is a symbolic operand that resolves locally.  */
3286
3287 static int
3288 local_symbolic_operand (op, mode)
3289      rtx op;
3290      enum machine_mode mode ATTRIBUTE_UNUSED;
3291 {
3292   if (GET_CODE (op) == CONST
3293       && GET_CODE (XEXP (op, 0)) == PLUS
3294       && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
3295     op = XEXP (XEXP (op, 0), 0);
3296
3297   if (GET_CODE (op) == LABEL_REF)
3298     return 1;
3299
3300   if (GET_CODE (op) != SYMBOL_REF)
3301     return 0;
3302
3303   /* These we've been told are local by varasm and encode_section_info
3304      respectively.  */
3305   if (CONSTANT_POOL_ADDRESS_P (op) || SYMBOL_REF_FLAG (op))
3306     return 1;
3307
3308   /* There is, however, a not insubstantial body of code in the rest of
3309      the compiler that assumes it can just stick the results of
3310      ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done.  */
3311   /* ??? This is a hack.  Should update the body of the compiler to
3312      always create a DECL an invoke targetm.encode_section_info.  */
3313   if (strncmp (XSTR (op, 0), internal_label_prefix,
3314                internal_label_prefix_len) == 0)
3315     return 1;
3316
3317   return 0;
3318 }
3319
3320 /* Test for various thread-local symbols.  See ix86_encode_section_info. */
3321
3322 int
3323 tls_symbolic_operand (op, mode)
3324      register rtx op;
3325      enum machine_mode mode ATTRIBUTE_UNUSED;
3326 {
3327   const char *symbol_str;
3328
3329   if (GET_CODE (op) != SYMBOL_REF)
3330     return 0;
3331   symbol_str = XSTR (op, 0);
3332
3333   if (symbol_str[0] != '%')
3334     return 0;
3335   return strchr (tls_model_chars, symbol_str[1]) - tls_model_chars;
3336 }
3337
3338 static int
3339 tls_symbolic_operand_1 (op, kind)
3340      rtx op;
3341      enum tls_model kind;
3342 {
3343   const char *symbol_str;
3344
3345   if (GET_CODE (op) != SYMBOL_REF)
3346     return 0;
3347   symbol_str = XSTR (op, 0);
3348
3349   return symbol_str[0] == '%' && symbol_str[1] == tls_model_chars[kind];
3350 }
3351
3352 int
3353 global_dynamic_symbolic_operand (op, mode)
3354      register rtx op;
3355      enum machine_mode mode ATTRIBUTE_UNUSED;
3356 {
3357   return tls_symbolic_operand_1 (op, TLS_MODEL_GLOBAL_DYNAMIC);
3358 }
3359
3360 int
3361 local_dynamic_symbolic_operand (op, mode)
3362      register rtx op;
3363      enum machine_mode mode ATTRIBUTE_UNUSED;
3364 {
3365   return tls_symbolic_operand_1 (op, TLS_MODEL_LOCAL_DYNAMIC);
3366 }
3367
3368 int
3369 initial_exec_symbolic_operand (op, mode)
3370      register rtx op;
3371      enum machine_mode mode ATTRIBUTE_UNUSED;
3372 {
3373   return tls_symbolic_operand_1 (op, TLS_MODEL_INITIAL_EXEC);
3374 }
3375
3376 int
3377 local_exec_symbolic_operand (op, mode)
3378      register rtx op;
3379      enum machine_mode mode ATTRIBUTE_UNUSED;
3380 {
3381   return tls_symbolic_operand_1 (op, TLS_MODEL_LOCAL_EXEC);
3382 }
3383
3384 /* Test for a valid operand for a call instruction.  Don't allow the
3385    arg pointer register or virtual regs since they may decay into
3386    reg + const, which the patterns can't handle.  */
3387
3388 int
3389 call_insn_operand (op, mode)
3390      rtx op;
3391      enum machine_mode mode ATTRIBUTE_UNUSED;
3392 {
3393   /* Disallow indirect through a virtual register.  This leads to
3394      compiler aborts when trying to eliminate them.  */
3395   if (GET_CODE (op) == REG
3396       && (op == arg_pointer_rtx
3397           || op == frame_pointer_rtx
3398           || (REGNO (op) >= FIRST_PSEUDO_REGISTER
3399               && REGNO (op) <= LAST_VIRTUAL_REGISTER)))
3400     return 0;
3401
3402   /* Disallow `call 1234'.  Due to varying assembler lameness this
3403      gets either rejected or translated to `call .+1234'.  */
3404   if (GET_CODE (op) == CONST_INT)
3405     return 0;
3406
3407   /* Explicitly allow SYMBOL_REF even if pic.  */
3408   if (GET_CODE (op) == SYMBOL_REF)
3409     return 1;
3410
3411   /* Otherwise we can allow any general_operand in the address.  */
3412   return general_operand (op, Pmode);
3413 }
3414
3415 /* Test for a valid operand for a call instruction.  Don't allow the
3416    arg pointer register or virtual regs since they may decay into
3417    reg + const, which the patterns can't handle.  */
3418
3419 int
3420 sibcall_insn_operand (op, mode)
3421      rtx op;
3422      enum machine_mode mode ATTRIBUTE_UNUSED;
3423 {
3424   /* Disallow indirect through a virtual register.  This leads to
3425      compiler aborts when trying to eliminate them.  */
3426   if (GET_CODE (op) == REG
3427       && (op == arg_pointer_rtx
3428           || op == frame_pointer_rtx
3429           || (REGNO (op) >= FIRST_PSEUDO_REGISTER
3430               && REGNO (op) <= LAST_VIRTUAL_REGISTER)))
3431     return 0;
3432
3433   /* Explicitly allow SYMBOL_REF even if pic.  */
3434   if (GET_CODE (op) == SYMBOL_REF)
3435     return 1;
3436
3437   /* Otherwise we can only allow register operands.  */
3438   return register_operand (op, Pmode);
3439 }
3440
3441 int
3442 constant_call_address_operand (op, mode)
3443      rtx op;
3444      enum machine_mode mode ATTRIBUTE_UNUSED;
3445 {
3446   if (GET_CODE (op) == CONST
3447       && GET_CODE (XEXP (op, 0)) == PLUS
3448       && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
3449     op = XEXP (XEXP (op, 0), 0);
3450   return GET_CODE (op) == SYMBOL_REF;
3451 }
3452
3453 /* Match exactly zero and one.  */
3454
3455 int
3456 const0_operand (op, mode)
3457      register rtx op;
3458      enum machine_mode mode;
3459 {
3460   return op == CONST0_RTX (mode);
3461 }
3462
3463 int
3464 const1_operand (op, mode)
3465      register rtx op;
3466      enum machine_mode mode ATTRIBUTE_UNUSED;
3467 {
3468   return op == const1_rtx;
3469 }
3470
3471 /* Match 2, 4, or 8.  Used for leal multiplicands.  */
3472
3473 int
3474 const248_operand (op, mode)
3475      register rtx op;
3476      enum machine_mode mode ATTRIBUTE_UNUSED;
3477 {
3478   return (GET_CODE (op) == CONST_INT
3479           && (INTVAL (op) == 2 || INTVAL (op) == 4 || INTVAL (op) == 8));
3480 }
3481
3482 /* True if this is a constant appropriate for an increment or decrement.  */
3483
3484 int
3485 incdec_operand (op, mode)
3486      register rtx op;
3487      enum machine_mode mode ATTRIBUTE_UNUSED;
3488 {
3489   /* On Pentium4, the inc and dec operations causes extra dependency on flag
3490      registers, since carry flag is not set.  */
3491   if (TARGET_PENTIUM4 && !optimize_size)
3492     return 0;
3493   return op == const1_rtx || op == constm1_rtx;
3494 }
3495
3496 /* Return nonzero if OP is acceptable as operand of DImode shift
3497    expander.  */
3498
3499 int
3500 shiftdi_operand (op, mode)
3501      rtx op;
3502      enum machine_mode mode ATTRIBUTE_UNUSED;
3503 {
3504   if (TARGET_64BIT)
3505     return nonimmediate_operand (op, mode);
3506   else
3507     return register_operand (op, mode);
3508 }
3509
3510 /* Return false if this is the stack pointer, or any other fake
3511    register eliminable to the stack pointer.  Otherwise, this is
3512    a register operand.
3513
3514    This is used to prevent esp from being used as an index reg.
3515    Which would only happen in pathological cases.  */
3516
3517 int
3518 reg_no_sp_operand (op, mode)
3519      register rtx op;
3520      enum machine_mode mode;
3521 {
3522   rtx t = op;
3523   if (GET_CODE (t) == SUBREG)
3524     t = SUBREG_REG (t);
3525   if (t == stack_pointer_rtx || t == arg_pointer_rtx || t == frame_pointer_rtx)
3526     return 0;
3527
3528   return register_operand (op, mode);
3529 }
3530
3531 int
3532 mmx_reg_operand (op, mode)
3533      register rtx op;
3534      enum machine_mode mode ATTRIBUTE_UNUSED;
3535 {
3536   return MMX_REG_P (op);
3537 }
3538
3539 /* Return false if this is any eliminable register.  Otherwise
3540    general_operand.  */
3541
3542 int
3543 general_no_elim_operand (op, mode)
3544      register rtx op;
3545      enum machine_mode mode;
3546 {
3547   rtx t = op;
3548   if (GET_CODE (t) == SUBREG)
3549     t = SUBREG_REG (t);
3550   if (t == arg_pointer_rtx || t == frame_pointer_rtx
3551       || t == virtual_incoming_args_rtx || t == virtual_stack_vars_rtx
3552       || t == virtual_stack_dynamic_rtx)
3553     return 0;
3554   if (REG_P (t)
3555       && REGNO (t) >= FIRST_VIRTUAL_REGISTER
3556       && REGNO (t) <= LAST_VIRTUAL_REGISTER)
3557     return 0;
3558
3559   return general_operand (op, mode);
3560 }
3561
3562 /* Return false if this is any eliminable register.  Otherwise
3563    register_operand or const_int.  */
3564
3565 int
3566 nonmemory_no_elim_operand (op, mode)
3567      register rtx op;
3568      enum machine_mode mode;
3569 {
3570   rtx t = op;
3571   if (GET_CODE (t) == SUBREG)
3572     t = SUBREG_REG (t);
3573   if (t == arg_pointer_rtx || t == frame_pointer_rtx
3574       || t == virtual_incoming_args_rtx || t == virtual_stack_vars_rtx
3575       || t == virtual_stack_dynamic_rtx)
3576     return 0;
3577
3578   return GET_CODE (op) == CONST_INT || register_operand (op, mode);
3579 }
3580
3581 /* Return false if this is any eliminable register or stack register,
3582    otherwise work like register_operand.  */
3583
3584 int
3585 index_register_operand (op, mode)
3586      register rtx op;
3587      enum machine_mode mode;
3588 {
3589   rtx t = op;
3590   if (GET_CODE (t) == SUBREG)
3591     t = SUBREG_REG (t);
3592   if (!REG_P (t))
3593     return 0;
3594   if (t == arg_pointer_rtx
3595       || t == frame_pointer_rtx
3596       || t == virtual_incoming_args_rtx
3597       || t == virtual_stack_vars_rtx
3598       || t == virtual_stack_dynamic_rtx
3599       || REGNO (t) == STACK_POINTER_REGNUM)
3600     return 0;
3601
3602   return general_operand (op, mode);
3603 }
3604
3605 /* Return true if op is a Q_REGS class register.  */
3606
3607 int
3608 q_regs_operand (op, mode)
3609      register rtx op;
3610      enum machine_mode mode;
3611 {
3612   if (mode != VOIDmode && GET_MODE (op) != mode)
3613     return 0;
3614   if (GET_CODE (op) == SUBREG)
3615     op = SUBREG_REG (op);
3616   return ANY_QI_REG_P (op);
3617 }
3618
3619 /* Return true if op is an flags register.  */
3620
3621 int
3622 flags_reg_operand (op, mode)
3623      register rtx op;
3624      enum machine_mode mode;
3625 {
3626   if (mode != VOIDmode && GET_MODE (op) != mode)
3627     return 0;
3628   return REG_P (op) && REGNO (op) == FLAGS_REG && GET_MODE (op) != VOIDmode;
3629 }
3630
3631 /* Return true if op is a NON_Q_REGS class register.  */
3632
3633 int
3634 non_q_regs_operand (op, mode)
3635      register rtx op;
3636      enum machine_mode mode;
3637 {
3638   if (mode != VOIDmode && GET_MODE (op) != mode)
3639     return 0;
3640   if (GET_CODE (op) == SUBREG)
3641     op = SUBREG_REG (op);
3642   return NON_QI_REG_P (op);
3643 }
3644
3645 int
3646 zero_extended_scalar_load_operand (op, mode)
3647      rtx op;
3648      enum machine_mode mode ATTRIBUTE_UNUSED;
3649 {
3650   unsigned n_elts;
3651   if (GET_CODE (op) != MEM)
3652     return 0;
3653   op = maybe_get_pool_constant (op);
3654   if (!op)
3655     return 0;
3656   if (GET_CODE (op) != CONST_VECTOR)
3657     return 0;
3658   n_elts =
3659     (GET_MODE_SIZE (GET_MODE (op)) /
3660      GET_MODE_SIZE (GET_MODE_INNER (GET_MODE (op))));
3661   for (n_elts--; n_elts > 0; n_elts--)
3662     {
3663       rtx elt = CONST_VECTOR_ELT (op, n_elts);
3664       if (elt != CONST0_RTX (GET_MODE_INNER (GET_MODE (op))))
3665         return 0;
3666     }
3667   return 1;
3668 }
3669
3670 /* Return 1 if OP is a comparison that can be used in the CMPSS/CMPPS
3671    insns.  */
3672 int
3673 sse_comparison_operator (op, mode)
3674      rtx op;
3675      enum machine_mode mode ATTRIBUTE_UNUSED;
3676 {
3677   enum rtx_code code = GET_CODE (op);
3678   switch (code)
3679     {
3680     /* Operations supported directly.  */
3681     case EQ:
3682     case LT:
3683     case LE:
3684     case UNORDERED:
3685     case NE:
3686     case UNGE:
3687     case UNGT:
3688     case ORDERED:
3689       return 1;
3690     /* These are equivalent to ones above in non-IEEE comparisons.  */
3691     case UNEQ:
3692     case UNLT:
3693     case UNLE:
3694     case LTGT:
3695     case GE:
3696     case GT:
3697       return !TARGET_IEEE_FP;
3698     default:
3699       return 0;
3700     }
3701 }
3702 /* Return 1 if OP is a valid comparison operator in valid mode.  */
3703 int
3704 ix86_comparison_operator (op, mode)
3705      register rtx op;
3706      enum machine_mode mode;
3707 {
3708   enum machine_mode inmode;
3709   enum rtx_code code = GET_CODE (op);
3710   if (mode != VOIDmode && GET_MODE (op) != mode)
3711     return 0;
3712   if (GET_RTX_CLASS (code) != '<')
3713     return 0;
3714   inmode = GET_MODE (XEXP (op, 0));
3715
3716   if (inmode == CCFPmode || inmode == CCFPUmode)
3717     {
3718       enum rtx_code second_code, bypass_code;
3719       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
3720       return (bypass_code == NIL && second_code == NIL);
3721     }
3722   switch (code)
3723     {
3724     case EQ: case NE:
3725       return 1;
3726     case LT: case GE:
3727       if (inmode == CCmode || inmode == CCGCmode
3728           || inmode == CCGOCmode || inmode == CCNOmode)
3729         return 1;
3730       return 0;
3731     case LTU: case GTU: case LEU: case ORDERED: case UNORDERED: case GEU:
3732       if (inmode == CCmode)
3733         return 1;
3734       return 0;
3735     case GT: case LE:
3736       if (inmode == CCmode || inmode == CCGCmode || inmode == CCNOmode)
3737         return 1;
3738       return 0;
3739     default:
3740       return 0;
3741     }
3742 }
3743
3744 /* Return 1 if OP is a comparison operator that can be issued by fcmov.  */
3745
3746 int
3747 fcmov_comparison_operator (op, mode)
3748     register rtx op;
3749     enum machine_mode mode;
3750 {
3751   enum machine_mode inmode;
3752   enum rtx_code code = GET_CODE (op);
3753   if (mode != VOIDmode && GET_MODE (op) != mode)
3754     return 0;
3755   if (GET_RTX_CLASS (code) != '<')
3756     return 0;
3757   inmode = GET_MODE (XEXP (op, 0));
3758   if (inmode == CCFPmode || inmode == CCFPUmode)
3759     {
3760       enum rtx_code second_code, bypass_code;
3761       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
3762       if (bypass_code != NIL || second_code != NIL)
3763         return 0;
3764       code = ix86_fp_compare_code_to_integer (code);
3765     }
3766   /* i387 supports just limited amount of conditional codes.  */
3767   switch (code)
3768     {
3769     case LTU: case GTU: case LEU: case GEU:
3770       if (inmode == CCmode || inmode == CCFPmode || inmode == CCFPUmode)
3771         return 1;
3772       return 0;
3773     case ORDERED: case UNORDERED:
3774     case EQ: case NE:
3775       return 1;
3776     default:
3777       return 0;
3778     }
3779 }
3780
3781 /* Return 1 if OP is a binary operator that can be promoted to wider mode.  */
3782
3783 int
3784 promotable_binary_operator (op, mode)
3785      register rtx op;
3786      enum machine_mode mode ATTRIBUTE_UNUSED;
3787 {
3788   switch (GET_CODE (op))
3789     {
3790     case MULT:
3791       /* Modern CPUs have same latency for HImode and SImode multiply,
3792          but 386 and 486 do HImode multiply faster.  */
3793       return ix86_cpu > PROCESSOR_I486;
3794     case PLUS:
3795     case AND:
3796     case IOR:
3797     case XOR:
3798     case ASHIFT:
3799       return 1;
3800     default:
3801       return 0;
3802     }
3803 }
3804
3805 /* Nearly general operand, but accept any const_double, since we wish
3806    to be able to drop them into memory rather than have them get pulled
3807    into registers.  */
3808
3809 int
3810 cmp_fp_expander_operand (op, mode)
3811      register rtx op;
3812      enum machine_mode mode;
3813 {
3814   if (mode != VOIDmode && mode != GET_MODE (op))
3815     return 0;
3816   if (GET_CODE (op) == CONST_DOUBLE)
3817     return 1;
3818   return general_operand (op, mode);
3819 }
3820
3821 /* Match an SI or HImode register for a zero_extract.  */
3822
3823 int
3824 ext_register_operand (op, mode)
3825      register rtx op;
3826      enum machine_mode mode ATTRIBUTE_UNUSED;
3827 {
3828   int regno;
3829   if ((!TARGET_64BIT || GET_MODE (op) != DImode)
3830       && GET_MODE (op) != SImode && GET_MODE (op) != HImode)
3831     return 0;
3832
3833   if (!register_operand (op, VOIDmode))
3834     return 0;
3835
3836   /* Be careful to accept only registers having upper parts.  */
3837   regno = REG_P (op) ? REGNO (op) : REGNO (SUBREG_REG (op));
3838   return (regno > LAST_VIRTUAL_REGISTER || regno < 4);
3839 }
3840
3841 /* Return 1 if this is a valid binary floating-point operation.
3842    OP is the expression matched, and MODE is its mode.  */
3843
3844 int
3845 binary_fp_operator (op, mode)
3846     register rtx op;
3847     enum machine_mode mode;
3848 {
3849   if (mode != VOIDmode && mode != GET_MODE (op))
3850     return 0;
3851
3852   switch (GET_CODE (op))
3853     {
3854     case PLUS:
3855     case MINUS:
3856     case MULT:
3857     case DIV:
3858       return GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT;
3859
3860     default:
3861       return 0;
3862     }
3863 }
3864
3865 int
3866 mult_operator (op, mode)
3867     register rtx op;
3868     enum machine_mode mode ATTRIBUTE_UNUSED;
3869 {
3870   return GET_CODE (op) == MULT;
3871 }
3872
3873 int
3874 div_operator (op, mode)
3875     register rtx op;
3876     enum machine_mode mode ATTRIBUTE_UNUSED;
3877 {
3878   return GET_CODE (op) == DIV;
3879 }
3880
3881 int
3882 arith_or_logical_operator (op, mode)
3883       rtx op;
3884       enum machine_mode mode;
3885 {
3886   return ((mode == VOIDmode || GET_MODE (op) == mode)
3887           && (GET_RTX_CLASS (GET_CODE (op)) == 'c'
3888               || GET_RTX_CLASS (GET_CODE (op)) == '2'));
3889 }
3890
3891 /* Returns 1 if OP is memory operand with a displacement.  */
3892
3893 int
3894 memory_displacement_operand (op, mode)
3895      register rtx op;
3896      enum machine_mode mode;
3897 {
3898   struct ix86_address parts;
3899
3900   if (! memory_operand (op, mode))
3901     return 0;
3902
3903   if (! ix86_decompose_address (XEXP (op, 0), &parts))
3904     abort ();
3905
3906   return parts.disp != NULL_RTX;
3907 }
3908
3909 /* To avoid problems when jump re-emits comparisons like testqi_ext_ccno_0,
3910    re-recognize the operand to avoid a copy_to_mode_reg that will fail.
3911
3912    ??? It seems likely that this will only work because cmpsi is an
3913    expander, and no actual insns use this.  */
3914
3915 int
3916 cmpsi_operand (op, mode)
3917       rtx op;
3918       enum machine_mode mode;
3919 {
3920   if (nonimmediate_operand (op, mode))
3921     return 1;
3922
3923   if (GET_CODE (op) == AND
3924       && GET_MODE (op) == SImode
3925       && GET_CODE (XEXP (op, 0)) == ZERO_EXTRACT
3926       && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
3927       && GET_CODE (XEXP (XEXP (op, 0), 2)) == CONST_INT
3928       && INTVAL (XEXP (XEXP (op, 0), 1)) == 8
3929       && INTVAL (XEXP (XEXP (op, 0), 2)) == 8
3930       && GET_CODE (XEXP (op, 1)) == CONST_INT)
3931     return 1;
3932
3933   return 0;
3934 }
3935
3936 /* Returns 1 if OP is memory operand that can not be represented by the
3937    modRM array.  */
3938
3939 int
3940 long_memory_operand (op, mode)
3941      register rtx op;
3942      enum machine_mode mode;
3943 {
3944   if (! memory_operand (op, mode))
3945     return 0;
3946
3947   return memory_address_length (op) != 0;
3948 }
3949
3950 /* Return nonzero if the rtx is known aligned.  */
3951
3952 int
3953 aligned_operand (op, mode)
3954      rtx op;
3955      enum machine_mode mode;
3956 {
3957   struct ix86_address parts;
3958
3959   if (!general_operand (op, mode))
3960     return 0;
3961
3962   /* Registers and immediate operands are always "aligned".  */
3963   if (GET_CODE (op) != MEM)
3964     return 1;
3965
3966   /* Don't even try to do any aligned optimizations with volatiles.  */
3967   if (MEM_VOLATILE_P (op))
3968     return 0;
3969
3970   op = XEXP (op, 0);
3971
3972   /* Pushes and pops are only valid on the stack pointer.  */
3973   if (GET_CODE (op) == PRE_DEC
3974       || GET_CODE (op) == POST_INC)
3975     return 1;
3976
3977   /* Decode the address.  */
3978   if (! ix86_decompose_address (op, &parts))
3979     abort ();
3980
3981   if (parts.base && GET_CODE (parts.base) == SUBREG)
3982     parts.base = SUBREG_REG (parts.base);
3983   if (parts.index && GET_CODE (parts.index) == SUBREG)
3984     parts.index = SUBREG_REG (parts.index);
3985
3986   /* Look for some component that isn't known to be aligned.  */
3987   if (parts.index)
3988     {
3989       if (parts.scale < 4
3990           && REGNO_POINTER_ALIGN (REGNO (parts.index)) < 32)
3991         return 0;
3992     }
3993   if (parts.base)
3994     {
3995       if (REGNO_POINTER_ALIGN (REGNO (parts.base)) < 32)
3996         return 0;
3997     }
3998   if (parts.disp)
3999     {
4000       if (GET_CODE (parts.disp) != CONST_INT
4001           || (INTVAL (parts.disp) & 3) != 0)
4002         return 0;
4003     }
4004
4005   /* Didn't find one -- this must be an aligned address.  */
4006   return 1;
4007 }
4008 \f
4009 /* Return true if the constant is something that can be loaded with
4010    a special instruction.  Only handle 0.0 and 1.0; others are less
4011    worthwhile.  */
4012
4013 int
4014 standard_80387_constant_p (x)
4015      rtx x;
4016 {
4017   if (GET_CODE (x) != CONST_DOUBLE || !FLOAT_MODE_P (GET_MODE (x)))
4018     return -1;
4019   /* Note that on the 80387, other constants, such as pi, that we should support
4020      too.  On some machines, these are much slower to load as standard constant,
4021      than to load from doubles in memory.  */
4022   if (x == CONST0_RTX (GET_MODE (x)))
4023     return 1;
4024   if (x == CONST1_RTX (GET_MODE (x)))
4025     return 2;
4026   return 0;
4027 }
4028
4029 /* Return 1 if X is FP constant we can load to SSE register w/o using memory.
4030  */
4031 int
4032 standard_sse_constant_p (x)
4033      rtx x;
4034 {
4035   if (x == const0_rtx)
4036     return 1;
4037   return (x == CONST0_RTX (GET_MODE (x)));
4038 }
4039
4040 /* Returns 1 if OP contains a symbol reference */
4041
4042 int
4043 symbolic_reference_mentioned_p (op)
4044      rtx op;
4045 {
4046   register const char *fmt;
4047   register int i;
4048
4049   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
4050     return 1;
4051
4052   fmt = GET_RTX_FORMAT (GET_CODE (op));
4053   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
4054     {
4055       if (fmt[i] == 'E')
4056         {
4057           register int j;
4058
4059           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
4060             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
4061               return 1;
4062         }
4063
4064       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
4065         return 1;
4066     }
4067
4068   return 0;
4069 }
4070
4071 /* Return 1 if it is appropriate to emit `ret' instructions in the
4072    body of a function.  Do this only if the epilogue is simple, needing a
4073    couple of insns.  Prior to reloading, we can't tell how many registers
4074    must be saved, so return 0 then.  Return 0 if there is no frame
4075    marker to de-allocate.
4076
4077    If NON_SAVING_SETJMP is defined and true, then it is not possible
4078    for the epilogue to be simple, so return 0.  This is a special case
4079    since NON_SAVING_SETJMP will not cause regs_ever_live to change
4080    until final, but jump_optimize may need to know sooner if a
4081    `return' is OK.  */
4082
4083 int
4084 ix86_can_use_return_insn_p ()
4085 {
4086   struct ix86_frame frame;
4087
4088 #ifdef NON_SAVING_SETJMP
4089   if (NON_SAVING_SETJMP && current_function_calls_setjmp)
4090     return 0;
4091 #endif
4092
4093   if (! reload_completed || frame_pointer_needed)
4094     return 0;
4095
4096   /* Don't allow more than 32 pop, since that's all we can do
4097      with one instruction.  */
4098   if (current_function_pops_args
4099       && current_function_args_size >= 32768)
4100     return 0;
4101
4102   ix86_compute_frame_layout (&frame);
4103   return frame.to_allocate == 0 && frame.nregs == 0;
4104 }
4105 \f
4106 /* Return 1 if VALUE can be stored in the sign extended immediate field.  */
4107 int
4108 x86_64_sign_extended_value (value)
4109      rtx value;
4110 {
4111   switch (GET_CODE (value))
4112     {
4113       /* CONST_DOUBLES never match, since HOST_BITS_PER_WIDE_INT is known
4114          to be at least 32 and this all acceptable constants are
4115          represented as CONST_INT.  */
4116       case CONST_INT:
4117         if (HOST_BITS_PER_WIDE_INT == 32)
4118           return 1;
4119         else
4120           {
4121             HOST_WIDE_INT val = trunc_int_for_mode (INTVAL (value), DImode);
4122             return trunc_int_for_mode (val, SImode) == val;
4123           }
4124         break;
4125
4126       /* For certain code models, the symbolic references are known to fit.
4127          in CM_SMALL_PIC model we know it fits if it is local to the shared
4128          library.  Don't count TLS SYMBOL_REFs here, since they should fit
4129          only if inside of UNSPEC handled below.  */
4130       case SYMBOL_REF:
4131         return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL);
4132
4133       /* For certain code models, the code is near as well.  */
4134       case LABEL_REF:
4135         return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM
4136                 || ix86_cmodel == CM_KERNEL);
4137
4138       /* We also may accept the offsetted memory references in certain special
4139          cases.  */
4140       case CONST:
4141         if (GET_CODE (XEXP (value, 0)) == UNSPEC)
4142           switch (XINT (XEXP (value, 0), 1))
4143             {
4144             case UNSPEC_GOTPCREL:
4145             case UNSPEC_DTPOFF:
4146             case UNSPEC_GOTNTPOFF:
4147             case UNSPEC_NTPOFF:
4148               return 1;
4149             default:
4150               break;
4151             }
4152         if (GET_CODE (XEXP (value, 0)) == PLUS)
4153           {
4154             rtx op1 = XEXP (XEXP (value, 0), 0);
4155             rtx op2 = XEXP (XEXP (value, 0), 1);
4156             HOST_WIDE_INT offset;
4157
4158             if (ix86_cmodel == CM_LARGE)
4159               return 0;
4160             if (GET_CODE (op2) != CONST_INT)
4161               return 0;
4162             offset = trunc_int_for_mode (INTVAL (op2), DImode);
4163             switch (GET_CODE (op1))
4164               {
4165                 case SYMBOL_REF:
4166                   /* For CM_SMALL assume that latest object is 16MB before
4167                      end of 31bits boundary.  We may also accept pretty
4168                      large negative constants knowing that all objects are
4169                      in the positive half of address space.  */
4170                   if (ix86_cmodel == CM_SMALL
4171                       && offset < 16*1024*1024
4172                       && trunc_int_for_mode (offset, SImode) == offset)
4173                     return 1;
4174                   /* For CM_KERNEL we know that all object resist in the
4175                      negative half of 32bits address space.  We may not
4176                      accept negative offsets, since they may be just off
4177                      and we may accept pretty large positive ones.  */
4178                   if (ix86_cmodel == CM_KERNEL
4179                       && offset > 0
4180                       && trunc_int_for_mode (offset, SImode) == offset)
4181                     return 1;
4182                   break;
4183                 case LABEL_REF:
4184                   /* These conditions are similar to SYMBOL_REF ones, just the
4185                      constraints for code models differ.  */
4186                   if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM)
4187                       && offset < 16*1024*1024
4188                       && trunc_int_for_mode (offset, SImode) == offset)
4189                     return 1;
4190                   if (ix86_cmodel == CM_KERNEL
4191                       && offset > 0
4192                       && trunc_int_for_mode (offset, SImode) == offset)
4193                     return 1;
4194                   break;
4195                 case UNSPEC:
4196                   switch (XINT (op1, 1))
4197                     {
4198                     case UNSPEC_DTPOFF:
4199                     case UNSPEC_NTPOFF:
4200                       if (offset > 0
4201                           && trunc_int_for_mode (offset, SImode) == offset)
4202                         return 1;
4203                     }
4204                   break;
4205                 default:
4206                   return 0;
4207               }
4208           }
4209         return 0;
4210       default:
4211         return 0;
4212     }
4213 }
4214
4215 /* Return 1 if VALUE can be stored in the zero extended immediate field.  */
4216 int
4217 x86_64_zero_extended_value (value)
4218      rtx value;
4219 {
4220   switch (GET_CODE (value))
4221     {
4222       case CONST_DOUBLE:
4223         if (HOST_BITS_PER_WIDE_INT == 32)
4224           return  (GET_MODE (value) == VOIDmode
4225                    && !CONST_DOUBLE_HIGH (value));
4226         else
4227           return 0;
4228       case CONST_INT:
4229         if (HOST_BITS_PER_WIDE_INT == 32)
4230           return INTVAL (value) >= 0;
4231         else
4232           return !(INTVAL (value) & ~(HOST_WIDE_INT) 0xffffffff);
4233         break;
4234
4235       /* For certain code models, the symbolic references are known to fit.  */
4236       case SYMBOL_REF:
4237         return ix86_cmodel == CM_SMALL;
4238
4239       /* For certain code models, the code is near as well.  */
4240       case LABEL_REF:
4241         return ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM;
4242
4243       /* We also may accept the offsetted memory references in certain special
4244          cases.  */
4245       case CONST:
4246         if (GET_CODE (XEXP (value, 0)) == PLUS)
4247           {
4248             rtx op1 = XEXP (XEXP (value, 0), 0);
4249             rtx op2 = XEXP (XEXP (value, 0), 1);
4250
4251             if (ix86_cmodel == CM_LARGE)
4252               return 0;
4253             switch (GET_CODE (op1))
4254               {
4255                 case SYMBOL_REF:
4256                     return 0;
4257                   /* For small code model we may accept pretty large positive
4258                      offsets, since one bit is available for free.  Negative
4259                      offsets are limited by the size of NULL pointer area
4260                      specified by the ABI.  */
4261                   if (ix86_cmodel == CM_SMALL
4262                       && GET_CODE (op2) == CONST_INT
4263                       && trunc_int_for_mode (INTVAL (op2), DImode) > -0x10000
4264                       && (trunc_int_for_mode (INTVAL (op2), SImode)
4265                           == INTVAL (op2)))
4266                     return 1;
4267                   /* ??? For the kernel, we may accept adjustment of
4268                      -0x10000000, since we know that it will just convert
4269                      negative address space to positive, but perhaps this
4270                      is not worthwhile.  */
4271                   break;
4272                 case LABEL_REF:
4273                   /* These conditions are similar to SYMBOL_REF ones, just the
4274                      constraints for code models differ.  */
4275                   if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM)
4276                       && GET_CODE (op2) == CONST_INT
4277                       && trunc_int_for_mode (INTVAL (op2), DImode) > -0x10000
4278                       && (trunc_int_for_mode (INTVAL (op2), SImode)
4279                           == INTVAL (op2)))
4280                     return 1;
4281                   break;
4282                 default:
4283                   return 0;
4284               }
4285           }
4286         return 0;
4287       default:
4288         return 0;
4289     }
4290 }
4291
4292 /* Value should be nonzero if functions must have frame pointers.
4293    Zero means the frame pointer need not be set up (and parms may
4294    be accessed via the stack pointer) in functions that seem suitable.  */
4295
4296 int
4297 ix86_frame_pointer_required ()
4298 {
4299   /* If we accessed previous frames, then the generated code expects
4300      to be able to access the saved ebp value in our frame.  */
4301   if (cfun->machine->accesses_prev_frame)
4302     return 1;
4303
4304   /* Several x86 os'es need a frame pointer for other reasons,
4305      usually pertaining to setjmp.  */
4306   if (SUBTARGET_FRAME_POINTER_REQUIRED)
4307     return 1;
4308
4309   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
4310      the frame pointer by default.  Turn it back on now if we've not
4311      got a leaf function.  */
4312   if (TARGET_OMIT_LEAF_FRAME_POINTER
4313       && (!current_function_is_leaf))
4314     return 1;
4315
4316   if (current_function_profile)
4317     return 1;
4318
4319   return 0;
4320 }
4321
4322 /* Record that the current function accesses previous call frames.  */
4323
4324 void
4325 ix86_setup_frame_addresses ()
4326 {
4327   cfun->machine->accesses_prev_frame = 1;
4328 }
4329 \f
4330 #if defined(HAVE_GAS_HIDDEN) && defined(SUPPORTS_ONE_ONLY)
4331 # define USE_HIDDEN_LINKONCE 1
4332 #else
4333 # define USE_HIDDEN_LINKONCE 0
4334 #endif
4335
4336 static int pic_labels_used;
4337
4338 /* Fills in the label name that should be used for a pc thunk for
4339    the given register.  */
4340
4341 static void
4342 get_pc_thunk_name (name, regno)
4343      char name[32];
4344      unsigned int regno;
4345 {
4346   if (USE_HIDDEN_LINKONCE)
4347     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
4348   else
4349     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
4350 }
4351
4352
4353 /* This function generates code for -fpic that loads %ebx with
4354    the return address of the caller and then returns.  */
4355
4356 void
4357 ix86_asm_file_end (file)
4358      FILE *file;
4359 {
4360   rtx xops[2];
4361   int regno;
4362
4363   for (regno = 0; regno < 8; ++regno)
4364     {
4365       char name[32];
4366
4367       if (! ((pic_labels_used >> regno) & 1))
4368         continue;
4369
4370       get_pc_thunk_name (name, regno);
4371
4372       if (USE_HIDDEN_LINKONCE)
4373         {
4374           tree decl;
4375
4376           decl = build_decl (FUNCTION_DECL, get_identifier (name),
4377                              error_mark_node);
4378           TREE_PUBLIC (decl) = 1;
4379           TREE_STATIC (decl) = 1;
4380           DECL_ONE_ONLY (decl) = 1;
4381
4382           (*targetm.asm_out.unique_section) (decl, 0);
4383           named_section (decl, NULL, 0);
4384
4385           (*targetm.asm_out.globalize_label) (file, name);
4386           fputs ("\t.hidden\t", file);
4387           assemble_name (file, name);
4388           fputc ('\n', file);
4389           ASM_DECLARE_FUNCTION_NAME (file, name, decl);
4390         }
4391       else
4392         {
4393           text_section ();
4394           ASM_OUTPUT_LABEL (file, name);
4395         }
4396
4397       xops[0] = gen_rtx_REG (SImode, regno);
4398       xops[1] = gen_rtx_MEM (SImode, stack_pointer_rtx);
4399       output_asm_insn ("mov{l}\t{%1, %0|%0, %1}", xops);
4400       output_asm_insn ("ret", xops);
4401     }
4402 }
4403
4404 /* Emit code for the SET_GOT patterns.  */
4405
4406 const char *
4407 output_set_got (dest)
4408      rtx dest;
4409 {
4410   rtx xops[3];
4411
4412   xops[0] = dest;
4413   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
4414
4415   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
4416     {
4417       xops[2] = gen_rtx_LABEL_REF (Pmode, gen_label_rtx ());
4418
4419       if (!flag_pic)
4420         output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
4421       else
4422         output_asm_insn ("call\t%a2", xops);
4423
4424 #if TARGET_MACHO
4425       /* Output the "canonical" label name ("Lxx$pb") here too.  This
4426          is what will be referred to by the Mach-O PIC subsystem.  */
4427       ASM_OUTPUT_LABEL (asm_out_file, machopic_function_base_name ());
4428 #endif
4429       (*targetm.asm_out.internal_label) (asm_out_file, "L",
4430                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
4431
4432       if (flag_pic)
4433         output_asm_insn ("pop{l}\t%0", xops);
4434     }
4435   else
4436     {
4437       char name[32];
4438       get_pc_thunk_name (name, REGNO (dest));
4439       pic_labels_used |= 1 << REGNO (dest);
4440
4441       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
4442       xops[2] = gen_rtx_MEM (QImode, xops[2]);
4443       output_asm_insn ("call\t%X2", xops);
4444     }
4445
4446   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
4447     output_asm_insn ("add{l}\t{%1, %0|%0, %1}", xops);
4448   else if (!TARGET_MACHO)
4449     output_asm_insn ("add{l}\t{%1+[.-%a2], %0|%0, %a1+(.-%a2)}", xops);
4450
4451   return "";
4452 }
4453
4454 /* Generate an "push" pattern for input ARG.  */
4455
4456 static rtx
4457 gen_push (arg)
4458      rtx arg;
4459 {
4460   return gen_rtx_SET (VOIDmode,
4461                       gen_rtx_MEM (Pmode,
4462                                    gen_rtx_PRE_DEC (Pmode,
4463                                                     stack_pointer_rtx)),
4464                       arg);
4465 }
4466
4467 /* Return >= 0 if there is an unused call-clobbered register available
4468    for the entire function.  */
4469
4470 static unsigned int
4471 ix86_select_alt_pic_regnum ()
4472 {
4473   if (current_function_is_leaf && !current_function_profile)
4474     {
4475       int i;
4476       for (i = 2; i >= 0; --i)
4477         if (!regs_ever_live[i])
4478           return i;
4479     }
4480
4481   return INVALID_REGNUM;
4482 }
4483
4484 /* Return 1 if we need to save REGNO.  */
4485 static int
4486 ix86_save_reg (regno, maybe_eh_return)
4487      unsigned int regno;
4488      int maybe_eh_return;
4489 {
4490   if (pic_offset_table_rtx
4491       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
4492       && (regs_ever_live[REAL_PIC_OFFSET_TABLE_REGNUM]
4493           || current_function_profile
4494           || current_function_calls_eh_return))
4495     {
4496       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
4497         return 0;
4498       return 1;
4499     }
4500
4501   if (current_function_calls_eh_return && maybe_eh_return)
4502     {
4503       unsigned i;
4504       for (i = 0; ; i++)
4505         {
4506           unsigned test = EH_RETURN_DATA_REGNO (i);
4507           if (test == INVALID_REGNUM)
4508             break;
4509           if (test == regno)
4510             return 1;
4511         }
4512     }
4513
4514   return (regs_ever_live[regno]
4515           && !call_used_regs[regno]
4516           && !fixed_regs[regno]
4517           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
4518 }
4519
4520 /* Return number of registers to be saved on the stack.  */
4521
4522 static int
4523 ix86_nsaved_regs ()
4524 {
4525   int nregs = 0;
4526   int regno;
4527
4528   for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno--)
4529     if (ix86_save_reg (regno, true))
4530       nregs++;
4531   return nregs;
4532 }
4533
4534 /* Return the offset between two registers, one to be eliminated, and the other
4535    its replacement, at the start of a routine.  */
4536
4537 HOST_WIDE_INT
4538 ix86_initial_elimination_offset (from, to)
4539      int from;
4540      int to;
4541 {
4542   struct ix86_frame frame;
4543   ix86_compute_frame_layout (&frame);
4544
4545   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
4546     return frame.hard_frame_pointer_offset;
4547   else if (from == FRAME_POINTER_REGNUM
4548            && to == HARD_FRAME_POINTER_REGNUM)
4549     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
4550   else
4551     {
4552       if (to != STACK_POINTER_REGNUM)
4553         abort ();
4554       else if (from == ARG_POINTER_REGNUM)
4555         return frame.stack_pointer_offset;
4556       else if (from != FRAME_POINTER_REGNUM)
4557         abort ();
4558       else
4559         return frame.stack_pointer_offset - frame.frame_pointer_offset;
4560     }
4561 }
4562
4563 /* Fill structure ix86_frame about frame of currently computed function.  */
4564
4565 static void
4566 ix86_compute_frame_layout (frame)
4567      struct ix86_frame *frame;
4568 {
4569   HOST_WIDE_INT total_size;
4570   int stack_alignment_needed = cfun->stack_alignment_needed / BITS_PER_UNIT;
4571   int offset;
4572   int preferred_alignment = cfun->preferred_stack_boundary / BITS_PER_UNIT;
4573   HOST_WIDE_INT size = get_frame_size ();
4574
4575   frame->nregs = ix86_nsaved_regs ();
4576   total_size = size;
4577
4578   /* Skip return address and saved base pointer.  */
4579   offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
4580
4581   frame->hard_frame_pointer_offset = offset;
4582
4583   /* Do some sanity checking of stack_alignment_needed and
4584      preferred_alignment, since i386 port is the only using those features
4585      that may break easily.  */
4586
4587   if (size && !stack_alignment_needed)
4588     abort ();
4589   if (preferred_alignment < STACK_BOUNDARY / BITS_PER_UNIT)
4590     abort ();
4591   if (preferred_alignment > PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
4592     abort ();
4593   if (stack_alignment_needed > PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
4594     abort ();
4595
4596   if (stack_alignment_needed < STACK_BOUNDARY / BITS_PER_UNIT)
4597     stack_alignment_needed = STACK_BOUNDARY / BITS_PER_UNIT;
4598
4599   /* Register save area */
4600   offset += frame->nregs * UNITS_PER_WORD;
4601
4602   /* Va-arg area */
4603   if (ix86_save_varrargs_registers)
4604     {
4605       offset += X86_64_VARARGS_SIZE;
4606       frame->va_arg_size = X86_64_VARARGS_SIZE;
4607     }
4608   else
4609     frame->va_arg_size = 0;
4610
4611   /* Align start of frame for local function.  */
4612   frame->padding1 = ((offset + stack_alignment_needed - 1)
4613                      & -stack_alignment_needed) - offset;
4614
4615   offset += frame->padding1;
4616
4617   /* Frame pointer points here.  */
4618   frame->frame_pointer_offset = offset;
4619
4620   offset += size;
4621
4622   /* Add outgoing arguments area.  Can be skipped if we eliminated
4623      all the function calls as dead code.  */
4624   if (ACCUMULATE_OUTGOING_ARGS && !current_function_is_leaf)
4625     {
4626       offset += current_function_outgoing_args_size;
4627       frame->outgoing_arguments_size = current_function_outgoing_args_size;
4628     }
4629   else
4630     frame->outgoing_arguments_size = 0;
4631
4632   /* Align stack boundary.  Only needed if we're calling another function
4633      or using alloca.  */
4634   if (!current_function_is_leaf || current_function_calls_alloca)
4635     frame->padding2 = ((offset + preferred_alignment - 1)
4636                        & -preferred_alignment) - offset;
4637   else
4638     frame->padding2 = 0;
4639
4640   offset += frame->padding2;
4641
4642   /* We've reached end of stack frame.  */
4643   frame->stack_pointer_offset = offset;
4644
4645   /* Size prologue needs to allocate.  */
4646   frame->to_allocate =
4647     (size + frame->padding1 + frame->padding2
4648      + frame->outgoing_arguments_size + frame->va_arg_size);
4649
4650   if (TARGET_64BIT && TARGET_RED_ZONE && current_function_sp_is_unchanging
4651       && current_function_is_leaf)
4652     {
4653       frame->red_zone_size = frame->to_allocate;
4654       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
4655         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
4656     }
4657   else
4658     frame->red_zone_size = 0;
4659   frame->to_allocate -= frame->red_zone_size;
4660   frame->stack_pointer_offset -= frame->red_zone_size;
4661 #if 0
4662   fprintf (stderr, "nregs: %i\n", frame->nregs);
4663   fprintf (stderr, "size: %i\n", size);
4664   fprintf (stderr, "alignment1: %i\n", stack_alignment_needed);
4665   fprintf (stderr, "padding1: %i\n", frame->padding1);
4666   fprintf (stderr, "va_arg: %i\n", frame->va_arg_size);
4667   fprintf (stderr, "padding2: %i\n", frame->padding2);
4668   fprintf (stderr, "to_allocate: %i\n", frame->to_allocate);
4669   fprintf (stderr, "red_zone_size: %i\n", frame->red_zone_size);
4670   fprintf (stderr, "frame_pointer_offset: %i\n", frame->frame_pointer_offset);
4671   fprintf (stderr, "hard_frame_pointer_offset: %i\n",
4672            frame->hard_frame_pointer_offset);
4673   fprintf (stderr, "stack_pointer_offset: %i\n", frame->stack_pointer_offset);
4674 #endif
4675 }
4676
4677 /* Emit code to save registers in the prologue.  */
4678
4679 static void
4680 ix86_emit_save_regs ()
4681 {
4682   register int regno;
4683   rtx insn;
4684
4685   for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno--)
4686     if (ix86_save_reg (regno, true))
4687       {
4688         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
4689         RTX_FRAME_RELATED_P (insn) = 1;
4690       }
4691 }
4692
4693 /* Emit code to save registers using MOV insns.  First register
4694    is restored from POINTER + OFFSET.  */
4695 static void
4696 ix86_emit_save_regs_using_mov (pointer, offset)
4697      rtx pointer;
4698      HOST_WIDE_INT offset;
4699 {
4700   int regno;
4701   rtx insn;
4702
4703   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4704     if (ix86_save_reg (regno, true))
4705       {
4706         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
4707                                                Pmode, offset),
4708                                gen_rtx_REG (Pmode, regno));
4709         RTX_FRAME_RELATED_P (insn) = 1;
4710         offset += UNITS_PER_WORD;
4711       }
4712 }
4713
4714 /* Expand the prologue into a bunch of separate insns.  */
4715
4716 void
4717 ix86_expand_prologue ()
4718 {
4719   rtx insn;
4720   bool pic_reg_used;
4721   struct ix86_frame frame;
4722   int use_mov = 0;
4723   HOST_WIDE_INT allocate;
4724
4725   ix86_compute_frame_layout (&frame);
4726   if (!optimize_size)
4727     {
4728       int count = frame.nregs;
4729
4730       /* The fast prologue uses move instead of push to save registers.  This
4731          is significantly longer, but also executes faster as modern hardware
4732          can execute the moves in parallel, but can't do that for push/pop.
4733          
4734          Be careful about choosing what prologue to emit:  When function takes
4735          many instructions to execute we may use slow version as well as in
4736          case function is known to be outside hot spot (this is known with
4737          feedback only).  Weight the size of function by number of registers
4738          to save as it is cheap to use one or two push instructions but very
4739          slow to use many of them.  */
4740       if (count)
4741         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
4742       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
4743           || (flag_branch_probabilities
4744               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
4745         use_fast_prologue_epilogue = 0;
4746       else
4747         use_fast_prologue_epilogue = !expensive_function_p (count);
4748       if (TARGET_PROLOGUE_USING_MOVE)
4749         use_mov = use_fast_prologue_epilogue;
4750     }
4751
4752   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
4753      slower on all targets.  Also sdb doesn't like it.  */
4754
4755   if (frame_pointer_needed)
4756     {
4757       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
4758       RTX_FRAME_RELATED_P (insn) = 1;
4759
4760       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
4761       RTX_FRAME_RELATED_P (insn) = 1;
4762     }
4763
4764   allocate = frame.to_allocate;
4765   /* In case we are dealing only with single register and empty frame,
4766      push is equivalent of the mov+add sequence.  */
4767   if (allocate == 0 && frame.nregs <= 1)
4768     use_mov = 0;
4769
4770   if (!use_mov)
4771     ix86_emit_save_regs ();
4772   else
4773     allocate += frame.nregs * UNITS_PER_WORD;
4774
4775   if (allocate == 0)
4776     ;
4777   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
4778     {
4779       insn = emit_insn (gen_pro_epilogue_adjust_stack
4780                         (stack_pointer_rtx, stack_pointer_rtx,
4781                          GEN_INT (-allocate)));
4782       RTX_FRAME_RELATED_P (insn) = 1;
4783     }
4784   else
4785     {
4786       /* ??? Is this only valid for Win32?  */
4787
4788       rtx arg0, sym;
4789
4790       if (TARGET_64BIT)
4791         abort ();
4792
4793       arg0 = gen_rtx_REG (SImode, 0);
4794       emit_move_insn (arg0, GEN_INT (allocate));
4795
4796       sym = gen_rtx_MEM (FUNCTION_MODE,
4797                          gen_rtx_SYMBOL_REF (Pmode, "_alloca"));
4798       insn = emit_call_insn (gen_call (sym, const0_rtx, constm1_rtx));
4799
4800       CALL_INSN_FUNCTION_USAGE (insn)
4801         = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, arg0),
4802                              CALL_INSN_FUNCTION_USAGE (insn));
4803     }
4804   if (use_mov)
4805     {
4806       if (!frame_pointer_needed || !frame.to_allocate)
4807         ix86_emit_save_regs_using_mov (stack_pointer_rtx, frame.to_allocate);
4808       else
4809         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
4810                                        -frame.nregs * UNITS_PER_WORD);
4811     }
4812
4813 #ifdef SUBTARGET_PROLOGUE
4814   SUBTARGET_PROLOGUE;
4815 #endif
4816
4817   pic_reg_used = false;
4818   if (pic_offset_table_rtx
4819       && (regs_ever_live[REAL_PIC_OFFSET_TABLE_REGNUM]
4820           || current_function_profile))
4821     {
4822       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
4823
4824       if (alt_pic_reg_used != INVALID_REGNUM)
4825         REGNO (pic_offset_table_rtx) = alt_pic_reg_used;
4826
4827       pic_reg_used = true;
4828     }
4829
4830   if (pic_reg_used)
4831     {
4832       insn = emit_insn (gen_set_got (pic_offset_table_rtx));
4833
4834       /* Even with accurate pre-reload life analysis, we can wind up
4835          deleting all references to the pic register after reload.
4836          Consider if cross-jumping unifies two sides of a branch
4837          controlled by a comparison vs the only read from a global.
4838          In which case, allow the set_got to be deleted, though we're
4839          too late to do anything about the ebx save in the prologue.  */
4840       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD, const0_rtx, NULL);
4841     }
4842
4843   /* Prevent function calls from be scheduled before the call to mcount.
4844      In the pic_reg_used case, make sure that the got load isn't deleted.  */
4845   if (current_function_profile)
4846     emit_insn (gen_blockage (pic_reg_used ? pic_offset_table_rtx : const0_rtx));
4847 }
4848
4849 /* Emit code to restore saved registers using MOV insns.  First register
4850    is restored from POINTER + OFFSET.  */
4851 static void
4852 ix86_emit_restore_regs_using_mov (pointer, offset, maybe_eh_return)
4853      rtx pointer;
4854      int offset;
4855      int maybe_eh_return;
4856 {
4857   int regno;
4858
4859   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4860     if (ix86_save_reg (regno, maybe_eh_return))
4861       {
4862         emit_move_insn (gen_rtx_REG (Pmode, regno),
4863                         adjust_address (gen_rtx_MEM (Pmode, pointer),
4864                                         Pmode, offset));
4865         offset += UNITS_PER_WORD;
4866       }
4867 }
4868
4869 /* Restore function stack, frame, and registers.  */
4870
4871 void
4872 ix86_expand_epilogue (style)
4873      int style;
4874 {
4875   int regno;
4876   int sp_valid = !frame_pointer_needed || current_function_sp_is_unchanging;
4877   struct ix86_frame frame;
4878   HOST_WIDE_INT offset;
4879
4880   ix86_compute_frame_layout (&frame);
4881
4882   /* Calculate start of saved registers relative to ebp.  Special care
4883      must be taken for the normal return case of a function using
4884      eh_return: the eax and edx registers are marked as saved, but not
4885      restored along this path.  */
4886   offset = frame.nregs;
4887   if (current_function_calls_eh_return && style != 2)
4888     offset -= 2;
4889   offset *= -UNITS_PER_WORD;
4890
4891   /* If we're only restoring one register and sp is not valid then
4892      using a move instruction to restore the register since it's
4893      less work than reloading sp and popping the register.
4894
4895      The default code result in stack adjustment using add/lea instruction,
4896      while this code results in LEAVE instruction (or discrete equivalent),
4897      so it is profitable in some other cases as well.  Especially when there
4898      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
4899      and there is exactly one register to pop. This heuristic may need some
4900      tuning in future.  */
4901   if ((!sp_valid && frame.nregs <= 1)
4902       || (TARGET_EPILOGUE_USING_MOVE
4903           && use_fast_prologue_epilogue
4904           && (frame.nregs > 1 || frame.to_allocate))
4905       || (frame_pointer_needed && !frame.nregs && frame.to_allocate)
4906       || (frame_pointer_needed && TARGET_USE_LEAVE
4907           && use_fast_prologue_epilogue && frame.nregs == 1)
4908       || current_function_calls_eh_return)
4909     {
4910       /* Restore registers.  We can use ebp or esp to address the memory
4911          locations.  If both are available, default to ebp, since offsets
4912          are known to be small.  Only exception is esp pointing directly to the
4913          end of block of saved registers, where we may simplify addressing
4914          mode.  */
4915
4916       if (!frame_pointer_needed || (sp_valid && !frame.to_allocate))
4917         ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
4918                                           frame.to_allocate, style == 2);
4919       else
4920         ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
4921                                           offset, style == 2);
4922
4923       /* eh_return epilogues need %ecx added to the stack pointer.  */
4924       if (style == 2)
4925         {
4926           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
4927
4928           if (frame_pointer_needed)
4929             {
4930               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
4931               tmp = plus_constant (tmp, UNITS_PER_WORD);
4932               emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
4933
4934               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
4935               emit_move_insn (hard_frame_pointer_rtx, tmp);
4936
4937               emit_insn (gen_pro_epilogue_adjust_stack
4938                          (stack_pointer_rtx, sa, const0_rtx));
4939             }
4940           else
4941             {
4942               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
4943               tmp = plus_constant (tmp, (frame.to_allocate
4944                                          + frame.nregs * UNITS_PER_WORD));
4945               emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
4946             }
4947         }
4948       else if (!frame_pointer_needed)
4949         emit_insn (gen_pro_epilogue_adjust_stack
4950                    (stack_pointer_rtx, stack_pointer_rtx,
4951                     GEN_INT (frame.to_allocate
4952                              + frame.nregs * UNITS_PER_WORD)));
4953       /* If not an i386, mov & pop is faster than "leave".  */
4954       else if (TARGET_USE_LEAVE || optimize_size || !use_fast_prologue_epilogue)
4955         emit_insn (TARGET_64BIT ? gen_leave_rex64 () : gen_leave ());
4956       else
4957         {
4958           emit_insn (gen_pro_epilogue_adjust_stack (stack_pointer_rtx,
4959                                                     hard_frame_pointer_rtx,
4960                                                     const0_rtx));
4961           if (TARGET_64BIT)
4962             emit_insn (gen_popdi1 (hard_frame_pointer_rtx));
4963           else
4964             emit_insn (gen_popsi1 (hard_frame_pointer_rtx));
4965         }
4966     }
4967   else
4968     {
4969       /* First step is to deallocate the stack frame so that we can
4970          pop the registers.  */
4971       if (!sp_valid)
4972         {
4973           if (!frame_pointer_needed)
4974             abort ();
4975           emit_insn (gen_pro_epilogue_adjust_stack (stack_pointer_rtx,
4976                                                     hard_frame_pointer_rtx,
4977                                                     GEN_INT (offset)));
4978         }
4979       else if (frame.to_allocate)
4980         emit_insn (gen_pro_epilogue_adjust_stack
4981                    (stack_pointer_rtx, stack_pointer_rtx,
4982                     GEN_INT (frame.to_allocate)));
4983
4984       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4985         if (ix86_save_reg (regno, false))
4986           {
4987             if (TARGET_64BIT)
4988               emit_insn (gen_popdi1 (gen_rtx_REG (Pmode, regno)));
4989             else
4990               emit_insn (gen_popsi1 (gen_rtx_REG (Pmode, regno)));
4991           }
4992       if (frame_pointer_needed)
4993         {
4994           /* Leave results in shorter dependency chains on CPUs that are
4995              able to grok it fast.  */
4996           if (TARGET_USE_LEAVE)
4997             emit_insn (TARGET_64BIT ? gen_leave_rex64 () : gen_leave ());
4998           else if (TARGET_64BIT)
4999             emit_insn (gen_popdi1 (hard_frame_pointer_rtx));
5000           else
5001             emit_insn (gen_popsi1 (hard_frame_pointer_rtx));
5002         }
5003     }
5004
5005   /* Sibcall epilogues don't want a return instruction.  */
5006   if (style == 0)
5007     return;
5008
5009   if (current_function_pops_args && current_function_args_size)
5010     {
5011       rtx popc = GEN_INT (current_function_pops_args);
5012
5013       /* i386 can only pop 64K bytes.  If asked to pop more, pop
5014          return address, do explicit add, and jump indirectly to the
5015          caller.  */
5016
5017       if (current_function_pops_args >= 65536)
5018         {
5019           rtx ecx = gen_rtx_REG (SImode, 2);
5020
5021           /* There are is no "pascal" calling convention in 64bit ABI.  */
5022           if (TARGET_64BIT)
5023             abort ();
5024
5025           emit_insn (gen_popsi1 (ecx));
5026           emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
5027           emit_jump_insn (gen_return_indirect_internal (ecx));
5028         }
5029       else
5030         emit_jump_insn (gen_return_pop_internal (popc));
5031     }
5032   else
5033     emit_jump_insn (gen_return_internal ());
5034 }
5035
5036 /* Reset from the function's potential modifications.  */
5037
5038 static void
5039 ix86_output_function_epilogue (file, size)
5040      FILE *file ATTRIBUTE_UNUSED;
5041      HOST_WIDE_INT size ATTRIBUTE_UNUSED;
5042 {
5043   if (pic_offset_table_rtx)
5044     REGNO (pic_offset_table_rtx) = REAL_PIC_OFFSET_TABLE_REGNUM;
5045 }
5046 \f
5047 /* Extract the parts of an RTL expression that is a valid memory address
5048    for an instruction.  Return 0 if the structure of the address is
5049    grossly off.  Return -1 if the address contains ASHIFT, so it is not
5050    strictly valid, but still used for computing length of lea instruction.
5051    */
5052
5053 static int
5054 ix86_decompose_address (addr, out)
5055      register rtx addr;
5056      struct ix86_address *out;
5057 {
5058   rtx base = NULL_RTX;
5059   rtx index = NULL_RTX;
5060   rtx disp = NULL_RTX;
5061   HOST_WIDE_INT scale = 1;
5062   rtx scale_rtx = NULL_RTX;
5063   int retval = 1;
5064
5065   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
5066     base = addr;
5067   else if (GET_CODE (addr) == PLUS)
5068     {
5069       rtx op0 = XEXP (addr, 0);
5070       rtx op1 = XEXP (addr, 1);
5071       enum rtx_code code0 = GET_CODE (op0);
5072       enum rtx_code code1 = GET_CODE (op1);
5073
5074       if (code0 == REG || code0 == SUBREG)
5075         {
5076           if (code1 == REG || code1 == SUBREG)
5077             index = op0, base = op1;    /* index + base */
5078           else
5079             base = op0, disp = op1;     /* base + displacement */
5080         }
5081       else if (code0 == MULT)
5082         {
5083           index = XEXP (op0, 0);
5084           scale_rtx = XEXP (op0, 1);
5085           if (code1 == REG || code1 == SUBREG)
5086             base = op1;                 /* index*scale + base */
5087           else
5088             disp = op1;                 /* index*scale + disp */
5089         }
5090       else if (code0 == PLUS && GET_CODE (XEXP (op0, 0)) == MULT)
5091         {
5092           index = XEXP (XEXP (op0, 0), 0);      /* index*scale + base + disp */
5093           scale_rtx = XEXP (XEXP (op0, 0), 1);
5094           base = XEXP (op0, 1);
5095           disp = op1;
5096         }
5097       else if (code0 == PLUS)
5098         {
5099           index = XEXP (op0, 0);        /* index + base + disp */
5100           base = XEXP (op0, 1);
5101           disp = op1;
5102         }
5103       else
5104         return 0;
5105     }
5106   else if (GET_CODE (addr) == MULT)
5107     {
5108       index = XEXP (addr, 0);           /* index*scale */
5109       scale_rtx = XEXP (addr, 1);
5110     }
5111   else if (GET_CODE (addr) == ASHIFT)
5112     {
5113       rtx tmp;
5114
5115       /* We're called for lea too, which implements ashift on occasion.  */
5116       index = XEXP (addr, 0);
5117       tmp = XEXP (addr, 1);
5118       if (GET_CODE (tmp) != CONST_INT)
5119         return 0;
5120       scale = INTVAL (tmp);
5121       if ((unsigned HOST_WIDE_INT) scale > 3)
5122         return 0;
5123       scale = 1 << scale;
5124       retval = -1;
5125     }
5126   else
5127     disp = addr;                        /* displacement */
5128
5129   /* Extract the integral value of scale.  */
5130   if (scale_rtx)
5131     {
5132       if (GET_CODE (scale_rtx) != CONST_INT)
5133         return 0;
5134       scale = INTVAL (scale_rtx);
5135     }
5136
5137   /* Allow arg pointer and stack pointer as index if there is not scaling */
5138   if (base && index && scale == 1
5139       && (index == arg_pointer_rtx || index == frame_pointer_rtx
5140           || index == stack_pointer_rtx))
5141     {
5142       rtx tmp = base;
5143       base = index;
5144       index = tmp;
5145     }
5146
5147   /* Special case: %ebp cannot be encoded as a base without a displacement.  */
5148   if ((base == hard_frame_pointer_rtx
5149        || base == frame_pointer_rtx
5150        || base == arg_pointer_rtx) && !disp)
5151     disp = const0_rtx;
5152
5153   /* Special case: on K6, [%esi] makes the instruction vector decoded.
5154      Avoid this by transforming to [%esi+0].  */
5155   if (ix86_cpu == PROCESSOR_K6 && !optimize_size
5156       && base && !index && !disp
5157       && REG_P (base)
5158       && REGNO_REG_CLASS (REGNO (base)) == SIREG)
5159     disp = const0_rtx;
5160
5161   /* Special case: encode reg+reg instead of reg*2.  */
5162   if (!base && index && scale && scale == 2)
5163     base = index, scale = 1;
5164
5165   /* Special case: scaling cannot be encoded without base or displacement.  */
5166   if (!base && !disp && index && scale != 1)
5167     disp = const0_rtx;
5168
5169   out->base = base;
5170   out->index = index;
5171   out->disp = disp;
5172   out->scale = scale;
5173
5174   return retval;
5175 }
5176 \f
5177 /* Return cost of the memory address x.
5178    For i386, it is better to use a complex address than let gcc copy
5179    the address into a reg and make a new pseudo.  But not if the address
5180    requires to two regs - that would mean more pseudos with longer
5181    lifetimes.  */
5182 int
5183 ix86_address_cost (x)
5184      rtx x;
5185 {
5186   struct ix86_address parts;
5187   int cost = 1;
5188
5189   if (!ix86_decompose_address (x, &parts))
5190     abort ();
5191
5192   if (parts.base && GET_CODE (parts.base) == SUBREG)
5193     parts.base = SUBREG_REG (parts.base);
5194   if (parts.index && GET_CODE (parts.index) == SUBREG)
5195     parts.index = SUBREG_REG (parts.index);
5196
5197   /* More complex memory references are better.  */
5198   if (parts.disp && parts.disp != const0_rtx)
5199     cost--;
5200
5201   /* Attempt to minimize number of registers in the address.  */
5202   if ((parts.base
5203        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
5204       || (parts.index
5205           && (!REG_P (parts.index)
5206               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
5207     cost++;
5208
5209   if (parts.base
5210       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
5211       && parts.index
5212       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
5213       && parts.base != parts.index)
5214     cost++;
5215
5216   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
5217      since it's predecode logic can't detect the length of instructions
5218      and it degenerates to vector decoded.  Increase cost of such
5219      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
5220      to split such addresses or even refuse such addresses at all.
5221
5222      Following addressing modes are affected:
5223       [base+scale*index]
5224       [scale*index+disp]
5225       [base+index]
5226
5227      The first and last case  may be avoidable by explicitly coding the zero in
5228      memory address, but I don't have AMD-K6 machine handy to check this
5229      theory.  */
5230
5231   if (TARGET_K6
5232       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
5233           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
5234           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
5235     cost += 10;
5236
5237   return cost;
5238 }
5239 \f
5240 /* If X is a machine specific address (i.e. a symbol or label being
5241    referenced as a displacement from the GOT implemented using an
5242    UNSPEC), then return the base term.  Otherwise return X.  */
5243
5244 rtx
5245 ix86_find_base_term (x)
5246      rtx x;
5247 {
5248   rtx term;
5249
5250   if (TARGET_64BIT)
5251     {
5252       if (GET_CODE (x) != CONST)
5253         return x;
5254       term = XEXP (x, 0);
5255       if (GET_CODE (term) == PLUS
5256           && (GET_CODE (XEXP (term, 1)) == CONST_INT
5257               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
5258         term = XEXP (term, 0);
5259       if (GET_CODE (term) != UNSPEC
5260           || XINT (term, 1) != UNSPEC_GOTPCREL)
5261         return x;
5262
5263       term = XVECEXP (term, 0, 0);
5264
5265       if (GET_CODE (term) != SYMBOL_REF
5266           && GET_CODE (term) != LABEL_REF)
5267         return x;
5268
5269       return term;
5270     }
5271
5272   if (GET_CODE (x) != PLUS
5273       || XEXP (x, 0) != pic_offset_table_rtx
5274       || GET_CODE (XEXP (x, 1)) != CONST)
5275     return x;
5276
5277   term = XEXP (XEXP (x, 1), 0);
5278
5279   if (GET_CODE (term) == PLUS && GET_CODE (XEXP (term, 1)) == CONST_INT)
5280     term = XEXP (term, 0);
5281
5282   if (GET_CODE (term) != UNSPEC
5283       || XINT (term, 1) != UNSPEC_GOTOFF)
5284     return x;
5285
5286   term = XVECEXP (term, 0, 0);
5287
5288   if (GET_CODE (term) != SYMBOL_REF
5289       && GET_CODE (term) != LABEL_REF)
5290     return x;
5291
5292   return term;
5293 }
5294 \f
5295 /* Determine if a given RTX is a valid constant.  We already know this
5296    satisfies CONSTANT_P.  */
5297
5298 bool
5299 legitimate_constant_p (x)
5300      rtx x;
5301 {
5302   rtx inner;
5303
5304   switch (GET_CODE (x))
5305     {
5306     case SYMBOL_REF:
5307       /* TLS symbols are not constant.  */
5308       if (tls_symbolic_operand (x, Pmode))
5309         return false;
5310       break;
5311
5312     case CONST:
5313       inner = XEXP (x, 0);
5314
5315       /* Offsets of TLS symbols are never valid.
5316          Discourage CSE from creating them.  */
5317       if (GET_CODE (inner) == PLUS
5318           && tls_symbolic_operand (XEXP (inner, 0), Pmode))
5319         return false;
5320
5321       /* Only some unspecs are valid as "constants".  */
5322       if (GET_CODE (inner) == UNSPEC)
5323         switch (XINT (inner, 1))
5324           {
5325           case UNSPEC_TPOFF:
5326             return local_exec_symbolic_operand (XVECEXP (inner, 0, 0), Pmode);
5327           default:
5328             return false;
5329           }
5330       break;
5331
5332     default:
5333       break;
5334     }
5335
5336   /* Otherwise we handle everything else in the move patterns.  */
5337   return true;
5338 }
5339
5340 /* Determine if it's legal to put X into the constant pool.  This
5341    is not possible for the address of thread-local symbols, which
5342    is checked above.  */
5343
5344 static bool
5345 ix86_cannot_force_const_mem (x)
5346      rtx x;
5347 {
5348   return !legitimate_constant_p (x);
5349 }
5350
5351 /* Determine if a given RTX is a valid constant address.  */
5352
5353 bool
5354 constant_address_p (x)
5355      rtx x;
5356 {
5357   switch (GET_CODE (x))
5358     {
5359     case LABEL_REF:
5360     case CONST_INT:
5361       return true;
5362
5363     case CONST_DOUBLE:
5364       return TARGET_64BIT;
5365
5366     case CONST:
5367       /* For Mach-O, really believe the CONST.  */
5368       if (TARGET_MACHO)
5369         return true;
5370       /* Otherwise fall through.  */
5371     case SYMBOL_REF:
5372       return !flag_pic && legitimate_constant_p (x);
5373
5374     default:
5375       return false;
5376     }
5377 }
5378
5379 /* Nonzero if the constant value X is a legitimate general operand
5380    when generating PIC code.  It is given that flag_pic is on and
5381    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
5382
5383 bool
5384 legitimate_pic_operand_p (x)
5385      rtx x;
5386 {
5387   rtx inner;
5388
5389   switch (GET_CODE (x))
5390     {
5391     case CONST:
5392       inner = XEXP (x, 0);
5393
5394       /* Only some unspecs are valid as "constants".  */
5395       if (GET_CODE (inner) == UNSPEC)
5396         switch (XINT (inner, 1))
5397           {
5398           case UNSPEC_TPOFF:
5399             return local_exec_symbolic_operand (XVECEXP (inner, 0, 0), Pmode);
5400           default:
5401             return false;
5402           }
5403       /* FALLTHRU */
5404
5405     case SYMBOL_REF:
5406     case LABEL_REF:
5407       return legitimate_pic_address_disp_p (x);
5408
5409     default:
5410       return true;
5411     }
5412 }
5413
5414 /* Determine if a given CONST RTX is a valid memory displacement
5415    in PIC mode.  */
5416
5417 int
5418 legitimate_pic_address_disp_p (disp)
5419      register rtx disp;
5420 {
5421   bool saw_plus;
5422
5423   /* In 64bit mode we can allow direct addresses of symbols and labels
5424      when they are not dynamic symbols.  */
5425   if (TARGET_64BIT)
5426     {
5427       /* TLS references should always be enclosed in UNSPEC.  */
5428       if (tls_symbolic_operand (disp, GET_MODE (disp)))
5429         return 0;
5430       if (GET_CODE (disp) == SYMBOL_REF
5431           && ix86_cmodel == CM_SMALL_PIC
5432           && (CONSTANT_POOL_ADDRESS_P (disp)
5433               || SYMBOL_REF_FLAG (disp)))
5434         return 1;
5435       if (GET_CODE (disp) == LABEL_REF)
5436         return 1;
5437       if (GET_CODE (disp) == CONST
5438           && GET_CODE (XEXP (disp, 0)) == PLUS
5439           && ((GET_CODE (XEXP (XEXP (disp, 0), 0)) == SYMBOL_REF
5440                && ix86_cmodel == CM_SMALL_PIC
5441                && (CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (disp, 0), 0))
5442                    || SYMBOL_REF_FLAG (XEXP (XEXP (disp, 0), 0))))
5443               || GET_CODE (XEXP (XEXP (disp, 0), 0)) == LABEL_REF)
5444           && GET_CODE (XEXP (XEXP (disp, 0), 1)) == CONST_INT
5445           && INTVAL (XEXP (XEXP (disp, 0), 1)) < 16*1024*1024
5446           && INTVAL (XEXP (XEXP (disp, 0), 1)) >= -16*1024*1024)
5447         return 1;
5448     }
5449   if (GET_CODE (disp) != CONST)
5450     return 0;
5451   disp = XEXP (disp, 0);
5452
5453   if (TARGET_64BIT)
5454     {
5455       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
5456          of GOT tables.  We should not need these anyway.  */
5457       if (GET_CODE (disp) != UNSPEC
5458           || XINT (disp, 1) != UNSPEC_GOTPCREL)
5459         return 0;
5460
5461       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
5462           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
5463         return 0;
5464       return 1;
5465     }
5466
5467   saw_plus = false;
5468   if (GET_CODE (disp) == PLUS)
5469     {
5470       if (GET_CODE (XEXP (disp, 1)) != CONST_INT)
5471         return 0;
5472       disp = XEXP (disp, 0);
5473       saw_plus = true;
5474     }
5475
5476   /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O.  */
5477   if (TARGET_MACHO && GET_CODE (disp) == MINUS)
5478     {
5479       if (GET_CODE (XEXP (disp, 0)) == LABEL_REF
5480           || GET_CODE (XEXP (disp, 0)) == SYMBOL_REF)
5481         if (GET_CODE (XEXP (disp, 1)) == SYMBOL_REF)
5482           {
5483             const char *sym_name = XSTR (XEXP (disp, 1), 0);
5484             if (strstr (sym_name, "$pb") != 0)
5485               return 1;
5486           }
5487     }
5488
5489   if (GET_CODE (disp) != UNSPEC)
5490     return 0;
5491
5492   switch (XINT (disp, 1))
5493     {
5494     case UNSPEC_GOT:
5495       if (saw_plus)
5496         return false;
5497       return GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF;
5498     case UNSPEC_GOTOFF:
5499       return local_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5500     case UNSPEC_GOTTPOFF:
5501     case UNSPEC_GOTNTPOFF:
5502     case UNSPEC_INDNTPOFF:
5503       if (saw_plus)
5504         return false;
5505       return initial_exec_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5506     case UNSPEC_NTPOFF:
5507       return local_exec_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5508     case UNSPEC_DTPOFF:
5509       return local_dynamic_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
5510     }
5511
5512   return 0;
5513 }
5514
5515 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression that is a valid
5516    memory address for an instruction.  The MODE argument is the machine mode
5517    for the MEM expression that wants to use this address.
5518
5519    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
5520    convert common non-canonical forms to canonical form so that they will
5521    be recognized.  */
5522
5523 int
5524 legitimate_address_p (mode, addr, strict)
5525      enum machine_mode mode;
5526      register rtx addr;
5527      int strict;
5528 {
5529   struct ix86_address parts;
5530   rtx base, index, disp;
5531   HOST_WIDE_INT scale;
5532   const char *reason = NULL;
5533   rtx reason_rtx = NULL_RTX;
5534
5535   if (TARGET_DEBUG_ADDR)
5536     {
5537       fprintf (stderr,
5538                "\n======\nGO_IF_LEGITIMATE_ADDRESS, mode = %s, strict = %d\n",
5539                GET_MODE_NAME (mode), strict);
5540       debug_rtx (addr);
5541     }
5542
5543   if (GET_CODE (addr) == UNSPEC && XINT (addr, 1) == UNSPEC_TP)
5544     {
5545       if (TARGET_DEBUG_ADDR)
5546         fprintf (stderr, "Success.\n");
5547       return TRUE;
5548     }
5549
5550   if (ix86_decompose_address (addr, &parts) <= 0)
5551     {
5552       reason = "decomposition failed";
5553       goto report_error;
5554     }
5555
5556   base = parts.base;
5557   index = parts.index;
5558   disp = parts.disp;
5559   scale = parts.scale;
5560
5561   /* Validate base register.
5562
5563      Don't allow SUBREG's here, it can lead to spill failures when the base
5564      is one word out of a two word structure, which is represented internally
5565      as a DImode int.  */
5566
5567   if (base)
5568     {
5569       rtx reg;
5570       reason_rtx = base;
5571
5572       if (GET_CODE (base) == SUBREG)
5573         reg = SUBREG_REG (base);
5574       else
5575         reg = base;
5576
5577       if (GET_CODE (reg) != REG)
5578         {
5579           reason = "base is not a register";
5580           goto report_error;
5581         }
5582
5583       if (GET_MODE (base) != Pmode)
5584         {
5585           reason = "base is not in Pmode";
5586           goto report_error;
5587         }
5588
5589       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
5590           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
5591         {
5592           reason = "base is not valid";
5593           goto report_error;
5594         }
5595     }
5596
5597   /* Validate index register.
5598
5599      Don't allow SUBREG's here, it can lead to spill failures when the index
5600      is one word out of a two word structure, which is represented internally
5601      as a DImode int.  */
5602
5603   if (index)
5604     {
5605       rtx reg;
5606       reason_rtx = index;
5607
5608       if (GET_CODE (index) == SUBREG)
5609         reg = SUBREG_REG (index);
5610       else
5611         reg = index;
5612
5613       if (GET_CODE (reg) != REG)
5614         {
5615           reason = "index is not a register";
5616           goto report_error;
5617         }
5618
5619       if (GET_MODE (index) != Pmode)
5620         {
5621           reason = "index is not in Pmode";
5622           goto report_error;
5623         }
5624
5625       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
5626           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
5627         {
5628           reason = "index is not valid";
5629           goto report_error;
5630         }
5631     }
5632
5633   /* Validate scale factor.  */
5634   if (scale != 1)
5635     {
5636       reason_rtx = GEN_INT (scale);
5637       if (!index)
5638         {
5639           reason = "scale without index";
5640           goto report_error;
5641         }
5642
5643       if (scale != 2 && scale != 4 && scale != 8)
5644         {
5645           reason = "scale is not a valid multiplier";
5646           goto report_error;
5647         }
5648     }
5649
5650   /* Validate displacement.  */
5651   if (disp)
5652     {
5653       reason_rtx = disp;
5654
5655       if (GET_CODE (disp) == CONST
5656           && GET_CODE (XEXP (disp, 0)) == UNSPEC)
5657         switch (XINT (XEXP (disp, 0), 1))
5658           {
5659           case UNSPEC_GOT:
5660           case UNSPEC_GOTOFF:
5661           case UNSPEC_GOTPCREL:
5662             if (!flag_pic)
5663               abort ();
5664             goto is_legitimate_pic;
5665
5666           case UNSPEC_GOTTPOFF:
5667           case UNSPEC_GOTNTPOFF:
5668           case UNSPEC_INDNTPOFF:
5669           case UNSPEC_NTPOFF:
5670           case UNSPEC_DTPOFF:
5671             break;
5672
5673           default:
5674             reason = "invalid address unspec";
5675             goto report_error;
5676           }
5677
5678       else if (flag_pic && (SYMBOLIC_CONST (disp)
5679 #if TARGET_MACHO
5680                             && !machopic_operand_p (disp)
5681 #endif
5682                             ))
5683         {
5684         is_legitimate_pic:
5685           if (TARGET_64BIT && (index || base))
5686             {
5687               /* foo@dtpoff(%rX) is ok.  */
5688               if (GET_CODE (disp) != CONST
5689                   || GET_CODE (XEXP (disp, 0)) != PLUS
5690                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
5691                   || GET_CODE (XEXP (XEXP (disp, 0), 1)) != CONST_INT
5692                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
5693                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
5694                 {
5695                   reason = "non-constant pic memory reference";
5696                   goto report_error;
5697                 }
5698             }
5699           else if (! legitimate_pic_address_disp_p (disp))
5700             {
5701               reason = "displacement is an invalid pic construct";
5702               goto report_error;
5703             }
5704
5705           /* This code used to verify that a symbolic pic displacement
5706              includes the pic_offset_table_rtx register.
5707
5708              While this is good idea, unfortunately these constructs may
5709              be created by "adds using lea" optimization for incorrect
5710              code like:
5711
5712              int a;
5713              int foo(int i)
5714                {
5715                  return *(&a+i);
5716                }
5717
5718              This code is nonsensical, but results in addressing
5719              GOT table with pic_offset_table_rtx base.  We can't
5720              just refuse it easily, since it gets matched by
5721              "addsi3" pattern, that later gets split to lea in the
5722              case output register differs from input.  While this
5723              can be handled by separate addsi pattern for this case
5724              that never results in lea, this seems to be easier and
5725              correct fix for crash to disable this test.  */
5726         }
5727       else if (!CONSTANT_ADDRESS_P (disp))
5728         {
5729           reason = "displacement is not constant";
5730           goto report_error;
5731         }
5732       else if (TARGET_64BIT && !x86_64_sign_extended_value (disp))
5733         {
5734           reason = "displacement is out of range";
5735           goto report_error;
5736         }
5737       else if (!TARGET_64BIT && GET_CODE (disp) == CONST_DOUBLE)
5738         {
5739           reason = "displacement is a const_double";
5740           goto report_error;
5741         }
5742     }
5743
5744   /* Everything looks valid.  */
5745   if (TARGET_DEBUG_ADDR)
5746     fprintf (stderr, "Success.\n");
5747   return TRUE;
5748
5749  report_error:
5750   if (TARGET_DEBUG_ADDR)
5751     {
5752       fprintf (stderr, "Error: %s\n", reason);
5753       debug_rtx (reason_rtx);
5754     }
5755   return FALSE;
5756 }
5757 \f
5758 /* Return an unique alias set for the GOT.  */
5759
5760 static HOST_WIDE_INT
5761 ix86_GOT_alias_set ()
5762 {
5763   static HOST_WIDE_INT set = -1;
5764   if (set == -1)
5765     set = new_alias_set ();
5766   return set;
5767 }
5768
5769 /* Return a legitimate reference for ORIG (an address) using the
5770    register REG.  If REG is 0, a new pseudo is generated.
5771
5772    There are two types of references that must be handled:
5773
5774    1. Global data references must load the address from the GOT, via
5775       the PIC reg.  An insn is emitted to do this load, and the reg is
5776       returned.
5777
5778    2. Static data references, constant pool addresses, and code labels
5779       compute the address as an offset from the GOT, whose base is in
5780       the PIC reg.  Static data objects have SYMBOL_REF_FLAG set to
5781       differentiate them from global data objects.  The returned
5782       address is the PIC reg + an unspec constant.
5783
5784    GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
5785    reg also appears in the address.  */
5786
5787 rtx
5788 legitimize_pic_address (orig, reg)
5789      rtx orig;
5790      rtx reg;
5791 {
5792   rtx addr = orig;
5793   rtx new = orig;
5794   rtx base;
5795
5796 #if TARGET_MACHO
5797   if (reg == 0)
5798     reg = gen_reg_rtx (Pmode);
5799   /* Use the generic Mach-O PIC machinery.  */
5800   return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
5801 #endif
5802
5803   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
5804     new = addr;
5805   else if (!TARGET_64BIT && local_symbolic_operand (addr, Pmode))
5806     {
5807       /* This symbol may be referenced via a displacement from the PIC
5808          base address (@GOTOFF).  */
5809
5810       if (reload_in_progress)
5811         regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
5812       new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
5813       new = gen_rtx_CONST (Pmode, new);
5814       new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
5815
5816       if (reg != 0)
5817         {
5818           emit_move_insn (reg, new);
5819           new = reg;
5820         }
5821     }
5822   else if (GET_CODE (addr) == SYMBOL_REF)
5823     {
5824       if (TARGET_64BIT)
5825         {
5826           new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
5827           new = gen_rtx_CONST (Pmode, new);
5828           new = gen_rtx_MEM (Pmode, new);
5829           RTX_UNCHANGING_P (new) = 1;
5830           set_mem_alias_set (new, ix86_GOT_alias_set ());
5831
5832           if (reg == 0)
5833             reg = gen_reg_rtx (Pmode);
5834           /* Use directly gen_movsi, otherwise the address is loaded
5835              into register for CSE.  We don't want to CSE this addresses,
5836              instead we CSE addresses from the GOT table, so skip this.  */
5837           emit_insn (gen_movsi (reg, new));
5838           new = reg;
5839         }
5840       else
5841         {
5842           /* This symbol must be referenced via a load from the
5843              Global Offset Table (@GOT).  */
5844
5845           if (reload_in_progress)
5846             regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
5847           new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
5848           new = gen_rtx_CONST (Pmode, new);
5849           new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
5850           new = gen_rtx_MEM (Pmode, new);
5851           RTX_UNCHANGING_P (new) = 1;
5852           set_mem_alias_set (new, ix86_GOT_alias_set ());
5853
5854           if (reg == 0)
5855             reg = gen_reg_rtx (Pmode);
5856           emit_move_insn (reg, new);
5857           new = reg;
5858         }
5859     }
5860   else
5861     {
5862       if (GET_CODE (addr) == CONST)
5863         {
5864           addr = XEXP (addr, 0);
5865
5866           /* We must match stuff we generate before.  Assume the only
5867              unspecs that can get here are ours.  Not that we could do
5868              anything with them anyway...  */
5869           if (GET_CODE (addr) == UNSPEC
5870               || (GET_CODE (addr) == PLUS
5871                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
5872             return orig;
5873           if (GET_CODE (addr) != PLUS)
5874             abort ();
5875         }
5876       if (GET_CODE (addr) == PLUS)
5877         {
5878           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
5879
5880           /* Check first to see if this is a constant offset from a @GOTOFF
5881              symbol reference.  */
5882           if (local_symbolic_operand (op0, Pmode)
5883               && GET_CODE (op1) == CONST_INT)
5884             {
5885               if (!TARGET_64BIT)
5886                 {
5887                   if (reload_in_progress)
5888                     regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
5889                   new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
5890                                         UNSPEC_GOTOFF);
5891                   new = gen_rtx_PLUS (Pmode, new, op1);
5892                   new = gen_rtx_CONST (Pmode, new);
5893                   new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new);
5894
5895                   if (reg != 0)
5896                     {
5897                       emit_move_insn (reg, new);
5898                       new = reg;
5899                     }
5900                 }
5901               else
5902                 {
5903                   if (INTVAL (op1) < -16*1024*1024
5904                       || INTVAL (op1) >= 16*1024*1024)
5905                     new = gen_rtx_PLUS (Pmode, op0, force_reg (Pmode, op1));
5906                 }
5907             }
5908           else
5909             {
5910               base = legitimize_pic_address (XEXP (addr, 0), reg);
5911               new  = legitimize_pic_address (XEXP (addr, 1),
5912                                              base == reg ? NULL_RTX : reg);
5913
5914               if (GET_CODE (new) == CONST_INT)
5915                 new = plus_constant (base, INTVAL (new));
5916               else
5917                 {
5918                   if (GET_CODE (new) == PLUS && CONSTANT_P (XEXP (new, 1)))
5919                     {
5920                       base = gen_rtx_PLUS (Pmode, base, XEXP (new, 0));
5921                       new = XEXP (new, 1);
5922                     }
5923                   new = gen_rtx_PLUS (Pmode, base, new);
5924                 }
5925             }
5926         }
5927     }
5928   return new;
5929 }
5930
5931 static void
5932 ix86_encode_section_info (decl, first)
5933      tree decl;
5934      int first ATTRIBUTE_UNUSED;
5935 {
5936   bool local_p = (*targetm.binds_local_p) (decl);
5937   rtx rtl, symbol;
5938
5939   rtl = DECL_P (decl) ? DECL_RTL (decl) : TREE_CST_RTL (decl);
5940   if (GET_CODE (rtl) != MEM)
5941     return;
5942   symbol = XEXP (rtl, 0);
5943   if (GET_CODE (symbol) != SYMBOL_REF)
5944     return;
5945
5946   /* For basic x86, if using PIC, mark a SYMBOL_REF for a non-global
5947      symbol so that we may access it directly in the GOT.  */
5948
5949   if (flag_pic)
5950     SYMBOL_REF_FLAG (symbol) = local_p;
5951
5952   /* For ELF, encode thread-local data with %[GLil] for "global dynamic",
5953      "local dynamic", "initial exec" or "local exec" TLS models
5954      respectively.  */
5955
5956   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
5957     {
5958       const char *symbol_str;
5959       char *newstr;
5960       size_t len;
5961       enum tls_model kind = decl_tls_model (decl);
5962
5963       if (TARGET_64BIT && ! flag_pic)
5964         {
5965           /* x86-64 doesn't allow non-pic code for shared libraries,
5966              so don't generate GD/LD TLS models for non-pic code.  */
5967           switch (kind)
5968             {
5969             case TLS_MODEL_GLOBAL_DYNAMIC:
5970               kind = TLS_MODEL_INITIAL_EXEC; break;
5971             case TLS_MODEL_LOCAL_DYNAMIC:
5972               kind = TLS_MODEL_LOCAL_EXEC; break;
5973             default:
5974               break;
5975             }
5976         }
5977
5978       symbol_str = XSTR (symbol, 0);
5979
5980       if (symbol_str[0] == '%')
5981         {
5982           if (symbol_str[1] == tls_model_chars[kind])
5983             return;
5984           symbol_str += 2;
5985         }
5986       len = strlen (symbol_str) + 1;
5987       newstr = alloca (len + 2);
5988
5989       newstr[0] = '%';
5990       newstr[1] = tls_model_chars[kind];
5991       memcpy (newstr + 2, symbol_str, len);
5992
5993       XSTR (symbol, 0) = ggc_alloc_string (newstr, len + 2 - 1);
5994     }
5995 }
5996
5997 /* Undo the above when printing symbol names.  */
5998
5999 static const char *
6000 ix86_strip_name_encoding (str)
6001      const char *str;
6002 {
6003   if (str[0] == '%')
6004     str += 2;
6005   if (str [0] == '*')
6006     str += 1;
6007   return str;
6008 }
6009 \f
6010 /* Load the thread pointer into a register.  */
6011
6012 static rtx
6013 get_thread_pointer ()
6014 {
6015   rtx tp;
6016
6017   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
6018   tp = gen_rtx_MEM (Pmode, tp);
6019   RTX_UNCHANGING_P (tp) = 1;
6020   set_mem_alias_set (tp, ix86_GOT_alias_set ());
6021   tp = force_reg (Pmode, tp);
6022
6023   return tp;
6024 }
6025
6026 /* Try machine-dependent ways of modifying an illegitimate address
6027    to be legitimate.  If we find one, return the new, valid address.
6028    This macro is used in only one place: `memory_address' in explow.c.
6029
6030    OLDX is the address as it was before break_out_memory_refs was called.
6031    In some cases it is useful to look at this to decide what needs to be done.
6032
6033    MODE and WIN are passed so that this macro can use
6034    GO_IF_LEGITIMATE_ADDRESS.
6035
6036    It is always safe for this macro to do nothing.  It exists to recognize
6037    opportunities to optimize the output.
6038
6039    For the 80386, we handle X+REG by loading X into a register R and
6040    using R+REG.  R will go in a general reg and indexing will be used.
6041    However, if REG is a broken-out memory address or multiplication,
6042    nothing needs to be done because REG can certainly go in a general reg.
6043
6044    When -fpic is used, special handling is needed for symbolic references.
6045    See comments by legitimize_pic_address in i386.c for details.  */
6046
6047 rtx
6048 legitimize_address (x, oldx, mode)
6049      register rtx x;
6050      register rtx oldx ATTRIBUTE_UNUSED;
6051      enum machine_mode mode;
6052 {
6053   int changed = 0;
6054   unsigned log;
6055
6056   if (TARGET_DEBUG_ADDR)
6057     {
6058       fprintf (stderr, "\n==========\nLEGITIMIZE_ADDRESS, mode = %s\n",
6059                GET_MODE_NAME (mode));
6060       debug_rtx (x);
6061     }
6062
6063   log = tls_symbolic_operand (x, mode);
6064   if (log)
6065     {
6066       rtx dest, base, off, pic;
6067       int type;
6068
6069       switch (log)
6070         {
6071         case TLS_MODEL_GLOBAL_DYNAMIC:
6072           dest = gen_reg_rtx (Pmode);
6073           if (TARGET_64BIT)
6074             {
6075               rtx rax = gen_rtx_REG (Pmode, 0), insns;
6076
6077               start_sequence ();
6078               emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
6079               insns = get_insns ();
6080               end_sequence ();
6081
6082               emit_libcall_block (insns, dest, rax, x);
6083             }
6084           else
6085             emit_insn (gen_tls_global_dynamic_32 (dest, x));
6086           break;
6087
6088         case TLS_MODEL_LOCAL_DYNAMIC:
6089           base = gen_reg_rtx (Pmode);
6090           if (TARGET_64BIT)
6091             {
6092               rtx rax = gen_rtx_REG (Pmode, 0), insns, note;
6093
6094               start_sequence ();
6095               emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
6096               insns = get_insns ();
6097               end_sequence ();
6098
6099               note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
6100               note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
6101               emit_libcall_block (insns, base, rax, note);
6102             }
6103           else
6104             emit_insn (gen_tls_local_dynamic_base_32 (base));
6105
6106           off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
6107           off = gen_rtx_CONST (Pmode, off);
6108
6109           return gen_rtx_PLUS (Pmode, base, off);
6110
6111         case TLS_MODEL_INITIAL_EXEC:
6112           if (TARGET_64BIT)
6113             {
6114               pic = NULL;
6115               type = UNSPEC_GOTNTPOFF;
6116             }
6117           else if (flag_pic)
6118             {
6119               if (reload_in_progress)
6120                 regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
6121               pic = pic_offset_table_rtx;
6122               type = TARGET_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
6123             }
6124           else if (!TARGET_GNU_TLS)
6125             {
6126               pic = gen_reg_rtx (Pmode);
6127               emit_insn (gen_set_got (pic));
6128               type = UNSPEC_GOTTPOFF;
6129             }
6130           else
6131             {
6132               pic = NULL;
6133               type = UNSPEC_INDNTPOFF;
6134             }
6135
6136           base = get_thread_pointer ();
6137
6138           off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
6139           off = gen_rtx_CONST (Pmode, off);
6140           if (pic)
6141             off = gen_rtx_PLUS (Pmode, pic, off);
6142           off = gen_rtx_MEM (Pmode, off);
6143           RTX_UNCHANGING_P (off) = 1;
6144           set_mem_alias_set (off, ix86_GOT_alias_set ());
6145           dest = gen_reg_rtx (Pmode);
6146
6147           if (TARGET_64BIT || TARGET_GNU_TLS)
6148             {
6149               emit_move_insn (dest, off);
6150               return gen_rtx_PLUS (Pmode, base, dest);
6151             }
6152           else
6153             emit_insn (gen_subsi3 (dest, base, off));
6154           break;
6155
6156         case TLS_MODEL_LOCAL_EXEC:
6157           base = get_thread_pointer ();
6158
6159           off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
6160                                 (TARGET_64BIT || TARGET_GNU_TLS)
6161                                 ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
6162           off = gen_rtx_CONST (Pmode, off);
6163
6164           if (TARGET_64BIT || TARGET_GNU_TLS)
6165             return gen_rtx_PLUS (Pmode, base, off);
6166           else
6167             {
6168               dest = gen_reg_rtx (Pmode);
6169               emit_insn (gen_subsi3 (dest, base, off));
6170             }
6171           break;
6172
6173         default:
6174           abort ();
6175         }
6176
6177       return dest;
6178     }
6179
6180   if (flag_pic && SYMBOLIC_CONST (x))
6181     return legitimize_pic_address (x, 0);
6182
6183   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
6184   if (GET_CODE (x) == ASHIFT
6185       && GET_CODE (XEXP (x, 1)) == CONST_INT
6186       && (log = (unsigned) exact_log2 (INTVAL (XEXP (x, 1)))) < 4)
6187     {
6188       changed = 1;
6189       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
6190                         GEN_INT (1 << log));
6191     }
6192
6193   if (GET_CODE (x) == PLUS)
6194     {
6195       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
6196
6197       if (GET_CODE (XEXP (x, 0)) == ASHIFT
6198           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6199           && (log = (unsigned) exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) < 4)
6200         {
6201           changed = 1;
6202           XEXP (x, 0) = gen_rtx_MULT (Pmode,
6203                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
6204                                       GEN_INT (1 << log));
6205         }
6206
6207       if (GET_CODE (XEXP (x, 1)) == ASHIFT
6208           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
6209           && (log = (unsigned) exact_log2 (INTVAL (XEXP (XEXP (x, 1), 1)))) < 4)
6210         {
6211           changed = 1;
6212           XEXP (x, 1) = gen_rtx_MULT (Pmode,
6213                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
6214                                       GEN_INT (1 << log));
6215         }
6216
6217       /* Put multiply first if it isn't already.  */
6218       if (GET_CODE (XEXP (x, 1)) == MULT)
6219         {
6220           rtx tmp = XEXP (x, 0);
6221           XEXP (x, 0) = XEXP (x, 1);
6222           XEXP (x, 1) = tmp;
6223           changed = 1;
6224         }
6225
6226       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
6227          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
6228          created by virtual register instantiation, register elimination, and
6229          similar optimizations.  */
6230       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
6231         {
6232           changed = 1;
6233           x = gen_rtx_PLUS (Pmode,
6234                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
6235                                           XEXP (XEXP (x, 1), 0)),
6236                             XEXP (XEXP (x, 1), 1));
6237         }
6238
6239       /* Canonicalize
6240          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
6241          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
6242       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
6243                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
6244                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
6245                && CONSTANT_P (XEXP (x, 1)))
6246         {
6247           rtx constant;
6248           rtx other = NULL_RTX;
6249
6250           if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6251             {
6252               constant = XEXP (x, 1);
6253               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
6254             }
6255           else if (GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 1)) == CONST_INT)
6256             {
6257               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
6258               other = XEXP (x, 1);
6259             }
6260           else
6261             constant = 0;
6262
6263           if (constant)
6264             {
6265               changed = 1;
6266               x = gen_rtx_PLUS (Pmode,
6267                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
6268                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
6269                                 plus_constant (other, INTVAL (constant)));
6270             }
6271         }
6272
6273       if (changed && legitimate_address_p (mode, x, FALSE))
6274         return x;
6275
6276       if (GET_CODE (XEXP (x, 0)) == MULT)
6277         {
6278           changed = 1;
6279           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
6280         }
6281
6282       if (GET_CODE (XEXP (x, 1)) == MULT)
6283         {
6284           changed = 1;
6285           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
6286         }
6287
6288       if (changed
6289           && GET_CODE (XEXP (x, 1)) == REG
6290           && GET_CODE (XEXP (x, 0)) == REG)
6291         return x;
6292
6293       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
6294         {
6295           changed = 1;
6296           x = legitimize_pic_address (x, 0);
6297         }
6298
6299       if (changed && legitimate_address_p (mode, x, FALSE))
6300         return x;
6301
6302       if (GET_CODE (XEXP (x, 0)) == REG)
6303         {
6304           register rtx temp = gen_reg_rtx (Pmode);
6305           register rtx val  = force_operand (XEXP (x, 1), temp);
6306           if (val != temp)
6307             emit_move_insn (temp, val);
6308
6309           XEXP (x, 1) = temp;
6310           return x;
6311         }
6312
6313       else if (GET_CODE (XEXP (x, 1)) == REG)
6314         {
6315           register rtx temp = gen_reg_rtx (Pmode);
6316           register rtx val  = force_operand (XEXP (x, 0), temp);
6317           if (val != temp)
6318             emit_move_insn (temp, val);
6319
6320           XEXP (x, 0) = temp;
6321           return x;
6322         }
6323     }
6324
6325   return x;
6326 }
6327 \f
6328 /* Print an integer constant expression in assembler syntax.  Addition
6329    and subtraction are the only arithmetic that may appear in these
6330    expressions.  FILE is the stdio stream to write to, X is the rtx, and
6331    CODE is the operand print code from the output string.  */
6332
6333 static void
6334 output_pic_addr_const (file, x, code)
6335      FILE *file;
6336      rtx x;
6337      int code;
6338 {
6339   char buf[256];
6340
6341   switch (GET_CODE (x))
6342     {
6343     case PC:
6344       if (flag_pic)
6345         putc ('.', file);
6346       else
6347         abort ();
6348       break;
6349
6350     case SYMBOL_REF:
6351       assemble_name (file, XSTR (x, 0));
6352       if (!TARGET_MACHO && code == 'P' && ! SYMBOL_REF_FLAG (x))
6353         fputs ("@PLT", file);
6354       break;
6355
6356     case LABEL_REF:
6357       x = XEXP (x, 0);
6358       /* FALLTHRU */
6359     case CODE_LABEL:
6360       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
6361       assemble_name (asm_out_file, buf);
6362       break;
6363
6364     case CONST_INT:
6365       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
6366       break;
6367
6368     case CONST:
6369       /* This used to output parentheses around the expression,
6370          but that does not work on the 386 (either ATT or BSD assembler).  */
6371       output_pic_addr_const (file, XEXP (x, 0), code);
6372       break;
6373
6374     case CONST_DOUBLE:
6375       if (GET_MODE (x) == VOIDmode)
6376         {
6377           /* We can use %d if the number is <32 bits and positive.  */
6378           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
6379             fprintf (file, "0x%lx%08lx",
6380                      (unsigned long) CONST_DOUBLE_HIGH (x),
6381                      (unsigned long) CONST_DOUBLE_LOW (x));
6382           else
6383             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
6384         }
6385       else
6386         /* We can't handle floating point constants;
6387            PRINT_OPERAND must handle them.  */
6388         output_operand_lossage ("floating constant misused");
6389       break;
6390
6391     case PLUS:
6392       /* Some assemblers need integer constants to appear first.  */
6393       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
6394         {
6395           output_pic_addr_const (file, XEXP (x, 0), code);
6396           putc ('+', file);
6397           output_pic_addr_const (file, XEXP (x, 1), code);
6398         }
6399       else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6400         {
6401           output_pic_addr_const (file, XEXP (x, 1), code);
6402           putc ('+', file);
6403           output_pic_addr_const (file, XEXP (x, 0), code);
6404         }
6405       else
6406         abort ();
6407       break;
6408
6409     case MINUS:
6410       if (!TARGET_MACHO)
6411         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
6412       output_pic_addr_const (file, XEXP (x, 0), code);
6413       putc ('-', file);
6414       output_pic_addr_const (file, XEXP (x, 1), code);
6415       if (!TARGET_MACHO)
6416         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
6417       break;
6418
6419      case UNSPEC:
6420        if (XVECLEN (x, 0) != 1)
6421          abort ();
6422        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
6423        switch (XINT (x, 1))
6424         {
6425         case UNSPEC_GOT:
6426           fputs ("@GOT", file);
6427           break;
6428         case UNSPEC_GOTOFF:
6429           fputs ("@GOTOFF", file);
6430           break;
6431         case UNSPEC_GOTPCREL:
6432           fputs ("@GOTPCREL(%rip)", file);
6433           break;
6434         case UNSPEC_GOTTPOFF:
6435           /* FIXME: This might be @TPOFF in Sun ld too.  */
6436           fputs ("@GOTTPOFF", file);
6437           break;
6438         case UNSPEC_TPOFF:
6439           fputs ("@TPOFF", file);
6440           break;
6441         case UNSPEC_NTPOFF:
6442           if (TARGET_64BIT)
6443             fputs ("@TPOFF", file);
6444           else
6445             fputs ("@NTPOFF", file);
6446           break;
6447         case UNSPEC_DTPOFF:
6448           fputs ("@DTPOFF", file);
6449           break;
6450         case UNSPEC_GOTNTPOFF:
6451           if (TARGET_64BIT)
6452             fputs ("@GOTTPOFF(%rip)", file);
6453           else
6454             fputs ("@GOTNTPOFF", file);
6455           break;
6456         case UNSPEC_INDNTPOFF:
6457           fputs ("@INDNTPOFF", file);
6458           break;
6459         default:
6460           output_operand_lossage ("invalid UNSPEC as operand");
6461           break;
6462         }
6463        break;
6464
6465     default:
6466       output_operand_lossage ("invalid expression as operand");
6467     }
6468 }
6469
6470 /* This is called from dwarfout.c via ASM_OUTPUT_DWARF_ADDR_CONST.
6471    We need to handle our special PIC relocations.  */
6472
6473 void
6474 i386_dwarf_output_addr_const (file, x)
6475      FILE *file;
6476      rtx x;
6477 {
6478 #ifdef ASM_QUAD
6479   fprintf (file, "%s", TARGET_64BIT ? ASM_QUAD : ASM_LONG);
6480 #else
6481   if (TARGET_64BIT)
6482     abort ();
6483   fprintf (file, "%s", ASM_LONG);
6484 #endif
6485   if (flag_pic)
6486     output_pic_addr_const (file, x, '\0');
6487   else
6488     output_addr_const (file, x);
6489   fputc ('\n', file);
6490 }
6491
6492 /* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
6493    We need to emit DTP-relative relocations.  */
6494
6495 void
6496 i386_output_dwarf_dtprel (file, size, x)
6497      FILE *file;
6498      int size;
6499      rtx x;
6500 {
6501   fputs (ASM_LONG, file);
6502   output_addr_const (file, x);
6503   fputs ("@DTPOFF", file);
6504   switch (size)
6505     {
6506     case 4:
6507       break;
6508     case 8:
6509       fputs (", 0", file);
6510       break;
6511     default:
6512       abort ();
6513    }
6514 }
6515
6516 /* In the name of slightly smaller debug output, and to cater to
6517    general assembler losage, recognize PIC+GOTOFF and turn it back
6518    into a direct symbol reference.  */
6519
6520 rtx
6521 i386_simplify_dwarf_addr (orig_x)
6522      rtx orig_x;
6523 {
6524   rtx x = orig_x, y;
6525
6526   if (GET_CODE (x) == MEM)
6527     x = XEXP (x, 0);
6528
6529   if (TARGET_64BIT)
6530     {
6531       if (GET_CODE (x) != CONST
6532           || GET_CODE (XEXP (x, 0)) != UNSPEC
6533           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
6534           || GET_CODE (orig_x) != MEM)
6535         return orig_x;
6536       return XVECEXP (XEXP (x, 0), 0, 0);
6537     }
6538
6539   if (GET_CODE (x) != PLUS
6540       || GET_CODE (XEXP (x, 1)) != CONST)
6541     return orig_x;
6542
6543   if (GET_CODE (XEXP (x, 0)) == REG
6544       && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM)
6545     /* %ebx + GOT/GOTOFF */
6546     y = NULL;
6547   else if (GET_CODE (XEXP (x, 0)) == PLUS)
6548     {
6549       /* %ebx + %reg * scale + GOT/GOTOFF */
6550       y = XEXP (x, 0);
6551       if (GET_CODE (XEXP (y, 0)) == REG
6552           && REGNO (XEXP (y, 0)) == PIC_OFFSET_TABLE_REGNUM)
6553         y = XEXP (y, 1);
6554       else if (GET_CODE (XEXP (y, 1)) == REG
6555                && REGNO (XEXP (y, 1)) == PIC_OFFSET_TABLE_REGNUM)
6556         y = XEXP (y, 0);
6557       else
6558         return orig_x;
6559       if (GET_CODE (y) != REG
6560           && GET_CODE (y) != MULT
6561           && GET_CODE (y) != ASHIFT)
6562         return orig_x;
6563     }
6564   else
6565     return orig_x;
6566
6567   x = XEXP (XEXP (x, 1), 0);
6568   if (GET_CODE (x) == UNSPEC
6569       && ((XINT (x, 1) == UNSPEC_GOT && GET_CODE (orig_x) == MEM)
6570           || (XINT (x, 1) == UNSPEC_GOTOFF && GET_CODE (orig_x) != MEM)))
6571     {
6572       if (y)
6573         return gen_rtx_PLUS (Pmode, y, XVECEXP (x, 0, 0));
6574       return XVECEXP (x, 0, 0);
6575     }
6576
6577   if (GET_CODE (x) == PLUS
6578       && GET_CODE (XEXP (x, 0)) == UNSPEC
6579       && GET_CODE (XEXP (x, 1)) == CONST_INT
6580       && ((XINT (XEXP (x, 0), 1) == UNSPEC_GOT && GET_CODE (orig_x) == MEM)
6581           || (XINT (XEXP (x, 0), 1) == UNSPEC_GOTOFF
6582               && GET_CODE (orig_x) != MEM)))
6583     {
6584       x = gen_rtx_PLUS (VOIDmode, XVECEXP (XEXP (x, 0), 0, 0), XEXP (x, 1));
6585       if (y)
6586         return gen_rtx_PLUS (Pmode, y, x);
6587       return x;
6588     }
6589
6590   return orig_x;
6591 }
6592 \f
6593 static void
6594 put_condition_code (code, mode, reverse, fp, file)
6595      enum rtx_code code;
6596      enum machine_mode mode;
6597      int reverse, fp;
6598      FILE *file;
6599 {
6600   const char *suffix;
6601
6602   if (mode == CCFPmode || mode == CCFPUmode)
6603     {
6604       enum rtx_code second_code, bypass_code;
6605       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
6606       if (bypass_code != NIL || second_code != NIL)
6607         abort ();
6608       code = ix86_fp_compare_code_to_integer (code);
6609       mode = CCmode;
6610     }
6611   if (reverse)
6612     code = reverse_condition (code);
6613
6614   switch (code)
6615     {
6616     case EQ:
6617       suffix = "e";
6618       break;
6619     case NE:
6620       suffix = "ne";
6621       break;
6622     case GT:
6623       if (mode != CCmode && mode != CCNOmode && mode != CCGCmode)
6624         abort ();
6625       suffix = "g";
6626       break;
6627     case GTU:
6628       /* ??? Use "nbe" instead of "a" for fcmov losage on some assemblers.
6629          Those same assemblers have the same but opposite losage on cmov.  */
6630       if (mode != CCmode)
6631         abort ();
6632       suffix = fp ? "nbe" : "a";
6633       break;
6634     case LT:
6635       if (mode == CCNOmode || mode == CCGOCmode)
6636         suffix = "s";
6637       else if (mode == CCmode || mode == CCGCmode)
6638         suffix = "l";
6639       else
6640         abort ();
6641       break;
6642     case LTU:
6643       if (mode != CCmode)
6644         abort ();
6645       suffix = "b";
6646       break;
6647     case GE:
6648       if (mode == CCNOmode || mode == CCGOCmode)
6649         suffix = "ns";
6650       else if (mode == CCmode || mode == CCGCmode)
6651         suffix = "ge";
6652       else
6653         abort ();
6654       break;
6655     case GEU:
6656       /* ??? As above.  */
6657       if (mode != CCmode)
6658         abort ();
6659       suffix = fp ? "nb" : "ae";
6660       break;
6661     case LE:
6662       if (mode != CCmode && mode != CCGCmode && mode != CCNOmode)
6663         abort ();
6664       suffix = "le";
6665       break;
6666     case LEU:
6667       if (mode != CCmode)
6668         abort ();
6669       suffix = "be";
6670       break;
6671     case UNORDERED:
6672       suffix = fp ? "u" : "p";
6673       break;
6674     case ORDERED:
6675       suffix = fp ? "nu" : "np";
6676       break;
6677     default:
6678       abort ();
6679     }
6680   fputs (suffix, file);
6681 }
6682
6683 void
6684 print_reg (x, code, file)
6685      rtx x;
6686      int code;
6687      FILE *file;
6688 {
6689   if (REGNO (x) == ARG_POINTER_REGNUM
6690       || REGNO (x) == FRAME_POINTER_REGNUM
6691       || REGNO (x) == FLAGS_REG
6692       || REGNO (x) == FPSR_REG)
6693     abort ();
6694
6695   if (ASSEMBLER_DIALECT == ASM_ATT || USER_LABEL_PREFIX[0] == 0)
6696     putc ('%', file);
6697
6698   if (code == 'w' || MMX_REG_P (x))
6699     code = 2;
6700   else if (code == 'b')
6701     code = 1;
6702   else if (code == 'k')
6703     code = 4;
6704   else if (code == 'q')
6705     code = 8;
6706   else if (code == 'y')
6707     code = 3;
6708   else if (code == 'h')
6709     code = 0;
6710   else
6711     code = GET_MODE_SIZE (GET_MODE (x));
6712
6713   /* Irritatingly, AMD extended registers use different naming convention
6714      from the normal registers.  */
6715   if (REX_INT_REG_P (x))
6716     {
6717       if (!TARGET_64BIT)
6718         abort ();
6719       switch (code)
6720         {
6721           case 0:
6722             error ("extended registers have no high halves");
6723             break;
6724           case 1:
6725             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
6726             break;
6727           case 2:
6728             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
6729             break;
6730           case 4:
6731             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
6732             break;
6733           case 8:
6734             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
6735             break;
6736           default:
6737             error ("unsupported operand size for extended register");
6738             break;
6739         }
6740       return;
6741     }
6742   switch (code)
6743     {
6744     case 3:
6745       if (STACK_TOP_P (x))
6746         {
6747           fputs ("st(0)", file);
6748           break;
6749         }
6750       /* FALLTHRU */
6751     case 8:
6752     case 4:
6753     case 12:
6754       if (! ANY_FP_REG_P (x))
6755         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
6756       /* FALLTHRU */
6757     case 16:
6758     case 2:
6759       fputs (hi_reg_name[REGNO (x)], file);
6760       break;
6761     case 1:
6762       fputs (qi_reg_name[REGNO (x)], file);
6763       break;
6764     case 0:
6765       fputs (qi_high_reg_name[REGNO (x)], file);
6766       break;
6767     default:
6768       abort ();
6769     }
6770 }
6771
6772 /* Locate some local-dynamic symbol still in use by this function
6773    so that we can print its name in some tls_local_dynamic_base
6774    pattern.  */
6775
6776 static const char *
6777 get_some_local_dynamic_name ()
6778 {
6779   rtx insn;
6780
6781   if (cfun->machine->some_ld_name)
6782     return cfun->machine->some_ld_name;
6783
6784   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
6785     if (INSN_P (insn)
6786         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
6787       return cfun->machine->some_ld_name;
6788
6789   abort ();
6790 }
6791
6792 static int
6793 get_some_local_dynamic_name_1 (px, data)
6794      rtx *px;
6795      void *data ATTRIBUTE_UNUSED;
6796 {
6797   rtx x = *px;
6798
6799   if (GET_CODE (x) == SYMBOL_REF
6800       && local_dynamic_symbolic_operand (x, Pmode))
6801     {
6802       cfun->machine->some_ld_name = XSTR (x, 0);
6803       return 1;
6804     }
6805
6806   return 0;
6807 }
6808
6809 /* Meaning of CODE:
6810    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
6811    C -- print opcode suffix for set/cmov insn.
6812    c -- like C, but print reversed condition
6813    F,f -- likewise, but for floating-point.
6814    O -- if CMOV_SUN_AS_SYNTAX, expand to "w.", "l." or "q.", otherwise
6815         nothing
6816    R -- print the prefix for register names.
6817    z -- print the opcode suffix for the size of the current operand.
6818    * -- print a star (in certain assembler syntax)
6819    A -- print an absolute memory reference.
6820    w -- print the operand as if it's a "word" (HImode) even if it isn't.
6821    s -- print a shift double count, followed by the assemblers argument
6822         delimiter.
6823    b -- print the QImode name of the register for the indicated operand.
6824         %b0 would print %al if operands[0] is reg 0.
6825    w --  likewise, print the HImode name of the register.
6826    k --  likewise, print the SImode name of the register.
6827    q --  likewise, print the DImode name of the register.
6828    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
6829    y -- print "st(0)" instead of "st" as a register.
6830    D -- print condition for SSE cmp instruction.
6831    P -- if PIC, print an @PLT suffix.
6832    X -- don't print any sort of PIC '@' suffix for a symbol.
6833    & -- print some in-use local-dynamic symbol name.
6834  */
6835
6836 void
6837 print_operand (file, x, code)
6838      FILE *file;
6839      rtx x;
6840      int code;
6841 {
6842   if (code)
6843     {
6844       switch (code)
6845         {
6846         case '*':
6847           if (ASSEMBLER_DIALECT == ASM_ATT)
6848             putc ('*', file);
6849           return;
6850
6851         case '&':
6852           assemble_name (file, get_some_local_dynamic_name ());
6853           return;
6854
6855         case 'A':
6856           if (ASSEMBLER_DIALECT == ASM_ATT)
6857             putc ('*', file);
6858           else if (ASSEMBLER_DIALECT == ASM_INTEL)
6859             {
6860               /* Intel syntax. For absolute addresses, registers should not
6861                  be surrounded by braces.  */
6862               if (GET_CODE (x) != REG)
6863                 {
6864                   putc ('[', file);
6865                   PRINT_OPERAND (file, x, 0);
6866                   putc (']', file);
6867                   return;
6868                 }
6869             }
6870           else
6871             abort ();
6872
6873           PRINT_OPERAND (file, x, 0);
6874           return;
6875
6876
6877         case 'L':
6878           if (ASSEMBLER_DIALECT == ASM_ATT)
6879             putc ('l', file);
6880           return;
6881
6882         case 'W':
6883           if (ASSEMBLER_DIALECT == ASM_ATT)
6884             putc ('w', file);
6885           return;
6886
6887         case 'B':
6888           if (ASSEMBLER_DIALECT == ASM_ATT)
6889             putc ('b', file);
6890           return;
6891
6892         case 'Q':
6893           if (ASSEMBLER_DIALECT == ASM_ATT)
6894             putc ('l', file);
6895           return;
6896
6897         case 'S':
6898           if (ASSEMBLER_DIALECT == ASM_ATT)
6899             putc ('s', file);
6900           return;
6901
6902         case 'T':
6903           if (ASSEMBLER_DIALECT == ASM_ATT)
6904             putc ('t', file);
6905           return;
6906
6907         case 'z':
6908           /* 387 opcodes don't get size suffixes if the operands are
6909              registers.  */
6910           if (STACK_REG_P (x))
6911             return;
6912
6913           /* Likewise if using Intel opcodes.  */
6914           if (ASSEMBLER_DIALECT == ASM_INTEL)
6915             return;
6916
6917           /* This is the size of op from size of operand.  */
6918           switch (GET_MODE_SIZE (GET_MODE (x)))
6919             {
6920             case 2:
6921 #ifdef HAVE_GAS_FILDS_FISTS
6922               putc ('s', file);
6923 #endif
6924               return;
6925
6926             case 4:
6927               if (GET_MODE (x) == SFmode)
6928                 {
6929                   putc ('s', file);
6930                   return;
6931                 }
6932               else
6933                 putc ('l', file);
6934               return;
6935
6936             case 12:
6937             case 16:
6938               putc ('t', file);
6939               return;
6940
6941             case 8:
6942               if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
6943                 {
6944 #ifdef GAS_MNEMONICS
6945                   putc ('q', file);
6946 #else
6947                   putc ('l', file);
6948                   putc ('l', file);
6949 #endif
6950                 }
6951               else
6952                 putc ('l', file);
6953               return;
6954
6955             default:
6956               abort ();
6957             }
6958
6959         case 'b':
6960         case 'w':
6961         case 'k':
6962         case 'q':
6963         case 'h':
6964         case 'y':
6965         case 'X':
6966         case 'P':
6967           break;
6968
6969         case 's':
6970           if (GET_CODE (x) == CONST_INT || ! SHIFT_DOUBLE_OMITS_COUNT)
6971             {
6972               PRINT_OPERAND (file, x, 0);
6973               putc (',', file);
6974             }
6975           return;
6976
6977         case 'D':
6978           /* Little bit of braindamage here.  The SSE compare instructions
6979              does use completely different names for the comparisons that the
6980              fp conditional moves.  */
6981           switch (GET_CODE (x))
6982             {
6983             case EQ:
6984             case UNEQ:
6985               fputs ("eq", file);
6986               break;
6987             case LT:
6988             case UNLT:
6989               fputs ("lt", file);
6990               break;
6991             case LE:
6992             case UNLE:
6993               fputs ("le", file);
6994               break;
6995             case UNORDERED:
6996               fputs ("unord", file);
6997               break;
6998             case NE:
6999             case LTGT:
7000               fputs ("neq", file);
7001               break;
7002             case UNGE:
7003             case GE:
7004               fputs ("nlt", file);
7005               break;
7006             case UNGT:
7007             case GT:
7008               fputs ("nle", file);
7009               break;
7010             case ORDERED:
7011               fputs ("ord", file);
7012               break;
7013             default:
7014               abort ();
7015               break;
7016             }
7017           return;
7018         case 'O':
7019 #ifdef CMOV_SUN_AS_SYNTAX
7020           if (ASSEMBLER_DIALECT == ASM_ATT)
7021             {
7022               switch (GET_MODE (x))
7023                 {
7024                 case HImode: putc ('w', file); break;
7025                 case SImode:
7026                 case SFmode: putc ('l', file); break;
7027                 case DImode:
7028                 case DFmode: putc ('q', file); break;
7029                 default: abort ();
7030                 }
7031               putc ('.', file);
7032             }
7033 #endif
7034           return;
7035         case 'C':
7036           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
7037           return;
7038         case 'F':
7039 #ifdef CMOV_SUN_AS_SYNTAX
7040           if (ASSEMBLER_DIALECT == ASM_ATT)
7041             putc ('.', file);
7042 #endif
7043           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
7044           return;
7045
7046           /* Like above, but reverse condition */
7047         case 'c':
7048           /* Check to see if argument to %c is really a constant
7049              and not a condition code which needs to be reversed.  */
7050           if (GET_RTX_CLASS (GET_CODE (x)) != '<')
7051           {
7052             output_operand_lossage ("operand is neither a constant nor a condition code, invalid operand code 'c'");
7053              return;
7054           }
7055           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
7056           return;
7057         case 'f':
7058 #ifdef CMOV_SUN_AS_SYNTAX
7059           if (ASSEMBLER_DIALECT == ASM_ATT)
7060             putc ('.', file);
7061 #endif
7062           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
7063           return;
7064         case '+':
7065           {
7066             rtx x;
7067
7068             if (!optimize || optimize_size || !TARGET_BRANCH_PREDICTION_HINTS)
7069               return;
7070
7071             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
7072             if (x)
7073               {
7074                 int pred_val = INTVAL (XEXP (x, 0));
7075
7076                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
7077                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
7078                   {
7079                     int taken = pred_val > REG_BR_PROB_BASE / 2;
7080                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
7081
7082                     /* Emit hints only in the case default branch prediction
7083                        heuristics would fail.  */
7084                     if (taken != cputaken)
7085                       {
7086                         /* We use 3e (DS) prefix for taken branches and
7087                            2e (CS) prefix for not taken branches.  */
7088                         if (taken)
7089                           fputs ("ds ; ", file);
7090                         else
7091                           fputs ("cs ; ", file);
7092                       }
7093                   }
7094               }
7095             return;
7096           }
7097         default:
7098             output_operand_lossage ("invalid operand code `%c'", code);
7099         }
7100     }
7101
7102   if (GET_CODE (x) == REG)
7103     {
7104       PRINT_REG (x, code, file);
7105     }
7106
7107   else if (GET_CODE (x) == MEM)
7108     {
7109       /* No `byte ptr' prefix for call instructions.  */
7110       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P')
7111         {
7112           const char * size;
7113           switch (GET_MODE_SIZE (GET_MODE (x)))
7114             {
7115             case 1: size = "BYTE"; break;
7116             case 2: size = "WORD"; break;
7117             case 4: size = "DWORD"; break;
7118             case 8: size = "QWORD"; break;
7119             case 12: size = "XWORD"; break;
7120             case 16: size = "XMMWORD"; break;
7121             default:
7122               abort ();
7123             }
7124
7125           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
7126           if (code == 'b')
7127             size = "BYTE";
7128           else if (code == 'w')
7129             size = "WORD";
7130           else if (code == 'k')
7131             size = "DWORD";
7132
7133           fputs (size, file);
7134           fputs (" PTR ", file);
7135         }
7136
7137       x = XEXP (x, 0);
7138       if (flag_pic && CONSTANT_ADDRESS_P (x))
7139         output_pic_addr_const (file, x, code);
7140       /* Avoid (%rip) for call operands.  */
7141       else if (CONSTANT_ADDRESS_P (x) && code == 'P'
7142                && GET_CODE (x) != CONST_INT)
7143         output_addr_const (file, x);
7144       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
7145         output_operand_lossage ("invalid constraints for operand");
7146       else
7147         output_address (x);
7148     }
7149
7150   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
7151     {
7152       REAL_VALUE_TYPE r;
7153       long l;
7154
7155       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7156       REAL_VALUE_TO_TARGET_SINGLE (r, l);
7157
7158       if (ASSEMBLER_DIALECT == ASM_ATT)
7159         putc ('$', file);
7160       fprintf (file, "0x%lx", l);
7161     }
7162
7163  /* These float cases don't actually occur as immediate operands.  */
7164  else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
7165     {
7166       char dstr[30];
7167
7168       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
7169       fprintf (file, "%s", dstr);
7170     }
7171
7172   else if (GET_CODE (x) == CONST_DOUBLE
7173            && (GET_MODE (x) == XFmode || GET_MODE (x) == TFmode))
7174     {
7175       char dstr[30];
7176
7177       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
7178       fprintf (file, "%s", dstr);
7179     }
7180
7181   else
7182     {
7183       if (code != 'P')
7184         {
7185           if (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
7186             {
7187               if (ASSEMBLER_DIALECT == ASM_ATT)
7188                 putc ('$', file);
7189             }
7190           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
7191                    || GET_CODE (x) == LABEL_REF)
7192             {
7193               if (ASSEMBLER_DIALECT == ASM_ATT)
7194                 putc ('$', file);
7195               else
7196                 fputs ("OFFSET FLAT:", file);
7197             }
7198         }
7199       if (GET_CODE (x) == CONST_INT)
7200         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
7201       else if (flag_pic)
7202         output_pic_addr_const (file, x, code);
7203       else
7204         output_addr_const (file, x);
7205     }
7206 }
7207 \f
7208 /* Print a memory operand whose address is ADDR.  */
7209
7210 void
7211 print_operand_address (file, addr)
7212      FILE *file;
7213      register rtx addr;
7214 {
7215   struct ix86_address parts;
7216   rtx base, index, disp;
7217   int scale;
7218
7219   if (GET_CODE (addr) == UNSPEC && XINT (addr, 1) == UNSPEC_TP)
7220     {
7221       if (ASSEMBLER_DIALECT == ASM_INTEL)
7222         fputs ("DWORD PTR ", file);
7223       if (ASSEMBLER_DIALECT == ASM_ATT || USER_LABEL_PREFIX[0] == 0)
7224         putc ('%', file);
7225       if (TARGET_64BIT)
7226         fputs ("fs:0", file);
7227       else
7228         fputs ("gs:0", file);
7229       return;
7230     }
7231
7232   if (! ix86_decompose_address (addr, &parts))
7233     abort ();
7234
7235   base = parts.base;
7236   index = parts.index;
7237   disp = parts.disp;
7238   scale = parts.scale;
7239
7240   if (!base && !index)
7241     {
7242       /* Displacement only requires special attention.  */
7243
7244       if (GET_CODE (disp) == CONST_INT)
7245         {
7246           if (ASSEMBLER_DIALECT == ASM_INTEL)
7247             {
7248               if (USER_LABEL_PREFIX[0] == 0)
7249                 putc ('%', file);
7250               fputs ("ds:", file);
7251             }
7252           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr));
7253         }
7254       else if (flag_pic)
7255         output_pic_addr_const (file, addr, 0);
7256       else
7257         output_addr_const (file, addr);
7258
7259       /* Use one byte shorter RIP relative addressing for 64bit mode.  */
7260       if (TARGET_64BIT
7261           && ((GET_CODE (addr) == SYMBOL_REF
7262                && ! tls_symbolic_operand (addr, GET_MODE (addr)))
7263               || GET_CODE (addr) == LABEL_REF
7264               || (GET_CODE (addr) == CONST
7265                   && GET_CODE (XEXP (addr, 0)) == PLUS
7266                   && (GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
7267                       || GET_CODE (XEXP (XEXP (addr, 0), 0)) == LABEL_REF)
7268                   && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)))
7269         fputs ("(%rip)", file);
7270     }
7271   else
7272     {
7273       if (ASSEMBLER_DIALECT == ASM_ATT)
7274         {
7275           if (disp)
7276             {
7277               if (flag_pic)
7278                 output_pic_addr_const (file, disp, 0);
7279               else if (GET_CODE (disp) == LABEL_REF)
7280                 output_asm_label (disp);
7281               else
7282                 output_addr_const (file, disp);
7283             }
7284
7285           putc ('(', file);
7286           if (base)
7287             PRINT_REG (base, 0, file);
7288           if (index)
7289             {
7290               putc (',', file);
7291               PRINT_REG (index, 0, file);
7292               if (scale != 1)
7293                 fprintf (file, ",%d", scale);
7294             }
7295           putc (')', file);
7296         }
7297       else
7298         {
7299           rtx offset = NULL_RTX;
7300
7301           if (disp)
7302             {
7303               /* Pull out the offset of a symbol; print any symbol itself.  */
7304               if (GET_CODE (disp) == CONST
7305                   && GET_CODE (XEXP (disp, 0)) == PLUS
7306                   && GET_CODE (XEXP (XEXP (disp, 0), 1)) == CONST_INT)
7307                 {
7308                   offset = XEXP (XEXP (disp, 0), 1);
7309                   disp = gen_rtx_CONST (VOIDmode,
7310                                         XEXP (XEXP (disp, 0), 0));
7311                 }
7312
7313               if (flag_pic)
7314                 output_pic_addr_const (file, disp, 0);
7315               else if (GET_CODE (disp) == LABEL_REF)
7316                 output_asm_label (disp);
7317               else if (GET_CODE (disp) == CONST_INT)
7318                 offset = disp;
7319               else
7320                 output_addr_const (file, disp);
7321             }
7322
7323           putc ('[', file);
7324           if (base)
7325             {
7326               PRINT_REG (base, 0, file);
7327               if (offset)
7328                 {
7329                   if (INTVAL (offset) >= 0)
7330                     putc ('+', file);
7331                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
7332                 }
7333             }
7334           else if (offset)
7335             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
7336           else
7337             putc ('0', file);
7338
7339           if (index)
7340             {
7341               putc ('+', file);
7342               PRINT_REG (index, 0, file);
7343               if (scale != 1)
7344                 fprintf (file, "*%d", scale);
7345             }
7346           putc (']', file);
7347         }
7348     }
7349 }
7350
7351 bool
7352 output_addr_const_extra (file, x)
7353      FILE *file;
7354      rtx x;
7355 {
7356   rtx op;
7357
7358   if (GET_CODE (x) != UNSPEC)
7359     return false;
7360
7361   op = XVECEXP (x, 0, 0);
7362   switch (XINT (x, 1))
7363     {
7364     case UNSPEC_GOTTPOFF:
7365       output_addr_const (file, op);
7366       /* FIXME: This might be @TPOFF in Sun ld.  */
7367       fputs ("@GOTTPOFF", file);
7368       break;
7369     case UNSPEC_TPOFF:
7370       output_addr_const (file, op);
7371       fputs ("@TPOFF", file);
7372       break;
7373     case UNSPEC_NTPOFF:
7374       output_addr_const (file, op);
7375       if (TARGET_64BIT)
7376         fputs ("@TPOFF", file);
7377       else
7378         fputs ("@NTPOFF", file);
7379       break;
7380     case UNSPEC_DTPOFF:
7381       output_addr_const (file, op);
7382       fputs ("@DTPOFF", file);
7383       break;
7384     case UNSPEC_GOTNTPOFF:
7385       output_addr_const (file, op);
7386       if (TARGET_64BIT)
7387         fputs ("@GOTTPOFF(%rip)", file);
7388       else
7389         fputs ("@GOTNTPOFF", file);
7390       break;
7391     case UNSPEC_INDNTPOFF:
7392       output_addr_const (file, op);
7393       fputs ("@INDNTPOFF", file);
7394       break;
7395
7396     default:
7397       return false;
7398     }
7399
7400   return true;
7401 }
7402 \f
7403 /* Split one or more DImode RTL references into pairs of SImode
7404    references.  The RTL can be REG, offsettable MEM, integer constant, or
7405    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
7406    split and "num" is its length.  lo_half and hi_half are output arrays
7407    that parallel "operands".  */
7408
7409 void
7410 split_di (operands, num, lo_half, hi_half)
7411      rtx operands[];
7412      int num;
7413      rtx lo_half[], hi_half[];
7414 {
7415   while (num--)
7416     {
7417       rtx op = operands[num];
7418
7419       /* simplify_subreg refuse to split volatile memory addresses,
7420          but we still have to handle it.  */
7421       if (GET_CODE (op) == MEM)
7422         {
7423           lo_half[num] = adjust_address (op, SImode, 0);
7424           hi_half[num] = adjust_address (op, SImode, 4);
7425         }
7426       else
7427         {
7428           lo_half[num] = simplify_gen_subreg (SImode, op,
7429                                               GET_MODE (op) == VOIDmode
7430                                               ? DImode : GET_MODE (op), 0);
7431           hi_half[num] = simplify_gen_subreg (SImode, op,
7432                                               GET_MODE (op) == VOIDmode
7433                                               ? DImode : GET_MODE (op), 4);
7434         }
7435     }
7436 }
7437 /* Split one or more TImode RTL references into pairs of SImode
7438    references.  The RTL can be REG, offsettable MEM, integer constant, or
7439    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
7440    split and "num" is its length.  lo_half and hi_half are output arrays
7441    that parallel "operands".  */
7442
7443 void
7444 split_ti (operands, num, lo_half, hi_half)
7445      rtx operands[];
7446      int num;
7447      rtx lo_half[], hi_half[];
7448 {
7449   while (num--)
7450     {
7451       rtx op = operands[num];
7452
7453       /* simplify_subreg refuse to split volatile memory addresses, but we
7454          still have to handle it.  */
7455       if (GET_CODE (op) == MEM)
7456         {
7457           lo_half[num] = adjust_address (op, DImode, 0);
7458           hi_half[num] = adjust_address (op, DImode, 8);
7459         }
7460       else
7461         {
7462           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
7463           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
7464         }
7465     }
7466 }
7467 \f
7468 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
7469    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
7470    is the expression of the binary operation.  The output may either be
7471    emitted here, or returned to the caller, like all output_* functions.
7472
7473    There is no guarantee that the operands are the same mode, as they
7474    might be within FLOAT or FLOAT_EXTEND expressions.  */
7475
7476 #ifndef SYSV386_COMPAT
7477 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
7478    wants to fix the assemblers because that causes incompatibility
7479    with gcc.  No-one wants to fix gcc because that causes
7480    incompatibility with assemblers...  You can use the option of
7481    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
7482 #define SYSV386_COMPAT 1
7483 #endif
7484
7485 const char *
7486 output_387_binary_op (insn, operands)
7487      rtx insn;
7488      rtx *operands;
7489 {
7490   static char buf[30];
7491   const char *p;
7492   const char *ssep;
7493   int is_sse = SSE_REG_P (operands[0]) | SSE_REG_P (operands[1]) | SSE_REG_P (operands[2]);
7494
7495 #ifdef ENABLE_CHECKING
7496   /* Even if we do not want to check the inputs, this documents input
7497      constraints.  Which helps in understanding the following code.  */
7498   if (STACK_REG_P (operands[0])
7499       && ((REG_P (operands[1])
7500            && REGNO (operands[0]) == REGNO (operands[1])
7501            && (STACK_REG_P (operands[2]) || GET_CODE (operands[2]) == MEM))
7502           || (REG_P (operands[2])
7503               && REGNO (operands[0]) == REGNO (operands[2])
7504               && (STACK_REG_P (operands[1]) || GET_CODE (operands[1]) == MEM)))
7505       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
7506     ; /* ok */
7507   else if (!is_sse)
7508     abort ();
7509 #endif
7510
7511   switch (GET_CODE (operands[3]))
7512     {
7513     case PLUS:
7514       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
7515           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
7516         p = "fiadd";
7517       else
7518         p = "fadd";
7519       ssep = "add";
7520       break;
7521
7522     case MINUS:
7523       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
7524           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
7525         p = "fisub";
7526       else
7527         p = "fsub";
7528       ssep = "sub";
7529       break;
7530
7531     case MULT:
7532       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
7533           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
7534         p = "fimul";
7535       else
7536         p = "fmul";
7537       ssep = "mul";
7538       break;
7539
7540     case DIV:
7541       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
7542           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
7543         p = "fidiv";
7544       else
7545         p = "fdiv";
7546       ssep = "div";
7547       break;
7548
7549     default:
7550       abort ();
7551     }
7552
7553   if (is_sse)
7554    {
7555       strcpy (buf, ssep);
7556       if (GET_MODE (operands[0]) == SFmode)
7557         strcat (buf, "ss\t{%2, %0|%0, %2}");
7558       else
7559         strcat (buf, "sd\t{%2, %0|%0, %2}");
7560       return buf;
7561    }
7562   strcpy (buf, p);
7563
7564   switch (GET_CODE (operands[3]))
7565     {
7566     case MULT:
7567     case PLUS:
7568       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
7569         {
7570           rtx temp = operands[2];
7571           operands[2] = operands[1];
7572           operands[1] = temp;
7573         }
7574
7575       /* know operands[0] == operands[1].  */
7576
7577       if (GET_CODE (operands[2]) == MEM)
7578         {
7579           p = "%z2\t%2";
7580           break;
7581         }
7582
7583       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
7584         {
7585           if (STACK_TOP_P (operands[0]))
7586             /* How is it that we are storing to a dead operand[2]?
7587                Well, presumably operands[1] is dead too.  We can't
7588                store the result to st(0) as st(0) gets popped on this
7589                instruction.  Instead store to operands[2] (which I
7590                think has to be st(1)).  st(1) will be popped later.
7591                gcc <= 2.8.1 didn't have this check and generated
7592                assembly code that the Unixware assembler rejected.  */
7593             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
7594           else
7595             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
7596           break;
7597         }
7598
7599       if (STACK_TOP_P (operands[0]))
7600         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
7601       else
7602         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
7603       break;
7604
7605     case MINUS:
7606     case DIV:
7607       if (GET_CODE (operands[1]) == MEM)
7608         {
7609           p = "r%z1\t%1";
7610           break;
7611         }
7612
7613       if (GET_CODE (operands[2]) == MEM)
7614         {
7615           p = "%z2\t%2";
7616           break;
7617         }
7618
7619       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
7620         {
7621 #if SYSV386_COMPAT
7622           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
7623              derived assemblers, confusingly reverse the direction of
7624              the operation for fsub{r} and fdiv{r} when the
7625              destination register is not st(0).  The Intel assembler
7626              doesn't have this brain damage.  Read !SYSV386_COMPAT to
7627              figure out what the hardware really does.  */
7628           if (STACK_TOP_P (operands[0]))
7629             p = "{p\t%0, %2|rp\t%2, %0}";
7630           else
7631             p = "{rp\t%2, %0|p\t%0, %2}";
7632 #else
7633           if (STACK_TOP_P (operands[0]))
7634             /* As above for fmul/fadd, we can't store to st(0).  */
7635             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
7636           else
7637             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
7638 #endif
7639           break;
7640         }
7641
7642       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
7643         {
7644 #if SYSV386_COMPAT
7645           if (STACK_TOP_P (operands[0]))
7646             p = "{rp\t%0, %1|p\t%1, %0}";
7647           else
7648             p = "{p\t%1, %0|rp\t%0, %1}";
7649 #else
7650           if (STACK_TOP_P (operands[0]))
7651             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
7652           else
7653             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
7654 #endif
7655           break;
7656         }
7657
7658       if (STACK_TOP_P (operands[0]))
7659         {
7660           if (STACK_TOP_P (operands[1]))
7661             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
7662           else
7663             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
7664           break;
7665         }
7666       else if (STACK_TOP_P (operands[1]))
7667         {
7668 #if SYSV386_COMPAT
7669           p = "{\t%1, %0|r\t%0, %1}";
7670 #else
7671           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
7672 #endif
7673         }
7674       else
7675         {
7676 #if SYSV386_COMPAT
7677           p = "{r\t%2, %0|\t%0, %2}";
7678 #else
7679           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
7680 #endif
7681         }
7682       break;
7683
7684     default:
7685       abort ();
7686     }
7687
7688   strcat (buf, p);
7689   return buf;
7690 }
7691
7692 /* Output code to initialize control word copies used by
7693    trunc?f?i patterns.  NORMAL is set to current control word, while ROUND_DOWN
7694    is set to control word rounding downwards.  */
7695 void
7696 emit_i387_cw_initialization (normal, round_down)
7697      rtx normal, round_down;
7698 {
7699   rtx reg = gen_reg_rtx (HImode);
7700
7701   emit_insn (gen_x86_fnstcw_1 (normal));
7702   emit_move_insn (reg, normal);
7703   if (!TARGET_PARTIAL_REG_STALL && !optimize_size
7704       && !TARGET_64BIT)
7705     emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
7706   else
7707     emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0xc00)));
7708   emit_move_insn (round_down, reg);
7709 }
7710
7711 /* Output code for INSN to convert a float to a signed int.  OPERANDS
7712    are the insn operands.  The output may be [HSD]Imode and the input
7713    operand may be [SDX]Fmode.  */
7714
7715 const char *
7716 output_fix_trunc (insn, operands)
7717      rtx insn;
7718      rtx *operands;
7719 {
7720   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
7721   int dimode_p = GET_MODE (operands[0]) == DImode;
7722
7723   /* Jump through a hoop or two for DImode, since the hardware has no
7724      non-popping instruction.  We used to do this a different way, but
7725      that was somewhat fragile and broke with post-reload splitters.  */
7726   if (dimode_p && !stack_top_dies)
7727     output_asm_insn ("fld\t%y1", operands);
7728
7729   if (!STACK_TOP_P (operands[1]))
7730     abort ();
7731
7732   if (GET_CODE (operands[0]) != MEM)
7733     abort ();
7734
7735   output_asm_insn ("fldcw\t%3", operands);
7736   if (stack_top_dies || dimode_p)
7737     output_asm_insn ("fistp%z0\t%0", operands);
7738   else
7739     output_asm_insn ("fist%z0\t%0", operands);
7740   output_asm_insn ("fldcw\t%2", operands);
7741
7742   return "";
7743 }
7744
7745 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
7746    should be used and 2 when fnstsw should be used.  UNORDERED_P is true
7747    when fucom should be used.  */
7748
7749 const char *
7750 output_fp_compare (insn, operands, eflags_p, unordered_p)
7751      rtx insn;
7752      rtx *operands;
7753      int eflags_p, unordered_p;
7754 {
7755   int stack_top_dies;
7756   rtx cmp_op0 = operands[0];
7757   rtx cmp_op1 = operands[1];
7758   int is_sse = SSE_REG_P (operands[0]) | SSE_REG_P (operands[1]);
7759
7760   if (eflags_p == 2)
7761     {
7762       cmp_op0 = cmp_op1;
7763       cmp_op1 = operands[2];
7764     }
7765   if (is_sse)
7766     {
7767       if (GET_MODE (operands[0]) == SFmode)
7768         if (unordered_p)
7769           return "ucomiss\t{%1, %0|%0, %1}";
7770         else
7771           return "comiss\t{%1, %0|%0, %y}";
7772       else
7773         if (unordered_p)
7774           return "ucomisd\t{%1, %0|%0, %1}";
7775         else
7776           return "comisd\t{%1, %0|%0, %y}";
7777     }
7778
7779   if (! STACK_TOP_P (cmp_op0))
7780     abort ();
7781
7782   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
7783
7784   if (STACK_REG_P (cmp_op1)
7785       && stack_top_dies
7786       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
7787       && REGNO (cmp_op1) != FIRST_STACK_REG)
7788     {
7789       /* If both the top of the 387 stack dies, and the other operand
7790          is also a stack register that dies, then this must be a
7791          `fcompp' float compare */
7792
7793       if (eflags_p == 1)
7794         {
7795           /* There is no double popping fcomi variant.  Fortunately,
7796              eflags is immune from the fstp's cc clobbering.  */
7797           if (unordered_p)
7798             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
7799           else
7800             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
7801           return "fstp\t%y0";
7802         }
7803       else
7804         {
7805           if (eflags_p == 2)
7806             {
7807               if (unordered_p)
7808                 return "fucompp\n\tfnstsw\t%0";
7809               else
7810                 return "fcompp\n\tfnstsw\t%0";
7811             }
7812           else
7813             {
7814               if (unordered_p)
7815                 return "fucompp";
7816               else
7817                 return "fcompp";
7818             }
7819         }
7820     }
7821   else
7822     {
7823       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
7824
7825       static const char * const alt[24] =
7826       {
7827         "fcom%z1\t%y1",
7828         "fcomp%z1\t%y1",
7829         "fucom%z1\t%y1",
7830         "fucomp%z1\t%y1",
7831
7832         "ficom%z1\t%y1",
7833         "ficomp%z1\t%y1",
7834         NULL,
7835         NULL,
7836
7837         "fcomi\t{%y1, %0|%0, %y1}",
7838         "fcomip\t{%y1, %0|%0, %y1}",
7839         "fucomi\t{%y1, %0|%0, %y1}",
7840         "fucomip\t{%y1, %0|%0, %y1}",
7841
7842         NULL,
7843         NULL,
7844         NULL,
7845         NULL,
7846
7847         "fcom%z2\t%y2\n\tfnstsw\t%0",
7848         "fcomp%z2\t%y2\n\tfnstsw\t%0",
7849         "fucom%z2\t%y2\n\tfnstsw\t%0",
7850         "fucomp%z2\t%y2\n\tfnstsw\t%0",
7851
7852         "ficom%z2\t%y2\n\tfnstsw\t%0",
7853         "ficomp%z2\t%y2\n\tfnstsw\t%0",
7854         NULL,
7855         NULL
7856       };
7857
7858       int mask;
7859       const char *ret;
7860
7861       mask  = eflags_p << 3;
7862       mask |= (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT) << 2;
7863       mask |= unordered_p << 1;
7864       mask |= stack_top_dies;
7865
7866       if (mask >= 24)
7867         abort ();
7868       ret = alt[mask];
7869       if (ret == NULL)
7870         abort ();
7871
7872       return ret;
7873     }
7874 }
7875
7876 void
7877 ix86_output_addr_vec_elt (file, value)
7878      FILE *file;
7879      int value;
7880 {
7881   const char *directive = ASM_LONG;
7882
7883   if (TARGET_64BIT)
7884     {
7885 #ifdef ASM_QUAD
7886       directive = ASM_QUAD;
7887 #else
7888       abort ();
7889 #endif
7890     }
7891
7892   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
7893 }
7894
7895 void
7896 ix86_output_addr_diff_elt (file, value, rel)
7897      FILE *file;
7898      int value, rel;
7899 {
7900   if (TARGET_64BIT)
7901     fprintf (file, "%s%s%d-%s%d\n",
7902              ASM_LONG, LPREFIX, value, LPREFIX, rel);
7903   else if (HAVE_AS_GOTOFF_IN_DATA)
7904     fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value);
7905 #if TARGET_MACHO
7906   else if (TARGET_MACHO)
7907     fprintf (file, "%s%s%d-%s\n", ASM_LONG, LPREFIX, value,
7908              machopic_function_base_name () + 1);
7909 #endif
7910   else
7911     asm_fprintf (file, "%s%U%s+[.-%s%d]\n",
7912                  ASM_LONG, GOT_SYMBOL_NAME, LPREFIX, value);
7913 }
7914 \f
7915 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
7916    for the target.  */
7917
7918 void
7919 ix86_expand_clear (dest)
7920      rtx dest;
7921 {
7922   rtx tmp;
7923
7924   /* We play register width games, which are only valid after reload.  */
7925   if (!reload_completed)
7926     abort ();
7927
7928   /* Avoid HImode and its attendant prefix byte.  */
7929   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
7930     dest = gen_rtx_REG (SImode, REGNO (dest));
7931
7932   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
7933
7934   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
7935   if (reload_completed && (!TARGET_USE_MOV0 || optimize_size))
7936     {
7937       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, 17));
7938       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
7939     }
7940
7941   emit_insn (tmp);
7942 }
7943
7944 /* X is an unchanging MEM.  If it is a constant pool reference, return
7945    the constant pool rtx, else NULL.  */
7946
7947 static rtx
7948 maybe_get_pool_constant (x)
7949      rtx x;
7950 {
7951   x = XEXP (x, 0);
7952
7953   if (flag_pic && ! TARGET_64BIT)
7954     {
7955       if (GET_CODE (x) != PLUS)
7956         return NULL_RTX;
7957       if (XEXP (x, 0) != pic_offset_table_rtx)
7958         return NULL_RTX;
7959       x = XEXP (x, 1);
7960       if (GET_CODE (x) != CONST)
7961         return NULL_RTX;
7962       x = XEXP (x, 0);
7963       if (GET_CODE (x) != UNSPEC)
7964         return NULL_RTX;
7965       if (XINT (x, 1) != UNSPEC_GOTOFF)
7966         return NULL_RTX;
7967       x = XVECEXP (x, 0, 0);
7968     }
7969
7970   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
7971     return get_pool_constant (x);
7972
7973   return NULL_RTX;
7974 }
7975
7976 void
7977 ix86_expand_move (mode, operands)
7978      enum machine_mode mode;
7979      rtx operands[];
7980 {
7981   int strict = (reload_in_progress || reload_completed);
7982   rtx insn, op0, op1, tmp;
7983
7984   op0 = operands[0];
7985   op1 = operands[1];
7986
7987   if (tls_symbolic_operand (op1, Pmode))
7988     {
7989       op1 = legitimize_address (op1, op1, VOIDmode);
7990       if (GET_CODE (op0) == MEM)
7991         {
7992           tmp = gen_reg_rtx (mode);
7993           emit_insn (gen_rtx_SET (VOIDmode, tmp, op1));
7994           op1 = tmp;
7995         }
7996     }
7997   else if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
7998     {
7999 #if TARGET_MACHO
8000       if (MACHOPIC_PURE)
8001         {
8002           rtx temp = ((reload_in_progress
8003                        || ((op0 && GET_CODE (op0) == REG)
8004                            && mode == Pmode))
8005                       ? op0 : gen_reg_rtx (Pmode));
8006           op1 = machopic_indirect_data_reference (op1, temp);
8007           op1 = machopic_legitimize_pic_address (op1, mode,
8008                                                  temp == op1 ? 0 : temp);
8009         }
8010       else
8011         {
8012           if (MACHOPIC_INDIRECT)
8013             op1 = machopic_indirect_data_reference (op1, 0);
8014         }
8015       if (op0 != op1)
8016         {
8017           insn = gen_rtx_SET (VOIDmode, op0, op1);
8018           emit_insn (insn);
8019         }
8020       return;
8021 #endif /* TARGET_MACHO */
8022       if (GET_CODE (op0) == MEM)
8023         op1 = force_reg (Pmode, op1);
8024       else
8025         {
8026           rtx temp = op0;
8027           if (GET_CODE (temp) != REG)
8028             temp = gen_reg_rtx (Pmode);
8029           temp = legitimize_pic_address (op1, temp);
8030           if (temp == op0)
8031             return;
8032           op1 = temp;
8033         }
8034     }
8035   else
8036     {
8037       if (GET_CODE (op0) == MEM
8038           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
8039               || !push_operand (op0, mode))
8040           && GET_CODE (op1) == MEM)
8041         op1 = force_reg (mode, op1);
8042
8043       if (push_operand (op0, mode)
8044           && ! general_no_elim_operand (op1, mode))
8045         op1 = copy_to_mode_reg (mode, op1);
8046
8047       /* Force large constants in 64bit compilation into register
8048          to get them CSEed.  */
8049       if (TARGET_64BIT && mode == DImode
8050           && immediate_operand (op1, mode)
8051           && !x86_64_zero_extended_value (op1)
8052           && !register_operand (op0, mode)
8053           && optimize && !reload_completed && !reload_in_progress)
8054         op1 = copy_to_mode_reg (mode, op1);
8055
8056       if (FLOAT_MODE_P (mode))
8057         {
8058           /* If we are loading a floating point constant to a register,
8059              force the value to memory now, since we'll get better code
8060              out the back end.  */
8061
8062           if (strict)
8063             ;
8064           else if (GET_CODE (op1) == CONST_DOUBLE
8065                    && register_operand (op0, mode))
8066             op1 = validize_mem (force_const_mem (mode, op1));
8067         }
8068     }
8069
8070   insn = gen_rtx_SET (VOIDmode, op0, op1);
8071
8072   emit_insn (insn);
8073 }
8074
8075 void
8076 ix86_expand_vector_move (mode, operands)
8077      enum machine_mode mode;
8078      rtx operands[];
8079 {
8080   /* Force constants other than zero into memory.  We do not know how
8081      the instructions used to build constants modify the upper 64 bits
8082      of the register, once we have that information we may be able
8083      to handle some of them more efficiently.  */
8084   if ((reload_in_progress | reload_completed) == 0
8085       && register_operand (operands[0], mode)
8086       && CONSTANT_P (operands[1]))
8087     operands[1] = force_const_mem (mode, operands[1]);
8088
8089   /* Make operand1 a register if it isn't already.  */
8090   if (!no_new_pseudos
8091       && !register_operand (operands[0], mode)
8092       && !register_operand (operands[1], mode))
8093     {
8094       rtx temp = force_reg (GET_MODE (operands[1]), operands[1]);
8095       emit_move_insn (operands[0], temp);
8096       return;
8097     }
8098
8099   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
8100 }
8101
8102 /* Attempt to expand a binary operator.  Make the expansion closer to the
8103    actual machine, then just general_operand, which will allow 3 separate
8104    memory references (one output, two input) in a single insn.  */
8105
8106 void
8107 ix86_expand_binary_operator (code, mode, operands)
8108      enum rtx_code code;
8109      enum machine_mode mode;
8110      rtx operands[];
8111 {
8112   int matching_memory;
8113   rtx src1, src2, dst, op, clob;
8114
8115   dst = operands[0];
8116   src1 = operands[1];
8117   src2 = operands[2];
8118
8119   /* Recognize <var1> = <value> <op> <var1> for commutative operators */
8120   if (GET_RTX_CLASS (code) == 'c'
8121       && (rtx_equal_p (dst, src2)
8122           || immediate_operand (src1, mode)))
8123     {
8124       rtx temp = src1;
8125       src1 = src2;
8126       src2 = temp;
8127     }
8128
8129   /* If the destination is memory, and we do not have matching source
8130      operands, do things in registers.  */
8131   matching_memory = 0;
8132   if (GET_CODE (dst) == MEM)
8133     {
8134       if (rtx_equal_p (dst, src1))
8135         matching_memory = 1;
8136       else if (GET_RTX_CLASS (code) == 'c'
8137                && rtx_equal_p (dst, src2))
8138         matching_memory = 2;
8139       else
8140         dst = gen_reg_rtx (mode);
8141     }
8142
8143   /* Both source operands cannot be in memory.  */
8144   if (GET_CODE (src1) == MEM && GET_CODE (src2) == MEM)
8145     {
8146       if (matching_memory != 2)
8147         src2 = force_reg (mode, src2);
8148       else
8149         src1 = force_reg (mode, src1);
8150     }
8151
8152   /* If the operation is not commutable, source 1 cannot be a constant
8153      or non-matching memory.  */
8154   if ((CONSTANT_P (src1)
8155        || (!matching_memory && GET_CODE (src1) == MEM))
8156       && GET_RTX_CLASS (code) != 'c')
8157     src1 = force_reg (mode, src1);
8158
8159   /* If optimizing, copy to regs to improve CSE */
8160   if (optimize && ! no_new_pseudos)
8161     {
8162       if (GET_CODE (dst) == MEM)
8163         dst = gen_reg_rtx (mode);
8164       if (GET_CODE (src1) == MEM)
8165         src1 = force_reg (mode, src1);
8166       if (GET_CODE (src2) == MEM)
8167         src2 = force_reg (mode, src2);
8168     }
8169
8170   /* Emit the instruction.  */
8171
8172   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
8173   if (reload_in_progress)
8174     {
8175       /* Reload doesn't know about the flags register, and doesn't know that
8176          it doesn't want to clobber it.  We can only do this with PLUS.  */
8177       if (code != PLUS)
8178         abort ();
8179       emit_insn (op);
8180     }
8181   else
8182     {
8183       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
8184       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
8185     }
8186
8187   /* Fix up the destination if needed.  */
8188   if (dst != operands[0])
8189     emit_move_insn (operands[0], dst);
8190 }
8191
8192 /* Return TRUE or FALSE depending on whether the binary operator meets the
8193    appropriate constraints.  */
8194
8195 int
8196 ix86_binary_operator_ok (code, mode, operands)
8197      enum rtx_code code;
8198      enum machine_mode mode ATTRIBUTE_UNUSED;
8199      rtx operands[3];
8200 {
8201   /* Both source operands cannot be in memory.  */
8202   if (GET_CODE (operands[1]) == MEM && GET_CODE (operands[2]) == MEM)
8203     return 0;
8204   /* If the operation is not commutable, source 1 cannot be a constant.  */
8205   if (CONSTANT_P (operands[1]) && GET_RTX_CLASS (code) != 'c')
8206     return 0;
8207   /* If the destination is memory, we must have a matching source operand.  */
8208   if (GET_CODE (operands[0]) == MEM
8209       && ! (rtx_equal_p (operands[0], operands[1])
8210             || (GET_RTX_CLASS (code) == 'c'
8211                 && rtx_equal_p (operands[0], operands[2]))))
8212     return 0;
8213   /* If the operation is not commutable and the source 1 is memory, we must
8214      have a matching destination.  */
8215   if (GET_CODE (operands[1]) == MEM
8216       && GET_RTX_CLASS (code) != 'c'
8217       && ! rtx_equal_p (operands[0], operands[1]))
8218     return 0;
8219   return 1;
8220 }
8221
8222 /* Attempt to expand a unary operator.  Make the expansion closer to the
8223    actual machine, then just general_operand, which will allow 2 separate
8224    memory references (one output, one input) in a single insn.  */
8225
8226 void
8227 ix86_expand_unary_operator (code, mode, operands)
8228      enum rtx_code code;
8229      enum machine_mode mode;
8230      rtx operands[];
8231 {
8232   int matching_memory;
8233   rtx src, dst, op, clob;
8234
8235   dst = operands[0];
8236   src = operands[1];
8237
8238   /* If the destination is memory, and we do not have matching source
8239      operands, do things in registers.  */
8240   matching_memory = 0;
8241   if (GET_CODE (dst) == MEM)
8242     {
8243       if (rtx_equal_p (dst, src))
8244         matching_memory = 1;
8245       else
8246         dst = gen_reg_rtx (mode);
8247     }
8248
8249   /* When source operand is memory, destination must match.  */
8250   if (!matching_memory && GET_CODE (src) == MEM)
8251     src = force_reg (mode, src);
8252
8253   /* If optimizing, copy to regs to improve CSE */
8254   if (optimize && ! no_new_pseudos)
8255     {
8256       if (GET_CODE (dst) == MEM)
8257         dst = gen_reg_rtx (mode);
8258       if (GET_CODE (src) == MEM)
8259         src = force_reg (mode, src);
8260     }
8261
8262   /* Emit the instruction.  */
8263
8264   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
8265   if (reload_in_progress || code == NOT)
8266     {
8267       /* Reload doesn't know about the flags register, and doesn't know that
8268          it doesn't want to clobber it.  */
8269       if (code != NOT)
8270         abort ();
8271       emit_insn (op);
8272     }
8273   else
8274     {
8275       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
8276       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
8277     }
8278
8279   /* Fix up the destination if needed.  */
8280   if (dst != operands[0])
8281     emit_move_insn (operands[0], dst);
8282 }
8283
8284 /* Return TRUE or FALSE depending on whether the unary operator meets the
8285    appropriate constraints.  */
8286
8287 int
8288 ix86_unary_operator_ok (code, mode, operands)
8289      enum rtx_code code ATTRIBUTE_UNUSED;
8290      enum machine_mode mode ATTRIBUTE_UNUSED;
8291      rtx operands[2] ATTRIBUTE_UNUSED;
8292 {
8293   /* If one of operands is memory, source and destination must match.  */
8294   if ((GET_CODE (operands[0]) == MEM
8295        || GET_CODE (operands[1]) == MEM)
8296       && ! rtx_equal_p (operands[0], operands[1]))
8297     return FALSE;
8298   return TRUE;
8299 }
8300
8301 /* Return TRUE or FALSE depending on whether the first SET in INSN
8302    has source and destination with matching CC modes, and that the
8303    CC mode is at least as constrained as REQ_MODE.  */
8304
8305 int
8306 ix86_match_ccmode (insn, req_mode)
8307      rtx insn;
8308      enum machine_mode req_mode;
8309 {
8310   rtx set;
8311   enum machine_mode set_mode;
8312
8313   set = PATTERN (insn);
8314   if (GET_CODE (set) == PARALLEL)
8315     set = XVECEXP (set, 0, 0);
8316   if (GET_CODE (set) != SET)
8317     abort ();
8318   if (GET_CODE (SET_SRC (set)) != COMPARE)
8319     abort ();
8320
8321   set_mode = GET_MODE (SET_DEST (set));
8322   switch (set_mode)
8323     {
8324     case CCNOmode:
8325       if (req_mode != CCNOmode
8326           && (req_mode != CCmode
8327               || XEXP (SET_SRC (set), 1) != const0_rtx))
8328         return 0;
8329       break;
8330     case CCmode:
8331       if (req_mode == CCGCmode)
8332         return 0;
8333       /* FALLTHRU */
8334     case CCGCmode:
8335       if (req_mode == CCGOCmode || req_mode == CCNOmode)
8336         return 0;
8337       /* FALLTHRU */
8338     case CCGOCmode:
8339       if (req_mode == CCZmode)
8340         return 0;
8341       /* FALLTHRU */
8342     case CCZmode:
8343       break;
8344
8345     default:
8346       abort ();
8347     }
8348
8349   return (GET_MODE (SET_SRC (set)) == set_mode);
8350 }
8351
8352 /* Generate insn patterns to do an integer compare of OPERANDS.  */
8353
8354 static rtx
8355 ix86_expand_int_compare (code, op0, op1)
8356      enum rtx_code code;
8357      rtx op0, op1;
8358 {
8359   enum machine_mode cmpmode;
8360   rtx tmp, flags;
8361
8362   cmpmode = SELECT_CC_MODE (code, op0, op1);
8363   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
8364
8365   /* This is very simple, but making the interface the same as in the
8366      FP case makes the rest of the code easier.  */
8367   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
8368   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
8369
8370   /* Return the test that should be put into the flags user, i.e.
8371      the bcc, scc, or cmov instruction.  */
8372   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
8373 }
8374
8375 /* Figure out whether to use ordered or unordered fp comparisons.
8376    Return the appropriate mode to use.  */
8377
8378 enum machine_mode
8379 ix86_fp_compare_mode (code)
8380      enum rtx_code code ATTRIBUTE_UNUSED;
8381 {
8382   /* ??? In order to make all comparisons reversible, we do all comparisons
8383      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
8384      all forms trapping and nontrapping comparisons, we can make inequality
8385      comparisons trapping again, since it results in better code when using
8386      FCOM based compares.  */
8387   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
8388 }
8389
8390 enum machine_mode
8391 ix86_cc_mode (code, op0, op1)
8392      enum rtx_code code;
8393      rtx op0, op1;
8394 {
8395   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
8396     return ix86_fp_compare_mode (code);
8397   switch (code)
8398     {
8399       /* Only zero flag is needed.  */
8400     case EQ:                    /* ZF=0 */
8401     case NE:                    /* ZF!=0 */
8402       return CCZmode;
8403       /* Codes needing carry flag.  */
8404     case GEU:                   /* CF=0 */
8405     case GTU:                   /* CF=0 & ZF=0 */
8406     case LTU:                   /* CF=1 */
8407     case LEU:                   /* CF=1 | ZF=1 */
8408       return CCmode;
8409       /* Codes possibly doable only with sign flag when
8410          comparing against zero.  */
8411     case GE:                    /* SF=OF   or   SF=0 */
8412     case LT:                    /* SF<>OF  or   SF=1 */
8413       if (op1 == const0_rtx)
8414         return CCGOCmode;
8415       else
8416         /* For other cases Carry flag is not required.  */
8417         return CCGCmode;
8418       /* Codes doable only with sign flag when comparing
8419          against zero, but we miss jump instruction for it
8420          so we need to use relational tests agains overflow
8421          that thus needs to be zero.  */
8422     case GT:                    /* ZF=0 & SF=OF */
8423     case LE:                    /* ZF=1 | SF<>OF */
8424       if (op1 == const0_rtx)
8425         return CCNOmode;
8426       else
8427         return CCGCmode;
8428       /* strcmp pattern do (use flags) and combine may ask us for proper
8429          mode.  */
8430     case USE:
8431       return CCmode;
8432     default:
8433       abort ();
8434     }
8435 }
8436
8437 /* Return true if we should use an FCOMI instruction for this fp comparison.  */
8438
8439 int
8440 ix86_use_fcomi_compare (code)
8441      enum rtx_code code ATTRIBUTE_UNUSED;
8442 {
8443   enum rtx_code swapped_code = swap_condition (code);
8444   return ((ix86_fp_comparison_cost (code) == ix86_fp_comparison_fcomi_cost (code))
8445           || (ix86_fp_comparison_cost (swapped_code)
8446               == ix86_fp_comparison_fcomi_cost (swapped_code)));
8447 }
8448
8449 /* Swap, force into registers, or otherwise massage the two operands
8450    to a fp comparison.  The operands are updated in place; the new
8451    comparison code is returned.  */
8452
8453 static enum rtx_code
8454 ix86_prepare_fp_compare_args (code, pop0, pop1)
8455      enum rtx_code code;
8456      rtx *pop0, *pop1;
8457 {
8458   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
8459   rtx op0 = *pop0, op1 = *pop1;
8460   enum machine_mode op_mode = GET_MODE (op0);
8461   int is_sse = SSE_REG_P (op0) | SSE_REG_P (op1);
8462
8463   /* All of the unordered compare instructions only work on registers.
8464      The same is true of the XFmode compare instructions.  The same is
8465      true of the fcomi compare instructions.  */
8466
8467   if (!is_sse
8468       && (fpcmp_mode == CCFPUmode
8469           || op_mode == XFmode
8470           || op_mode == TFmode
8471           || ix86_use_fcomi_compare (code)))
8472     {
8473       op0 = force_reg (op_mode, op0);
8474       op1 = force_reg (op_mode, op1);
8475     }
8476   else
8477     {
8478       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
8479          things around if they appear profitable, otherwise force op0
8480          into a register.  */
8481
8482       if (standard_80387_constant_p (op0) == 0
8483           || (GET_CODE (op0) == MEM
8484               && ! (standard_80387_constant_p (op1) == 0
8485                     || GET_CODE (op1) == MEM)))
8486         {
8487           rtx tmp;
8488           tmp = op0, op0 = op1, op1 = tmp;
8489           code = swap_condition (code);
8490         }
8491
8492       if (GET_CODE (op0) != REG)
8493         op0 = force_reg (op_mode, op0);
8494
8495       if (CONSTANT_P (op1))
8496         {
8497           if (standard_80387_constant_p (op1))
8498             op1 = force_reg (op_mode, op1);
8499           else
8500             op1 = validize_mem (force_const_mem (op_mode, op1));
8501         }
8502     }
8503
8504   /* Try to rearrange the comparison to make it cheaper.  */
8505   if (ix86_fp_comparison_cost (code)
8506       > ix86_fp_comparison_cost (swap_condition (code))
8507       && (GET_CODE (op1) == REG || !no_new_pseudos))
8508     {
8509       rtx tmp;
8510       tmp = op0, op0 = op1, op1 = tmp;
8511       code = swap_condition (code);
8512       if (GET_CODE (op0) != REG)
8513         op0 = force_reg (op_mode, op0);
8514     }
8515
8516   *pop0 = op0;
8517   *pop1 = op1;
8518   return code;
8519 }
8520
8521 /* Convert comparison codes we use to represent FP comparison to integer
8522    code that will result in proper branch.  Return UNKNOWN if no such code
8523    is available.  */
8524 static enum rtx_code
8525 ix86_fp_compare_code_to_integer (code)
8526      enum rtx_code code;
8527 {
8528   switch (code)
8529     {
8530     case GT:
8531       return GTU;
8532     case GE:
8533       return GEU;
8534     case ORDERED:
8535     case UNORDERED:
8536       return code;
8537       break;
8538     case UNEQ:
8539       return EQ;
8540       break;
8541     case UNLT:
8542       return LTU;
8543       break;
8544     case UNLE:
8545       return LEU;
8546       break;
8547     case LTGT:
8548       return NE;
8549       break;
8550     default:
8551       return UNKNOWN;
8552     }
8553 }
8554
8555 /* Split comparison code CODE into comparisons we can do using branch
8556    instructions.  BYPASS_CODE is comparison code for branch that will
8557    branch around FIRST_CODE and SECOND_CODE.  If some of branches
8558    is not required, set value to NIL.
8559    We never require more than two branches.  */
8560 static void
8561 ix86_fp_comparison_codes (code, bypass_code, first_code, second_code)
8562      enum rtx_code code, *bypass_code, *first_code, *second_code;
8563 {
8564   *first_code = code;
8565   *bypass_code = NIL;
8566   *second_code = NIL;
8567
8568   /* The fcomi comparison sets flags as follows:
8569
8570      cmp    ZF PF CF
8571      >      0  0  0
8572      <      0  0  1
8573      =      1  0  0
8574      un     1  1  1 */
8575
8576   switch (code)
8577     {
8578     case GT:                    /* GTU - CF=0 & ZF=0 */
8579     case GE:                    /* GEU - CF=0 */
8580     case ORDERED:               /* PF=0 */
8581     case UNORDERED:             /* PF=1 */
8582     case UNEQ:                  /* EQ - ZF=1 */
8583     case UNLT:                  /* LTU - CF=1 */
8584     case UNLE:                  /* LEU - CF=1 | ZF=1 */
8585     case LTGT:                  /* EQ - ZF=0 */
8586       break;
8587     case LT:                    /* LTU - CF=1 - fails on unordered */
8588       *first_code = UNLT;
8589       *bypass_code = UNORDERED;
8590       break;
8591     case LE:                    /* LEU - CF=1 | ZF=1 - fails on unordered */
8592       *first_code = UNLE;
8593       *bypass_code = UNORDERED;
8594       break;
8595     case EQ:                    /* EQ - ZF=1 - fails on unordered */
8596       *first_code = UNEQ;
8597       *bypass_code = UNORDERED;
8598       break;
8599     case NE:                    /* NE - ZF=0 - fails on unordered */
8600       *first_code = LTGT;
8601       *second_code = UNORDERED;
8602       break;
8603     case UNGE:                  /* GEU - CF=0 - fails on unordered */
8604       *first_code = GE;
8605       *second_code = UNORDERED;
8606       break;
8607     case UNGT:                  /* GTU - CF=0 & ZF=0 - fails on unordered */
8608       *first_code = GT;
8609       *second_code = UNORDERED;
8610       break;
8611     default:
8612       abort ();
8613     }
8614   if (!TARGET_IEEE_FP)
8615     {
8616       *second_code = NIL;
8617       *bypass_code = NIL;
8618     }
8619 }
8620
8621 /* Return cost of comparison done fcom + arithmetics operations on AX.
8622    All following functions do use number of instructions as a cost metrics.
8623    In future this should be tweaked to compute bytes for optimize_size and
8624    take into account performance of various instructions on various CPUs.  */
8625 static int
8626 ix86_fp_comparison_arithmetics_cost (code)
8627      enum rtx_code code;
8628 {
8629   if (!TARGET_IEEE_FP)
8630     return 4;
8631   /* The cost of code output by ix86_expand_fp_compare.  */
8632   switch (code)
8633     {
8634     case UNLE:
8635     case UNLT:
8636     case LTGT:
8637     case GT:
8638     case GE:
8639     case UNORDERED:
8640     case ORDERED:
8641     case UNEQ:
8642       return 4;
8643       break;
8644     case LT:
8645     case NE:
8646     case EQ:
8647     case UNGE:
8648       return 5;
8649       break;
8650     case LE:
8651     case UNGT:
8652       return 6;
8653       break;
8654     default:
8655       abort ();
8656     }
8657 }
8658
8659 /* Return cost of comparison done using fcomi operation.
8660    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
8661 static int
8662 ix86_fp_comparison_fcomi_cost (code)
8663      enum rtx_code code;
8664 {
8665   enum rtx_code bypass_code, first_code, second_code;
8666   /* Return arbitrarily high cost when instruction is not supported - this
8667      prevents gcc from using it.  */
8668   if (!TARGET_CMOVE)
8669     return 1024;
8670   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8671   return (bypass_code != NIL || second_code != NIL) + 2;
8672 }
8673
8674 /* Return cost of comparison done using sahf operation.
8675    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
8676 static int
8677 ix86_fp_comparison_sahf_cost (code)
8678      enum rtx_code code;
8679 {
8680   enum rtx_code bypass_code, first_code, second_code;
8681   /* Return arbitrarily high cost when instruction is not preferred - this
8682      avoids gcc from using it.  */
8683   if (!TARGET_USE_SAHF && !optimize_size)
8684     return 1024;
8685   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8686   return (bypass_code != NIL || second_code != NIL) + 3;
8687 }
8688
8689 /* Compute cost of the comparison done using any method.
8690    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
8691 static int
8692 ix86_fp_comparison_cost (code)
8693      enum rtx_code code;
8694 {
8695   int fcomi_cost, sahf_cost, arithmetics_cost = 1024;
8696   int min;
8697
8698   fcomi_cost = ix86_fp_comparison_fcomi_cost (code);
8699   sahf_cost = ix86_fp_comparison_sahf_cost (code);
8700
8701   min = arithmetics_cost = ix86_fp_comparison_arithmetics_cost (code);
8702   if (min > sahf_cost)
8703     min = sahf_cost;
8704   if (min > fcomi_cost)
8705     min = fcomi_cost;
8706   return min;
8707 }
8708
8709 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
8710
8711 static rtx
8712 ix86_expand_fp_compare (code, op0, op1, scratch, second_test, bypass_test)
8713      enum rtx_code code;
8714      rtx op0, op1, scratch;
8715      rtx *second_test;
8716      rtx *bypass_test;
8717 {
8718   enum machine_mode fpcmp_mode, intcmp_mode;
8719   rtx tmp, tmp2;
8720   int cost = ix86_fp_comparison_cost (code);
8721   enum rtx_code bypass_code, first_code, second_code;
8722
8723   fpcmp_mode = ix86_fp_compare_mode (code);
8724   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
8725
8726   if (second_test)
8727     *second_test = NULL_RTX;
8728   if (bypass_test)
8729     *bypass_test = NULL_RTX;
8730
8731   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8732
8733   /* Do fcomi/sahf based test when profitable.  */
8734   if ((bypass_code == NIL || bypass_test)
8735       && (second_code == NIL || second_test)
8736       && ix86_fp_comparison_arithmetics_cost (code) > cost)
8737     {
8738       if (TARGET_CMOVE)
8739         {
8740           tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
8741           tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
8742                              tmp);
8743           emit_insn (tmp);
8744         }
8745       else
8746         {
8747           tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
8748           tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
8749           if (!scratch)
8750             scratch = gen_reg_rtx (HImode);
8751           emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
8752           emit_insn (gen_x86_sahf_1 (scratch));
8753         }
8754
8755       /* The FP codes work out to act like unsigned.  */
8756       intcmp_mode = fpcmp_mode;
8757       code = first_code;
8758       if (bypass_code != NIL)
8759         *bypass_test = gen_rtx_fmt_ee (bypass_code, VOIDmode,
8760                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
8761                                        const0_rtx);
8762       if (second_code != NIL)
8763         *second_test = gen_rtx_fmt_ee (second_code, VOIDmode,
8764                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
8765                                        const0_rtx);
8766     }
8767   else
8768     {
8769       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
8770       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
8771       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
8772       if (!scratch)
8773         scratch = gen_reg_rtx (HImode);
8774       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
8775
8776       /* In the unordered case, we have to check C2 for NaN's, which
8777          doesn't happen to work out to anything nice combination-wise.
8778          So do some bit twiddling on the value we've got in AH to come
8779          up with an appropriate set of condition codes.  */
8780
8781       intcmp_mode = CCNOmode;
8782       switch (code)
8783         {
8784         case GT:
8785         case UNGT:
8786           if (code == GT || !TARGET_IEEE_FP)
8787             {
8788               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
8789               code = EQ;
8790             }
8791           else
8792             {
8793               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8794               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
8795               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
8796               intcmp_mode = CCmode;
8797               code = GEU;
8798             }
8799           break;
8800         case LT:
8801         case UNLT:
8802           if (code == LT && TARGET_IEEE_FP)
8803             {
8804               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8805               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x01)));
8806               intcmp_mode = CCmode;
8807               code = EQ;
8808             }
8809           else
8810             {
8811               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x01)));
8812               code = NE;
8813             }
8814           break;
8815         case GE:
8816         case UNGE:
8817           if (code == GE || !TARGET_IEEE_FP)
8818             {
8819               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
8820               code = EQ;
8821             }
8822           else
8823             {
8824               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8825               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
8826                                              GEN_INT (0x01)));
8827               code = NE;
8828             }
8829           break;
8830         case LE:
8831         case UNLE:
8832           if (code == LE && TARGET_IEEE_FP)
8833             {
8834               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8835               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
8836               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
8837               intcmp_mode = CCmode;
8838               code = LTU;
8839             }
8840           else
8841             {
8842               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
8843               code = NE;
8844             }
8845           break;
8846         case EQ:
8847         case UNEQ:
8848           if (code == EQ && TARGET_IEEE_FP)
8849             {
8850               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8851               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
8852               intcmp_mode = CCmode;
8853               code = EQ;
8854             }
8855           else
8856             {
8857               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
8858               code = NE;
8859               break;
8860             }
8861           break;
8862         case NE:
8863         case LTGT:
8864           if (code == NE && TARGET_IEEE_FP)
8865             {
8866               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
8867               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
8868                                              GEN_INT (0x40)));
8869               code = NE;
8870             }
8871           else
8872             {
8873               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
8874               code = EQ;
8875             }
8876           break;
8877
8878         case UNORDERED:
8879           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
8880           code = NE;
8881           break;
8882         case ORDERED:
8883           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
8884           code = EQ;
8885           break;
8886
8887         default:
8888           abort ();
8889         }
8890     }
8891
8892   /* Return the test that should be put into the flags user, i.e.
8893      the bcc, scc, or cmov instruction.  */
8894   return gen_rtx_fmt_ee (code, VOIDmode,
8895                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
8896                          const0_rtx);
8897 }
8898
8899 rtx
8900 ix86_expand_compare (code, second_test, bypass_test)
8901      enum rtx_code code;
8902      rtx *second_test, *bypass_test;
8903 {
8904   rtx op0, op1, ret;
8905   op0 = ix86_compare_op0;
8906   op1 = ix86_compare_op1;
8907
8908   if (second_test)
8909     *second_test = NULL_RTX;
8910   if (bypass_test)
8911     *bypass_test = NULL_RTX;
8912
8913   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
8914     ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
8915                                   second_test, bypass_test);
8916   else
8917     ret = ix86_expand_int_compare (code, op0, op1);
8918
8919   return ret;
8920 }
8921
8922 /* Return true if the CODE will result in nontrivial jump sequence.  */
8923 bool
8924 ix86_fp_jump_nontrivial_p (code)
8925     enum rtx_code code;
8926 {
8927   enum rtx_code bypass_code, first_code, second_code;
8928   if (!TARGET_CMOVE)
8929     return true;
8930   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8931   return bypass_code != NIL || second_code != NIL;
8932 }
8933
8934 void
8935 ix86_expand_branch (code, label)
8936      enum rtx_code code;
8937      rtx label;
8938 {
8939   rtx tmp;
8940
8941   switch (GET_MODE (ix86_compare_op0))
8942     {
8943     case QImode:
8944     case HImode:
8945     case SImode:
8946       simple:
8947       tmp = ix86_expand_compare (code, NULL, NULL);
8948       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
8949                                   gen_rtx_LABEL_REF (VOIDmode, label),
8950                                   pc_rtx);
8951       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
8952       return;
8953
8954     case SFmode:
8955     case DFmode:
8956     case XFmode:
8957     case TFmode:
8958       {
8959         rtvec vec;
8960         int use_fcomi;
8961         enum rtx_code bypass_code, first_code, second_code;
8962
8963         code = ix86_prepare_fp_compare_args (code, &ix86_compare_op0,
8964                                              &ix86_compare_op1);
8965
8966         ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
8967
8968         /* Check whether we will use the natural sequence with one jump.  If
8969            so, we can expand jump early.  Otherwise delay expansion by
8970            creating compound insn to not confuse optimizers.  */
8971         if (bypass_code == NIL && second_code == NIL
8972             && TARGET_CMOVE)
8973           {
8974             ix86_split_fp_branch (code, ix86_compare_op0, ix86_compare_op1,
8975                                   gen_rtx_LABEL_REF (VOIDmode, label),
8976                                   pc_rtx, NULL_RTX);
8977           }
8978         else
8979           {
8980             tmp = gen_rtx_fmt_ee (code, VOIDmode,
8981                                   ix86_compare_op0, ix86_compare_op1);
8982             tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
8983                                         gen_rtx_LABEL_REF (VOIDmode, label),
8984                                         pc_rtx);
8985             tmp = gen_rtx_SET (VOIDmode, pc_rtx, tmp);
8986
8987             use_fcomi = ix86_use_fcomi_compare (code);
8988             vec = rtvec_alloc (3 + !use_fcomi);
8989             RTVEC_ELT (vec, 0) = tmp;
8990             RTVEC_ELT (vec, 1)
8991               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, 18));
8992             RTVEC_ELT (vec, 2)
8993               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, 17));
8994             if (! use_fcomi)
8995               RTVEC_ELT (vec, 3)
8996                 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (HImode));
8997
8998             emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, vec));
8999           }
9000         return;
9001       }
9002
9003     case DImode:
9004       if (TARGET_64BIT)
9005         goto simple;
9006       /* Expand DImode branch into multiple compare+branch.  */
9007       {
9008         rtx lo[2], hi[2], label2;
9009         enum rtx_code code1, code2, code3;
9010
9011         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
9012           {
9013             tmp = ix86_compare_op0;
9014             ix86_compare_op0 = ix86_compare_op1;
9015             ix86_compare_op1 = tmp;
9016             code = swap_condition (code);
9017           }
9018         split_di (&ix86_compare_op0, 1, lo+0, hi+0);
9019         split_di (&ix86_compare_op1, 1, lo+1, hi+1);
9020
9021         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
9022            avoid two branches.  This costs one extra insn, so disable when
9023            optimizing for size.  */
9024
9025         if ((code == EQ || code == NE)
9026             && (!optimize_size
9027                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
9028           {
9029             rtx xor0, xor1;
9030
9031             xor1 = hi[0];
9032             if (hi[1] != const0_rtx)
9033               xor1 = expand_binop (SImode, xor_optab, xor1, hi[1],
9034                                    NULL_RTX, 0, OPTAB_WIDEN);
9035
9036             xor0 = lo[0];
9037             if (lo[1] != const0_rtx)
9038               xor0 = expand_binop (SImode, xor_optab, xor0, lo[1],
9039                                    NULL_RTX, 0, OPTAB_WIDEN);
9040
9041             tmp = expand_binop (SImode, ior_optab, xor1, xor0,
9042                                 NULL_RTX, 0, OPTAB_WIDEN);
9043
9044             ix86_compare_op0 = tmp;
9045             ix86_compare_op1 = const0_rtx;
9046             ix86_expand_branch (code, label);
9047             return;
9048           }
9049
9050         /* Otherwise, if we are doing less-than or greater-or-equal-than,
9051            op1 is a constant and the low word is zero, then we can just
9052            examine the high word.  */
9053
9054         if (GET_CODE (hi[1]) == CONST_INT && lo[1] == const0_rtx)
9055           switch (code)
9056             {
9057             case LT: case LTU: case GE: case GEU:
9058               ix86_compare_op0 = hi[0];
9059               ix86_compare_op1 = hi[1];
9060               ix86_expand_branch (code, label);
9061               return;
9062             default:
9063               break;
9064             }
9065
9066         /* Otherwise, we need two or three jumps.  */
9067
9068         label2 = gen_label_rtx ();
9069
9070         code1 = code;
9071         code2 = swap_condition (code);
9072         code3 = unsigned_condition (code);
9073
9074         switch (code)
9075           {
9076           case LT: case GT: case LTU: case GTU:
9077             break;
9078
9079           case LE:   code1 = LT;  code2 = GT;  break;
9080           case GE:   code1 = GT;  code2 = LT;  break;
9081           case LEU:  code1 = LTU; code2 = GTU; break;
9082           case GEU:  code1 = GTU; code2 = LTU; break;
9083
9084           case EQ:   code1 = NIL; code2 = NE;  break;
9085           case NE:   code2 = NIL; break;
9086
9087           default:
9088             abort ();
9089           }
9090
9091         /*
9092          * a < b =>
9093          *    if (hi(a) < hi(b)) goto true;
9094          *    if (hi(a) > hi(b)) goto false;
9095          *    if (lo(a) < lo(b)) goto true;
9096          *  false:
9097          */
9098
9099         ix86_compare_op0 = hi[0];
9100         ix86_compare_op1 = hi[1];
9101
9102         if (code1 != NIL)
9103           ix86_expand_branch (code1, label);
9104         if (code2 != NIL)
9105           ix86_expand_branch (code2, label2);
9106
9107         ix86_compare_op0 = lo[0];
9108         ix86_compare_op1 = lo[1];
9109         ix86_expand_branch (code3, label);
9110
9111         if (code2 != NIL)
9112           emit_label (label2);
9113         return;
9114       }
9115
9116     default:
9117       abort ();
9118     }
9119 }
9120
9121 /* Split branch based on floating point condition.  */
9122 void
9123 ix86_split_fp_branch (code, op1, op2, target1, target2, tmp)
9124      enum rtx_code code;
9125      rtx op1, op2, target1, target2, tmp;
9126 {
9127   rtx second, bypass;
9128   rtx label = NULL_RTX;
9129   rtx condition;
9130   int bypass_probability = -1, second_probability = -1, probability = -1;
9131   rtx i;
9132
9133   if (target2 != pc_rtx)
9134     {
9135       rtx tmp = target2;
9136       code = reverse_condition_maybe_unordered (code);
9137       target2 = target1;
9138       target1 = tmp;
9139     }
9140
9141   condition = ix86_expand_fp_compare (code, op1, op2,
9142                                       tmp, &second, &bypass);
9143
9144   if (split_branch_probability >= 0)
9145     {
9146       /* Distribute the probabilities across the jumps.
9147          Assume the BYPASS and SECOND to be always test
9148          for UNORDERED.  */
9149       probability = split_branch_probability;
9150
9151       /* Value of 1 is low enough to make no need for probability
9152          to be updated.  Later we may run some experiments and see
9153          if unordered values are more frequent in practice.  */
9154       if (bypass)
9155         bypass_probability = 1;
9156       if (second)
9157         second_probability = 1;
9158     }
9159   if (bypass != NULL_RTX)
9160     {
9161       label = gen_label_rtx ();
9162       i = emit_jump_insn (gen_rtx_SET
9163                           (VOIDmode, pc_rtx,
9164                            gen_rtx_IF_THEN_ELSE (VOIDmode,
9165                                                  bypass,
9166                                                  gen_rtx_LABEL_REF (VOIDmode,
9167                                                                     label),
9168                                                  pc_rtx)));
9169       if (bypass_probability >= 0)
9170         REG_NOTES (i)
9171           = gen_rtx_EXPR_LIST (REG_BR_PROB,
9172                                GEN_INT (bypass_probability),
9173                                REG_NOTES (i));
9174     }
9175   i = emit_jump_insn (gen_rtx_SET
9176                       (VOIDmode, pc_rtx,
9177                        gen_rtx_IF_THEN_ELSE (VOIDmode,
9178                                              condition, target1, target2)));
9179   if (probability >= 0)
9180     REG_NOTES (i)
9181       = gen_rtx_EXPR_LIST (REG_BR_PROB,
9182                            GEN_INT (probability),
9183                            REG_NOTES (i));
9184   if (second != NULL_RTX)
9185     {
9186       i = emit_jump_insn (gen_rtx_SET
9187                           (VOIDmode, pc_rtx,
9188                            gen_rtx_IF_THEN_ELSE (VOIDmode, second, target1,
9189                                                  target2)));
9190       if (second_probability >= 0)
9191         REG_NOTES (i)
9192           = gen_rtx_EXPR_LIST (REG_BR_PROB,
9193                                GEN_INT (second_probability),
9194                                REG_NOTES (i));
9195     }
9196   if (label != NULL_RTX)
9197     emit_label (label);
9198 }
9199
9200 int
9201 ix86_expand_setcc (code, dest)
9202      enum rtx_code code;
9203      rtx dest;
9204 {
9205   rtx ret, tmp, tmpreg;
9206   rtx second_test, bypass_test;
9207
9208   if (GET_MODE (ix86_compare_op0) == DImode
9209       && !TARGET_64BIT)
9210     return 0; /* FAIL */
9211
9212   if (GET_MODE (dest) != QImode)
9213     abort ();
9214
9215   ret = ix86_expand_compare (code, &second_test, &bypass_test);
9216   PUT_MODE (ret, QImode);
9217
9218   tmp = dest;
9219   tmpreg = dest;
9220
9221   emit_insn (gen_rtx_SET (VOIDmode, tmp, ret));
9222   if (bypass_test || second_test)
9223     {
9224       rtx test = second_test;
9225       int bypass = 0;
9226       rtx tmp2 = gen_reg_rtx (QImode);
9227       if (bypass_test)
9228         {
9229           if (second_test)
9230             abort ();
9231           test = bypass_test;
9232           bypass = 1;
9233           PUT_CODE (test, reverse_condition_maybe_unordered (GET_CODE (test)));
9234         }
9235       PUT_MODE (test, QImode);
9236       emit_insn (gen_rtx_SET (VOIDmode, tmp2, test));
9237
9238       if (bypass)
9239         emit_insn (gen_andqi3 (tmp, tmpreg, tmp2));
9240       else
9241         emit_insn (gen_iorqi3 (tmp, tmpreg, tmp2));
9242     }
9243
9244   return 1; /* DONE */
9245 }
9246
9247 /* Expand comparison setting or clearing carry flag.  Return true when successful
9248    and set pop for the operation.  */
9249 bool
9250 ix86_expand_carry_flag_compare (code, op0, op1, pop)
9251      rtx op0, op1, *pop;
9252      enum rtx_code code;
9253 {
9254   enum machine_mode mode =
9255     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
9256
9257   /* Do not handle DImode compares that go trought special path.  Also we can't
9258      deal with FP compares yet.  This is possible to add.   */
9259   if ((mode == DImode && !TARGET_64BIT) || !INTEGRAL_MODE_P (mode))
9260     return false;
9261   switch (code)
9262     {
9263     case LTU:
9264     case GEU:
9265       break;
9266
9267     /* Convert a==0 into (unsigned)a<1.  */
9268     case EQ:
9269     case NE:
9270       if (op1 != const0_rtx)
9271         return false;
9272       op1 = const1_rtx;
9273       code = (code == EQ ? LTU : GEU);
9274       break;
9275
9276     /* Convert a>b into b<a or a>=b-1.  */
9277     case GTU:
9278     case LEU:
9279       if (GET_CODE (op1) == CONST_INT)
9280         {
9281           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
9282           /* Bail out on overflow.  We still can swap operands but that
9283              would force loading of the constant into register. */
9284           if (op1 == const0_rtx
9285               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
9286             return false;
9287           code = (code == GTU ? GEU : LTU);
9288         }
9289       else
9290         {
9291           rtx tmp = op1;
9292           op1 = op0;
9293           op0 = tmp;
9294           code = (code == GTU ? LTU : GEU);
9295         }
9296       break;
9297
9298     /* Convert a>0 into (unsigned)a<0x7fffffff.  */
9299     case LT:
9300     case GE:
9301       if (mode == DImode || op1 != const0_rtx)
9302         return false;
9303       op1 = gen_int_mode (~(1 << (GET_MODE_BITSIZE (mode) - 1)), mode);
9304       code = (code == LT ? GEU : LTU);
9305       break;
9306     case LE:
9307     case GT:
9308       if (mode == DImode || op1 != constm1_rtx)
9309         return false;
9310       op1 = gen_int_mode (~(1 << (GET_MODE_BITSIZE (mode) - 1)), mode);
9311       code = (code == LE ? GEU : LTU);
9312       break;
9313
9314     default:
9315       return false;
9316     }
9317   ix86_compare_op0 = op0;
9318   ix86_compare_op1 = op1;
9319   *pop = ix86_expand_compare (code, NULL, NULL);
9320   if (GET_CODE (*pop) != LTU && GET_CODE (*pop) != GEU)
9321     abort ();
9322   return true;
9323 }
9324
9325 int
9326 ix86_expand_int_movcc (operands)
9327      rtx operands[];
9328 {
9329   enum rtx_code code = GET_CODE (operands[1]), compare_code;
9330   rtx compare_seq, compare_op;
9331   rtx second_test, bypass_test;
9332   enum machine_mode mode = GET_MODE (operands[0]);
9333   bool sign_bit_compare_p = false;;
9334
9335   start_sequence ();
9336   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
9337   compare_seq = get_insns ();
9338   end_sequence ();
9339
9340   compare_code = GET_CODE (compare_op);
9341
9342   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
9343       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
9344     sign_bit_compare_p = true;
9345
9346   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
9347      HImode insns, we'd be swallowed in word prefix ops.  */
9348
9349   if ((mode != HImode || TARGET_FAST_PREFIX)
9350       && (mode != DImode || TARGET_64BIT)
9351       && GET_CODE (operands[2]) == CONST_INT
9352       && GET_CODE (operands[3]) == CONST_INT)
9353     {
9354       rtx out = operands[0];
9355       HOST_WIDE_INT ct = INTVAL (operands[2]);
9356       HOST_WIDE_INT cf = INTVAL (operands[3]);
9357       HOST_WIDE_INT diff;
9358
9359       diff = ct - cf;
9360       /*  Sign bit compares are better done using shifts than we do by using
9361           sbb.  */
9362       if (sign_bit_compare_p
9363           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
9364                                              ix86_compare_op1, &compare_op))
9365         {
9366           /* Detect overlap between destination and compare sources.  */
9367           rtx tmp = out;
9368
9369           if (!sign_bit_compare_p)
9370             {
9371               compare_code = GET_CODE (compare_op);
9372
9373               /* To simplify rest of code, restrict to the GEU case.  */
9374               if (compare_code == LTU)
9375                 {
9376                   HOST_WIDE_INT tmp = ct;
9377                   ct = cf;
9378                   cf = tmp;
9379                   compare_code = reverse_condition (compare_code);
9380                   code = reverse_condition (code);
9381                 }
9382               diff = ct - cf;
9383
9384               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
9385                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
9386                 tmp = gen_reg_rtx (mode);
9387
9388               if (mode == DImode)
9389                 emit_insn (gen_x86_movdicc_0_m1_rex64 (tmp));
9390               else
9391                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp)));
9392             }
9393           else
9394             {
9395               if (code == GT || code == GE)
9396                 code = reverse_condition (code);
9397               else
9398                 {
9399                   HOST_WIDE_INT tmp = ct;
9400                   ct = cf;
9401                   cf = tmp;
9402                 }
9403               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
9404                                      ix86_compare_op1, VOIDmode, 0, -1);
9405             }
9406
9407           if (diff == 1)
9408             {
9409               /*
9410                * cmpl op0,op1
9411                * sbbl dest,dest
9412                * [addl dest, ct]
9413                *
9414                * Size 5 - 8.
9415                */
9416               if (ct)
9417                 tmp = expand_simple_binop (mode, PLUS,
9418                                            tmp, GEN_INT (ct),
9419                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
9420             }
9421           else if (cf == -1)
9422             {
9423               /*
9424                * cmpl op0,op1
9425                * sbbl dest,dest
9426                * orl $ct, dest
9427                *
9428                * Size 8.
9429                */
9430               tmp = expand_simple_binop (mode, IOR,
9431                                          tmp, GEN_INT (ct),
9432                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
9433             }
9434           else if (diff == -1 && ct)
9435             {
9436               /*
9437                * cmpl op0,op1
9438                * sbbl dest,dest
9439                * notl dest
9440                * [addl dest, cf]
9441                *
9442                * Size 8 - 11.
9443                */
9444               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
9445               if (cf)
9446                 tmp = expand_simple_binop (mode, PLUS,
9447                                            copy_rtx (tmp), GEN_INT (cf),
9448                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
9449             }
9450           else
9451             {
9452               /*
9453                * cmpl op0,op1
9454                * sbbl dest,dest
9455                * [notl dest]
9456                * andl cf - ct, dest
9457                * [addl dest, ct]
9458                *
9459                * Size 8 - 11.
9460                */
9461
9462               if (cf == 0)
9463                 {
9464                   cf = ct;
9465                   ct = 0;
9466                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
9467                 }
9468
9469               tmp = expand_simple_binop (mode, AND,
9470                                          copy_rtx (tmp),
9471                                          gen_int_mode (cf - ct, mode),
9472                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
9473               if (ct)
9474                 tmp = expand_simple_binop (mode, PLUS,
9475                                            copy_rtx (tmp), GEN_INT (ct),
9476                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
9477             }
9478
9479           if (!rtx_equal_p (tmp, out))
9480             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
9481
9482           return 1; /* DONE */
9483         }
9484
9485       if (diff < 0)
9486         {
9487           HOST_WIDE_INT tmp;
9488           tmp = ct, ct = cf, cf = tmp;
9489           diff = -diff;
9490           if (FLOAT_MODE_P (GET_MODE (ix86_compare_op0)))
9491             {
9492               /* We may be reversing unordered compare to normal compare, that
9493                  is not valid in general (we may convert non-trapping condition
9494                  to trapping one), however on i386 we currently emit all
9495                  comparisons unordered.  */
9496               compare_code = reverse_condition_maybe_unordered (compare_code);
9497               code = reverse_condition_maybe_unordered (code);
9498             }
9499           else
9500             {
9501               compare_code = reverse_condition (compare_code);
9502               code = reverse_condition (code);
9503             }
9504         }
9505
9506       compare_code = NIL;
9507       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
9508           && GET_CODE (ix86_compare_op1) == CONST_INT)
9509         {
9510           if (ix86_compare_op1 == const0_rtx
9511               && (code == LT || code == GE))
9512             compare_code = code;
9513           else if (ix86_compare_op1 == constm1_rtx)
9514             {
9515               if (code == LE)
9516                 compare_code = LT;
9517               else if (code == GT)
9518                 compare_code = GE;
9519             }
9520         }
9521
9522       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
9523       if (compare_code != NIL
9524           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
9525           && (cf == -1 || ct == -1))
9526         {
9527           /* If lea code below could be used, only optimize
9528              if it results in a 2 insn sequence.  */
9529
9530           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
9531                  || diff == 3 || diff == 5 || diff == 9)
9532               || (compare_code == LT && ct == -1)
9533               || (compare_code == GE && cf == -1))
9534             {
9535               /*
9536                * notl op1       (if necessary)
9537                * sarl $31, op1
9538                * orl cf, op1
9539                */
9540               if (ct != -1)
9541                 {
9542                   cf = ct;
9543                   ct = -1;
9544                   code = reverse_condition (code);
9545                 }
9546
9547               out = emit_store_flag (out, code, ix86_compare_op0,
9548                                      ix86_compare_op1, VOIDmode, 0, -1);
9549
9550               out = expand_simple_binop (mode, IOR,
9551                                          out, GEN_INT (cf),
9552                                          out, 1, OPTAB_DIRECT);
9553               if (out != operands[0])
9554                 emit_move_insn (operands[0], out);
9555
9556               return 1; /* DONE */
9557             }
9558         }
9559
9560
9561       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
9562            || diff == 3 || diff == 5 || diff == 9)
9563           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
9564           && (mode != DImode || x86_64_sign_extended_value (GEN_INT (cf))))
9565         {
9566           /*
9567            * xorl dest,dest
9568            * cmpl op1,op2
9569            * setcc dest
9570            * lea cf(dest*(ct-cf)),dest
9571            *
9572            * Size 14.
9573            *
9574            * This also catches the degenerate setcc-only case.
9575            */
9576
9577           rtx tmp;
9578           int nops;
9579
9580           out = emit_store_flag (out, code, ix86_compare_op0,
9581                                  ix86_compare_op1, VOIDmode, 0, 1);
9582
9583           nops = 0;
9584           /* On x86_64 the lea instruction operates on Pmode, so we need
9585              to get arithmetics done in proper mode to match.  */
9586           if (diff == 1)
9587             tmp = copy_rtx (out);
9588           else
9589             {
9590               rtx out1;
9591               out1 = copy_rtx (out);
9592               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
9593               nops++;
9594               if (diff & 1)
9595                 {
9596                   tmp = gen_rtx_PLUS (mode, tmp, out1);
9597                   nops++;
9598                 }
9599             }
9600           if (cf != 0)
9601             {
9602               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
9603               nops++;
9604             }
9605           if (!rtx_equal_p (tmp, out))
9606             {
9607               if (nops == 1)
9608                 out = force_operand (tmp, out);
9609               else
9610                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
9611             }
9612           if (!rtx_equal_p (out, operands[0]))
9613             emit_move_insn (operands[0], copy_rtx (out));
9614
9615           return 1; /* DONE */
9616         }
9617
9618       /*
9619        * General case:                  Jumpful:
9620        *   xorl dest,dest               cmpl op1, op2
9621        *   cmpl op1, op2                movl ct, dest
9622        *   setcc dest                   jcc 1f
9623        *   decl dest                    movl cf, dest
9624        *   andl (cf-ct),dest            1:
9625        *   addl ct,dest
9626        *
9627        * Size 20.                       Size 14.
9628        *
9629        * This is reasonably steep, but branch mispredict costs are
9630        * high on modern cpus, so consider failing only if optimizing
9631        * for space.
9632        */
9633
9634       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
9635           && BRANCH_COST >= 2)
9636         {
9637           if (cf == 0)
9638             {
9639               cf = ct;
9640               ct = 0;
9641               if (FLOAT_MODE_P (GET_MODE (ix86_compare_op0)))
9642                 /* We may be reversing unordered compare to normal compare,
9643                    that is not valid in general (we may convert non-trapping
9644                    condition to trapping one), however on i386 we currently
9645                    emit all comparisons unordered.  */
9646                 code = reverse_condition_maybe_unordered (code);
9647               else
9648                 {
9649                   code = reverse_condition (code);
9650                   if (compare_code != NIL)
9651                     compare_code = reverse_condition (compare_code);
9652                 }
9653             }
9654
9655           if (compare_code != NIL)
9656             {
9657               /* notl op1       (if needed)
9658                  sarl $31, op1
9659                  andl (cf-ct), op1
9660                  addl ct, op1
9661
9662                  For x < 0 (resp. x <= -1) there will be no notl,
9663                  so if possible swap the constants to get rid of the
9664                  complement.
9665                  True/false will be -1/0 while code below (store flag
9666                  followed by decrement) is 0/-1, so the constants need
9667                  to be exchanged once more.  */
9668
9669               if (compare_code == GE || !cf)
9670                 {
9671                   code = reverse_condition (code);
9672                   compare_code = LT;
9673                 }
9674               else
9675                 {
9676                   HOST_WIDE_INT tmp = cf;
9677                   cf = ct;
9678                   ct = tmp;
9679                 }
9680
9681               out = emit_store_flag (out, code, ix86_compare_op0,
9682                                      ix86_compare_op1, VOIDmode, 0, -1);
9683             }
9684           else
9685             {
9686               out = emit_store_flag (out, code, ix86_compare_op0,
9687                                      ix86_compare_op1, VOIDmode, 0, 1);
9688
9689               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
9690                                          copy_rtx (out), 1, OPTAB_DIRECT);
9691             }
9692
9693           out = expand_simple_binop (mode, AND, copy_rtx (out),
9694                                      gen_int_mode (cf - ct, mode),
9695                                      copy_rtx (out), 1, OPTAB_DIRECT);
9696           if (ct)
9697             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
9698                                        copy_rtx (out), 1, OPTAB_DIRECT);
9699           if (!rtx_equal_p (out, operands[0]))
9700             emit_move_insn (operands[0], copy_rtx (out));
9701
9702           return 1; /* DONE */
9703         }
9704     }
9705
9706   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
9707     {
9708       /* Try a few things more with specific constants and a variable.  */
9709
9710       optab op;
9711       rtx var, orig_out, out, tmp;
9712
9713       if (BRANCH_COST <= 2)
9714         return 0; /* FAIL */
9715
9716       /* If one of the two operands is an interesting constant, load a
9717          constant with the above and mask it in with a logical operation.  */
9718
9719       if (GET_CODE (operands[2]) == CONST_INT)
9720         {
9721           var = operands[3];
9722           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
9723             operands[3] = constm1_rtx, op = and_optab;
9724           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
9725             operands[3] = const0_rtx, op = ior_optab;
9726           else
9727             return 0; /* FAIL */
9728         }
9729       else if (GET_CODE (operands[3]) == CONST_INT)
9730         {
9731           var = operands[2];
9732           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
9733             operands[2] = constm1_rtx, op = and_optab;
9734           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
9735             operands[2] = const0_rtx, op = ior_optab;
9736           else
9737             return 0; /* FAIL */
9738         }
9739       else
9740         return 0; /* FAIL */
9741
9742       orig_out = operands[0];
9743       tmp = gen_reg_rtx (mode);
9744       operands[0] = tmp;
9745
9746       /* Recurse to get the constant loaded.  */
9747       if (ix86_expand_int_movcc (operands) == 0)
9748         return 0; /* FAIL */
9749
9750       /* Mask in the interesting variable.  */
9751       out = expand_binop (mode, op, var, tmp, orig_out, 0,
9752                           OPTAB_WIDEN);
9753       if (!rtx_equal_p (out, orig_out))
9754         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
9755
9756       return 1; /* DONE */
9757     }
9758
9759   /*
9760    * For comparison with above,
9761    *
9762    * movl cf,dest
9763    * movl ct,tmp
9764    * cmpl op1,op2
9765    * cmovcc tmp,dest
9766    *
9767    * Size 15.
9768    */
9769
9770   if (! nonimmediate_operand (operands[2], mode))
9771     operands[2] = force_reg (mode, operands[2]);
9772   if (! nonimmediate_operand (operands[3], mode))
9773     operands[3] = force_reg (mode, operands[3]);
9774
9775   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
9776     {
9777       rtx tmp = gen_reg_rtx (mode);
9778       emit_move_insn (tmp, operands[3]);
9779       operands[3] = tmp;
9780     }
9781   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
9782     {
9783       rtx tmp = gen_reg_rtx (mode);
9784       emit_move_insn (tmp, operands[2]);
9785       operands[2] = tmp;
9786     }
9787
9788   if (! register_operand (operands[2], VOIDmode)
9789       && (mode == QImode 
9790           || ! register_operand (operands[3], VOIDmode)))
9791     operands[2] = force_reg (mode, operands[2]);
9792
9793   if (mode == QImode
9794       && ! register_operand (operands[3], VOIDmode))
9795     operands[3] = force_reg (mode, operands[3]);
9796
9797   emit_insn (compare_seq);
9798   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9799                           gen_rtx_IF_THEN_ELSE (mode,
9800                                                 compare_op, operands[2],
9801                                                 operands[3])));
9802   if (bypass_test)
9803     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
9804                             gen_rtx_IF_THEN_ELSE (mode,
9805                                   bypass_test,
9806                                   copy_rtx (operands[3]),
9807                                   copy_rtx (operands[0]))));
9808   if (second_test)
9809     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
9810                             gen_rtx_IF_THEN_ELSE (mode,
9811                                   second_test,
9812                                   copy_rtx (operands[2]),
9813                                   copy_rtx (operands[0]))));
9814
9815   return 1; /* DONE */
9816 }
9817
9818 int
9819 ix86_expand_fp_movcc (operands)
9820      rtx operands[];
9821 {
9822   enum rtx_code code;
9823   rtx tmp;
9824   rtx compare_op, second_test, bypass_test;
9825
9826   /* For SF/DFmode conditional moves based on comparisons
9827      in same mode, we may want to use SSE min/max instructions.  */
9828   if (((TARGET_SSE_MATH && GET_MODE (operands[0]) == SFmode)
9829        || (TARGET_SSE2 && TARGET_SSE_MATH && GET_MODE (operands[0]) == DFmode))
9830       && GET_MODE (ix86_compare_op0) == GET_MODE (operands[0])
9831       /* The SSE comparisons does not support the LTGT/UNEQ pair.  */
9832       && (!TARGET_IEEE_FP
9833           || (GET_CODE (operands[1]) != LTGT && GET_CODE (operands[1]) != UNEQ))
9834       /* We may be called from the post-reload splitter.  */
9835       && (!REG_P (operands[0])
9836           || SSE_REG_P (operands[0])
9837           || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))
9838     {
9839       rtx op0 = ix86_compare_op0, op1 = ix86_compare_op1;
9840       code = GET_CODE (operands[1]);
9841
9842       /* See if we have (cross) match between comparison operands and
9843          conditional move operands.  */
9844       if (rtx_equal_p (operands[2], op1))
9845         {
9846           rtx tmp = op0;
9847           op0 = op1;
9848           op1 = tmp;
9849           code = reverse_condition_maybe_unordered (code);
9850         }
9851       if (rtx_equal_p (operands[2], op0) && rtx_equal_p (operands[3], op1))
9852         {
9853           /* Check for min operation.  */
9854           if (code == LT || code == UNLE)
9855             {
9856                if (code == UNLE)
9857                 {
9858                   rtx tmp = op0;
9859                   op0 = op1;
9860                   op1 = tmp;
9861                 }
9862                operands[0] = force_reg (GET_MODE (operands[0]), operands[0]);
9863                if (memory_operand (op0, VOIDmode))
9864                  op0 = force_reg (GET_MODE (operands[0]), op0);
9865                if (GET_MODE (operands[0]) == SFmode)
9866                  emit_insn (gen_minsf3 (operands[0], op0, op1));
9867                else
9868                  emit_insn (gen_mindf3 (operands[0], op0, op1));
9869                return 1;
9870             }
9871           /* Check for max operation.  */
9872           if (code == GT || code == UNGE)
9873             {
9874                if (code == UNGE)
9875                 {
9876                   rtx tmp = op0;
9877                   op0 = op1;
9878                   op1 = tmp;
9879                 }
9880                operands[0] = force_reg (GET_MODE (operands[0]), operands[0]);
9881                if (memory_operand (op0, VOIDmode))
9882                  op0 = force_reg (GET_MODE (operands[0]), op0);
9883                if (GET_MODE (operands[0]) == SFmode)
9884                  emit_insn (gen_maxsf3 (operands[0], op0, op1));
9885                else
9886                  emit_insn (gen_maxdf3 (operands[0], op0, op1));
9887                return 1;
9888             }
9889         }
9890       /* Manage condition to be sse_comparison_operator.  In case we are
9891          in non-ieee mode, try to canonicalize the destination operand
9892          to be first in the comparison - this helps reload to avoid extra
9893          moves.  */
9894       if (!sse_comparison_operator (operands[1], VOIDmode)
9895           || (rtx_equal_p (operands[0], ix86_compare_op1) && !TARGET_IEEE_FP))
9896         {
9897           rtx tmp = ix86_compare_op0;
9898           ix86_compare_op0 = ix86_compare_op1;
9899           ix86_compare_op1 = tmp;
9900           operands[1] = gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[1])),
9901                                         VOIDmode, ix86_compare_op0,
9902                                         ix86_compare_op1);
9903         }
9904       /* Similarly try to manage result to be first operand of conditional
9905          move. We also don't support the NE comparison on SSE, so try to
9906          avoid it.  */
9907       if ((rtx_equal_p (operands[0], operands[3])
9908            && (!TARGET_IEEE_FP || GET_CODE (operands[1]) != EQ))
9909           || (GET_CODE (operands[1]) == NE && TARGET_IEEE_FP))
9910         {
9911           rtx tmp = operands[2];
9912           operands[2] = operands[3];
9913           operands[3] = tmp;
9914           operands[1] = gen_rtx_fmt_ee (reverse_condition_maybe_unordered
9915                                           (GET_CODE (operands[1])),
9916                                         VOIDmode, ix86_compare_op0,
9917                                         ix86_compare_op1);
9918         }
9919       if (GET_MODE (operands[0]) == SFmode)
9920         emit_insn (gen_sse_movsfcc (operands[0], operands[1],
9921                                     operands[2], operands[3],
9922                                     ix86_compare_op0, ix86_compare_op1));
9923       else
9924         emit_insn (gen_sse_movdfcc (operands[0], operands[1],
9925                                     operands[2], operands[3],
9926                                     ix86_compare_op0, ix86_compare_op1));
9927       return 1;
9928     }
9929
9930   /* The floating point conditional move instructions don't directly
9931      support conditions resulting from a signed integer comparison.  */
9932
9933   code = GET_CODE (operands[1]);
9934   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
9935
9936   /* The floating point conditional move instructions don't directly
9937      support signed integer comparisons.  */
9938
9939   if (!fcmov_comparison_operator (compare_op, VOIDmode))
9940     {
9941       if (second_test != NULL || bypass_test != NULL)
9942         abort ();
9943       tmp = gen_reg_rtx (QImode);
9944       ix86_expand_setcc (code, tmp);
9945       code = NE;
9946       ix86_compare_op0 = tmp;
9947       ix86_compare_op1 = const0_rtx;
9948       compare_op = ix86_expand_compare (code,  &second_test, &bypass_test);
9949     }
9950   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
9951     {
9952       tmp = gen_reg_rtx (GET_MODE (operands[0]));
9953       emit_move_insn (tmp, operands[3]);
9954       operands[3] = tmp;
9955     }
9956   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
9957     {
9958       tmp = gen_reg_rtx (GET_MODE (operands[0]));
9959       emit_move_insn (tmp, operands[2]);
9960       operands[2] = tmp;
9961     }
9962
9963   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9964                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
9965                                 compare_op,
9966                                 operands[2],
9967                                 operands[3])));
9968   if (bypass_test)
9969     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9970                             gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
9971                                   bypass_test,
9972                                   operands[3],
9973                                   operands[0])));
9974   if (second_test)
9975     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
9976                             gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
9977                                   second_test,
9978                                   operands[2],
9979                                   operands[0])));
9980
9981   return 1;
9982 }
9983
9984 /* Expand conditional increment or decrement using adb/sbb instructions.
9985    The default case using setcc followed by the conditional move can be
9986    done by generic code.  */
9987 int
9988 ix86_expand_int_addcc (operands)
9989      rtx operands[];
9990 {
9991   enum rtx_code code = GET_CODE (operands[1]);
9992   rtx compare_op;
9993   rtx val = const0_rtx;
9994
9995   if (operands[3] != const1_rtx
9996       && operands[3] != constm1_rtx)
9997     return 0;
9998   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
9999                                        ix86_compare_op1, &compare_op))
10000      return 0;
10001   if (GET_CODE (compare_op) != LTU)
10002     val = operands[3] == const1_rtx ? constm1_rtx : const1_rtx;
10003   if ((GET_CODE (compare_op) == LTU) == (operands[3] == constm1_rtx))
10004     {
10005       switch (GET_MODE (operands[0]))
10006         {
10007           case QImode:
10008             emit_insn (gen_subqi3_carry (operands[0], operands[2], val));
10009             break;
10010           case HImode:
10011             emit_insn (gen_subhi3_carry (operands[0], operands[2], val));
10012             break;
10013           case SImode:
10014             emit_insn (gen_subsi3_carry (operands[0], operands[2], val));
10015             break;
10016           case DImode:
10017             emit_insn (gen_subdi3_carry_rex64 (operands[0], operands[2], val));
10018             break;
10019           default:
10020             abort ();
10021         }
10022     }
10023   else
10024     {
10025       switch (GET_MODE (operands[0]))
10026         {
10027           case QImode:
10028             emit_insn (gen_addqi3_carry (operands[0], operands[2], val));
10029             break;
10030           case HImode:
10031             emit_insn (gen_addhi3_carry (operands[0], operands[2], val));
10032             break;
10033           case SImode:
10034             emit_insn (gen_addsi3_carry (operands[0], operands[2], val));
10035             break;
10036           case DImode:
10037             emit_insn (gen_adddi3_carry_rex64 (operands[0], operands[2], val));
10038             break;
10039           default:
10040             abort ();
10041         }
10042     }
10043   return 1; /* DONE */
10044 }
10045
10046
10047 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
10048    works for floating pointer parameters and nonoffsetable memories.
10049    For pushes, it returns just stack offsets; the values will be saved
10050    in the right order.  Maximally three parts are generated.  */
10051
10052 static int
10053 ix86_split_to_parts (operand, parts, mode)
10054      rtx operand;
10055      rtx *parts;
10056      enum machine_mode mode;
10057 {
10058   int size;
10059
10060   if (!TARGET_64BIT)
10061     size = mode == TFmode ? 3 : (GET_MODE_SIZE (mode) / 4);
10062   else
10063     size = (GET_MODE_SIZE (mode) + 4) / 8;
10064
10065   if (GET_CODE (operand) == REG && MMX_REGNO_P (REGNO (operand)))
10066     abort ();
10067   if (size < 2 || size > 3)
10068     abort ();
10069
10070   /* Optimize constant pool reference to immediates.  This is used by fp
10071      moves, that force all constants to memory to allow combining.  */
10072   if (GET_CODE (operand) == MEM && RTX_UNCHANGING_P (operand))
10073     {
10074       rtx tmp = maybe_get_pool_constant (operand);
10075       if (tmp)
10076         operand = tmp;
10077     }
10078
10079   if (GET_CODE (operand) == MEM && !offsettable_memref_p (operand))
10080     {
10081       /* The only non-offsetable memories we handle are pushes.  */
10082       if (! push_operand (operand, VOIDmode))
10083         abort ();
10084
10085       operand = copy_rtx (operand);
10086       PUT_MODE (operand, Pmode);
10087       parts[0] = parts[1] = parts[2] = operand;
10088     }
10089   else if (!TARGET_64BIT)
10090     {
10091       if (mode == DImode)
10092         split_di (&operand, 1, &parts[0], &parts[1]);
10093       else
10094         {
10095           if (REG_P (operand))
10096             {
10097               if (!reload_completed)
10098                 abort ();
10099               parts[0] = gen_rtx_REG (SImode, REGNO (operand) + 0);
10100               parts[1] = gen_rtx_REG (SImode, REGNO (operand) + 1);
10101               if (size == 3)
10102                 parts[2] = gen_rtx_REG (SImode, REGNO (operand) + 2);
10103             }
10104           else if (offsettable_memref_p (operand))
10105             {
10106               operand = adjust_address (operand, SImode, 0);
10107               parts[0] = operand;
10108               parts[1] = adjust_address (operand, SImode, 4);
10109               if (size == 3)
10110                 parts[2] = adjust_address (operand, SImode, 8);
10111             }
10112           else if (GET_CODE (operand) == CONST_DOUBLE)
10113             {
10114               REAL_VALUE_TYPE r;
10115               long l[4];
10116
10117               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
10118               switch (mode)
10119                 {
10120                 case XFmode:
10121                 case TFmode:
10122                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
10123                   parts[2] = gen_int_mode (l[2], SImode);
10124                   break;
10125                 case DFmode:
10126                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
10127                   break;
10128                 default:
10129                   abort ();
10130                 }
10131               parts[1] = gen_int_mode (l[1], SImode);
10132               parts[0] = gen_int_mode (l[0], SImode);
10133             }
10134           else
10135             abort ();
10136         }
10137     }
10138   else
10139     {
10140       if (mode == TImode)
10141         split_ti (&operand, 1, &parts[0], &parts[1]);
10142       if (mode == XFmode || mode == TFmode)
10143         {
10144           if (REG_P (operand))
10145             {
10146               if (!reload_completed)
10147                 abort ();
10148               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
10149               parts[1] = gen_rtx_REG (SImode, REGNO (operand) + 1);
10150             }
10151           else if (offsettable_memref_p (operand))
10152             {
10153               operand = adjust_address (operand, DImode, 0);
10154               parts[0] = operand;
10155               parts[1] = adjust_address (operand, SImode, 8);
10156             }
10157           else if (GET_CODE (operand) == CONST_DOUBLE)
10158             {
10159               REAL_VALUE_TYPE r;
10160               long l[3];
10161
10162               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
10163               REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
10164               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
10165               if (HOST_BITS_PER_WIDE_INT >= 64)
10166                 parts[0]
10167                   = gen_int_mode
10168                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
10169                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
10170                        DImode);
10171               else
10172                 parts[0] = immed_double_const (l[0], l[1], DImode);
10173               parts[1] = gen_int_mode (l[2], SImode);
10174             }
10175           else
10176             abort ();
10177         }
10178     }
10179
10180   return size;
10181 }
10182
10183 /* Emit insns to perform a move or push of DI, DF, and XF values.
10184    Return false when normal moves are needed; true when all required
10185    insns have been emitted.  Operands 2-4 contain the input values
10186    int the correct order; operands 5-7 contain the output values.  */
10187
10188 void
10189 ix86_split_long_move (operands)
10190      rtx operands[];
10191 {
10192   rtx part[2][3];
10193   int nparts;
10194   int push = 0;
10195   int collisions = 0;
10196   enum machine_mode mode = GET_MODE (operands[0]);
10197
10198   /* The DFmode expanders may ask us to move double.
10199      For 64bit target this is single move.  By hiding the fact
10200      here we simplify i386.md splitters.  */
10201   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
10202     {
10203       /* Optimize constant pool reference to immediates.  This is used by
10204          fp moves, that force all constants to memory to allow combining.  */
10205
10206       if (GET_CODE (operands[1]) == MEM
10207           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
10208           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
10209         operands[1] = get_pool_constant (XEXP (operands[1], 0));
10210       if (push_operand (operands[0], VOIDmode))
10211         {
10212           operands[0] = copy_rtx (operands[0]);
10213           PUT_MODE (operands[0], Pmode);
10214         }
10215       else
10216         operands[0] = gen_lowpart (DImode, operands[0]);
10217       operands[1] = gen_lowpart (DImode, operands[1]);
10218       emit_move_insn (operands[0], operands[1]);
10219       return;
10220     }
10221
10222   /* The only non-offsettable memory we handle is push.  */
10223   if (push_operand (operands[0], VOIDmode))
10224     push = 1;
10225   else if (GET_CODE (operands[0]) == MEM
10226            && ! offsettable_memref_p (operands[0]))
10227     abort ();
10228
10229   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
10230   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
10231
10232   /* When emitting push, take care for source operands on the stack.  */
10233   if (push && GET_CODE (operands[1]) == MEM
10234       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
10235     {
10236       if (nparts == 3)
10237         part[1][1] = change_address (part[1][1], GET_MODE (part[1][1]),
10238                                      XEXP (part[1][2], 0));
10239       part[1][0] = change_address (part[1][0], GET_MODE (part[1][0]),
10240                                    XEXP (part[1][1], 0));
10241     }
10242
10243   /* We need to do copy in the right order in case an address register
10244      of the source overlaps the destination.  */
10245   if (REG_P (part[0][0]) && GET_CODE (part[1][0]) == MEM)
10246     {
10247       if (reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0)))
10248         collisions++;
10249       if (reg_overlap_mentioned_p (part[0][1], XEXP (part[1][0], 0)))
10250         collisions++;
10251       if (nparts == 3
10252           && reg_overlap_mentioned_p (part[0][2], XEXP (part[1][0], 0)))
10253         collisions++;
10254
10255       /* Collision in the middle part can be handled by reordering.  */
10256       if (collisions == 1 && nparts == 3
10257           && reg_overlap_mentioned_p (part[0][1], XEXP (part[1][0], 0)))
10258         {
10259           rtx tmp;
10260           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
10261           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
10262         }
10263
10264       /* If there are more collisions, we can't handle it by reordering.
10265          Do an lea to the last part and use only one colliding move.  */
10266       else if (collisions > 1)
10267         {
10268           collisions = 1;
10269           emit_insn (gen_rtx_SET (VOIDmode, part[0][nparts - 1],
10270                                   XEXP (part[1][0], 0)));
10271           part[1][0] = change_address (part[1][0],
10272                                        TARGET_64BIT ? DImode : SImode,
10273                                        part[0][nparts - 1]);
10274           part[1][1] = adjust_address (part[1][0], VOIDmode, UNITS_PER_WORD);
10275           if (nparts == 3)
10276             part[1][2] = adjust_address (part[1][0], VOIDmode, 8);
10277         }
10278     }
10279
10280   if (push)
10281     {
10282       if (!TARGET_64BIT)
10283         {
10284           if (nparts == 3)
10285             {
10286               /* We use only first 12 bytes of TFmode value, but for pushing we
10287                  are required to adjust stack as if we were pushing real 16byte
10288                  value.  */
10289               if (mode == TFmode && !TARGET_64BIT)
10290                 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
10291                                        GEN_INT (-4)));
10292               emit_move_insn (part[0][2], part[1][2]);
10293             }
10294         }
10295       else
10296         {
10297           /* In 64bit mode we don't have 32bit push available.  In case this is
10298              register, it is OK - we will just use larger counterpart.  We also
10299              retype memory - these comes from attempt to avoid REX prefix on
10300              moving of second half of TFmode value.  */
10301           if (GET_MODE (part[1][1]) == SImode)
10302             {
10303               if (GET_CODE (part[1][1]) == MEM)
10304                 part[1][1] = adjust_address (part[1][1], DImode, 0);
10305               else if (REG_P (part[1][1]))
10306                 part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
10307               else
10308                 abort ();
10309               if (GET_MODE (part[1][0]) == SImode)
10310                 part[1][0] = part[1][1];
10311             }
10312         }
10313       emit_move_insn (part[0][1], part[1][1]);
10314       emit_move_insn (part[0][0], part[1][0]);
10315       return;
10316     }
10317
10318   /* Choose correct order to not overwrite the source before it is copied.  */
10319   if ((REG_P (part[0][0])
10320        && REG_P (part[1][1])
10321        && (REGNO (part[0][0]) == REGNO (part[1][1])
10322            || (nparts == 3
10323                && REGNO (part[0][0]) == REGNO (part[1][2]))))
10324       || (collisions > 0
10325           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
10326     {
10327       if (nparts == 3)
10328         {
10329           operands[2] = part[0][2];
10330           operands[3] = part[0][1];
10331           operands[4] = part[0][0];
10332           operands[5] = part[1][2];
10333           operands[6] = part[1][1];
10334           operands[7] = part[1][0];
10335         }
10336       else
10337         {
10338           operands[2] = part[0][1];
10339           operands[3] = part[0][0];
10340           operands[5] = part[1][1];
10341           operands[6] = part[1][0];
10342         }
10343     }
10344   else
10345     {
10346       if (nparts == 3)
10347         {
10348           operands[2] = part[0][0];
10349           operands[3] = part[0][1];
10350           operands[4] = part[0][2];
10351           operands[5] = part[1][0];
10352           operands[6] = part[1][1];
10353           operands[7] = part[1][2];
10354         }
10355       else
10356         {
10357           operands[2] = part[0][0];
10358           operands[3] = part[0][1];
10359           operands[5] = part[1][0];
10360           operands[6] = part[1][1];
10361         }
10362     }
10363   emit_move_insn (operands[2], operands[5]);
10364   emit_move_insn (operands[3], operands[6]);
10365   if (nparts == 3)
10366     emit_move_insn (operands[4], operands[7]);
10367
10368   return;
10369 }
10370
10371 void
10372 ix86_split_ashldi (operands, scratch)
10373      rtx *operands, scratch;
10374 {
10375   rtx low[2], high[2];
10376   int count;
10377
10378   if (GET_CODE (operands[2]) == CONST_INT)
10379     {
10380       split_di (operands, 2, low, high);
10381       count = INTVAL (operands[2]) & 63;
10382
10383       if (count >= 32)
10384         {
10385           emit_move_insn (high[0], low[1]);
10386           emit_move_insn (low[0], const0_rtx);
10387
10388           if (count > 32)
10389             emit_insn (gen_ashlsi3 (high[0], high[0], GEN_INT (count - 32)));
10390         }
10391       else
10392         {
10393           if (!rtx_equal_p (operands[0], operands[1]))
10394             emit_move_insn (operands[0], operands[1]);
10395           emit_insn (gen_x86_shld_1 (high[0], low[0], GEN_INT (count)));
10396           emit_insn (gen_ashlsi3 (low[0], low[0], GEN_INT (count)));
10397         }
10398     }
10399   else
10400     {
10401       if (!rtx_equal_p (operands[0], operands[1]))
10402         emit_move_insn (operands[0], operands[1]);
10403
10404       split_di (operands, 1, low, high);
10405
10406       emit_insn (gen_x86_shld_1 (high[0], low[0], operands[2]));
10407       emit_insn (gen_ashlsi3 (low[0], low[0], operands[2]));
10408
10409       if (TARGET_CMOVE && (! no_new_pseudos || scratch))
10410         {
10411           if (! no_new_pseudos)
10412             scratch = force_reg (SImode, const0_rtx);
10413           else
10414             emit_move_insn (scratch, const0_rtx);
10415
10416           emit_insn (gen_x86_shift_adj_1 (high[0], low[0], operands[2],
10417                                           scratch));
10418         }
10419       else
10420         emit_insn (gen_x86_shift_adj_2 (high[0], low[0], operands[2]));
10421     }
10422 }
10423
10424 void
10425 ix86_split_ashrdi (operands, scratch)
10426      rtx *operands, scratch;
10427 {
10428   rtx low[2], high[2];
10429   int count;
10430
10431   if (GET_CODE (operands[2]) == CONST_INT)
10432     {
10433       split_di (operands, 2, low, high);
10434       count = INTVAL (operands[2]) & 63;
10435
10436       if (count >= 32)
10437         {
10438           emit_move_insn (low[0], high[1]);
10439
10440           if (! reload_completed)
10441             emit_insn (gen_ashrsi3 (high[0], low[0], GEN_INT (31)));
10442           else
10443             {
10444               emit_move_insn (high[0], low[0]);
10445               emit_insn (gen_ashrsi3 (high[0], high[0], GEN_INT (31)));
10446             }
10447
10448           if (count > 32)
10449             emit_insn (gen_ashrsi3 (low[0], low[0], GEN_INT (count - 32)));
10450         }
10451       else
10452         {
10453           if (!rtx_equal_p (operands[0], operands[1]))
10454             emit_move_insn (operands[0], operands[1]);
10455           emit_insn (gen_x86_shrd_1 (low[0], high[0], GEN_INT (count)));
10456           emit_insn (gen_ashrsi3 (high[0], high[0], GEN_INT (count)));
10457         }
10458     }
10459   else
10460     {
10461       if (!rtx_equal_p (operands[0], operands[1]))
10462         emit_move_insn (operands[0], operands[1]);
10463
10464       split_di (operands, 1, low, high);
10465
10466       emit_insn (gen_x86_shrd_1 (low[0], high[0], operands[2]));
10467       emit_insn (gen_ashrsi3 (high[0], high[0], operands[2]));
10468
10469       if (TARGET_CMOVE && (! no_new_pseudos || scratch))
10470         {
10471           if (! no_new_pseudos)
10472             scratch = gen_reg_rtx (SImode);
10473           emit_move_insn (scratch, high[0]);
10474           emit_insn (gen_ashrsi3 (scratch, scratch, GEN_INT (31)));
10475           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
10476                                           scratch));
10477         }
10478       else
10479         emit_insn (gen_x86_shift_adj_3 (low[0], high[0], operands[2]));
10480     }
10481 }
10482
10483 void
10484 ix86_split_lshrdi (operands, scratch)
10485      rtx *operands, scratch;
10486 {
10487   rtx low[2], high[2];
10488   int count;
10489
10490   if (GET_CODE (operands[2]) == CONST_INT)
10491     {
10492       split_di (operands, 2, low, high);
10493       count = INTVAL (operands[2]) & 63;
10494
10495       if (count >= 32)
10496         {
10497           emit_move_insn (low[0], high[1]);
10498           emit_move_insn (high[0], const0_rtx);
10499
10500           if (count > 32)
10501             emit_insn (gen_lshrsi3 (low[0], low[0], GEN_INT (count - 32)));
10502         }
10503       else
10504         {
10505           if (!rtx_equal_p (operands[0], operands[1]))
10506             emit_move_insn (operands[0], operands[1]);
10507           emit_insn (gen_x86_shrd_1 (low[0], high[0], GEN_INT (count)));
10508           emit_insn (gen_lshrsi3 (high[0], high[0], GEN_INT (count)));
10509         }
10510     }
10511   else
10512     {
10513       if (!rtx_equal_p (operands[0], operands[1]))
10514         emit_move_insn (operands[0], operands[1]);
10515
10516       split_di (operands, 1, low, high);
10517
10518       emit_insn (gen_x86_shrd_1 (low[0], high[0], operands[2]));
10519       emit_insn (gen_lshrsi3 (high[0], high[0], operands[2]));
10520
10521       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
10522       if (TARGET_CMOVE && (! no_new_pseudos || scratch))
10523         {
10524           if (! no_new_pseudos)
10525             scratch = force_reg (SImode, const0_rtx);
10526           else
10527             emit_move_insn (scratch, const0_rtx);
10528
10529           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
10530                                           scratch));
10531         }
10532       else
10533         emit_insn (gen_x86_shift_adj_2 (low[0], high[0], operands[2]));
10534     }
10535 }
10536
10537 /* Helper function for the string operations below.  Dest VARIABLE whether
10538    it is aligned to VALUE bytes.  If true, jump to the label.  */
10539 static rtx
10540 ix86_expand_aligntest (variable, value)
10541      rtx variable;
10542      int value;
10543 {
10544   rtx label = gen_label_rtx ();
10545   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
10546   if (GET_MODE (variable) == DImode)
10547     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
10548   else
10549     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
10550   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
10551                            1, label);
10552   return label;
10553 }
10554
10555 /* Adjust COUNTER by the VALUE.  */
10556 static void
10557 ix86_adjust_counter (countreg, value)
10558      rtx countreg;
10559      HOST_WIDE_INT value;
10560 {
10561   if (GET_MODE (countreg) == DImode)
10562     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
10563   else
10564     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
10565 }
10566
10567 /* Zero extend possibly SImode EXP to Pmode register.  */
10568 rtx
10569 ix86_zero_extend_to_Pmode (exp)
10570    rtx exp;
10571 {
10572   rtx r;
10573   if (GET_MODE (exp) == VOIDmode)
10574     return force_reg (Pmode, exp);
10575   if (GET_MODE (exp) == Pmode)
10576     return copy_to_mode_reg (Pmode, exp);
10577   r = gen_reg_rtx (Pmode);
10578   emit_insn (gen_zero_extendsidi2 (r, exp));
10579   return r;
10580 }
10581
10582 /* Expand string move (memcpy) operation.  Use i386 string operations when
10583    profitable.  expand_clrstr contains similar code.  */
10584 int
10585 ix86_expand_movstr (dst, src, count_exp, align_exp)
10586      rtx dst, src, count_exp, align_exp;
10587 {
10588   rtx srcreg, destreg, countreg;
10589   enum machine_mode counter_mode;
10590   HOST_WIDE_INT align = 0;
10591   unsigned HOST_WIDE_INT count = 0;
10592   rtx insns;
10593
10594   start_sequence ();
10595
10596   if (GET_CODE (align_exp) == CONST_INT)
10597     align = INTVAL (align_exp);
10598
10599   /* This simple hack avoids all inlining code and simplifies code below.  */
10600   if (!TARGET_ALIGN_STRINGOPS)
10601     align = 64;
10602
10603   if (GET_CODE (count_exp) == CONST_INT)
10604     count = INTVAL (count_exp);
10605
10606   /* Figure out proper mode for counter.  For 32bits it is always SImode,
10607      for 64bits use SImode when possible, otherwise DImode.
10608      Set count to number of bytes copied when known at compile time.  */
10609   if (!TARGET_64BIT || GET_MODE (count_exp) == SImode
10610       || x86_64_zero_extended_value (count_exp))
10611     counter_mode = SImode;
10612   else
10613     counter_mode = DImode;
10614
10615   if (counter_mode != SImode && counter_mode != DImode)
10616     abort ();
10617
10618   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
10619   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
10620
10621   emit_insn (gen_cld ());
10622
10623   /* When optimizing for size emit simple rep ; movsb instruction for
10624      counts not divisible by 4.  */
10625
10626   if ((!optimize || optimize_size) && (count == 0 || (count & 0x03)))
10627     {
10628       countreg = ix86_zero_extend_to_Pmode (count_exp);
10629       if (TARGET_64BIT)
10630         emit_insn (gen_rep_movqi_rex64 (destreg, srcreg, countreg,
10631                                         destreg, srcreg, countreg));
10632       else
10633         emit_insn (gen_rep_movqi (destreg, srcreg, countreg,
10634                                   destreg, srcreg, countreg));
10635     }
10636
10637   /* For constant aligned (or small unaligned) copies use rep movsl
10638      followed by code copying the rest.  For PentiumPro ensure 8 byte
10639      alignment to allow rep movsl acceleration.  */
10640
10641   else if (count != 0
10642            && (align >= 8
10643                || (!TARGET_PENTIUMPRO && !TARGET_64BIT && align >= 4)
10644                || optimize_size || count < (unsigned int) 64))
10645     {
10646       int size = TARGET_64BIT && !optimize_size ? 8 : 4;
10647       if (count & ~(size - 1))
10648         {
10649           countreg = copy_to_mode_reg (counter_mode,
10650                                        GEN_INT ((count >> (size == 4 ? 2 : 3))
10651                                                 & (TARGET_64BIT ? -1 : 0x3fffffff)));
10652           countreg = ix86_zero_extend_to_Pmode (countreg);
10653           if (size == 4)
10654             {
10655               if (TARGET_64BIT)
10656                 emit_insn (gen_rep_movsi_rex64 (destreg, srcreg, countreg,
10657                                                 destreg, srcreg, countreg));
10658               else
10659                 emit_insn (gen_rep_movsi (destreg, srcreg, countreg,
10660                                           destreg, srcreg, countreg));
10661             }
10662           else
10663             emit_insn (gen_rep_movdi_rex64 (destreg, srcreg, countreg,
10664                                             destreg, srcreg, countreg));
10665         }
10666       if (size == 8 && (count & 0x04))
10667         emit_insn (gen_strmovsi (destreg, srcreg));
10668       if (count & 0x02)
10669         emit_insn (gen_strmovhi (destreg, srcreg));
10670       if (count & 0x01)
10671         emit_insn (gen_strmovqi (destreg, srcreg));
10672     }
10673   /* The generic code based on the glibc implementation:
10674      - align destination to 4 bytes (8 byte alignment is used for PentiumPro
10675      allowing accelerated copying there)
10676      - copy the data using rep movsl
10677      - copy the rest.  */
10678   else
10679     {
10680       rtx countreg2;
10681       rtx label = NULL;
10682       int desired_alignment = (TARGET_PENTIUMPRO
10683                                && (count == 0 || count >= (unsigned int) 260)
10684                                ? 8 : UNITS_PER_WORD);
10685
10686       /* In case we don't know anything about the alignment, default to
10687          library version, since it is usually equally fast and result in
10688          shorter code. 
10689
10690          Also emit call when we know that the count is large and call overhead
10691          will not be important.  */
10692       if (!TARGET_INLINE_ALL_STRINGOPS
10693           && (align < UNITS_PER_WORD || !TARGET_REP_MOVL_OPTIMAL))
10694         {
10695           end_sequence ();
10696           return 0;
10697         }
10698
10699       if (TARGET_SINGLE_STRINGOP)
10700         emit_insn (gen_cld ());
10701
10702       countreg2 = gen_reg_rtx (Pmode);
10703       countreg = copy_to_mode_reg (counter_mode, count_exp);
10704
10705       /* We don't use loops to align destination and to copy parts smaller
10706          than 4 bytes, because gcc is able to optimize such code better (in
10707          the case the destination or the count really is aligned, gcc is often
10708          able to predict the branches) and also it is friendlier to the
10709          hardware branch prediction.
10710
10711          Using loops is beneficial for generic case, because we can
10712          handle small counts using the loops.  Many CPUs (such as Athlon)
10713          have large REP prefix setup costs.
10714
10715          This is quite costy.  Maybe we can revisit this decision later or
10716          add some customizability to this code.  */
10717
10718       if (count == 0 && align < desired_alignment)
10719         {
10720           label = gen_label_rtx ();
10721           emit_cmp_and_jump_insns (countreg, GEN_INT (desired_alignment - 1),
10722                                    LEU, 0, counter_mode, 1, label);
10723         }
10724       if (align <= 1)
10725         {
10726           rtx label = ix86_expand_aligntest (destreg, 1);
10727           emit_insn (gen_strmovqi (destreg, srcreg));
10728           ix86_adjust_counter (countreg, 1);
10729           emit_label (label);
10730           LABEL_NUSES (label) = 1;
10731         }
10732       if (align <= 2)
10733         {
10734           rtx label = ix86_expand_aligntest (destreg, 2);
10735           emit_insn (gen_strmovhi (destreg, srcreg));
10736           ix86_adjust_counter (countreg, 2);
10737           emit_label (label);
10738           LABEL_NUSES (label) = 1;
10739         }
10740       if (align <= 4 && desired_alignment > 4)
10741         {
10742           rtx label = ix86_expand_aligntest (destreg, 4);
10743           emit_insn (gen_strmovsi (destreg, srcreg));
10744           ix86_adjust_counter (countreg, 4);
10745           emit_label (label);
10746           LABEL_NUSES (label) = 1;
10747         }
10748
10749       if (label && desired_alignment > 4 && !TARGET_64BIT)
10750         {
10751           emit_label (label);
10752           LABEL_NUSES (label) = 1;
10753           label = NULL_RTX;
10754         }
10755       if (!TARGET_SINGLE_STRINGOP)
10756         emit_insn (gen_cld ());
10757       if (TARGET_64BIT)
10758         {
10759           emit_insn (gen_lshrdi3 (countreg2, ix86_zero_extend_to_Pmode (countreg),
10760                                   GEN_INT (3)));
10761           emit_insn (gen_rep_movdi_rex64 (destreg, srcreg, countreg2,
10762                                           destreg, srcreg, countreg2));
10763         }
10764       else
10765         {
10766           emit_insn (gen_lshrsi3 (countreg2, countreg, GEN_INT (2)));
10767           emit_insn (gen_rep_movsi (destreg, srcreg, countreg2,
10768                                     destreg, srcreg, countreg2));
10769         }
10770
10771       if (label)
10772         {
10773           emit_label (label);
10774           LABEL_NUSES (label) = 1;
10775         }
10776       if (TARGET_64BIT && align > 4 && count != 0 && (count & 4))
10777         emit_insn (gen_strmovsi (destreg, srcreg));
10778       if ((align <= 4 || count == 0) && TARGET_64BIT)
10779         {
10780           rtx label = ix86_expand_aligntest (countreg, 4);
10781           emit_insn (gen_strmovsi (destreg, srcreg));
10782           emit_label (label);
10783           LABEL_NUSES (label) = 1;
10784         }
10785       if (align > 2 && count != 0 && (count & 2))
10786         emit_insn (gen_strmovhi (destreg, srcreg));
10787       if (align <= 2 || count == 0)
10788         {
10789           rtx label = ix86_expand_aligntest (countreg, 2);
10790           emit_insn (gen_strmovhi (destreg, srcreg));
10791           emit_label (label);
10792           LABEL_NUSES (label) = 1;
10793         }
10794       if (align > 1 && count != 0 && (count & 1))
10795         emit_insn (gen_strmovqi (destreg, srcreg));
10796       if (align <= 1 || count == 0)
10797         {
10798           rtx label = ix86_expand_aligntest (countreg, 1);
10799           emit_insn (gen_strmovqi (destreg, srcreg));
10800           emit_label (label);
10801           LABEL_NUSES (label) = 1;
10802         }
10803     }
10804
10805   insns = get_insns ();
10806   end_sequence ();
10807
10808   ix86_set_move_mem_attrs (insns, dst, src, destreg, srcreg);
10809   emit_insn (insns);
10810   return 1;
10811 }
10812
10813 /* Expand string clear operation (bzero).  Use i386 string operations when
10814    profitable.  expand_movstr contains similar code.  */
10815 int
10816 ix86_expand_clrstr (src, count_exp, align_exp)
10817      rtx src, count_exp, align_exp;
10818 {
10819   rtx destreg, zeroreg, countreg;
10820   enum machine_mode counter_mode;
10821   HOST_WIDE_INT align = 0;
10822   unsigned HOST_WIDE_INT count = 0;
10823
10824   if (GET_CODE (align_exp) == CONST_INT)
10825     align = INTVAL (align_exp);
10826
10827   /* This simple hack avoids all inlining code and simplifies code below.  */
10828   if (!TARGET_ALIGN_STRINGOPS)
10829     align = 32;
10830
10831   if (GET_CODE (count_exp) == CONST_INT)
10832     count = INTVAL (count_exp);
10833   /* Figure out proper mode for counter.  For 32bits it is always SImode,
10834      for 64bits use SImode when possible, otherwise DImode.
10835      Set count to number of bytes copied when known at compile time.  */
10836   if (!TARGET_64BIT || GET_MODE (count_exp) == SImode
10837       || x86_64_zero_extended_value (count_exp))
10838     counter_mode = SImode;
10839   else
10840     counter_mode = DImode;
10841
10842   destreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
10843
10844   emit_insn (gen_cld ());
10845
10846   /* When optimizing for size emit simple rep ; movsb instruction for
10847      counts not divisible by 4.  */
10848
10849   if ((!optimize || optimize_size) && (count == 0 || (count & 0x03)))
10850     {
10851       countreg = ix86_zero_extend_to_Pmode (count_exp);
10852       zeroreg = copy_to_mode_reg (QImode, const0_rtx);
10853       if (TARGET_64BIT)
10854         emit_insn (gen_rep_stosqi_rex64 (destreg, countreg, zeroreg,
10855                                          destreg, countreg));
10856       else
10857         emit_insn (gen_rep_stosqi (destreg, countreg, zeroreg,
10858                                    destreg, countreg));
10859     }
10860   else if (count != 0
10861            && (align >= 8
10862                || (!TARGET_PENTIUMPRO && !TARGET_64BIT && align >= 4)
10863                || optimize_size || count < (unsigned int) 64))
10864     {
10865       int size = TARGET_64BIT && !optimize_size ? 8 : 4;
10866       zeroreg = copy_to_mode_reg (size == 4 ? SImode : DImode, const0_rtx);
10867       if (count & ~(size - 1))
10868         {
10869           countreg = copy_to_mode_reg (counter_mode,
10870                                        GEN_INT ((count >> (size == 4 ? 2 : 3))
10871                                                 & (TARGET_64BIT ? -1 : 0x3fffffff)));
10872           countreg = ix86_zero_extend_to_Pmode (countreg);
10873           if (size == 4)
10874             {
10875               if (TARGET_64BIT)
10876                 emit_insn (gen_rep_stossi_rex64 (destreg, countreg, zeroreg,
10877                                                  destreg, countreg));
10878               else
10879                 emit_insn (gen_rep_stossi (destreg, countreg, zeroreg,
10880                                            destreg, countreg));
10881             }
10882           else
10883             emit_insn (gen_rep_stosdi_rex64 (destreg, countreg, zeroreg,
10884                                              destreg, countreg));
10885         }
10886       if (size == 8 && (count & 0x04))
10887         emit_insn (gen_strsetsi (destreg,
10888                                  gen_rtx_SUBREG (SImode, zeroreg, 0)));
10889       if (count & 0x02)
10890         emit_insn (gen_strsethi (destreg,
10891                                  gen_rtx_SUBREG (HImode, zeroreg, 0)));
10892       if (count & 0x01)
10893         emit_insn (gen_strsetqi (destreg,
10894                                  gen_rtx_SUBREG (QImode, zeroreg, 0)));
10895     }
10896   else
10897     {
10898       rtx countreg2;
10899       rtx label = NULL;
10900       /* Compute desired alignment of the string operation.  */
10901       int desired_alignment = (TARGET_PENTIUMPRO
10902                                && (count == 0 || count >= (unsigned int) 260)
10903                                ? 8 : UNITS_PER_WORD);
10904
10905       /* In case we don't know anything about the alignment, default to
10906          library version, since it is usually equally fast and result in
10907          shorter code.
10908
10909          Also emit call when we know that the count is large and call overhead
10910          will not be important.  */
10911       if (!TARGET_INLINE_ALL_STRINGOPS
10912           && (align < UNITS_PER_WORD || !TARGET_REP_MOVL_OPTIMAL))
10913         return 0;
10914
10915       if (TARGET_SINGLE_STRINGOP)
10916         emit_insn (gen_cld ());
10917
10918       countreg2 = gen_reg_rtx (Pmode);
10919       countreg = copy_to_mode_reg (counter_mode, count_exp);
10920       zeroreg = copy_to_mode_reg (Pmode, const0_rtx);
10921
10922       if (count == 0 && align < desired_alignment)
10923         {
10924           label = gen_label_rtx ();
10925           emit_cmp_and_jump_insns (countreg, GEN_INT (desired_alignment - 1),
10926                                    LEU, 0, counter_mode, 1, label);
10927         }
10928       if (align <= 1)
10929         {
10930           rtx label = ix86_expand_aligntest (destreg, 1);
10931           emit_insn (gen_strsetqi (destreg,
10932                                    gen_rtx_SUBREG (QImode, zeroreg, 0)));
10933           ix86_adjust_counter (countreg, 1);
10934           emit_label (label);
10935           LABEL_NUSES (label) = 1;
10936         }
10937       if (align <= 2)
10938         {
10939           rtx label = ix86_expand_aligntest (destreg, 2);
10940           emit_insn (gen_strsethi (destreg,
10941                                    gen_rtx_SUBREG (HImode, zeroreg, 0)));
10942           ix86_adjust_counter (countreg, 2);
10943           emit_label (label);
10944           LABEL_NUSES (label) = 1;
10945         }
10946       if (align <= 4 && desired_alignment > 4)
10947         {
10948           rtx label = ix86_expand_aligntest (destreg, 4);
10949           emit_insn (gen_strsetsi (destreg, (TARGET_64BIT
10950                                              ? gen_rtx_SUBREG (SImode, zeroreg, 0)
10951                                              : zeroreg)));
10952           ix86_adjust_counter (countreg, 4);
10953           emit_label (label);
10954           LABEL_NUSES (label) = 1;
10955         }
10956
10957       if (label && desired_alignment > 4 && !TARGET_64BIT)
10958         {
10959           emit_label (label);
10960           LABEL_NUSES (label) = 1;
10961           label = NULL_RTX;
10962         }
10963
10964       if (!TARGET_SINGLE_STRINGOP)
10965         emit_insn (gen_cld ());
10966       if (TARGET_64BIT)
10967         {
10968           emit_insn (gen_lshrdi3 (countreg2, ix86_zero_extend_to_Pmode (countreg),
10969                                   GEN_INT (3)));
10970           emit_insn (gen_rep_stosdi_rex64 (destreg, countreg2, zeroreg,
10971                                            destreg, countreg2));
10972         }
10973       else
10974         {
10975           emit_insn (gen_lshrsi3 (countreg2, countreg, GEN_INT (2)));
10976           emit_insn (gen_rep_stossi (destreg, countreg2, zeroreg,
10977                                      destreg, countreg2));
10978         }
10979       if (label)
10980         {
10981           emit_label (label);
10982           LABEL_NUSES (label) = 1;
10983         }
10984
10985       if (TARGET_64BIT && align > 4 && count != 0 && (count & 4))
10986         emit_insn (gen_strsetsi (destreg,
10987                                  gen_rtx_SUBREG (SImode, zeroreg, 0)));
10988       if (TARGET_64BIT && (align <= 4 || count == 0))
10989         {
10990           rtx label = ix86_expand_aligntest (countreg, 4);
10991           emit_insn (gen_strsetsi (destreg,
10992                                    gen_rtx_SUBREG (SImode, zeroreg, 0)));
10993           emit_label (label);
10994           LABEL_NUSES (label) = 1;
10995         }
10996       if (align > 2 && count != 0 && (count & 2))
10997         emit_insn (gen_strsethi (destreg,
10998                                  gen_rtx_SUBREG (HImode, zeroreg, 0)));
10999       if (align <= 2 || count == 0)
11000         {
11001           rtx label = ix86_expand_aligntest (countreg, 2);
11002           emit_insn (gen_strsethi (destreg,
11003                                    gen_rtx_SUBREG (HImode, zeroreg, 0)));
11004           emit_label (label);
11005           LABEL_NUSES (label) = 1;
11006         }
11007       if (align > 1 && count != 0 && (count & 1))
11008         emit_insn (gen_strsetqi (destreg,
11009                                  gen_rtx_SUBREG (QImode, zeroreg, 0)));
11010       if (align <= 1 || count == 0)
11011         {
11012           rtx label = ix86_expand_aligntest (countreg, 1);
11013           emit_insn (gen_strsetqi (destreg,
11014                                    gen_rtx_SUBREG (QImode, zeroreg, 0)));
11015           emit_label (label);
11016           LABEL_NUSES (label) = 1;
11017         }
11018     }
11019   return 1;
11020 }
11021 /* Expand strlen.  */
11022 int
11023 ix86_expand_strlen (out, src, eoschar, align)
11024      rtx out, src, eoschar, align;
11025 {
11026   rtx addr, scratch1, scratch2, scratch3, scratch4;
11027
11028   /* The generic case of strlen expander is long.  Avoid it's
11029      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
11030
11031   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
11032       && !TARGET_INLINE_ALL_STRINGOPS
11033       && !optimize_size
11034       && (GET_CODE (align) != CONST_INT || INTVAL (align) < 4))
11035     return 0;
11036
11037   addr = force_reg (Pmode, XEXP (src, 0));
11038   scratch1 = gen_reg_rtx (Pmode);
11039
11040   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
11041       && !optimize_size)
11042     {
11043       /* Well it seems that some optimizer does not combine a call like
11044          foo(strlen(bar), strlen(bar));
11045          when the move and the subtraction is done here.  It does calculate
11046          the length just once when these instructions are done inside of
11047          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
11048          often used and I use one fewer register for the lifetime of
11049          output_strlen_unroll() this is better.  */
11050
11051       emit_move_insn (out, addr);
11052
11053       ix86_expand_strlensi_unroll_1 (out, align);
11054
11055       /* strlensi_unroll_1 returns the address of the zero at the end of
11056          the string, like memchr(), so compute the length by subtracting
11057          the start address.  */
11058       if (TARGET_64BIT)
11059         emit_insn (gen_subdi3 (out, out, addr));
11060       else
11061         emit_insn (gen_subsi3 (out, out, addr));
11062     }
11063   else
11064     {
11065       scratch2 = gen_reg_rtx (Pmode);
11066       scratch3 = gen_reg_rtx (Pmode);
11067       scratch4 = force_reg (Pmode, constm1_rtx);
11068
11069       emit_move_insn (scratch3, addr);
11070       eoschar = force_reg (QImode, eoschar);
11071
11072       emit_insn (gen_cld ());
11073       if (TARGET_64BIT)
11074         {
11075           emit_insn (gen_strlenqi_rex_1 (scratch1, scratch3, eoschar,
11076                                          align, scratch4, scratch3));
11077           emit_insn (gen_one_cmpldi2 (scratch2, scratch1));
11078           emit_insn (gen_adddi3 (out, scratch2, constm1_rtx));
11079         }
11080       else
11081         {
11082           emit_insn (gen_strlenqi_1 (scratch1, scratch3, eoschar,
11083                                      align, scratch4, scratch3));
11084           emit_insn (gen_one_cmplsi2 (scratch2, scratch1));
11085           emit_insn (gen_addsi3 (out, scratch2, constm1_rtx));
11086         }
11087     }
11088   return 1;
11089 }
11090
11091 /* Expand the appropriate insns for doing strlen if not just doing
11092    repnz; scasb
11093
11094    out = result, initialized with the start address
11095    align_rtx = alignment of the address.
11096    scratch = scratch register, initialized with the startaddress when
11097         not aligned, otherwise undefined
11098
11099    This is just the body. It needs the initialisations mentioned above and
11100    some address computing at the end.  These things are done in i386.md.  */
11101
11102 static void
11103 ix86_expand_strlensi_unroll_1 (out, align_rtx)
11104      rtx out, align_rtx;
11105 {
11106   int align;
11107   rtx tmp;
11108   rtx align_2_label = NULL_RTX;
11109   rtx align_3_label = NULL_RTX;
11110   rtx align_4_label = gen_label_rtx ();
11111   rtx end_0_label = gen_label_rtx ();
11112   rtx mem;
11113   rtx tmpreg = gen_reg_rtx (SImode);
11114   rtx scratch = gen_reg_rtx (SImode);
11115
11116   align = 0;
11117   if (GET_CODE (align_rtx) == CONST_INT)
11118     align = INTVAL (align_rtx);
11119
11120   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
11121
11122   /* Is there a known alignment and is it less than 4?  */
11123   if (align < 4)
11124     {
11125       rtx scratch1 = gen_reg_rtx (Pmode);
11126       emit_move_insn (scratch1, out);
11127       /* Is there a known alignment and is it not 2? */
11128       if (align != 2)
11129         {
11130           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
11131           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
11132
11133           /* Leave just the 3 lower bits.  */
11134           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
11135                                     NULL_RTX, 0, OPTAB_WIDEN);
11136
11137           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
11138                                    Pmode, 1, align_4_label);
11139           emit_cmp_and_jump_insns (align_rtx, GEN_INT (2), EQ, NULL,
11140                                    Pmode, 1, align_2_label);
11141           emit_cmp_and_jump_insns (align_rtx, GEN_INT (2), GTU, NULL,
11142                                    Pmode, 1, align_3_label);
11143         }
11144       else
11145         {
11146           /* Since the alignment is 2, we have to check 2 or 0 bytes;
11147              check if is aligned to 4 - byte.  */
11148
11149           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (2),
11150                                     NULL_RTX, 0, OPTAB_WIDEN);
11151
11152           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
11153                                    Pmode, 1, align_4_label);
11154         }
11155
11156       mem = gen_rtx_MEM (QImode, out);
11157
11158       /* Now compare the bytes.  */
11159
11160       /* Compare the first n unaligned byte on a byte per byte basis.  */
11161       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
11162                                QImode, 1, end_0_label);
11163
11164       /* Increment the address.  */
11165       if (TARGET_64BIT)
11166         emit_insn (gen_adddi3 (out, out, const1_rtx));
11167       else
11168         emit_insn (gen_addsi3 (out, out, const1_rtx));
11169
11170       /* Not needed with an alignment of 2 */
11171       if (align != 2)
11172         {
11173           emit_label (align_2_label);
11174
11175           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
11176                                    end_0_label);
11177
11178           if (TARGET_64BIT)
11179             emit_insn (gen_adddi3 (out, out, const1_rtx));
11180           else
11181             emit_insn (gen_addsi3 (out, out, const1_rtx));
11182
11183           emit_label (align_3_label);
11184         }
11185
11186       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
11187                                end_0_label);
11188
11189       if (TARGET_64BIT)
11190         emit_insn (gen_adddi3 (out, out, const1_rtx));
11191       else
11192         emit_insn (gen_addsi3 (out, out, const1_rtx));
11193     }
11194
11195   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
11196      align this loop.  It gives only huge programs, but does not help to
11197      speed up.  */
11198   emit_label (align_4_label);
11199
11200   mem = gen_rtx_MEM (SImode, out);
11201   emit_move_insn (scratch, mem);
11202   if (TARGET_64BIT)
11203     emit_insn (gen_adddi3 (out, out, GEN_INT (4)));
11204   else
11205     emit_insn (gen_addsi3 (out, out, GEN_INT (4)));
11206
11207   /* This formula yields a nonzero result iff one of the bytes is zero.
11208      This saves three branches inside loop and many cycles.  */
11209
11210   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
11211   emit_insn (gen_one_cmplsi2 (scratch, scratch));
11212   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
11213   emit_insn (gen_andsi3 (tmpreg, tmpreg,
11214                          gen_int_mode (0x80808080, SImode)));
11215   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
11216                            align_4_label);
11217
11218   if (TARGET_CMOVE)
11219     {
11220        rtx reg = gen_reg_rtx (SImode);
11221        rtx reg2 = gen_reg_rtx (Pmode);
11222        emit_move_insn (reg, tmpreg);
11223        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
11224
11225        /* If zero is not in the first two bytes, move two bytes forward.  */
11226        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
11227        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
11228        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
11229        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
11230                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
11231                                                      reg,
11232                                                      tmpreg)));
11233        /* Emit lea manually to avoid clobbering of flags.  */
11234        emit_insn (gen_rtx_SET (SImode, reg2,
11235                                gen_rtx_PLUS (Pmode, out, GEN_INT (2))));
11236
11237        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
11238        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
11239        emit_insn (gen_rtx_SET (VOIDmode, out,
11240                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
11241                                                      reg2,
11242                                                      out)));
11243
11244     }
11245   else
11246     {
11247        rtx end_2_label = gen_label_rtx ();
11248        /* Is zero in the first two bytes? */
11249
11250        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
11251        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
11252        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
11253        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
11254                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
11255                             pc_rtx);
11256        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
11257        JUMP_LABEL (tmp) = end_2_label;
11258
11259        /* Not in the first two.  Move two bytes forward.  */
11260        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
11261        if (TARGET_64BIT)
11262          emit_insn (gen_adddi3 (out, out, GEN_INT (2)));
11263        else
11264          emit_insn (gen_addsi3 (out, out, GEN_INT (2)));
11265
11266        emit_label (end_2_label);
11267
11268     }
11269
11270   /* Avoid branch in fixing the byte.  */
11271   tmpreg = gen_lowpart (QImode, tmpreg);
11272   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
11273   if (TARGET_64BIT)
11274     emit_insn (gen_subdi3_carry_rex64 (out, out, GEN_INT (3)));
11275   else
11276     emit_insn (gen_subsi3_carry (out, out, GEN_INT (3)));
11277
11278   emit_label (end_0_label);
11279 }
11280
11281 void
11282 ix86_expand_call (retval, fnaddr, callarg1, callarg2, pop, sibcall)
11283      rtx retval, fnaddr, callarg1, callarg2, pop;
11284      int sibcall;
11285 {
11286   rtx use = NULL, call;
11287
11288   if (pop == const0_rtx)
11289     pop = NULL;
11290   if (TARGET_64BIT && pop)
11291     abort ();
11292
11293 #if TARGET_MACHO
11294   if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
11295     fnaddr = machopic_indirect_call_target (fnaddr);
11296 #else
11297   /* Static functions and indirect calls don't need the pic register.  */
11298   if (! TARGET_64BIT && flag_pic
11299       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
11300       && ! SYMBOL_REF_FLAG (XEXP (fnaddr, 0)))
11301     use_reg (&use, pic_offset_table_rtx);
11302
11303   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
11304     {
11305       rtx al = gen_rtx_REG (QImode, 0);
11306       emit_move_insn (al, callarg2);
11307       use_reg (&use, al);
11308     }
11309 #endif /* TARGET_MACHO */
11310
11311   if (! call_insn_operand (XEXP (fnaddr, 0), Pmode))
11312     {
11313       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
11314       fnaddr = gen_rtx_MEM (QImode, fnaddr);
11315     }
11316   if (sibcall && TARGET_64BIT
11317       && !constant_call_address_operand (XEXP (fnaddr, 0), Pmode))
11318     {
11319       rtx addr;
11320       addr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
11321       fnaddr = gen_rtx_REG (Pmode, 40);
11322       emit_move_insn (fnaddr, addr);
11323       fnaddr = gen_rtx_MEM (QImode, fnaddr);
11324     }
11325
11326   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
11327   if (retval)
11328     call = gen_rtx_SET (VOIDmode, retval, call);
11329   if (pop)
11330     {
11331       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
11332       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
11333       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
11334     }
11335
11336   call = emit_call_insn (call);
11337   if (use)
11338     CALL_INSN_FUNCTION_USAGE (call) = use;
11339 }
11340
11341 \f
11342 /* Clear stack slot assignments remembered from previous functions.
11343    This is called from INIT_EXPANDERS once before RTL is emitted for each
11344    function.  */
11345
11346 static struct machine_function *
11347 ix86_init_machine_status ()
11348 {
11349   return ggc_alloc_cleared (sizeof (struct machine_function));
11350 }
11351
11352 /* Return a MEM corresponding to a stack slot with mode MODE.
11353    Allocate a new slot if necessary.
11354
11355    The RTL for a function can have several slots available: N is
11356    which slot to use.  */
11357
11358 rtx
11359 assign_386_stack_local (mode, n)
11360      enum machine_mode mode;
11361      int n;
11362 {
11363   if (n < 0 || n >= MAX_386_STACK_LOCALS)
11364     abort ();
11365
11366   if (ix86_stack_locals[(int) mode][n] == NULL_RTX)
11367     ix86_stack_locals[(int) mode][n]
11368       = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
11369
11370   return ix86_stack_locals[(int) mode][n];
11371 }
11372
11373 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
11374
11375 static GTY(()) rtx ix86_tls_symbol;
11376 rtx
11377 ix86_tls_get_addr ()
11378 {
11379
11380   if (!ix86_tls_symbol)
11381     {
11382       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
11383                                             (TARGET_GNU_TLS && !TARGET_64BIT)
11384                                             ? "___tls_get_addr"
11385                                             : "__tls_get_addr");
11386     }
11387
11388   return ix86_tls_symbol;
11389 }
11390 \f
11391 /* Calculate the length of the memory address in the instruction
11392    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
11393
11394 static int
11395 memory_address_length (addr)
11396      rtx addr;
11397 {
11398   struct ix86_address parts;
11399   rtx base, index, disp;
11400   int len;
11401
11402   if (GET_CODE (addr) == PRE_DEC
11403       || GET_CODE (addr) == POST_INC
11404       || GET_CODE (addr) == PRE_MODIFY
11405       || GET_CODE (addr) == POST_MODIFY)
11406     return 0;
11407
11408   if (! ix86_decompose_address (addr, &parts))
11409     abort ();
11410
11411   base = parts.base;
11412   index = parts.index;
11413   disp = parts.disp;
11414   len = 0;
11415
11416   /* Register Indirect.  */
11417   if (base && !index && !disp)
11418     {
11419       /* Special cases: ebp and esp need the two-byte modrm form.  */
11420       if (addr == stack_pointer_rtx
11421           || addr == arg_pointer_rtx
11422           || addr == frame_pointer_rtx
11423           || addr == hard_frame_pointer_rtx)
11424         len = 1;
11425     }
11426
11427   /* Direct Addressing.  */
11428   else if (disp && !base && !index)
11429     len = 4;
11430
11431   else
11432     {
11433       /* Find the length of the displacement constant.  */
11434       if (disp)
11435         {
11436           if (GET_CODE (disp) == CONST_INT
11437               && CONST_OK_FOR_LETTER_P (INTVAL (disp), 'K'))
11438             len = 1;
11439           else
11440             len = 4;
11441         }
11442
11443       /* An index requires the two-byte modrm form.  */
11444       if (index)
11445         len += 1;
11446     }
11447
11448   return len;
11449 }
11450
11451 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
11452    is set, expect that insn have 8bit immediate alternative.  */
11453 int
11454 ix86_attr_length_immediate_default (insn, shortform)
11455      rtx insn;
11456      int shortform;
11457 {
11458   int len = 0;
11459   int i;
11460   extract_insn_cached (insn);
11461   for (i = recog_data.n_operands - 1; i >= 0; --i)
11462     if (CONSTANT_P (recog_data.operand[i]))
11463       {
11464         if (len)
11465           abort ();
11466         if (shortform
11467             && GET_CODE (recog_data.operand[i]) == CONST_INT
11468             && CONST_OK_FOR_LETTER_P (INTVAL (recog_data.operand[i]), 'K'))
11469           len = 1;
11470         else
11471           {
11472             switch (get_attr_mode (insn))
11473               {
11474                 case MODE_QI:
11475                   len+=1;
11476                   break;
11477                 case MODE_HI:
11478                   len+=2;
11479                   break;
11480                 case MODE_SI:
11481                   len+=4;
11482                   break;
11483                 /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
11484                 case MODE_DI:
11485                   len+=4;
11486                   break;
11487                 default:
11488                   fatal_insn ("unknown insn mode", insn);
11489               }
11490           }
11491       }
11492   return len;
11493 }
11494 /* Compute default value for "length_address" attribute.  */
11495 int
11496 ix86_attr_length_address_default (insn)
11497      rtx insn;
11498 {
11499   int i;
11500   extract_insn_cached (insn);
11501   for (i = recog_data.n_operands - 1; i >= 0; --i)
11502     if (GET_CODE (recog_data.operand[i]) == MEM)
11503       {
11504         return memory_address_length (XEXP (recog_data.operand[i], 0));
11505         break;
11506       }
11507   return 0;
11508 }
11509 \f
11510 /* Return the maximum number of instructions a cpu can issue.  */
11511
11512 static int
11513 ix86_issue_rate ()
11514 {
11515   switch (ix86_cpu)
11516     {
11517     case PROCESSOR_PENTIUM:
11518     case PROCESSOR_K6:
11519       return 2;
11520
11521     case PROCESSOR_PENTIUMPRO:
11522     case PROCESSOR_PENTIUM4:
11523     case PROCESSOR_ATHLON:
11524     case PROCESSOR_K8:
11525       return 3;
11526
11527     default:
11528       return 1;
11529     }
11530 }
11531
11532 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
11533    by DEP_INSN and nothing set by DEP_INSN.  */
11534
11535 static int
11536 ix86_flags_dependant (insn, dep_insn, insn_type)
11537      rtx insn, dep_insn;
11538      enum attr_type insn_type;
11539 {
11540   rtx set, set2;
11541
11542   /* Simplify the test for uninteresting insns.  */
11543   if (insn_type != TYPE_SETCC
11544       && insn_type != TYPE_ICMOV
11545       && insn_type != TYPE_FCMOV
11546       && insn_type != TYPE_IBR)
11547     return 0;
11548
11549   if ((set = single_set (dep_insn)) != 0)
11550     {
11551       set = SET_DEST (set);
11552       set2 = NULL_RTX;
11553     }
11554   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
11555            && XVECLEN (PATTERN (dep_insn), 0) == 2
11556            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
11557            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
11558     {
11559       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
11560       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
11561     }
11562   else
11563     return 0;
11564
11565   if (GET_CODE (set) != REG || REGNO (set) != FLAGS_REG)
11566     return 0;
11567
11568   /* This test is true if the dependent insn reads the flags but
11569      not any other potentially set register.  */
11570   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
11571     return 0;
11572
11573   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
11574     return 0;
11575
11576   return 1;
11577 }
11578
11579 /* A subroutine of ix86_adjust_cost -- return true iff INSN has a memory
11580    address with operands set by DEP_INSN.  */
11581
11582 static int
11583 ix86_agi_dependant (insn, dep_insn, insn_type)
11584      rtx insn, dep_insn;
11585      enum attr_type insn_type;
11586 {
11587   rtx addr;
11588
11589   if (insn_type == TYPE_LEA
11590       && TARGET_PENTIUM)
11591     {
11592       addr = PATTERN (insn);
11593       if (GET_CODE (addr) == SET)
11594         ;
11595       else if (GET_CODE (addr) == PARALLEL
11596                && GET_CODE (XVECEXP (addr, 0, 0)) == SET)
11597         addr = XVECEXP (addr, 0, 0);
11598       else
11599         abort ();
11600       addr = SET_SRC (addr);
11601     }
11602   else
11603     {
11604       int i;
11605       extract_insn_cached (insn);
11606       for (i = recog_data.n_operands - 1; i >= 0; --i)
11607         if (GET_CODE (recog_data.operand[i]) == MEM)
11608           {
11609             addr = XEXP (recog_data.operand[i], 0);
11610             goto found;
11611           }
11612       return 0;
11613     found:;
11614     }
11615
11616   return modified_in_p (addr, dep_insn);
11617 }
11618
11619 static int
11620 ix86_adjust_cost (insn, link, dep_insn, cost)
11621      rtx insn, link, dep_insn;
11622      int cost;
11623 {
11624   enum attr_type insn_type, dep_insn_type;
11625   enum attr_memory memory, dep_memory;
11626   rtx set, set2;
11627   int dep_insn_code_number;
11628
11629   /* Anti and output dependencies have zero cost on all CPUs.  */
11630   if (REG_NOTE_KIND (link) != 0)
11631     return 0;
11632
11633   dep_insn_code_number = recog_memoized (dep_insn);
11634
11635   /* If we can't recognize the insns, we can't really do anything.  */
11636   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
11637     return cost;
11638
11639   insn_type = get_attr_type (insn);
11640   dep_insn_type = get_attr_type (dep_insn);
11641
11642   switch (ix86_cpu)
11643     {
11644     case PROCESSOR_PENTIUM:
11645       /* Address Generation Interlock adds a cycle of latency.  */
11646       if (ix86_agi_dependant (insn, dep_insn, insn_type))
11647         cost += 1;
11648
11649       /* ??? Compares pair with jump/setcc.  */
11650       if (ix86_flags_dependant (insn, dep_insn, insn_type))
11651         cost = 0;
11652
11653       /* Floating point stores require value to be ready one cycle earlier.  */
11654       if (insn_type == TYPE_FMOV
11655           && get_attr_memory (insn) == MEMORY_STORE
11656           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11657         cost += 1;
11658       break;
11659
11660     case PROCESSOR_PENTIUMPRO:
11661       memory = get_attr_memory (insn);
11662       dep_memory = get_attr_memory (dep_insn);
11663
11664       /* Since we can't represent delayed latencies of load+operation,
11665          increase the cost here for non-imov insns.  */
11666       if (dep_insn_type != TYPE_IMOV
11667           && dep_insn_type != TYPE_FMOV
11668           && (dep_memory == MEMORY_LOAD || dep_memory == MEMORY_BOTH))
11669         cost += 1;
11670
11671       /* INT->FP conversion is expensive.  */
11672       if (get_attr_fp_int_src (dep_insn))
11673         cost += 5;
11674
11675       /* There is one cycle extra latency between an FP op and a store.  */
11676       if (insn_type == TYPE_FMOV
11677           && (set = single_set (dep_insn)) != NULL_RTX
11678           && (set2 = single_set (insn)) != NULL_RTX
11679           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
11680           && GET_CODE (SET_DEST (set2)) == MEM)
11681         cost += 1;
11682
11683       /* Show ability of reorder buffer to hide latency of load by executing
11684          in parallel with previous instruction in case
11685          previous instruction is not needed to compute the address.  */
11686       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
11687           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11688         {
11689           /* Claim moves to take one cycle, as core can issue one load
11690              at time and the next load can start cycle later.  */
11691           if (dep_insn_type == TYPE_IMOV
11692               || dep_insn_type == TYPE_FMOV)
11693             cost = 1;
11694           else if (cost > 1)
11695             cost--;
11696         }
11697       break;
11698
11699     case PROCESSOR_K6:
11700       memory = get_attr_memory (insn);
11701       dep_memory = get_attr_memory (dep_insn);
11702       /* The esp dependency is resolved before the instruction is really
11703          finished.  */
11704       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
11705           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
11706         return 1;
11707
11708       /* Since we can't represent delayed latencies of load+operation,
11709          increase the cost here for non-imov insns.  */
11710       if (dep_memory == MEMORY_LOAD || dep_memory == MEMORY_BOTH)
11711         cost += (dep_insn_type != TYPE_IMOV) ? 2 : 1;
11712
11713       /* INT->FP conversion is expensive.  */
11714       if (get_attr_fp_int_src (dep_insn))
11715         cost += 5;
11716
11717       /* Show ability of reorder buffer to hide latency of load by executing
11718          in parallel with previous instruction in case
11719          previous instruction is not needed to compute the address.  */
11720       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
11721           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11722         {
11723           /* Claim moves to take one cycle, as core can issue one load
11724              at time and the next load can start cycle later.  */
11725           if (dep_insn_type == TYPE_IMOV
11726               || dep_insn_type == TYPE_FMOV)
11727             cost = 1;
11728           else if (cost > 2)
11729             cost -= 2;
11730           else
11731             cost = 1;
11732         }
11733       break;
11734
11735     case PROCESSOR_ATHLON:
11736     case PROCESSOR_K8:
11737       memory = get_attr_memory (insn);
11738       dep_memory = get_attr_memory (dep_insn);
11739
11740       /* Show ability of reorder buffer to hide latency of load by executing
11741          in parallel with previous instruction in case
11742          previous instruction is not needed to compute the address.  */
11743       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
11744           && !ix86_agi_dependant (insn, dep_insn, insn_type))
11745         {
11746           /* Claim moves to take one cycle, as core can issue one load
11747              at time and the next load can start cycle later.  */
11748           if (dep_insn_type == TYPE_IMOV
11749               || dep_insn_type == TYPE_FMOV)
11750             cost = 0;
11751           else if (cost >= 3)
11752             cost -= 3;
11753           else
11754             cost = 0;
11755         }
11756
11757     default:
11758       break;
11759     }
11760
11761   return cost;
11762 }
11763
11764 static union
11765 {
11766   struct ppro_sched_data
11767   {
11768     rtx decode[3];
11769     int issued_this_cycle;
11770   } ppro;
11771 } ix86_sched_data;
11772
11773 static enum attr_ppro_uops
11774 ix86_safe_ppro_uops (insn)
11775      rtx insn;
11776 {
11777   if (recog_memoized (insn) >= 0)
11778     return get_attr_ppro_uops (insn);
11779   else
11780     return PPRO_UOPS_MANY;
11781 }
11782
11783 static void
11784 ix86_dump_ppro_packet (dump)
11785      FILE *dump;
11786 {
11787   if (ix86_sched_data.ppro.decode[0])
11788     {
11789       fprintf (dump, "PPRO packet: %d",
11790                INSN_UID (ix86_sched_data.ppro.decode[0]));
11791       if (ix86_sched_data.ppro.decode[1])
11792         fprintf (dump, " %d", INSN_UID (ix86_sched_data.ppro.decode[1]));
11793       if (ix86_sched_data.ppro.decode[2])
11794         fprintf (dump, " %d", INSN_UID (ix86_sched_data.ppro.decode[2]));
11795       fputc ('\n', dump);
11796     }
11797 }
11798
11799 /* We're beginning a new block.  Initialize data structures as necessary.  */
11800
11801 static void
11802 ix86_sched_init (dump, sched_verbose, veclen)
11803      FILE *dump ATTRIBUTE_UNUSED;
11804      int sched_verbose ATTRIBUTE_UNUSED;
11805      int veclen ATTRIBUTE_UNUSED;
11806 {
11807   memset (&ix86_sched_data, 0, sizeof (ix86_sched_data));
11808 }
11809
11810 /* Shift INSN to SLOT, and shift everything else down.  */
11811
11812 static void
11813 ix86_reorder_insn (insnp, slot)
11814      rtx *insnp, *slot;
11815 {
11816   if (insnp != slot)
11817     {
11818       rtx insn = *insnp;
11819       do
11820         insnp[0] = insnp[1];
11821       while (++insnp != slot);
11822       *insnp = insn;
11823     }
11824 }
11825
11826 static void
11827 ix86_sched_reorder_ppro (ready, e_ready)
11828      rtx *ready;
11829      rtx *e_ready;
11830 {
11831   rtx decode[3];
11832   enum attr_ppro_uops cur_uops;
11833   int issued_this_cycle;
11834   rtx *insnp;
11835   int i;
11836
11837   /* At this point .ppro.decode contains the state of the three
11838      decoders from last "cycle".  That is, those insns that were
11839      actually independent.  But here we're scheduling for the
11840      decoder, and we may find things that are decodable in the
11841      same cycle.  */
11842
11843   memcpy (decode, ix86_sched_data.ppro.decode, sizeof (decode));
11844   issued_this_cycle = 0;
11845
11846   insnp = e_ready;
11847   cur_uops = ix86_safe_ppro_uops (*insnp);
11848
11849   /* If the decoders are empty, and we've a complex insn at the
11850      head of the priority queue, let it issue without complaint.  */
11851   if (decode[0] == NULL)
11852     {
11853       if (cur_uops == PPRO_UOPS_MANY)
11854         {
11855           decode[0] = *insnp;
11856           goto ppro_done;
11857         }
11858
11859       /* Otherwise, search for a 2-4 uop unsn to issue.  */
11860       while (cur_uops != PPRO_UOPS_FEW)
11861         {
11862           if (insnp == ready)
11863             break;
11864           cur_uops = ix86_safe_ppro_uops (*--insnp);
11865         }
11866
11867       /* If so, move it to the head of the line.  */
11868       if (cur_uops == PPRO_UOPS_FEW)
11869         ix86_reorder_insn (insnp, e_ready);
11870
11871       /* Issue the head of the queue.  */
11872       issued_this_cycle = 1;
11873       decode[0] = *e_ready--;
11874     }
11875
11876   /* Look for simple insns to fill in the other two slots.  */
11877   for (i = 1; i < 3; ++i)
11878     if (decode[i] == NULL)
11879       {
11880         if (ready > e_ready)
11881           goto ppro_done;
11882
11883         insnp = e_ready;
11884         cur_uops = ix86_safe_ppro_uops (*insnp);
11885         while (cur_uops != PPRO_UOPS_ONE)
11886           {
11887             if (insnp == ready)
11888               break;
11889             cur_uops = ix86_safe_ppro_uops (*--insnp);
11890           }
11891
11892         /* Found one.  Move it to the head of the queue and issue it.  */
11893         if (cur_uops == PPRO_UOPS_ONE)
11894           {
11895             ix86_reorder_insn (insnp, e_ready);
11896             decode[i] = *e_ready--;
11897             issued_this_cycle++;
11898             continue;
11899           }
11900
11901         /* ??? Didn't find one.  Ideally, here we would do a lazy split
11902            of 2-uop insns, issue one and queue the other.  */
11903       }
11904
11905  ppro_done:
11906   if (issued_this_cycle == 0)
11907     issued_this_cycle = 1;
11908   ix86_sched_data.ppro.issued_this_cycle = issued_this_cycle;
11909 }
11910
11911 /* We are about to being issuing insns for this clock cycle.
11912    Override the default sort algorithm to better slot instructions.  */
11913 static int
11914 ix86_sched_reorder (dump, sched_verbose, ready, n_readyp, clock_var)
11915      FILE *dump ATTRIBUTE_UNUSED;
11916      int sched_verbose ATTRIBUTE_UNUSED;
11917      rtx *ready;
11918      int *n_readyp;
11919      int clock_var ATTRIBUTE_UNUSED;
11920 {
11921   int n_ready = *n_readyp;
11922   rtx *e_ready = ready + n_ready - 1;
11923
11924   /* Make sure to go ahead and initialize key items in
11925      ix86_sched_data if we are not going to bother trying to
11926      reorder the ready queue.  */
11927   if (n_ready < 2)
11928     {
11929       ix86_sched_data.ppro.issued_this_cycle = 1;
11930       goto out;
11931     }
11932
11933   switch (ix86_cpu)
11934     {
11935     default:
11936       break;
11937
11938     case PROCESSOR_PENTIUMPRO:
11939       ix86_sched_reorder_ppro (ready, e_ready);
11940       break;
11941     }
11942
11943 out:
11944   return ix86_issue_rate ();
11945 }
11946
11947 /* We are about to issue INSN.  Return the number of insns left on the
11948    ready queue that can be issued this cycle.  */
11949
11950 static int
11951 ix86_variable_issue (dump, sched_verbose, insn, can_issue_more)
11952      FILE *dump;
11953      int sched_verbose;
11954      rtx insn;
11955      int can_issue_more;
11956 {
11957   int i;
11958   switch (ix86_cpu)
11959     {
11960     default:
11961       return can_issue_more - 1;
11962
11963     case PROCESSOR_PENTIUMPRO:
11964       {
11965         enum attr_ppro_uops uops = ix86_safe_ppro_uops (insn);
11966
11967         if (uops == PPRO_UOPS_MANY)
11968           {
11969             if (sched_verbose)
11970               ix86_dump_ppro_packet (dump);
11971             ix86_sched_data.ppro.decode[0] = insn;
11972             ix86_sched_data.ppro.decode[1] = NULL;
11973             ix86_sched_data.ppro.decode[2] = NULL;
11974             if (sched_verbose)
11975               ix86_dump_ppro_packet (dump);
11976             ix86_sched_data.ppro.decode[0] = NULL;
11977           }
11978         else if (uops == PPRO_UOPS_FEW)
11979           {
11980             if (sched_verbose)
11981               ix86_dump_ppro_packet (dump);
11982             ix86_sched_data.ppro.decode[0] = insn;
11983             ix86_sched_data.ppro.decode[1] = NULL;
11984             ix86_sched_data.ppro.decode[2] = NULL;
11985           }
11986         else
11987           {
11988             for (i = 0; i < 3; ++i)
11989               if (ix86_sched_data.ppro.decode[i] == NULL)
11990                 {
11991                   ix86_sched_data.ppro.decode[i] = insn;
11992                   break;
11993                 }
11994             if (i == 3)
11995               abort ();
11996             if (i == 2)
11997               {
11998                 if (sched_verbose)
11999                   ix86_dump_ppro_packet (dump);
12000                 ix86_sched_data.ppro.decode[0] = NULL;
12001                 ix86_sched_data.ppro.decode[1] = NULL;
12002                 ix86_sched_data.ppro.decode[2] = NULL;
12003               }
12004           }
12005       }
12006       return --ix86_sched_data.ppro.issued_this_cycle;
12007     }
12008 }
12009
12010 static int
12011 ia32_use_dfa_pipeline_interface ()
12012 {
12013   if (TARGET_PENTIUM || TARGET_ATHLON_K8)
12014     return 1;
12015   return 0;
12016 }
12017
12018 /* How many alternative schedules to try.  This should be as wide as the
12019    scheduling freedom in the DFA, but no wider.  Making this value too
12020    large results extra work for the scheduler.  */
12021
12022 static int
12023 ia32_multipass_dfa_lookahead ()
12024 {
12025   if (ix86_cpu == PROCESSOR_PENTIUM)
12026     return 2;
12027   else
12028    return 0;
12029 }
12030
12031 \f
12032 /* Walk through INSNS and look for MEM references whose address is DSTREG or
12033    SRCREG and set the memory attribute to those of DSTREF and SRCREF, as
12034    appropriate.  */
12035
12036 void
12037 ix86_set_move_mem_attrs (insns, dstref, srcref, dstreg, srcreg)
12038      rtx insns;
12039      rtx dstref, srcref, dstreg, srcreg;
12040 {
12041   rtx insn;
12042
12043   for (insn = insns; insn != 0 ; insn = NEXT_INSN (insn))
12044     if (INSN_P (insn))
12045       ix86_set_move_mem_attrs_1 (PATTERN (insn), dstref, srcref,
12046                                  dstreg, srcreg);
12047 }
12048
12049 /* Subroutine of above to actually do the updating by recursively walking
12050    the rtx.  */
12051
12052 static void
12053 ix86_set_move_mem_attrs_1 (x, dstref, srcref, dstreg, srcreg)
12054      rtx x;
12055      rtx dstref, srcref, dstreg, srcreg;
12056 {
12057   enum rtx_code code = GET_CODE (x);
12058   const char *format_ptr = GET_RTX_FORMAT (code);
12059   int i, j;
12060
12061   if (code == MEM && XEXP (x, 0) == dstreg)
12062     MEM_COPY_ATTRIBUTES (x, dstref);
12063   else if (code == MEM && XEXP (x, 0) == srcreg)
12064     MEM_COPY_ATTRIBUTES (x, srcref);
12065
12066   for (i = 0; i < GET_RTX_LENGTH (code); i++, format_ptr++)
12067     {
12068       if (*format_ptr == 'e')
12069         ix86_set_move_mem_attrs_1 (XEXP (x, i), dstref, srcref,
12070                                    dstreg, srcreg);
12071       else if (*format_ptr == 'E')
12072         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12073           ix86_set_move_mem_attrs_1 (XVECEXP (x, i, j), dstref, srcref,
12074                                      dstreg, srcreg);
12075     }
12076 }
12077 \f
12078 /* Compute the alignment given to a constant that is being placed in memory.
12079    EXP is the constant and ALIGN is the alignment that the object would
12080    ordinarily have.
12081    The value of this function is used instead of that alignment to align
12082    the object.  */
12083
12084 int
12085 ix86_constant_alignment (exp, align)
12086      tree exp;
12087      int align;
12088 {
12089   if (TREE_CODE (exp) == REAL_CST)
12090     {
12091       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
12092         return 64;
12093       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
12094         return 128;
12095     }
12096   else if (TREE_CODE (exp) == STRING_CST && TREE_STRING_LENGTH (exp) >= 31
12097            && align < 256)
12098     return 256;
12099
12100   return align;
12101 }
12102
12103 /* Compute the alignment for a static variable.
12104    TYPE is the data type, and ALIGN is the alignment that
12105    the object would ordinarily have.  The value of this function is used
12106    instead of that alignment to align the object.  */
12107
12108 int
12109 ix86_data_alignment (type, align)
12110      tree type;
12111      int align;
12112 {
12113   if (AGGREGATE_TYPE_P (type)
12114        && TYPE_SIZE (type)
12115        && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
12116        && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 256
12117            || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 256)
12118     return 256;
12119
12120   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
12121      to 16byte boundary.  */
12122   if (TARGET_64BIT)
12123     {
12124       if (AGGREGATE_TYPE_P (type)
12125            && TYPE_SIZE (type)
12126            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
12127            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
12128                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
12129         return 128;
12130     }
12131
12132   if (TREE_CODE (type) == ARRAY_TYPE)
12133     {
12134       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
12135         return 64;
12136       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
12137         return 128;
12138     }
12139   else if (TREE_CODE (type) == COMPLEX_TYPE)
12140     {
12141
12142       if (TYPE_MODE (type) == DCmode && align < 64)
12143         return 64;
12144       if (TYPE_MODE (type) == XCmode && align < 128)
12145         return 128;
12146     }
12147   else if ((TREE_CODE (type) == RECORD_TYPE
12148             || TREE_CODE (type) == UNION_TYPE
12149             || TREE_CODE (type) == QUAL_UNION_TYPE)
12150            && TYPE_FIELDS (type))
12151     {
12152       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
12153         return 64;
12154       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
12155         return 128;
12156     }
12157   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
12158            || TREE_CODE (type) == INTEGER_TYPE)
12159     {
12160       if (TYPE_MODE (type) == DFmode && align < 64)
12161         return 64;
12162       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
12163         return 128;
12164     }
12165
12166   return align;
12167 }
12168
12169 /* Compute the alignment for a local variable.
12170    TYPE is the data type, and ALIGN is the alignment that
12171    the object would ordinarily have.  The value of this macro is used
12172    instead of that alignment to align the object.  */
12173
12174 int
12175 ix86_local_alignment (type, align)
12176      tree type;
12177      int align;
12178 {
12179   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
12180      to 16byte boundary.  */
12181   if (TARGET_64BIT)
12182     {
12183       if (AGGREGATE_TYPE_P (type)
12184            && TYPE_SIZE (type)
12185            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
12186            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
12187                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
12188         return 128;
12189     }
12190   if (TREE_CODE (type) == ARRAY_TYPE)
12191     {
12192       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
12193         return 64;
12194       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
12195         return 128;
12196     }
12197   else if (TREE_CODE (type) == COMPLEX_TYPE)
12198     {
12199       if (TYPE_MODE (type) == DCmode && align < 64)
12200         return 64;
12201       if (TYPE_MODE (type) == XCmode && align < 128)
12202         return 128;
12203     }
12204   else if ((TREE_CODE (type) == RECORD_TYPE
12205             || TREE_CODE (type) == UNION_TYPE
12206             || TREE_CODE (type) == QUAL_UNION_TYPE)
12207            && TYPE_FIELDS (type))
12208     {
12209       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
12210         return 64;
12211       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
12212         return 128;
12213     }
12214   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
12215            || TREE_CODE (type) == INTEGER_TYPE)
12216     {
12217
12218       if (TYPE_MODE (type) == DFmode && align < 64)
12219         return 64;
12220       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
12221         return 128;
12222     }
12223   return align;
12224 }
12225 \f
12226 /* Emit RTL insns to initialize the variable parts of a trampoline.
12227    FNADDR is an RTX for the address of the function's pure code.
12228    CXT is an RTX for the static chain value for the function.  */
12229 void
12230 x86_initialize_trampoline (tramp, fnaddr, cxt)
12231      rtx tramp, fnaddr, cxt;
12232 {
12233   if (!TARGET_64BIT)
12234     {
12235       /* Compute offset from the end of the jmp to the target function.  */
12236       rtx disp = expand_binop (SImode, sub_optab, fnaddr,
12237                                plus_constant (tramp, 10),
12238                                NULL_RTX, 1, OPTAB_DIRECT);
12239       emit_move_insn (gen_rtx_MEM (QImode, tramp),
12240                       gen_int_mode (0xb9, QImode));
12241       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 1)), cxt);
12242       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, 5)),
12243                       gen_int_mode (0xe9, QImode));
12244       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 6)), disp);
12245     }
12246   else
12247     {
12248       int offset = 0;
12249       /* Try to load address using shorter movl instead of movabs.
12250          We may want to support movq for kernel mode, but kernel does not use
12251          trampolines at the moment.  */
12252       if (x86_64_zero_extended_value (fnaddr))
12253         {
12254           fnaddr = copy_to_mode_reg (DImode, fnaddr);
12255           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
12256                           gen_int_mode (0xbb41, HImode));
12257           emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, offset + 2)),
12258                           gen_lowpart (SImode, fnaddr));
12259           offset += 6;
12260         }
12261       else
12262         {
12263           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
12264                           gen_int_mode (0xbb49, HImode));
12265           emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
12266                           fnaddr);
12267           offset += 10;
12268         }
12269       /* Load static chain using movabs to r10.  */
12270       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
12271                       gen_int_mode (0xba49, HImode));
12272       emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
12273                       cxt);
12274       offset += 10;
12275       /* Jump to the r11 */
12276       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
12277                       gen_int_mode (0xff49, HImode));
12278       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, offset+2)),
12279                       gen_int_mode (0xe3, QImode));
12280       offset += 3;
12281       if (offset > TRAMPOLINE_SIZE)
12282         abort ();
12283     }
12284
12285 #ifdef TRANSFER_FROM_TRAMPOLINE
12286   emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
12287                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
12288 #endif
12289 }
12290 \f
12291 #define def_builtin(MASK, NAME, TYPE, CODE)                     \
12292 do {                                                            \
12293   if ((MASK) & target_flags)                                    \
12294     builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD,      \
12295                       NULL, NULL_TREE);                         \
12296 } while (0)
12297
12298 struct builtin_description
12299 {
12300   const unsigned int mask;
12301   const enum insn_code icode;
12302   const char *const name;
12303   const enum ix86_builtins code;
12304   const enum rtx_code comparison;
12305   const unsigned int flag;
12306 };
12307
12308 /* Used for builtins that are enabled both by -msse and -msse2.  */
12309 #define MASK_SSE1 (MASK_SSE | MASK_SSE2)
12310
12311 static const struct builtin_description bdesc_comi[] =
12312 {
12313   { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
12314   { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
12315   { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
12316   { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
12317   { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
12318   { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
12319   { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
12320   { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
12321   { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
12322   { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
12323   { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
12324   { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
12325   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
12326   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
12327   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
12328   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
12329   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
12330   { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
12331   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
12332   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
12333   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
12334   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
12335   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
12336   { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
12337 };
12338
12339 static const struct builtin_description bdesc_2arg[] =
12340 {
12341   /* SSE */
12342   { MASK_SSE1, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, 0, 0 },
12343   { MASK_SSE1, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, 0, 0 },
12344   { MASK_SSE1, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, 0, 0 },
12345   { MASK_SSE1, CODE_FOR_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, 0, 0 },
12346   { MASK_SSE1, CODE_FOR_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, 0, 0 },
12347   { MASK_SSE1, CODE_FOR_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, 0, 0 },
12348   { MASK_SSE1, CODE_FOR_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, 0, 0 },
12349   { MASK_SSE1, CODE_FOR_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, 0, 0 },
12350
12351   { MASK_SSE1, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, 0 },
12352   { MASK_SSE1, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, 0 },
12353   { MASK_SSE1, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, 0 },
12354   { MASK_SSE1, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, 1 },
12355   { MASK_SSE1, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, 1 },
12356   { MASK_SSE1, CODE_FOR_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, 0 },
12357   { MASK_SSE1, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, EQ, 0 },
12358   { MASK_SSE1, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, LT, 0 },
12359   { MASK_SSE1, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, LE, 0 },
12360   { MASK_SSE1, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, LT, 1 },
12361   { MASK_SSE1, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, LE, 1 },
12362   { MASK_SSE1, CODE_FOR_maskncmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, UNORDERED, 0 },
12363   { MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, 0 },
12364   { MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, 0 },
12365   { MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, 0 },
12366   { MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, 0 },
12367   { MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, EQ, 0 },
12368   { MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, LT, 0 },
12369   { MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, LE, 0 },
12370   { MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, UNORDERED, 0 },
12371
12372   { MASK_SSE1, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, 0, 0 },
12373   { MASK_SSE1, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, 0, 0 },
12374   { MASK_SSE1, CODE_FOR_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, 0, 0 },
12375   { MASK_SSE1, CODE_FOR_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, 0, 0 },
12376
12377   { MASK_SSE1, CODE_FOR_sse_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, 0, 0 },
12378   { MASK_SSE1, CODE_FOR_sse_nandv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, 0, 0 },
12379   { MASK_SSE1, CODE_FOR_sse_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, 0, 0 },
12380   { MASK_SSE1, CODE_FOR_sse_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, 0, 0 },
12381
12382   { MASK_SSE1, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, 0, 0 },
12383   { MASK_SSE1, CODE_FOR_sse_movhlps,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, 0, 0 },
12384   { MASK_SSE1, CODE_FOR_sse_movlhps,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, 0, 0 },
12385   { MASK_SSE1, CODE_FOR_sse_unpckhps, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, 0, 0 },
12386   { MASK_SSE1, CODE_FOR_sse_unpcklps, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, 0, 0 },
12387
12388   /* MMX */
12389   { MASK_MMX, CODE_FOR_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, 0, 0 },
12390   { MASK_MMX, CODE_FOR_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, 0, 0 },
12391   { MASK_MMX, CODE_FOR_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, 0, 0 },
12392   { MASK_MMX, CODE_FOR_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, 0, 0 },
12393   { MASK_MMX, CODE_FOR_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, 0, 0 },
12394   { MASK_MMX, CODE_FOR_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, 0, 0 },
12395
12396   { MASK_MMX, CODE_FOR_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, 0, 0 },
12397   { MASK_MMX, CODE_FOR_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, 0, 0 },
12398   { MASK_MMX, CODE_FOR_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, 0, 0 },
12399   { MASK_MMX, CODE_FOR_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, 0, 0 },
12400   { MASK_MMX, CODE_FOR_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, 0, 0 },
12401   { MASK_MMX, CODE_FOR_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, 0, 0 },
12402   { MASK_MMX, CODE_FOR_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, 0, 0 },
12403   { MASK_MMX, CODE_FOR_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, 0, 0 },
12404
12405   { MASK_MMX, CODE_FOR_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, 0, 0 },
12406   { MASK_MMX, CODE_FOR_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, 0, 0 },
12407   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_umulv4hi3_highpart, "__builtin_ia32_pmulhuw", IX86_BUILTIN_PMULHUW, 0, 0 },
12408
12409   { MASK_MMX, CODE_FOR_mmx_anddi3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, 0, 0 },
12410   { MASK_MMX, CODE_FOR_mmx_nanddi3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, 0, 0 },
12411   { MASK_MMX, CODE_FOR_mmx_iordi3, "__builtin_ia32_por", IX86_BUILTIN_POR, 0, 0 },
12412   { MASK_MMX, CODE_FOR_mmx_xordi3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, 0, 0 },
12413
12414   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgb", IX86_BUILTIN_PAVGB, 0, 0 },
12415   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_mmx_uavgv4hi3, "__builtin_ia32_pavgw", IX86_BUILTIN_PAVGW, 0, 0 },
12416
12417   { MASK_MMX, CODE_FOR_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, 0, 0 },
12418   { MASK_MMX, CODE_FOR_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, 0, 0 },
12419   { MASK_MMX, CODE_FOR_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, 0, 0 },
12420   { MASK_MMX, CODE_FOR_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, 0, 0 },
12421   { MASK_MMX, CODE_FOR_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, 0, 0 },
12422   { MASK_MMX, CODE_FOR_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, 0, 0 },
12423
12424   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_umaxv8qi3, "__builtin_ia32_pmaxub", IX86_BUILTIN_PMAXUB, 0, 0 },
12425   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_smaxv4hi3, "__builtin_ia32_pmaxsw", IX86_BUILTIN_PMAXSW, 0, 0 },
12426   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_uminv8qi3, "__builtin_ia32_pminub", IX86_BUILTIN_PMINUB, 0, 0 },
12427   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_sminv4hi3, "__builtin_ia32_pminsw", IX86_BUILTIN_PMINSW, 0, 0 },
12428
12429   { MASK_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, 0, 0 },
12430   { MASK_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, 0, 0 },
12431   { MASK_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, 0, 0 },
12432   { MASK_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, 0, 0 },
12433   { MASK_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, 0, 0 },
12434   { MASK_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, 0, 0 },
12435
12436   /* Special.  */
12437   { MASK_MMX, CODE_FOR_mmx_packsswb, 0, IX86_BUILTIN_PACKSSWB, 0, 0 },
12438   { MASK_MMX, CODE_FOR_mmx_packssdw, 0, IX86_BUILTIN_PACKSSDW, 0, 0 },
12439   { MASK_MMX, CODE_FOR_mmx_packuswb, 0, IX86_BUILTIN_PACKUSWB, 0, 0 },
12440
12441   { MASK_SSE1, CODE_FOR_cvtpi2ps, 0, IX86_BUILTIN_CVTPI2PS, 0, 0 },
12442   { MASK_SSE1, CODE_FOR_cvtsi2ss, 0, IX86_BUILTIN_CVTSI2SS, 0, 0 },
12443
12444   { MASK_MMX, CODE_FOR_ashlv4hi3, 0, IX86_BUILTIN_PSLLW, 0, 0 },
12445   { MASK_MMX, CODE_FOR_ashlv4hi3, 0, IX86_BUILTIN_PSLLWI, 0, 0 },
12446   { MASK_MMX, CODE_FOR_ashlv2si3, 0, IX86_BUILTIN_PSLLD, 0, 0 },
12447   { MASK_MMX, CODE_FOR_ashlv2si3, 0, IX86_BUILTIN_PSLLDI, 0, 0 },
12448   { MASK_MMX, CODE_FOR_mmx_ashldi3, 0, IX86_BUILTIN_PSLLQ, 0, 0 },
12449   { MASK_MMX, CODE_FOR_mmx_ashldi3, 0, IX86_BUILTIN_PSLLQI, 0, 0 },
12450
12451   { MASK_MMX, CODE_FOR_lshrv4hi3, 0, IX86_BUILTIN_PSRLW, 0, 0 },
12452   { MASK_MMX, CODE_FOR_lshrv4hi3, 0, IX86_BUILTIN_PSRLWI, 0, 0 },
12453   { MASK_MMX, CODE_FOR_lshrv2si3, 0, IX86_BUILTIN_PSRLD, 0, 0 },
12454   { MASK_MMX, CODE_FOR_lshrv2si3, 0, IX86_BUILTIN_PSRLDI, 0, 0 },
12455   { MASK_MMX, CODE_FOR_mmx_lshrdi3, 0, IX86_BUILTIN_PSRLQ, 0, 0 },
12456   { MASK_MMX, CODE_FOR_mmx_lshrdi3, 0, IX86_BUILTIN_PSRLQI, 0, 0 },
12457
12458   { MASK_MMX, CODE_FOR_ashrv4hi3, 0, IX86_BUILTIN_PSRAW, 0, 0 },
12459   { MASK_MMX, CODE_FOR_ashrv4hi3, 0, IX86_BUILTIN_PSRAWI, 0, 0 },
12460   { MASK_MMX, CODE_FOR_ashrv2si3, 0, IX86_BUILTIN_PSRAD, 0, 0 },
12461   { MASK_MMX, CODE_FOR_ashrv2si3, 0, IX86_BUILTIN_PSRADI, 0, 0 },
12462
12463   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_mmx_psadbw, 0, IX86_BUILTIN_PSADBW, 0, 0 },
12464   { MASK_MMX, CODE_FOR_mmx_pmaddwd, 0, IX86_BUILTIN_PMADDWD, 0, 0 },
12465
12466   /* SSE2 */
12467   { MASK_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, 0, 0 },
12468   { MASK_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, 0, 0 },
12469   { MASK_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, 0, 0 },
12470   { MASK_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, 0, 0 },
12471   { MASK_SSE2, CODE_FOR_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, 0, 0 },
12472   { MASK_SSE2, CODE_FOR_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, 0, 0 },
12473   { MASK_SSE2, CODE_FOR_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, 0, 0 },
12474   { MASK_SSE2, CODE_FOR_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, 0, 0 },
12475
12476   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, 0 },
12477   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, 0 },
12478   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, 0 },
12479   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, 1 },
12480   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, 1 },
12481   { MASK_SSE2, CODE_FOR_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, 0 },
12482   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, EQ, 0 },
12483   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, LT, 0 },
12484   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, LE, 0 },
12485   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, LT, 1 },
12486   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, LE, 1 },
12487   { MASK_SSE2, CODE_FOR_maskncmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, UNORDERED, 0 },
12488   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, 0 },
12489   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, 0 },
12490   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, 0 },
12491   { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, 0 },
12492   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, EQ, 0 },
12493   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, LT, 0 },
12494   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, LE, 0 },
12495   { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, UNORDERED, 0 },
12496
12497   { MASK_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, 0, 0 },
12498   { MASK_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, 0, 0 },
12499   { MASK_SSE2, CODE_FOR_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, 0, 0 },
12500   { MASK_SSE2, CODE_FOR_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, 0, 0 },
12501
12502   { MASK_SSE2, CODE_FOR_sse2_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, 0, 0 },
12503   { MASK_SSE2, CODE_FOR_sse2_nandv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, 0, 0 },
12504   { MASK_SSE2, CODE_FOR_sse2_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, 0, 0 },
12505   { MASK_SSE2, CODE_FOR_sse2_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, 0, 0 },
12506
12507   { MASK_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, 0, 0 },
12508   { MASK_SSE2, CODE_FOR_sse2_unpckhpd, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, 0, 0 },
12509   { MASK_SSE2, CODE_FOR_sse2_unpcklpd, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, 0, 0 },
12510
12511   /* SSE2 MMX */
12512   { MASK_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, 0, 0 },
12513   { MASK_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, 0, 0 },
12514   { MASK_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, 0, 0 },
12515   { MASK_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, 0, 0 },
12516   { MASK_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, 0, 0 },
12517   { MASK_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, 0, 0 },
12518   { MASK_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, 0, 0 },
12519   { MASK_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, 0, 0 },
12520
12521   { MASK_MMX, CODE_FOR_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, 0, 0 },
12522   { MASK_MMX, CODE_FOR_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, 0, 0 },
12523   { MASK_MMX, CODE_FOR_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, 0, 0 },
12524   { MASK_MMX, CODE_FOR_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, 0, 0 },
12525   { MASK_MMX, CODE_FOR_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, 0, 0 },
12526   { MASK_MMX, CODE_FOR_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, 0, 0 },
12527   { MASK_MMX, CODE_FOR_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, 0, 0 },
12528   { MASK_MMX, CODE_FOR_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, 0, 0 },
12529
12530   { MASK_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, 0, 0 },
12531   { MASK_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, 0, 0 },
12532   { MASK_SSE2, CODE_FOR_sse2_umulsidi3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, 0, 0 },
12533   { MASK_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, 0, 0 },
12534
12535   { MASK_SSE2, CODE_FOR_sse2_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, 0, 0 },
12536   { MASK_SSE2, CODE_FOR_sse2_nandv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, 0, 0 },
12537   { MASK_SSE2, CODE_FOR_sse2_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, 0, 0 },
12538   { MASK_SSE2, CODE_FOR_sse2_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, 0, 0 },
12539
12540   { MASK_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, 0, 0 },
12541   { MASK_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, 0, 0 },
12542
12543   { MASK_SSE2, CODE_FOR_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, 0, 0 },
12544   { MASK_SSE2, CODE_FOR_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, 0, 0 },
12545   { MASK_SSE2, CODE_FOR_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, 0, 0 },
12546   { MASK_SSE2, CODE_FOR_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, 0, 0 },
12547   { MASK_SSE2, CODE_FOR_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, 0, 0 },
12548   { MASK_SSE2, CODE_FOR_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, 0, 0 },
12549
12550   { MASK_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, 0, 0 },
12551   { MASK_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, 0, 0 },
12552   { MASK_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, 0, 0 },
12553   { MASK_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, 0, 0 },
12554
12555   { MASK_SSE2, CODE_FOR_sse2_punpckhbw, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, 0, 0 },
12556   { MASK_SSE2, CODE_FOR_sse2_punpckhwd, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, 0, 0 },
12557   { MASK_SSE2, CODE_FOR_sse2_punpckhdq, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, 0, 0 },
12558   { MASK_SSE2, CODE_FOR_sse2_punpckhqdq, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, 0, 0 },
12559   { MASK_SSE2, CODE_FOR_sse2_punpcklbw, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, 0, 0 },
12560   { MASK_SSE2, CODE_FOR_sse2_punpcklwd, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, 0, 0 },
12561   { MASK_SSE2, CODE_FOR_sse2_punpckldq, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, 0, 0 },
12562   { MASK_SSE2, CODE_FOR_sse2_punpcklqdq, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, 0, 0 },
12563
12564   { MASK_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, 0, 0 },
12565   { MASK_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, 0, 0 },
12566   { MASK_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, 0, 0 },
12567
12568   { MASK_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, 0, 0 },
12569   { MASK_SSE2, CODE_FOR_sse2_psadbw, 0, IX86_BUILTIN_PSADBW128, 0, 0 },
12570
12571   { MASK_SSE2, CODE_FOR_ashlv8hi3_ti, 0, IX86_BUILTIN_PSLLW128, 0, 0 },
12572   { MASK_SSE2, CODE_FOR_ashlv8hi3, 0, IX86_BUILTIN_PSLLWI128, 0, 0 },
12573   { MASK_SSE2, CODE_FOR_ashlv4si3_ti, 0, IX86_BUILTIN_PSLLD128, 0, 0 },
12574   { MASK_SSE2, CODE_FOR_ashlv4si3, 0, IX86_BUILTIN_PSLLDI128, 0, 0 },
12575   { MASK_SSE2, CODE_FOR_ashlv2di3_ti, 0, IX86_BUILTIN_PSLLQ128, 0, 0 },
12576   { MASK_SSE2, CODE_FOR_ashlv2di3, 0, IX86_BUILTIN_PSLLQI128, 0, 0 },
12577
12578   { MASK_SSE2, CODE_FOR_lshrv8hi3_ti, 0, IX86_BUILTIN_PSRLW128, 0, 0 },
12579   { MASK_SSE2, CODE_FOR_lshrv8hi3, 0, IX86_BUILTIN_PSRLWI128, 0, 0 },
12580   { MASK_SSE2, CODE_FOR_lshrv4si3_ti, 0, IX86_BUILTIN_PSRLD128, 0, 0 },
12581   { MASK_SSE2, CODE_FOR_lshrv4si3, 0, IX86_BUILTIN_PSRLDI128, 0, 0 },
12582   { MASK_SSE2, CODE_FOR_lshrv2di3_ti, 0, IX86_BUILTIN_PSRLQ128, 0, 0 },
12583   { MASK_SSE2, CODE_FOR_lshrv2di3, 0, IX86_BUILTIN_PSRLQI128, 0, 0 },
12584
12585   { MASK_SSE2, CODE_FOR_ashrv8hi3_ti, 0, IX86_BUILTIN_PSRAW128, 0, 0 },
12586   { MASK_SSE2, CODE_FOR_ashrv8hi3, 0, IX86_BUILTIN_PSRAWI128, 0, 0 },
12587   { MASK_SSE2, CODE_FOR_ashrv4si3_ti, 0, IX86_BUILTIN_PSRAD128, 0, 0 },
12588   { MASK_SSE2, CODE_FOR_ashrv4si3, 0, IX86_BUILTIN_PSRADI128, 0, 0 },
12589
12590   { MASK_SSE2, CODE_FOR_sse2_pmaddwd, 0, IX86_BUILTIN_PMADDWD128, 0, 0 },
12591
12592   { MASK_SSE2, CODE_FOR_cvtsi2sd, 0, IX86_BUILTIN_CVTSI2SD, 0, 0 },
12593   { MASK_SSE2, CODE_FOR_cvtsd2ss, 0, IX86_BUILTIN_CVTSD2SS, 0, 0 },
12594   { MASK_SSE2, CODE_FOR_cvtss2sd, 0, IX86_BUILTIN_CVTSS2SD, 0, 0 }
12595 };
12596
12597 static const struct builtin_description bdesc_1arg[] =
12598 {
12599   { MASK_SSE1 | MASK_3DNOW_A, CODE_FOR_mmx_pmovmskb, 0, IX86_BUILTIN_PMOVMSKB, 0, 0 },
12600   { MASK_SSE1, CODE_FOR_sse_movmskps, 0, IX86_BUILTIN_MOVMSKPS, 0, 0 },
12601
12602   { MASK_SSE1, CODE_FOR_sqrtv4sf2, 0, IX86_BUILTIN_SQRTPS, 0, 0 },
12603   { MASK_SSE1, CODE_FOR_rsqrtv4sf2, 0, IX86_BUILTIN_RSQRTPS, 0, 0 },
12604   { MASK_SSE1, CODE_FOR_rcpv4sf2, 0, IX86_BUILTIN_RCPPS, 0, 0 },
12605
12606   { MASK_SSE1, CODE_FOR_cvtps2pi, 0, IX86_BUILTIN_CVTPS2PI, 0, 0 },
12607   { MASK_SSE1, CODE_FOR_cvtss2si, 0, IX86_BUILTIN_CVTSS2SI, 0, 0 },
12608   { MASK_SSE1, CODE_FOR_cvttps2pi, 0, IX86_BUILTIN_CVTTPS2PI, 0, 0 },
12609   { MASK_SSE1, CODE_FOR_cvttss2si, 0, IX86_BUILTIN_CVTTSS2SI, 0, 0 },
12610
12611   { MASK_SSE2, CODE_FOR_sse2_pmovmskb, 0, IX86_BUILTIN_PMOVMSKB128, 0, 0 },
12612   { MASK_SSE2, CODE_FOR_sse2_movmskpd, 0, IX86_BUILTIN_MOVMSKPD, 0, 0 },
12613   { MASK_SSE2, CODE_FOR_sse2_movq2dq, 0, IX86_BUILTIN_MOVQ2DQ, 0, 0 },
12614   { MASK_SSE2, CODE_FOR_sse2_movdq2q, 0, IX86_BUILTIN_MOVDQ2Q, 0, 0 },
12615
12616   { MASK_SSE2, CODE_FOR_sqrtv2df2, 0, IX86_BUILTIN_SQRTPD, 0, 0 },
12617
12618   { MASK_SSE2, CODE_FOR_cvtdq2pd, 0, IX86_BUILTIN_CVTDQ2PD, 0, 0 },
12619   { MASK_SSE2, CODE_FOR_cvtdq2ps, 0, IX86_BUILTIN_CVTDQ2PS, 0, 0 },
12620
12621   { MASK_SSE2, CODE_FOR_cvtpd2dq, 0, IX86_BUILTIN_CVTPD2DQ, 0, 0 },
12622   { MASK_SSE2, CODE_FOR_cvtpd2pi, 0, IX86_BUILTIN_CVTPD2PI, 0, 0 },
12623   { MASK_SSE2, CODE_FOR_cvtpd2ps, 0, IX86_BUILTIN_CVTPD2PS, 0, 0 },
12624   { MASK_SSE2, CODE_FOR_cvttpd2dq, 0, IX86_BUILTIN_CVTTPD2DQ, 0, 0 },
12625   { MASK_SSE2, CODE_FOR_cvttpd2pi, 0, IX86_BUILTIN_CVTTPD2PI, 0, 0 },
12626
12627   { MASK_SSE2, CODE_FOR_cvtpi2pd, 0, IX86_BUILTIN_CVTPI2PD, 0, 0 },
12628
12629   { MASK_SSE2, CODE_FOR_cvtsd2si, 0, IX86_BUILTIN_CVTSD2SI, 0, 0 },
12630   { MASK_SSE2, CODE_FOR_cvttsd2si, 0, IX86_BUILTIN_CVTTSD2SI, 0, 0 },
12631
12632   { MASK_SSE2, CODE_FOR_cvtps2dq, 0, IX86_BUILTIN_CVTPS2DQ, 0, 0 },
12633   { MASK_SSE2, CODE_FOR_cvtps2pd, 0, IX86_BUILTIN_CVTPS2PD, 0, 0 },
12634   { MASK_SSE2, CODE_FOR_cvttps2dq, 0, IX86_BUILTIN_CVTTPS2DQ, 0, 0 },
12635
12636   { MASK_SSE2, CODE_FOR_sse2_movq, 0, IX86_BUILTIN_MOVQ, 0, 0 }
12637 };
12638
12639 void
12640 ix86_init_builtins ()
12641 {
12642   if (TARGET_MMX)
12643     ix86_init_mmx_sse_builtins ();
12644 }
12645
12646 /* Set up all the MMX/SSE builtins.  This is not called if TARGET_MMX
12647    is zero.  Otherwise, if TARGET_SSE is not set, only expand the MMX
12648    builtins.  */
12649 static void
12650 ix86_init_mmx_sse_builtins ()
12651 {
12652   const struct builtin_description * d;
12653   size_t i;
12654
12655   tree pchar_type_node = build_pointer_type (char_type_node);
12656   tree pcchar_type_node = build_pointer_type (
12657                              build_type_variant (char_type_node, 1, 0));
12658   tree pfloat_type_node = build_pointer_type (float_type_node);
12659   tree pcfloat_type_node = build_pointer_type (
12660                              build_type_variant (float_type_node, 1, 0));
12661   tree pv2si_type_node = build_pointer_type (V2SI_type_node);
12662   tree pv2di_type_node = build_pointer_type (V2DI_type_node);
12663   tree pdi_type_node = build_pointer_type (long_long_unsigned_type_node);
12664
12665   /* Comparisons.  */
12666   tree int_ftype_v4sf_v4sf
12667     = build_function_type_list (integer_type_node,
12668                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
12669   tree v4si_ftype_v4sf_v4sf
12670     = build_function_type_list (V4SI_type_node,
12671                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
12672   /* MMX/SSE/integer conversions.  */
12673   tree int_ftype_v4sf
12674     = build_function_type_list (integer_type_node,
12675                                 V4SF_type_node, NULL_TREE);
12676   tree int_ftype_v8qi
12677     = build_function_type_list (integer_type_node, V8QI_type_node, NULL_TREE);
12678   tree v4sf_ftype_v4sf_int
12679     = build_function_type_list (V4SF_type_node,
12680                                 V4SF_type_node, integer_type_node, NULL_TREE);
12681   tree v4sf_ftype_v4sf_v2si
12682     = build_function_type_list (V4SF_type_node,
12683                                 V4SF_type_node, V2SI_type_node, NULL_TREE);
12684   tree int_ftype_v4hi_int
12685     = build_function_type_list (integer_type_node,
12686                                 V4HI_type_node, integer_type_node, NULL_TREE);
12687   tree v4hi_ftype_v4hi_int_int
12688     = build_function_type_list (V4HI_type_node, V4HI_type_node,
12689                                 integer_type_node, integer_type_node,
12690                                 NULL_TREE);
12691   /* Miscellaneous.  */
12692   tree v8qi_ftype_v4hi_v4hi
12693     = build_function_type_list (V8QI_type_node,
12694                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
12695   tree v4hi_ftype_v2si_v2si
12696     = build_function_type_list (V4HI_type_node,
12697                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
12698   tree v4sf_ftype_v4sf_v4sf_int
12699     = build_function_type_list (V4SF_type_node,
12700                                 V4SF_type_node, V4SF_type_node,
12701                                 integer_type_node, NULL_TREE);
12702   tree v2si_ftype_v4hi_v4hi
12703     = build_function_type_list (V2SI_type_node,
12704                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
12705   tree v4hi_ftype_v4hi_int
12706     = build_function_type_list (V4HI_type_node,
12707                                 V4HI_type_node, integer_type_node, NULL_TREE);
12708   tree v4hi_ftype_v4hi_di
12709     = build_function_type_list (V4HI_type_node,
12710                                 V4HI_type_node, long_long_unsigned_type_node,
12711                                 NULL_TREE);
12712   tree v2si_ftype_v2si_di
12713     = build_function_type_list (V2SI_type_node,
12714                                 V2SI_type_node, long_long_unsigned_type_node,
12715                                 NULL_TREE);
12716   tree void_ftype_void
12717     = build_function_type (void_type_node, void_list_node);
12718   tree void_ftype_unsigned
12719     = build_function_type_list (void_type_node, unsigned_type_node, NULL_TREE);
12720   tree unsigned_ftype_void
12721     = build_function_type (unsigned_type_node, void_list_node);
12722   tree di_ftype_void
12723     = build_function_type (long_long_unsigned_type_node, void_list_node);
12724   tree v4sf_ftype_void
12725     = build_function_type (V4SF_type_node, void_list_node);
12726   tree v2si_ftype_v4sf
12727     = build_function_type_list (V2SI_type_node, V4SF_type_node, NULL_TREE);
12728   /* Loads/stores.  */
12729   tree void_ftype_v8qi_v8qi_pchar
12730     = build_function_type_list (void_type_node,
12731                                 V8QI_type_node, V8QI_type_node,
12732                                 pchar_type_node, NULL_TREE);
12733   tree v4sf_ftype_pcfloat
12734     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
12735   /* @@@ the type is bogus */
12736   tree v4sf_ftype_v4sf_pv2si
12737     = build_function_type_list (V4SF_type_node,
12738                                 V4SF_type_node, pv2si_type_node, NULL_TREE);
12739   tree void_ftype_pv2si_v4sf
12740     = build_function_type_list (void_type_node,
12741                                 pv2si_type_node, V4SF_type_node, NULL_TREE);
12742   tree void_ftype_pfloat_v4sf
12743     = build_function_type_list (void_type_node,
12744                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
12745   tree void_ftype_pdi_di
12746     = build_function_type_list (void_type_node,
12747                                 pdi_type_node, long_long_unsigned_type_node,
12748                                 NULL_TREE);
12749   tree void_ftype_pv2di_v2di
12750     = build_function_type_list (void_type_node,
12751                                 pv2di_type_node, V2DI_type_node, NULL_TREE);
12752   /* Normal vector unops.  */
12753   tree v4sf_ftype_v4sf
12754     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
12755
12756   /* Normal vector binops.  */
12757   tree v4sf_ftype_v4sf_v4sf
12758     = build_function_type_list (V4SF_type_node,
12759                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
12760   tree v8qi_ftype_v8qi_v8qi
12761     = build_function_type_list (V8QI_type_node,
12762                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
12763   tree v4hi_ftype_v4hi_v4hi
12764     = build_function_type_list (V4HI_type_node,
12765                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
12766   tree v2si_ftype_v2si_v2si
12767     = build_function_type_list (V2SI_type_node,
12768                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
12769   tree di_ftype_di_di
12770     = build_function_type_list (long_long_unsigned_type_node,
12771                                 long_long_unsigned_type_node,
12772                                 long_long_unsigned_type_node, NULL_TREE);
12773
12774   tree v2si_ftype_v2sf
12775     = build_function_type_list (V2SI_type_node, V2SF_type_node, NULL_TREE);
12776   tree v2sf_ftype_v2si
12777     = build_function_type_list (V2SF_type_node, V2SI_type_node, NULL_TREE);
12778   tree v2si_ftype_v2si
12779     = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
12780   tree v2sf_ftype_v2sf
12781     = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
12782   tree v2sf_ftype_v2sf_v2sf
12783     = build_function_type_list (V2SF_type_node,
12784                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
12785   tree v2si_ftype_v2sf_v2sf
12786     = build_function_type_list (V2SI_type_node,
12787                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
12788   tree pint_type_node    = build_pointer_type (integer_type_node);
12789   tree pcint_type_node = build_pointer_type (
12790                              build_type_variant (integer_type_node, 1, 0));
12791   tree pdouble_type_node = build_pointer_type (double_type_node);
12792   tree pcdouble_type_node = build_pointer_type (
12793                                 build_type_variant (double_type_node, 1, 0));
12794   tree int_ftype_v2df_v2df
12795     = build_function_type_list (integer_type_node,
12796                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
12797
12798   tree ti_ftype_void
12799     = build_function_type (intTI_type_node, void_list_node);
12800   tree v2di_ftype_void
12801     = build_function_type (V2DI_type_node, void_list_node);
12802   tree ti_ftype_ti_ti
12803     = build_function_type_list (intTI_type_node,
12804                                 intTI_type_node, intTI_type_node, NULL_TREE);
12805   tree void_ftype_pcvoid
12806     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
12807   tree v2di_ftype_di
12808     = build_function_type_list (V2DI_type_node,
12809                                 long_long_unsigned_type_node, NULL_TREE);
12810   tree di_ftype_v2di
12811     = build_function_type_list (long_long_unsigned_type_node,
12812                                 V2DI_type_node, NULL_TREE);
12813   tree v4sf_ftype_v4si
12814     = build_function_type_list (V4SF_type_node, V4SI_type_node, NULL_TREE);
12815   tree v4si_ftype_v4sf
12816     = build_function_type_list (V4SI_type_node, V4SF_type_node, NULL_TREE);
12817   tree v2df_ftype_v4si
12818     = build_function_type_list (V2DF_type_node, V4SI_type_node, NULL_TREE);
12819   tree v4si_ftype_v2df
12820     = build_function_type_list (V4SI_type_node, V2DF_type_node, NULL_TREE);
12821   tree v2si_ftype_v2df
12822     = build_function_type_list (V2SI_type_node, V2DF_type_node, NULL_TREE);
12823   tree v4sf_ftype_v2df
12824     = build_function_type_list (V4SF_type_node, V2DF_type_node, NULL_TREE);
12825   tree v2df_ftype_v2si
12826     = build_function_type_list (V2DF_type_node, V2SI_type_node, NULL_TREE);
12827   tree v2df_ftype_v4sf
12828     = build_function_type_list (V2DF_type_node, V4SF_type_node, NULL_TREE);
12829   tree int_ftype_v2df
12830     = build_function_type_list (integer_type_node, V2DF_type_node, NULL_TREE);
12831   tree v2df_ftype_v2df_int
12832     = build_function_type_list (V2DF_type_node,
12833                                 V2DF_type_node, integer_type_node, NULL_TREE);
12834   tree v4sf_ftype_v4sf_v2df
12835     = build_function_type_list (V4SF_type_node,
12836                                 V4SF_type_node, V2DF_type_node, NULL_TREE);
12837   tree v2df_ftype_v2df_v4sf
12838     = build_function_type_list (V2DF_type_node,
12839                                 V2DF_type_node, V4SF_type_node, NULL_TREE);
12840   tree v2df_ftype_v2df_v2df_int
12841     = build_function_type_list (V2DF_type_node,
12842                                 V2DF_type_node, V2DF_type_node,
12843                                 integer_type_node,
12844                                 NULL_TREE);
12845   tree v2df_ftype_v2df_pv2si
12846     = build_function_type_list (V2DF_type_node,
12847                                 V2DF_type_node, pv2si_type_node, NULL_TREE);
12848   tree void_ftype_pv2si_v2df
12849     = build_function_type_list (void_type_node,
12850                                 pv2si_type_node, V2DF_type_node, NULL_TREE);
12851   tree void_ftype_pdouble_v2df
12852     = build_function_type_list (void_type_node,
12853                                 pdouble_type_node, V2DF_type_node, NULL_TREE);
12854   tree void_ftype_pint_int
12855     = build_function_type_list (void_type_node,
12856                                 pint_type_node, integer_type_node, NULL_TREE);
12857   tree void_ftype_v16qi_v16qi_pchar
12858     = build_function_type_list (void_type_node,
12859                                 V16QI_type_node, V16QI_type_node,
12860                                 pchar_type_node, NULL_TREE);
12861   tree v2df_ftype_pcdouble
12862     = build_function_type_list (V2DF_type_node, pcdouble_type_node, NULL_TREE);
12863   tree v2df_ftype_v2df_v2df
12864     = build_function_type_list (V2DF_type_node,
12865                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
12866   tree v16qi_ftype_v16qi_v16qi
12867     = build_function_type_list (V16QI_type_node,
12868                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
12869   tree v8hi_ftype_v8hi_v8hi
12870     = build_function_type_list (V8HI_type_node,
12871                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
12872   tree v4si_ftype_v4si_v4si
12873     = build_function_type_list (V4SI_type_node,
12874                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
12875   tree v2di_ftype_v2di_v2di
12876     = build_function_type_list (V2DI_type_node,
12877                                 V2DI_type_node, V2DI_type_node, NULL_TREE);
12878   tree v2di_ftype_v2df_v2df
12879     = build_function_type_list (V2DI_type_node,
12880                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
12881   tree v2df_ftype_v2df
12882     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
12883   tree v2df_ftype_double
12884     = build_function_type_list (V2DF_type_node, double_type_node, NULL_TREE);
12885   tree v2df_ftype_double_double
12886     = build_function_type_list (V2DF_type_node,
12887                                 double_type_node, double_type_node, NULL_TREE);
12888   tree int_ftype_v8hi_int
12889     = build_function_type_list (integer_type_node,
12890                                 V8HI_type_node, integer_type_node, NULL_TREE);
12891   tree v8hi_ftype_v8hi_int_int
12892     = build_function_type_list (V8HI_type_node,
12893                                 V8HI_type_node, integer_type_node,
12894                                 integer_type_node, NULL_TREE);
12895   tree v2di_ftype_v2di_int
12896     = build_function_type_list (V2DI_type_node,
12897                                 V2DI_type_node, integer_type_node, NULL_TREE);
12898   tree v4si_ftype_v4si_int
12899     = build_function_type_list (V4SI_type_node,
12900                                 V4SI_type_node, integer_type_node, NULL_TREE);
12901   tree v8hi_ftype_v8hi_int
12902     = build_function_type_list (V8HI_type_node,
12903                                 V8HI_type_node, integer_type_node, NULL_TREE);
12904   tree v8hi_ftype_v8hi_v2di
12905     = build_function_type_list (V8HI_type_node,
12906                                 V8HI_type_node, V2DI_type_node, NULL_TREE);
12907   tree v4si_ftype_v4si_v2di
12908     = build_function_type_list (V4SI_type_node,
12909                                 V4SI_type_node, V2DI_type_node, NULL_TREE);
12910   tree v4si_ftype_v8hi_v8hi
12911     = build_function_type_list (V4SI_type_node,
12912                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
12913   tree di_ftype_v8qi_v8qi
12914     = build_function_type_list (long_long_unsigned_type_node,
12915                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
12916   tree v2di_ftype_v16qi_v16qi
12917     = build_function_type_list (V2DI_type_node,
12918                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
12919   tree int_ftype_v16qi
12920     = build_function_type_list (integer_type_node, V16QI_type_node, NULL_TREE);
12921   tree v16qi_ftype_pcchar
12922     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
12923   tree void_ftype_pchar_v16qi
12924     = build_function_type_list (void_type_node,
12925                                 pchar_type_node, V16QI_type_node, NULL_TREE);
12926   tree v4si_ftype_pcint
12927     = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
12928   tree void_ftype_pcint_v4si
12929     = build_function_type_list (void_type_node,
12930                                 pcint_type_node, V4SI_type_node, NULL_TREE);
12931   tree v2di_ftype_v2di
12932     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
12933
12934   /* Add all builtins that are more or less simple operations on two
12935      operands.  */
12936   for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
12937     {
12938       /* Use one of the operands; the target can have a different mode for
12939          mask-generating compares.  */
12940       enum machine_mode mode;
12941       tree type;
12942
12943       if (d->name == 0)
12944         continue;
12945       mode = insn_data[d->icode].operand[1].mode;
12946
12947       switch (mode)
12948         {
12949         case V16QImode:
12950           type = v16qi_ftype_v16qi_v16qi;
12951           break;
12952         case V8HImode:
12953           type = v8hi_ftype_v8hi_v8hi;
12954           break;
12955         case V4SImode:
12956           type = v4si_ftype_v4si_v4si;
12957           break;
12958         case V2DImode:
12959           type = v2di_ftype_v2di_v2di;
12960           break;
12961         case V2DFmode:
12962           type = v2df_ftype_v2df_v2df;
12963           break;
12964         case TImode:
12965           type = ti_ftype_ti_ti;
12966           break;
12967         case V4SFmode:
12968           type = v4sf_ftype_v4sf_v4sf;
12969           break;
12970         case V8QImode:
12971           type = v8qi_ftype_v8qi_v8qi;
12972           break;
12973         case V4HImode:
12974           type = v4hi_ftype_v4hi_v4hi;
12975           break;
12976         case V2SImode:
12977           type = v2si_ftype_v2si_v2si;
12978           break;
12979         case DImode:
12980           type = di_ftype_di_di;
12981           break;
12982
12983         default:
12984           abort ();
12985         }
12986
12987       /* Override for comparisons.  */
12988       if (d->icode == CODE_FOR_maskcmpv4sf3
12989           || d->icode == CODE_FOR_maskncmpv4sf3
12990           || d->icode == CODE_FOR_vmmaskcmpv4sf3
12991           || d->icode == CODE_FOR_vmmaskncmpv4sf3)
12992         type = v4si_ftype_v4sf_v4sf;
12993
12994       if (d->icode == CODE_FOR_maskcmpv2df3
12995           || d->icode == CODE_FOR_maskncmpv2df3
12996           || d->icode == CODE_FOR_vmmaskcmpv2df3
12997           || d->icode == CODE_FOR_vmmaskncmpv2df3)
12998         type = v2di_ftype_v2df_v2df;
12999
13000       def_builtin (d->mask, d->name, type, d->code);
13001     }
13002
13003   /* Add the remaining MMX insns with somewhat more complicated types.  */
13004   def_builtin (MASK_MMX, "__builtin_ia32_mmx_zero", di_ftype_void, IX86_BUILTIN_MMX_ZERO);
13005   def_builtin (MASK_MMX, "__builtin_ia32_emms", void_ftype_void, IX86_BUILTIN_EMMS);
13006   def_builtin (MASK_MMX, "__builtin_ia32_psllw", v4hi_ftype_v4hi_di, IX86_BUILTIN_PSLLW);
13007   def_builtin (MASK_MMX, "__builtin_ia32_pslld", v2si_ftype_v2si_di, IX86_BUILTIN_PSLLD);
13008   def_builtin (MASK_MMX, "__builtin_ia32_psllq", di_ftype_di_di, IX86_BUILTIN_PSLLQ);
13009
13010   def_builtin (MASK_MMX, "__builtin_ia32_psrlw", v4hi_ftype_v4hi_di, IX86_BUILTIN_PSRLW);
13011   def_builtin (MASK_MMX, "__builtin_ia32_psrld", v2si_ftype_v2si_di, IX86_BUILTIN_PSRLD);
13012   def_builtin (MASK_MMX, "__builtin_ia32_psrlq", di_ftype_di_di, IX86_BUILTIN_PSRLQ);
13013
13014   def_builtin (MASK_MMX, "__builtin_ia32_psraw", v4hi_ftype_v4hi_di, IX86_BUILTIN_PSRAW);
13015   def_builtin (MASK_MMX, "__builtin_ia32_psrad", v2si_ftype_v2si_di, IX86_BUILTIN_PSRAD);
13016
13017   def_builtin (MASK_MMX, "__builtin_ia32_pshufw", v4hi_ftype_v4hi_int, IX86_BUILTIN_PSHUFW);
13018   def_builtin (MASK_MMX, "__builtin_ia32_pmaddwd", v2si_ftype_v4hi_v4hi, IX86_BUILTIN_PMADDWD);
13019
13020   /* comi/ucomi insns.  */
13021   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
13022     if (d->mask == MASK_SSE2)
13023       def_builtin (d->mask, d->name, int_ftype_v2df_v2df, d->code);
13024     else
13025       def_builtin (d->mask, d->name, int_ftype_v4sf_v4sf, d->code);
13026
13027   def_builtin (MASK_MMX, "__builtin_ia32_packsswb", v8qi_ftype_v4hi_v4hi, IX86_BUILTIN_PACKSSWB);
13028   def_builtin (MASK_MMX, "__builtin_ia32_packssdw", v4hi_ftype_v2si_v2si, IX86_BUILTIN_PACKSSDW);
13029   def_builtin (MASK_MMX, "__builtin_ia32_packuswb", v8qi_ftype_v4hi_v4hi, IX86_BUILTIN_PACKUSWB);
13030
13031   def_builtin (MASK_SSE1, "__builtin_ia32_ldmxcsr", void_ftype_unsigned, IX86_BUILTIN_LDMXCSR);
13032   def_builtin (MASK_SSE1, "__builtin_ia32_stmxcsr", unsigned_ftype_void, IX86_BUILTIN_STMXCSR);
13033   def_builtin (MASK_SSE1, "__builtin_ia32_cvtpi2ps", v4sf_ftype_v4sf_v2si, IX86_BUILTIN_CVTPI2PS);
13034   def_builtin (MASK_SSE1, "__builtin_ia32_cvtps2pi", v2si_ftype_v4sf, IX86_BUILTIN_CVTPS2PI);
13035   def_builtin (MASK_SSE1, "__builtin_ia32_cvtsi2ss", v4sf_ftype_v4sf_int, IX86_BUILTIN_CVTSI2SS);
13036   def_builtin (MASK_SSE1, "__builtin_ia32_cvtss2si", int_ftype_v4sf, IX86_BUILTIN_CVTSS2SI);
13037   def_builtin (MASK_SSE1, "__builtin_ia32_cvttps2pi", v2si_ftype_v4sf, IX86_BUILTIN_CVTTPS2PI);
13038   def_builtin (MASK_SSE1, "__builtin_ia32_cvttss2si", int_ftype_v4sf, IX86_BUILTIN_CVTTSS2SI);
13039
13040   def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_pextrw", int_ftype_v4hi_int, IX86_BUILTIN_PEXTRW);
13041   def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_pinsrw", v4hi_ftype_v4hi_int_int, IX86_BUILTIN_PINSRW);
13042
13043   def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_maskmovq", void_ftype_v8qi_v8qi_pchar, IX86_BUILTIN_MASKMOVQ);
13044
13045   def_builtin (MASK_SSE1, "__builtin_ia32_loadaps", v4sf_ftype_pcfloat, IX86_BUILTIN_LOADAPS);
13046   def_builtin (MASK_SSE1, "__builtin_ia32_loadups", v4sf_ftype_pcfloat, IX86_BUILTIN_LOADUPS);
13047   def_builtin (MASK_SSE1, "__builtin_ia32_loadss", v4sf_ftype_pcfloat, IX86_BUILTIN_LOADSS);
13048   def_builtin (MASK_SSE1, "__builtin_ia32_storeaps", void_ftype_pfloat_v4sf, IX86_BUILTIN_STOREAPS);
13049   def_builtin (MASK_SSE1, "__builtin_ia32_storeups", void_ftype_pfloat_v4sf, IX86_BUILTIN_STOREUPS);
13050   def_builtin (MASK_SSE1, "__builtin_ia32_storess", void_ftype_pfloat_v4sf, IX86_BUILTIN_STORESS);
13051
13052   def_builtin (MASK_SSE1, "__builtin_ia32_loadhps", v4sf_ftype_v4sf_pv2si, IX86_BUILTIN_LOADHPS);
13053   def_builtin (MASK_SSE1, "__builtin_ia32_loadlps", v4sf_ftype_v4sf_pv2si, IX86_BUILTIN_LOADLPS);
13054   def_builtin (MASK_SSE1, "__builtin_ia32_storehps", void_ftype_pv2si_v4sf, IX86_BUILTIN_STOREHPS);
13055   def_builtin (MASK_SSE1, "__builtin_ia32_storelps", void_ftype_pv2si_v4sf, IX86_BUILTIN_STORELPS);
13056
13057   def_builtin (MASK_SSE1, "__builtin_ia32_movmskps", int_ftype_v4sf, IX86_BUILTIN_MOVMSKPS);
13058   def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_pmovmskb", int_ftype_v8qi, IX86_BUILTIN_PMOVMSKB);
13059   def_builtin (MASK_SSE1, "__builtin_ia32_movntps", void_ftype_pfloat_v4sf, IX86_BUILTIN_MOVNTPS);
13060   def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_movntq", void_ftype_pdi_di, IX86_BUILTIN_MOVNTQ);
13061
13062   def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_sfence", void_ftype_void, IX86_BUILTIN_SFENCE);
13063
13064   def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_psadbw", di_ftype_v8qi_v8qi, IX86_BUILTIN_PSADBW);
13065
13066   def_builtin (MASK_SSE1, "__builtin_ia32_rcpps", v4sf_ftype_v4sf, IX86_BUILTIN_RCPPS);
13067   def_builtin (MASK_SSE1, "__builtin_ia32_rcpss", v4sf_ftype_v4sf, IX86_BUILTIN_RCPSS);
13068   def_builtin (MASK_SSE1, "__builtin_ia32_rsqrtps", v4sf_ftype_v4sf, IX86_BUILTIN_RSQRTPS);
13069   def_builtin (MASK_SSE1, "__builtin_ia32_rsqrtss", v4sf_ftype_v4sf, IX86_BUILTIN_RSQRTSS);
13070   def_builtin (MASK_SSE1, "__builtin_ia32_sqrtps", v4sf_ftype_v4sf, IX86_BUILTIN_SQRTPS);
13071   def_builtin (MASK_SSE1, "__builtin_ia32_sqrtss", v4sf_ftype_v4sf, IX86_BUILTIN_SQRTSS);
13072
13073   def_builtin (MASK_SSE1, "__builtin_ia32_shufps", v4sf_ftype_v4sf_v4sf_int, IX86_BUILTIN_SHUFPS);
13074
13075   /* Original 3DNow!  */
13076   def_builtin (MASK_3DNOW, "__builtin_ia32_femms", void_ftype_void, IX86_BUILTIN_FEMMS);
13077   def_builtin (MASK_3DNOW, "__builtin_ia32_pavgusb", v8qi_ftype_v8qi_v8qi, IX86_BUILTIN_PAVGUSB);
13078   def_builtin (MASK_3DNOW, "__builtin_ia32_pf2id", v2si_ftype_v2sf, IX86_BUILTIN_PF2ID);
13079   def_builtin (MASK_3DNOW, "__builtin_ia32_pfacc", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFACC);
13080   def_builtin (MASK_3DNOW, "__builtin_ia32_pfadd", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFADD);
13081   def_builtin (MASK_3DNOW, "__builtin_ia32_pfcmpeq", v2si_ftype_v2sf_v2sf, IX86_BUILTIN_PFCMPEQ);
13082   def_builtin (MASK_3DNOW, "__builtin_ia32_pfcmpge", v2si_ftype_v2sf_v2sf, IX86_BUILTIN_PFCMPGE);
13083   def_builtin (MASK_3DNOW, "__builtin_ia32_pfcmpgt", v2si_ftype_v2sf_v2sf, IX86_BUILTIN_PFCMPGT);
13084   def_builtin (MASK_3DNOW, "__builtin_ia32_pfmax", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFMAX);
13085   def_builtin (MASK_3DNOW, "__builtin_ia32_pfmin", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFMIN);
13086   def_builtin (MASK_3DNOW, "__builtin_ia32_pfmul", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFMUL);
13087   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrcp", v2sf_ftype_v2sf, IX86_BUILTIN_PFRCP);
13088   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrcpit1", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFRCPIT1);
13089   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrcpit2", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFRCPIT2);
13090   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrsqrt", v2sf_ftype_v2sf, IX86_BUILTIN_PFRSQRT);
13091   def_builtin (MASK_3DNOW, "__builtin_ia32_pfrsqit1", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFRSQIT1);
13092   def_builtin (MASK_3DNOW, "__builtin_ia32_pfsub", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFSUB);
13093   def_builtin (MASK_3DNOW, "__builtin_ia32_pfsubr", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFSUBR);
13094   def_builtin (MASK_3DNOW, "__builtin_ia32_pi2fd", v2sf_ftype_v2si, IX86_BUILTIN_PI2FD);
13095   def_builtin (MASK_3DNOW, "__builtin_ia32_pmulhrw", v4hi_ftype_v4hi_v4hi, IX86_BUILTIN_PMULHRW);
13096
13097   /* 3DNow! extension as used in the Athlon CPU.  */
13098   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pf2iw", v2si_ftype_v2sf, IX86_BUILTIN_PF2IW);
13099   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pfnacc", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFNACC);
13100   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pfpnacc", v2sf_ftype_v2sf_v2sf, IX86_BUILTIN_PFPNACC);
13101   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pi2fw", v2sf_ftype_v2si, IX86_BUILTIN_PI2FW);
13102   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pswapdsf", v2sf_ftype_v2sf, IX86_BUILTIN_PSWAPDSF);
13103   def_builtin (MASK_3DNOW_A, "__builtin_ia32_pswapdsi", v2si_ftype_v2si, IX86_BUILTIN_PSWAPDSI);
13104
13105   def_builtin (MASK_SSE1, "__builtin_ia32_setzerops", v4sf_ftype_void, IX86_BUILTIN_SSE_ZERO);
13106
13107   /* SSE2 */
13108   def_builtin (MASK_SSE2, "__builtin_ia32_pextrw128", int_ftype_v8hi_int, IX86_BUILTIN_PEXTRW128);
13109   def_builtin (MASK_SSE2, "__builtin_ia32_pinsrw128", v8hi_ftype_v8hi_int_int, IX86_BUILTIN_PINSRW128);
13110
13111   def_builtin (MASK_SSE2, "__builtin_ia32_maskmovdqu", void_ftype_v16qi_v16qi_pchar, IX86_BUILTIN_MASKMOVDQU);
13112   def_builtin (MASK_SSE2, "__builtin_ia32_movq2dq", v2di_ftype_di, IX86_BUILTIN_MOVQ2DQ);
13113   def_builtin (MASK_SSE2, "__builtin_ia32_movdq2q", di_ftype_v2di, IX86_BUILTIN_MOVDQ2Q);
13114
13115   def_builtin (MASK_SSE2, "__builtin_ia32_loadapd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADAPD);
13116   def_builtin (MASK_SSE2, "__builtin_ia32_loadupd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADUPD);
13117   def_builtin (MASK_SSE2, "__builtin_ia32_loadsd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADSD);
13118   def_builtin (MASK_SSE2, "__builtin_ia32_storeapd", void_ftype_pdouble_v2df, IX86_BUILTIN_STOREAPD);
13119   def_builtin (MASK_SSE2, "__builtin_ia32_storeupd", void_ftype_pdouble_v2df, IX86_BUILTIN_STOREUPD);
13120   def_builtin (MASK_SSE2, "__builtin_ia32_storesd", void_ftype_pdouble_v2df, IX86_BUILTIN_STORESD);
13121
13122   def_builtin (MASK_SSE2, "__builtin_ia32_loadhpd", v2df_ftype_v2df_pv2si, IX86_BUILTIN_LOADHPD);
13123   def_builtin (MASK_SSE2, "__builtin_ia32_loadlpd", v2df_ftype_v2df_pv2si, IX86_BUILTIN_LOADLPD);
13124   def_builtin (MASK_SSE2, "__builtin_ia32_storehpd", void_ftype_pv2si_v2df, IX86_BUILTIN_STOREHPD);
13125   def_builtin (MASK_SSE2, "__builtin_ia32_storelpd", void_ftype_pv2si_v2df, IX86_BUILTIN_STORELPD);
13126
13127   def_builtin (MASK_SSE2, "__builtin_ia32_movmskpd", int_ftype_v2df, IX86_BUILTIN_MOVMSKPD);
13128   def_builtin (MASK_SSE2, "__builtin_ia32_pmovmskb128", int_ftype_v16qi, IX86_BUILTIN_PMOVMSKB128);
13129   def_builtin (MASK_SSE2, "__builtin_ia32_movnti", void_ftype_pint_int, IX86_BUILTIN_MOVNTI);
13130   def_builtin (MASK_SSE2, "__builtin_ia32_movntpd", void_ftype_pdouble_v2df, IX86_BUILTIN_MOVNTPD);
13131   def_builtin (MASK_SSE2, "__builtin_ia32_movntdq", void_ftype_pv2di_v2di, IX86_BUILTIN_MOVNTDQ);
13132
13133   def_builtin (MASK_SSE2, "__builtin_ia32_pshufd", v4si_ftype_v4si_int, IX86_BUILTIN_PSHUFD);
13134   def_builtin (MASK_SSE2, "__builtin_ia32_pshuflw", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSHUFLW);
13135   def_builtin (MASK_SSE2, "__builtin_ia32_pshufhw", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSHUFHW);
13136   def_builtin (MASK_SSE2, "__builtin_ia32_psadbw128", v2di_ftype_v16qi_v16qi, IX86_BUILTIN_PSADBW128);
13137
13138   def_builtin (MASK_SSE2, "__builtin_ia32_sqrtpd", v2df_ftype_v2df, IX86_BUILTIN_SQRTPD);
13139   def_builtin (MASK_SSE2, "__builtin_ia32_sqrtsd", v2df_ftype_v2df, IX86_BUILTIN_SQRTSD);
13140
13141   def_builtin (MASK_SSE2, "__builtin_ia32_shufpd", v2df_ftype_v2df_v2df_int, IX86_BUILTIN_SHUFPD);
13142
13143   def_builtin (MASK_SSE2, "__builtin_ia32_cvtdq2pd", v2df_ftype_v4si, IX86_BUILTIN_CVTDQ2PD);
13144   def_builtin (MASK_SSE2, "__builtin_ia32_cvtdq2ps", v4sf_ftype_v4si, IX86_BUILTIN_CVTDQ2PS);
13145
13146   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpd2dq", v4si_ftype_v2df, IX86_BUILTIN_CVTPD2DQ);
13147   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpd2pi", v2si_ftype_v2df, IX86_BUILTIN_CVTPD2PI);
13148   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpd2ps", v4sf_ftype_v2df, IX86_BUILTIN_CVTPD2PS);
13149   def_builtin (MASK_SSE2, "__builtin_ia32_cvttpd2dq", v4si_ftype_v2df, IX86_BUILTIN_CVTTPD2DQ);
13150   def_builtin (MASK_SSE2, "__builtin_ia32_cvttpd2pi", v2si_ftype_v2df, IX86_BUILTIN_CVTTPD2PI);
13151
13152   def_builtin (MASK_SSE2, "__builtin_ia32_cvtpi2pd", v2df_ftype_v2si, IX86_BUILTIN_CVTPI2PD);
13153
13154   def_builtin (MASK_SSE2, "__builtin_ia32_cvtsd2si", int_ftype_v2df, IX86_BUILTIN_CVTSD2SI);
13155   def_builtin (MASK_SSE2, "__builtin_ia32_cvttsd2si", int_ftype_v2df, IX86_BUILTIN_CVTTSD2SI);
13156
13157   def_builtin (MASK_SSE2, "__builtin_ia32_cvtps2dq", v4si_ftype_v4sf, IX86_BUILTIN_CVTPS2DQ);
13158   def_builtin (MASK_SSE2, "__builtin_ia32_cvtps2pd", v2df_ftype_v4sf, IX86_BUILTIN_CVTPS2PD);
13159   def_builtin (MASK_SSE2, "__builtin_ia32_cvttps2dq", v4si_ftype_v4sf, IX86_BUILTIN_CVTTPS2DQ);
13160
13161   def_builtin (MASK_SSE2, "__builtin_ia32_cvtsi2sd", v2df_ftype_v2df_int, IX86_BUILTIN_CVTSI2SD);
13162   def_builtin (MASK_SSE2, "__builtin_ia32_cvtsd2ss", v4sf_ftype_v4sf_v2df, IX86_BUILTIN_CVTSD2SS);
13163   def_builtin (MASK_SSE2, "__builtin_ia32_cvtss2sd", v2df_ftype_v2df_v4sf, IX86_BUILTIN_CVTSS2SD);
13164
13165   def_builtin (MASK_SSE2, "__builtin_ia32_setpd1", v2df_ftype_double, IX86_BUILTIN_SETPD1);
13166   def_builtin (MASK_SSE2, "__builtin_ia32_setpd", v2df_ftype_double_double, IX86_BUILTIN_SETPD);
13167   def_builtin (MASK_SSE2, "__builtin_ia32_setzeropd", ti_ftype_void, IX86_BUILTIN_CLRPD);
13168   def_builtin (MASK_SSE2, "__builtin_ia32_loadpd1", v2df_ftype_pcdouble, IX86_BUILTIN_LOADPD1);
13169   def_builtin (MASK_SSE2, "__builtin_ia32_loadrpd", v2df_ftype_pcdouble, IX86_BUILTIN_LOADRPD);
13170   def_builtin (MASK_SSE2, "__builtin_ia32_storepd1", void_ftype_pdouble_v2df, IX86_BUILTIN_STOREPD1);
13171   def_builtin (MASK_SSE2, "__builtin_ia32_storerpd", void_ftype_pdouble_v2df, IX86_BUILTIN_STORERPD);
13172
13173   def_builtin (MASK_SSE2, "__builtin_ia32_clflush", void_ftype_pcvoid, IX86_BUILTIN_CLFLUSH);
13174   def_builtin (MASK_SSE2, "__builtin_ia32_lfence", void_ftype_void, IX86_BUILTIN_LFENCE);
13175   def_builtin (MASK_SSE2, "__builtin_ia32_mfence", void_ftype_void, IX86_BUILTIN_MFENCE);
13176
13177   def_builtin (MASK_SSE2, "__builtin_ia32_loaddqa", v16qi_ftype_pcchar, IX86_BUILTIN_LOADDQA);
13178   def_builtin (MASK_SSE2, "__builtin_ia32_loaddqu", v16qi_ftype_pcchar, IX86_BUILTIN_LOADDQU);
13179   def_builtin (MASK_SSE2, "__builtin_ia32_loadd", v4si_ftype_pcint, IX86_BUILTIN_LOADD);
13180   def_builtin (MASK_SSE2, "__builtin_ia32_storedqa", void_ftype_pchar_v16qi, IX86_BUILTIN_STOREDQA);
13181   def_builtin (MASK_SSE2, "__builtin_ia32_storedqu", void_ftype_pchar_v16qi, IX86_BUILTIN_STOREDQU);
13182   def_builtin (MASK_SSE2, "__builtin_ia32_stored", void_ftype_pcint_v4si, IX86_BUILTIN_STORED);
13183   def_builtin (MASK_SSE2, "__builtin_ia32_movq", v2di_ftype_v2di, IX86_BUILTIN_MOVQ);
13184
13185   def_builtin (MASK_SSE1, "__builtin_ia32_setzero128", v2di_ftype_void, IX86_BUILTIN_CLRTI);
13186
13187   def_builtin (MASK_SSE2, "__builtin_ia32_psllw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSLLW128);
13188   def_builtin (MASK_SSE2, "__builtin_ia32_pslld128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSLLD128);
13189   def_builtin (MASK_SSE2, "__builtin_ia32_psllq128", v2di_ftype_v2di_v2di, IX86_BUILTIN_PSLLQ128);
13190
13191   def_builtin (MASK_SSE2, "__builtin_ia32_psrlw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSRLW128);
13192   def_builtin (MASK_SSE2, "__builtin_ia32_psrld128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSRLD128);
13193   def_builtin (MASK_SSE2, "__builtin_ia32_psrlq128", v2di_ftype_v2di_v2di, IX86_BUILTIN_PSRLQ128);
13194
13195   def_builtin (MASK_SSE2, "__builtin_ia32_psraw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSRAW128);
13196   def_builtin (MASK_SSE2, "__builtin_ia32_psrad128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSRAD128);
13197
13198   def_builtin (MASK_SSE2, "__builtin_ia32_pslldqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSLLDQI128);
13199   def_builtin (MASK_SSE2, "__builtin_ia32_psllwi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSLLWI128);
13200   def_builtin (MASK_SSE2, "__builtin_ia32_pslldi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSLLDI128);
13201   def_builtin (MASK_SSE2, "__builtin_ia32_psllqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSLLQI128);
13202
13203   def_builtin (MASK_SSE2, "__builtin_ia32_psrldqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSRLDQI128);
13204   def_builtin (MASK_SSE2, "__builtin_ia32_psrlwi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSRLWI128);
13205   def_builtin (MASK_SSE2, "__builtin_ia32_psrldi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSRLDI128);
13206   def_builtin (MASK_SSE2, "__builtin_ia32_psrlqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSRLQI128);
13207
13208   def_builtin (MASK_SSE2, "__builtin_ia32_psrawi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSRAWI128);
13209   def_builtin (MASK_SSE2, "__builtin_ia32_psradi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSRADI128);
13210
13211   def_builtin (MASK_SSE2, "__builtin_ia32_pmaddwd128", v4si_ftype_v8hi_v8hi, IX86_BUILTIN_PMADDWD128);
13212 }
13213
13214 /* Errors in the source file can cause expand_expr to return const0_rtx
13215    where we expect a vector.  To avoid crashing, use one of the vector
13216    clear instructions.  */
13217 static rtx
13218 safe_vector_operand (x, mode)
13219      rtx x;
13220      enum machine_mode mode;
13221 {
13222   if (x != const0_rtx)
13223     return x;
13224   x = gen_reg_rtx (mode);
13225
13226   if (VALID_MMX_REG_MODE (mode) || VALID_MMX_REG_MODE_3DNOW (mode))
13227     emit_insn (gen_mmx_clrdi (mode == DImode ? x
13228                               : gen_rtx_SUBREG (DImode, x, 0)));
13229   else
13230     emit_insn (gen_sse_clrv4sf (mode == V4SFmode ? x
13231                                 : gen_rtx_SUBREG (V4SFmode, x, 0),
13232                                 CONST0_RTX (V4SFmode)));
13233   return x;
13234 }
13235
13236 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
13237
13238 static rtx
13239 ix86_expand_binop_builtin (icode, arglist, target)
13240      enum insn_code icode;
13241      tree arglist;
13242      rtx target;
13243 {
13244   rtx pat;
13245   tree arg0 = TREE_VALUE (arglist);
13246   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13247   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13248   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13249   enum machine_mode tmode = insn_data[icode].operand[0].mode;
13250   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
13251   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
13252
13253   if (VECTOR_MODE_P (mode0))
13254     op0 = safe_vector_operand (op0, mode0);
13255   if (VECTOR_MODE_P (mode1))
13256     op1 = safe_vector_operand (op1, mode1);
13257
13258   if (! target
13259       || GET_MODE (target) != tmode
13260       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13261     target = gen_reg_rtx (tmode);
13262
13263   /* In case the insn wants input operands in modes different from
13264      the result, abort.  */
13265   if (GET_MODE (op0) != mode0 || GET_MODE (op1) != mode1)
13266     abort ();
13267
13268   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13269     op0 = copy_to_mode_reg (mode0, op0);
13270   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13271     op1 = copy_to_mode_reg (mode1, op1);
13272
13273   /* In the commutative cases, both op0 and op1 are nonimmediate_operand,
13274      yet one of the two must not be a memory.  This is normally enforced
13275      by expanders, but we didn't bother to create one here.  */
13276   if (GET_CODE (op0) == MEM && GET_CODE (op1) == MEM)
13277     op0 = copy_to_mode_reg (mode0, op0);
13278
13279   pat = GEN_FCN (icode) (target, op0, op1);
13280   if (! pat)
13281     return 0;
13282   emit_insn (pat);
13283   return target;
13284 }
13285
13286 /* Subroutine of ix86_expand_builtin to take care of stores.  */
13287
13288 static rtx
13289 ix86_expand_store_builtin (icode, arglist)
13290      enum insn_code icode;
13291      tree arglist;
13292 {
13293   rtx pat;
13294   tree arg0 = TREE_VALUE (arglist);
13295   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13296   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13297   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13298   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
13299   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
13300
13301   if (VECTOR_MODE_P (mode1))
13302     op1 = safe_vector_operand (op1, mode1);
13303
13304   op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
13305
13306   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
13307     op1 = copy_to_mode_reg (mode1, op1);
13308
13309   pat = GEN_FCN (icode) (op0, op1);
13310   if (pat)
13311     emit_insn (pat);
13312   return 0;
13313 }
13314
13315 /* Subroutine of ix86_expand_builtin to take care of unop insns.  */
13316
13317 static rtx
13318 ix86_expand_unop_builtin (icode, arglist, target, do_load)
13319      enum insn_code icode;
13320      tree arglist;
13321      rtx target;
13322      int do_load;
13323 {
13324   rtx pat;
13325   tree arg0 = TREE_VALUE (arglist);
13326   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13327   enum machine_mode tmode = insn_data[icode].operand[0].mode;
13328   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
13329
13330   if (! target
13331       || GET_MODE (target) != tmode
13332       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13333     target = gen_reg_rtx (tmode);
13334   if (do_load)
13335     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
13336   else
13337     {
13338       if (VECTOR_MODE_P (mode0))
13339         op0 = safe_vector_operand (op0, mode0);
13340
13341       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13342         op0 = copy_to_mode_reg (mode0, op0);
13343     }
13344
13345   pat = GEN_FCN (icode) (target, op0);
13346   if (! pat)
13347     return 0;
13348   emit_insn (pat);
13349   return target;
13350 }
13351
13352 /* Subroutine of ix86_expand_builtin to take care of three special unop insns:
13353    sqrtss, rsqrtss, rcpss.  */
13354
13355 static rtx
13356 ix86_expand_unop1_builtin (icode, arglist, target)
13357      enum insn_code icode;
13358      tree arglist;
13359      rtx target;
13360 {
13361   rtx pat;
13362   tree arg0 = TREE_VALUE (arglist);
13363   rtx op1, op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13364   enum machine_mode tmode = insn_data[icode].operand[0].mode;
13365   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
13366
13367   if (! target
13368       || GET_MODE (target) != tmode
13369       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13370     target = gen_reg_rtx (tmode);
13371
13372   if (VECTOR_MODE_P (mode0))
13373     op0 = safe_vector_operand (op0, mode0);
13374
13375   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13376     op0 = copy_to_mode_reg (mode0, op0);
13377
13378   op1 = op0;
13379   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
13380     op1 = copy_to_mode_reg (mode0, op1);
13381
13382   pat = GEN_FCN (icode) (target, op0, op1);
13383   if (! pat)
13384     return 0;
13385   emit_insn (pat);
13386   return target;
13387 }
13388
13389 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
13390
13391 static rtx
13392 ix86_expand_sse_compare (d, arglist, target)
13393      const struct builtin_description *d;
13394      tree arglist;
13395      rtx target;
13396 {
13397   rtx pat;
13398   tree arg0 = TREE_VALUE (arglist);
13399   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13400   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13401   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13402   rtx op2;
13403   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
13404   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
13405   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
13406   enum rtx_code comparison = d->comparison;
13407
13408   if (VECTOR_MODE_P (mode0))
13409     op0 = safe_vector_operand (op0, mode0);
13410   if (VECTOR_MODE_P (mode1))
13411     op1 = safe_vector_operand (op1, mode1);
13412
13413   /* Swap operands if we have a comparison that isn't available in
13414      hardware.  */
13415   if (d->flag)
13416     {
13417       rtx tmp = gen_reg_rtx (mode1);
13418       emit_move_insn (tmp, op1);
13419       op1 = op0;
13420       op0 = tmp;
13421     }
13422
13423   if (! target
13424       || GET_MODE (target) != tmode
13425       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
13426     target = gen_reg_rtx (tmode);
13427
13428   if (! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
13429     op0 = copy_to_mode_reg (mode0, op0);
13430   if (! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
13431     op1 = copy_to_mode_reg (mode1, op1);
13432
13433   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
13434   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
13435   if (! pat)
13436     return 0;
13437   emit_insn (pat);
13438   return target;
13439 }
13440
13441 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
13442
13443 static rtx
13444 ix86_expand_sse_comi (d, arglist, target)
13445      const struct builtin_description *d;
13446      tree arglist;
13447      rtx target;
13448 {
13449   rtx pat;
13450   tree arg0 = TREE_VALUE (arglist);
13451   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13452   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13453   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13454   rtx op2;
13455   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
13456   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
13457   enum rtx_code comparison = d->comparison;
13458
13459   if (VECTOR_MODE_P (mode0))
13460     op0 = safe_vector_operand (op0, mode0);
13461   if (VECTOR_MODE_P (mode1))
13462     op1 = safe_vector_operand (op1, mode1);
13463
13464   /* Swap operands if we have a comparison that isn't available in
13465      hardware.  */
13466   if (d->flag)
13467     {
13468       rtx tmp = op1;
13469       op1 = op0;
13470       op0 = tmp;
13471     }
13472
13473   target = gen_reg_rtx (SImode);
13474   emit_move_insn (target, const0_rtx);
13475   target = gen_rtx_SUBREG (QImode, target, 0);
13476
13477   if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
13478     op0 = copy_to_mode_reg (mode0, op0);
13479   if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
13480     op1 = copy_to_mode_reg (mode1, op1);
13481
13482   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
13483   pat = GEN_FCN (d->icode) (op0, op1);
13484   if (! pat)
13485     return 0;
13486   emit_insn (pat);
13487   emit_insn (gen_rtx_SET (VOIDmode,
13488                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
13489                           gen_rtx_fmt_ee (comparison, QImode,
13490                                           SET_DEST (pat),
13491                                           const0_rtx)));
13492
13493   return SUBREG_REG (target);
13494 }
13495
13496 /* Expand an expression EXP that calls a built-in function,
13497    with result going to TARGET if that's convenient
13498    (and in mode MODE if that's convenient).
13499    SUBTARGET may be used as the target for computing one of EXP's operands.
13500    IGNORE is nonzero if the value is to be ignored.  */
13501
13502 rtx
13503 ix86_expand_builtin (exp, target, subtarget, mode, ignore)
13504      tree exp;
13505      rtx target;
13506      rtx subtarget ATTRIBUTE_UNUSED;
13507      enum machine_mode mode ATTRIBUTE_UNUSED;
13508      int ignore ATTRIBUTE_UNUSED;
13509 {
13510   const struct builtin_description *d;
13511   size_t i;
13512   enum insn_code icode;
13513   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
13514   tree arglist = TREE_OPERAND (exp, 1);
13515   tree arg0, arg1, arg2;
13516   rtx op0, op1, op2, pat;
13517   enum machine_mode tmode, mode0, mode1, mode2;
13518   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
13519
13520   switch (fcode)
13521     {
13522     case IX86_BUILTIN_EMMS:
13523       emit_insn (gen_emms ());
13524       return 0;
13525
13526     case IX86_BUILTIN_SFENCE:
13527       emit_insn (gen_sfence ());
13528       return 0;
13529
13530     case IX86_BUILTIN_PEXTRW:
13531     case IX86_BUILTIN_PEXTRW128:
13532       icode = (fcode == IX86_BUILTIN_PEXTRW
13533                ? CODE_FOR_mmx_pextrw
13534                : CODE_FOR_sse2_pextrw);
13535       arg0 = TREE_VALUE (arglist);
13536       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13537       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13538       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13539       tmode = insn_data[icode].operand[0].mode;
13540       mode0 = insn_data[icode].operand[1].mode;
13541       mode1 = insn_data[icode].operand[2].mode;
13542
13543       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13544         op0 = copy_to_mode_reg (mode0, op0);
13545       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13546         {
13547           /* @@@ better error message */
13548           error ("selector must be an immediate");
13549           return gen_reg_rtx (tmode);
13550         }
13551       if (target == 0
13552           || GET_MODE (target) != tmode
13553           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13554         target = gen_reg_rtx (tmode);
13555       pat = GEN_FCN (icode) (target, op0, op1);
13556       if (! pat)
13557         return 0;
13558       emit_insn (pat);
13559       return target;
13560
13561     case IX86_BUILTIN_PINSRW:
13562     case IX86_BUILTIN_PINSRW128:
13563       icode = (fcode == IX86_BUILTIN_PINSRW
13564                ? CODE_FOR_mmx_pinsrw
13565                : CODE_FOR_sse2_pinsrw);
13566       arg0 = TREE_VALUE (arglist);
13567       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13568       arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
13569       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13570       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13571       op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
13572       tmode = insn_data[icode].operand[0].mode;
13573       mode0 = insn_data[icode].operand[1].mode;
13574       mode1 = insn_data[icode].operand[2].mode;
13575       mode2 = insn_data[icode].operand[3].mode;
13576
13577       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13578         op0 = copy_to_mode_reg (mode0, op0);
13579       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13580         op1 = copy_to_mode_reg (mode1, op1);
13581       if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
13582         {
13583           /* @@@ better error message */
13584           error ("selector must be an immediate");
13585           return const0_rtx;
13586         }
13587       if (target == 0
13588           || GET_MODE (target) != tmode
13589           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13590         target = gen_reg_rtx (tmode);
13591       pat = GEN_FCN (icode) (target, op0, op1, op2);
13592       if (! pat)
13593         return 0;
13594       emit_insn (pat);
13595       return target;
13596
13597     case IX86_BUILTIN_MASKMOVQ:
13598     case IX86_BUILTIN_MASKMOVDQU:
13599       icode = (fcode == IX86_BUILTIN_MASKMOVQ
13600                ? (TARGET_64BIT ? CODE_FOR_mmx_maskmovq_rex : CODE_FOR_mmx_maskmovq)
13601                : (TARGET_64BIT ? CODE_FOR_sse2_maskmovdqu_rex64
13602                   : CODE_FOR_sse2_maskmovdqu));
13603       /* Note the arg order is different from the operand order.  */
13604       arg1 = TREE_VALUE (arglist);
13605       arg2 = TREE_VALUE (TREE_CHAIN (arglist));
13606       arg0 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
13607       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13608       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13609       op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
13610       mode0 = insn_data[icode].operand[0].mode;
13611       mode1 = insn_data[icode].operand[1].mode;
13612       mode2 = insn_data[icode].operand[2].mode;
13613
13614       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13615         op0 = copy_to_mode_reg (mode0, op0);
13616       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
13617         op1 = copy_to_mode_reg (mode1, op1);
13618       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
13619         op2 = copy_to_mode_reg (mode2, op2);
13620       pat = GEN_FCN (icode) (op0, op1, op2);
13621       if (! pat)
13622         return 0;
13623       emit_insn (pat);
13624       return 0;
13625
13626     case IX86_BUILTIN_SQRTSS:
13627       return ix86_expand_unop1_builtin (CODE_FOR_vmsqrtv4sf2, arglist, target);
13628     case IX86_BUILTIN_RSQRTSS:
13629       return ix86_expand_unop1_builtin (CODE_FOR_vmrsqrtv4sf2, arglist, target);
13630     case IX86_BUILTIN_RCPSS:
13631       return ix86_expand_unop1_builtin (CODE_FOR_vmrcpv4sf2, arglist, target);
13632
13633     case IX86_BUILTIN_LOADAPS:
13634       return ix86_expand_unop_builtin (CODE_FOR_sse_movaps, arglist, target, 1);
13635
13636     case IX86_BUILTIN_LOADUPS:
13637       return ix86_expand_unop_builtin (CODE_FOR_sse_movups, arglist, target, 1);
13638
13639     case IX86_BUILTIN_STOREAPS:
13640       return ix86_expand_store_builtin (CODE_FOR_sse_movaps, arglist);
13641
13642     case IX86_BUILTIN_STOREUPS:
13643       return ix86_expand_store_builtin (CODE_FOR_sse_movups, arglist);
13644
13645     case IX86_BUILTIN_LOADSS:
13646       return ix86_expand_unop_builtin (CODE_FOR_sse_loadss, arglist, target, 1);
13647
13648     case IX86_BUILTIN_STORESS:
13649       return ix86_expand_store_builtin (CODE_FOR_sse_storess, arglist);
13650
13651     case IX86_BUILTIN_LOADHPS:
13652     case IX86_BUILTIN_LOADLPS:
13653     case IX86_BUILTIN_LOADHPD:
13654     case IX86_BUILTIN_LOADLPD:
13655       icode = (fcode == IX86_BUILTIN_LOADHPS ? CODE_FOR_sse_movhps
13656                : fcode == IX86_BUILTIN_LOADLPS ? CODE_FOR_sse_movlps
13657                : fcode == IX86_BUILTIN_LOADHPD ? CODE_FOR_sse2_movhpd
13658                : CODE_FOR_sse2_movlpd);
13659       arg0 = TREE_VALUE (arglist);
13660       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13661       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13662       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13663       tmode = insn_data[icode].operand[0].mode;
13664       mode0 = insn_data[icode].operand[1].mode;
13665       mode1 = insn_data[icode].operand[2].mode;
13666
13667       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13668         op0 = copy_to_mode_reg (mode0, op0);
13669       op1 = gen_rtx_MEM (mode1, copy_to_mode_reg (Pmode, op1));
13670       if (target == 0
13671           || GET_MODE (target) != tmode
13672           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13673         target = gen_reg_rtx (tmode);
13674       pat = GEN_FCN (icode) (target, op0, op1);
13675       if (! pat)
13676         return 0;
13677       emit_insn (pat);
13678       return target;
13679
13680     case IX86_BUILTIN_STOREHPS:
13681     case IX86_BUILTIN_STORELPS:
13682     case IX86_BUILTIN_STOREHPD:
13683     case IX86_BUILTIN_STORELPD:
13684       icode = (fcode == IX86_BUILTIN_STOREHPS ? CODE_FOR_sse_movhps
13685                : fcode == IX86_BUILTIN_STORELPS ? CODE_FOR_sse_movlps
13686                : fcode == IX86_BUILTIN_STOREHPD ? CODE_FOR_sse2_movhpd
13687                : CODE_FOR_sse2_movlpd);
13688       arg0 = TREE_VALUE (arglist);
13689       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13690       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13691       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13692       mode0 = insn_data[icode].operand[1].mode;
13693       mode1 = insn_data[icode].operand[2].mode;
13694
13695       op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
13696       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13697         op1 = copy_to_mode_reg (mode1, op1);
13698
13699       pat = GEN_FCN (icode) (op0, op0, op1);
13700       if (! pat)
13701         return 0;
13702       emit_insn (pat);
13703       return 0;
13704
13705     case IX86_BUILTIN_MOVNTPS:
13706       return ix86_expand_store_builtin (CODE_FOR_sse_movntv4sf, arglist);
13707     case IX86_BUILTIN_MOVNTQ:
13708       return ix86_expand_store_builtin (CODE_FOR_sse_movntdi, arglist);
13709
13710     case IX86_BUILTIN_LDMXCSR:
13711       op0 = expand_expr (TREE_VALUE (arglist), NULL_RTX, VOIDmode, 0);
13712       target = assign_386_stack_local (SImode, 0);
13713       emit_move_insn (target, op0);
13714       emit_insn (gen_ldmxcsr (target));
13715       return 0;
13716
13717     case IX86_BUILTIN_STMXCSR:
13718       target = assign_386_stack_local (SImode, 0);
13719       emit_insn (gen_stmxcsr (target));
13720       return copy_to_mode_reg (SImode, target);
13721
13722     case IX86_BUILTIN_SHUFPS:
13723     case IX86_BUILTIN_SHUFPD:
13724       icode = (fcode == IX86_BUILTIN_SHUFPS
13725                ? CODE_FOR_sse_shufps
13726                : CODE_FOR_sse2_shufpd);
13727       arg0 = TREE_VALUE (arglist);
13728       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13729       arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
13730       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13731       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13732       op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
13733       tmode = insn_data[icode].operand[0].mode;
13734       mode0 = insn_data[icode].operand[1].mode;
13735       mode1 = insn_data[icode].operand[2].mode;
13736       mode2 = insn_data[icode].operand[3].mode;
13737
13738       if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13739         op0 = copy_to_mode_reg (mode0, op0);
13740       if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13741         op1 = copy_to_mode_reg (mode1, op1);
13742       if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
13743         {
13744           /* @@@ better error message */
13745           error ("mask must be an immediate");
13746           return gen_reg_rtx (tmode);
13747         }
13748       if (target == 0
13749           || GET_MODE (target) != tmode
13750           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13751         target = gen_reg_rtx (tmode);
13752       pat = GEN_FCN (icode) (target, op0, op1, op2);
13753       if (! pat)
13754         return 0;
13755       emit_insn (pat);
13756       return target;
13757
13758     case IX86_BUILTIN_PSHUFW:
13759     case IX86_BUILTIN_PSHUFD:
13760     case IX86_BUILTIN_PSHUFHW:
13761     case IX86_BUILTIN_PSHUFLW:
13762       icode = (  fcode == IX86_BUILTIN_PSHUFHW ? CODE_FOR_sse2_pshufhw
13763                : fcode == IX86_BUILTIN_PSHUFLW ? CODE_FOR_sse2_pshuflw
13764                : fcode == IX86_BUILTIN_PSHUFD ? CODE_FOR_sse2_pshufd
13765                : CODE_FOR_mmx_pshufw);
13766       arg0 = TREE_VALUE (arglist);
13767       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13768       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13769       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13770       tmode = insn_data[icode].operand[0].mode;
13771       mode1 = insn_data[icode].operand[1].mode;
13772       mode2 = insn_data[icode].operand[2].mode;
13773
13774       if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
13775         op0 = copy_to_mode_reg (mode1, op0);
13776       if (! (*insn_data[icode].operand[2].predicate) (op1, mode2))
13777         {
13778           /* @@@ better error message */
13779           error ("mask must be an immediate");
13780           return const0_rtx;
13781         }
13782       if (target == 0
13783           || GET_MODE (target) != tmode
13784           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13785         target = gen_reg_rtx (tmode);
13786       pat = GEN_FCN (icode) (target, op0, op1);
13787       if (! pat)
13788         return 0;
13789       emit_insn (pat);
13790       return target;
13791
13792     case IX86_BUILTIN_PSLLDQI128:
13793     case IX86_BUILTIN_PSRLDQI128:
13794       icode = (  fcode == IX86_BUILTIN_PSLLDQI128 ? CODE_FOR_sse2_ashlti3
13795                : CODE_FOR_sse2_lshrti3);
13796       arg0 = TREE_VALUE (arglist);
13797       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13798       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13799       op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
13800       tmode = insn_data[icode].operand[0].mode;
13801       mode1 = insn_data[icode].operand[1].mode;
13802       mode2 = insn_data[icode].operand[2].mode;
13803
13804       if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
13805         {
13806           op0 = copy_to_reg (op0);
13807           op0 = simplify_gen_subreg (mode1, op0, GET_MODE (op0), 0);
13808         }
13809       if (! (*insn_data[icode].operand[2].predicate) (op1, mode2))
13810         {
13811           error ("shift must be an immediate");
13812           return const0_rtx;
13813         }
13814       target = gen_reg_rtx (V2DImode);
13815       pat = GEN_FCN (icode) (simplify_gen_subreg (tmode, target, V2DImode, 0), op0, op1);
13816       if (! pat)
13817         return 0;
13818       emit_insn (pat);
13819       return target;
13820
13821     case IX86_BUILTIN_FEMMS:
13822       emit_insn (gen_femms ());
13823       return NULL_RTX;
13824
13825     case IX86_BUILTIN_PAVGUSB:
13826       return ix86_expand_binop_builtin (CODE_FOR_pavgusb, arglist, target);
13827
13828     case IX86_BUILTIN_PF2ID:
13829       return ix86_expand_unop_builtin (CODE_FOR_pf2id, arglist, target, 0);
13830
13831     case IX86_BUILTIN_PFACC:
13832       return ix86_expand_binop_builtin (CODE_FOR_pfacc, arglist, target);
13833
13834     case IX86_BUILTIN_PFADD:
13835      return ix86_expand_binop_builtin (CODE_FOR_addv2sf3, arglist, target);
13836
13837     case IX86_BUILTIN_PFCMPEQ:
13838       return ix86_expand_binop_builtin (CODE_FOR_eqv2sf3, arglist, target);
13839
13840     case IX86_BUILTIN_PFCMPGE:
13841       return ix86_expand_binop_builtin (CODE_FOR_gev2sf3, arglist, target);
13842
13843     case IX86_BUILTIN_PFCMPGT:
13844       return ix86_expand_binop_builtin (CODE_FOR_gtv2sf3, arglist, target);
13845
13846     case IX86_BUILTIN_PFMAX:
13847       return ix86_expand_binop_builtin (CODE_FOR_pfmaxv2sf3, arglist, target);
13848
13849     case IX86_BUILTIN_PFMIN:
13850       return ix86_expand_binop_builtin (CODE_FOR_pfminv2sf3, arglist, target);
13851
13852     case IX86_BUILTIN_PFMUL:
13853       return ix86_expand_binop_builtin (CODE_FOR_mulv2sf3, arglist, target);
13854
13855     case IX86_BUILTIN_PFRCP:
13856       return ix86_expand_unop_builtin (CODE_FOR_pfrcpv2sf2, arglist, target, 0);
13857
13858     case IX86_BUILTIN_PFRCPIT1:
13859       return ix86_expand_binop_builtin (CODE_FOR_pfrcpit1v2sf3, arglist, target);
13860
13861     case IX86_BUILTIN_PFRCPIT2:
13862       return ix86_expand_binop_builtin (CODE_FOR_pfrcpit2v2sf3, arglist, target);
13863
13864     case IX86_BUILTIN_PFRSQIT1:
13865       return ix86_expand_binop_builtin (CODE_FOR_pfrsqit1v2sf3, arglist, target);
13866
13867     case IX86_BUILTIN_PFRSQRT:
13868       return ix86_expand_unop_builtin (CODE_FOR_pfrsqrtv2sf2, arglist, target, 0);
13869
13870     case IX86_BUILTIN_PFSUB:
13871       return ix86_expand_binop_builtin (CODE_FOR_subv2sf3, arglist, target);
13872
13873     case IX86_BUILTIN_PFSUBR:
13874       return ix86_expand_binop_builtin (CODE_FOR_subrv2sf3, arglist, target);
13875
13876     case IX86_BUILTIN_PI2FD:
13877       return ix86_expand_unop_builtin (CODE_FOR_floatv2si2, arglist, target, 0);
13878
13879     case IX86_BUILTIN_PMULHRW:
13880       return ix86_expand_binop_builtin (CODE_FOR_pmulhrwv4hi3, arglist, target);
13881
13882     case IX86_BUILTIN_PF2IW:
13883       return ix86_expand_unop_builtin (CODE_FOR_pf2iw, arglist, target, 0);
13884
13885     case IX86_BUILTIN_PFNACC:
13886       return ix86_expand_binop_builtin (CODE_FOR_pfnacc, arglist, target);
13887
13888     case IX86_BUILTIN_PFPNACC:
13889       return ix86_expand_binop_builtin (CODE_FOR_pfpnacc, arglist, target);
13890
13891     case IX86_BUILTIN_PI2FW:
13892       return ix86_expand_unop_builtin (CODE_FOR_pi2fw, arglist, target, 0);
13893
13894     case IX86_BUILTIN_PSWAPDSI:
13895       return ix86_expand_unop_builtin (CODE_FOR_pswapdv2si2, arglist, target, 0);
13896
13897     case IX86_BUILTIN_PSWAPDSF:
13898       return ix86_expand_unop_builtin (CODE_FOR_pswapdv2sf2, arglist, target, 0);
13899
13900     case IX86_BUILTIN_SSE_ZERO:
13901       target = gen_reg_rtx (V4SFmode);
13902       emit_insn (gen_sse_clrv4sf (target, CONST0_RTX (V4SFmode)));
13903       return target;
13904
13905     case IX86_BUILTIN_MMX_ZERO:
13906       target = gen_reg_rtx (DImode);
13907       emit_insn (gen_mmx_clrdi (target));
13908       return target;
13909
13910     case IX86_BUILTIN_CLRTI:
13911       target = gen_reg_rtx (V2DImode);
13912       emit_insn (gen_sse2_clrti (simplify_gen_subreg (TImode, target, V2DImode, 0)));
13913       return target;
13914
13915
13916     case IX86_BUILTIN_SQRTSD:
13917       return ix86_expand_unop1_builtin (CODE_FOR_vmsqrtv2df2, arglist, target);
13918     case IX86_BUILTIN_LOADAPD:
13919       return ix86_expand_unop_builtin (CODE_FOR_sse2_movapd, arglist, target, 1);
13920     case IX86_BUILTIN_LOADUPD:
13921       return ix86_expand_unop_builtin (CODE_FOR_sse2_movupd, arglist, target, 1);
13922
13923     case IX86_BUILTIN_STOREAPD:
13924       return ix86_expand_store_builtin (CODE_FOR_sse2_movapd, arglist);
13925     case IX86_BUILTIN_STOREUPD:
13926       return ix86_expand_store_builtin (CODE_FOR_sse2_movupd, arglist);
13927
13928     case IX86_BUILTIN_LOADSD:
13929       return ix86_expand_unop_builtin (CODE_FOR_sse2_loadsd, arglist, target, 1);
13930
13931     case IX86_BUILTIN_STORESD:
13932       return ix86_expand_store_builtin (CODE_FOR_sse2_storesd, arglist);
13933
13934     case IX86_BUILTIN_SETPD1:
13935       target = assign_386_stack_local (DFmode, 0);
13936       arg0 = TREE_VALUE (arglist);
13937       emit_move_insn (adjust_address (target, DFmode, 0),
13938                       expand_expr (arg0, NULL_RTX, VOIDmode, 0));
13939       op0 = gen_reg_rtx (V2DFmode);
13940       emit_insn (gen_sse2_loadsd (op0, adjust_address (target, V2DFmode, 0)));
13941       emit_insn (gen_sse2_shufpd (op0, op0, op0, GEN_INT (0)));
13942       return op0;
13943
13944     case IX86_BUILTIN_SETPD:
13945       target = assign_386_stack_local (V2DFmode, 0);
13946       arg0 = TREE_VALUE (arglist);
13947       arg1 = TREE_VALUE (TREE_CHAIN (arglist));
13948       emit_move_insn (adjust_address (target, DFmode, 0),
13949                       expand_expr (arg0, NULL_RTX, VOIDmode, 0));
13950       emit_move_insn (adjust_address (target, DFmode, 8),
13951                       expand_expr (arg1, NULL_RTX, VOIDmode, 0));
13952       op0 = gen_reg_rtx (V2DFmode);
13953       emit_insn (gen_sse2_movapd (op0, target));
13954       return op0;
13955
13956     case IX86_BUILTIN_LOADRPD:
13957       target = ix86_expand_unop_builtin (CODE_FOR_sse2_movapd, arglist,
13958                                          gen_reg_rtx (V2DFmode), 1);
13959       emit_insn (gen_sse2_shufpd (target, target, target, GEN_INT (1)));
13960       return target;
13961
13962     case IX86_BUILTIN_LOADPD1:
13963       target = ix86_expand_unop_builtin (CODE_FOR_sse2_loadsd, arglist,
13964                                          gen_reg_rtx (V2DFmode), 1);
13965       emit_insn (gen_sse2_shufpd (target, target, target, const0_rtx));
13966       return target;
13967
13968     case IX86_BUILTIN_STOREPD1:
13969       return ix86_expand_store_builtin (CODE_FOR_sse2_movapd, arglist);
13970     case IX86_BUILTIN_STORERPD:
13971       return ix86_expand_store_builtin (CODE_FOR_sse2_movapd, arglist);
13972
13973     case IX86_BUILTIN_CLRPD:
13974       target = gen_reg_rtx (V2DFmode);
13975       emit_insn (gen_sse_clrv2df (target));
13976       return target;
13977
13978     case IX86_BUILTIN_MFENCE:
13979         emit_insn (gen_sse2_mfence ());
13980         return 0;
13981     case IX86_BUILTIN_LFENCE:
13982         emit_insn (gen_sse2_lfence ());
13983         return 0;
13984
13985     case IX86_BUILTIN_CLFLUSH:
13986         arg0 = TREE_VALUE (arglist);
13987         op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
13988         icode = CODE_FOR_sse2_clflush;
13989         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
13990             op0 = copy_to_mode_reg (Pmode, op0);
13991
13992         emit_insn (gen_sse2_clflush (op0));
13993         return 0;
13994
13995     case IX86_BUILTIN_MOVNTPD:
13996       return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2df, arglist);
13997     case IX86_BUILTIN_MOVNTDQ:
13998       return ix86_expand_store_builtin (CODE_FOR_sse2_movntv2di, arglist);
13999     case IX86_BUILTIN_MOVNTI:
14000       return ix86_expand_store_builtin (CODE_FOR_sse2_movntsi, arglist);
14001
14002     case IX86_BUILTIN_LOADDQA:
14003       return ix86_expand_unop_builtin (CODE_FOR_sse2_movdqa, arglist, target, 1);
14004     case IX86_BUILTIN_LOADDQU:
14005       return ix86_expand_unop_builtin (CODE_FOR_sse2_movdqu, arglist, target, 1);
14006     case IX86_BUILTIN_LOADD:
14007       return ix86_expand_unop_builtin (CODE_FOR_sse2_loadd, arglist, target, 1);
14008
14009     case IX86_BUILTIN_STOREDQA:
14010       return ix86_expand_store_builtin (CODE_FOR_sse2_movdqa, arglist);
14011     case IX86_BUILTIN_STOREDQU:
14012       return ix86_expand_store_builtin (CODE_FOR_sse2_movdqu, arglist);
14013     case IX86_BUILTIN_STORED:
14014       return ix86_expand_store_builtin (CODE_FOR_sse2_stored, arglist);
14015
14016     default:
14017       break;
14018     }
14019
14020   for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
14021     if (d->code == fcode)
14022       {
14023         /* Compares are treated specially.  */
14024         if (d->icode == CODE_FOR_maskcmpv4sf3
14025             || d->icode == CODE_FOR_vmmaskcmpv4sf3
14026             || d->icode == CODE_FOR_maskncmpv4sf3
14027             || d->icode == CODE_FOR_vmmaskncmpv4sf3
14028             || d->icode == CODE_FOR_maskcmpv2df3
14029             || d->icode == CODE_FOR_vmmaskcmpv2df3
14030             || d->icode == CODE_FOR_maskncmpv2df3
14031             || d->icode == CODE_FOR_vmmaskncmpv2df3)
14032           return ix86_expand_sse_compare (d, arglist, target);
14033
14034         return ix86_expand_binop_builtin (d->icode, arglist, target);
14035       }
14036
14037   for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
14038     if (d->code == fcode)
14039       return ix86_expand_unop_builtin (d->icode, arglist, target, 0);
14040
14041   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
14042     if (d->code == fcode)
14043       return ix86_expand_sse_comi (d, arglist, target);
14044
14045   /* @@@ Should really do something sensible here.  */
14046   return 0;
14047 }
14048
14049 /* Store OPERAND to the memory after reload is completed.  This means
14050    that we can't easily use assign_stack_local.  */
14051 rtx
14052 ix86_force_to_memory (mode, operand)
14053      enum machine_mode mode;
14054      rtx operand;
14055 {
14056   rtx result;
14057   if (!reload_completed)
14058     abort ();
14059   if (TARGET_64BIT && TARGET_RED_ZONE)
14060     {
14061       result = gen_rtx_MEM (mode,
14062                             gen_rtx_PLUS (Pmode,
14063                                           stack_pointer_rtx,
14064                                           GEN_INT (-RED_ZONE_SIZE)));
14065       emit_move_insn (result, operand);
14066     }
14067   else if (TARGET_64BIT && !TARGET_RED_ZONE)
14068     {
14069       switch (mode)
14070         {
14071         case HImode:
14072         case SImode:
14073           operand = gen_lowpart (DImode, operand);
14074           /* FALLTHRU */
14075         case DImode:
14076           emit_insn (
14077                       gen_rtx_SET (VOIDmode,
14078                                    gen_rtx_MEM (DImode,
14079                                                 gen_rtx_PRE_DEC (DImode,
14080                                                         stack_pointer_rtx)),
14081                                    operand));
14082           break;
14083         default:
14084           abort ();
14085         }
14086       result = gen_rtx_MEM (mode, stack_pointer_rtx);
14087     }
14088   else
14089     {
14090       switch (mode)
14091         {
14092         case DImode:
14093           {
14094             rtx operands[2];
14095             split_di (&operand, 1, operands, operands + 1);
14096             emit_insn (
14097                         gen_rtx_SET (VOIDmode,
14098                                      gen_rtx_MEM (SImode,
14099                                                   gen_rtx_PRE_DEC (Pmode,
14100                                                         stack_pointer_rtx)),
14101                                      operands[1]));
14102             emit_insn (
14103                         gen_rtx_SET (VOIDmode,
14104                                      gen_rtx_MEM (SImode,
14105                                                   gen_rtx_PRE_DEC (Pmode,
14106                                                         stack_pointer_rtx)),
14107                                      operands[0]));
14108           }
14109           break;
14110         case HImode:
14111           /* It is better to store HImodes as SImodes.  */
14112           if (!TARGET_PARTIAL_REG_STALL)
14113             operand = gen_lowpart (SImode, operand);
14114           /* FALLTHRU */
14115         case SImode:
14116           emit_insn (
14117                       gen_rtx_SET (VOIDmode,
14118                                    gen_rtx_MEM (GET_MODE (operand),
14119                                                 gen_rtx_PRE_DEC (SImode,
14120                                                         stack_pointer_rtx)),
14121                                    operand));
14122           break;
14123         default:
14124           abort ();
14125         }
14126       result = gen_rtx_MEM (mode, stack_pointer_rtx);
14127     }
14128   return result;
14129 }
14130
14131 /* Free operand from the memory.  */
14132 void
14133 ix86_free_from_memory (mode)
14134      enum machine_mode mode;
14135 {
14136   if (!TARGET_64BIT || !TARGET_RED_ZONE)
14137     {
14138       int size;
14139
14140       if (mode == DImode || TARGET_64BIT)
14141         size = 8;
14142       else if (mode == HImode && TARGET_PARTIAL_REG_STALL)
14143         size = 2;
14144       else
14145         size = 4;
14146       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
14147          to pop or add instruction if registers are available.  */
14148       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
14149                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
14150                                             GEN_INT (size))));
14151     }
14152 }
14153
14154 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
14155    QImode must go into class Q_REGS.
14156    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
14157    movdf to do mem-to-mem moves through integer regs.  */
14158 enum reg_class
14159 ix86_preferred_reload_class (x, class)
14160      rtx x;
14161      enum reg_class class;
14162 {
14163   if (GET_CODE (x) == CONST_VECTOR && x != CONST0_RTX (GET_MODE (x)))
14164     return NO_REGS;
14165   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
14166     {
14167       /* SSE can't load any constant directly yet.  */
14168       if (SSE_CLASS_P (class))
14169         return NO_REGS;
14170       /* Floats can load 0 and 1.  */
14171       if (MAYBE_FLOAT_CLASS_P (class) && standard_80387_constant_p (x))
14172         {
14173           /* Limit class to non-SSE.  Use GENERAL_REGS if possible.  */
14174           if (MAYBE_SSE_CLASS_P (class))
14175             return (reg_class_subset_p (class, GENERAL_REGS)
14176                     ? GENERAL_REGS : FLOAT_REGS);
14177           else
14178             return class;
14179         }
14180       /* General regs can load everything.  */
14181       if (reg_class_subset_p (class, GENERAL_REGS))
14182         return GENERAL_REGS;
14183       /* In case we haven't resolved FLOAT or SSE yet, give up.  */
14184       if (MAYBE_FLOAT_CLASS_P (class) || MAYBE_SSE_CLASS_P (class))
14185         return NO_REGS;
14186     }
14187   if (MAYBE_MMX_CLASS_P (class) && CONSTANT_P (x))
14188     return NO_REGS;
14189   if (GET_MODE (x) == QImode && ! reg_class_subset_p (class, Q_REGS))
14190     return Q_REGS;
14191   return class;
14192 }
14193
14194 /* If we are copying between general and FP registers, we need a memory
14195    location. The same is true for SSE and MMX registers.
14196
14197    The macro can't work reliably when one of the CLASSES is class containing
14198    registers from multiple units (SSE, MMX, integer).  We avoid this by never
14199    combining those units in single alternative in the machine description.
14200    Ensure that this constraint holds to avoid unexpected surprises.
14201
14202    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
14203    enforce these sanity checks.  */
14204 int
14205 ix86_secondary_memory_needed (class1, class2, mode, strict)
14206      enum reg_class class1, class2;
14207      enum machine_mode mode;
14208      int strict;
14209 {
14210   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
14211       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
14212       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
14213       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
14214       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
14215       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
14216     {
14217       if (strict)
14218         abort ();
14219       else
14220         return 1;
14221     }
14222   return (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2)
14223           || (SSE_CLASS_P (class1) != SSE_CLASS_P (class2)
14224               && (mode) != SImode)
14225           || (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
14226               && (mode) != SImode));
14227 }
14228 /* Return the cost of moving data from a register in class CLASS1 to
14229    one in class CLASS2.
14230
14231    It is not required that the cost always equal 2 when FROM is the same as TO;
14232    on some machines it is expensive to move between registers if they are not
14233    general registers.  */
14234 int
14235 ix86_register_move_cost (mode, class1, class2)
14236      enum machine_mode mode;
14237      enum reg_class class1, class2;
14238 {
14239   /* In case we require secondary memory, compute cost of the store followed
14240      by load.  In order to avoid bad register allocation choices, we need 
14241      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
14242
14243   if (ix86_secondary_memory_needed (class1, class2, mode, 0))
14244     {
14245       int cost = 1;
14246
14247       cost += MAX (MEMORY_MOVE_COST (mode, class1, 0),
14248                    MEMORY_MOVE_COST (mode, class1, 1));
14249       cost += MAX (MEMORY_MOVE_COST (mode, class2, 0),
14250                    MEMORY_MOVE_COST (mode, class2, 1));
14251       
14252       /* In case of copying from general_purpose_register we may emit multiple
14253          stores followed by single load causing memory size mismatch stall.
14254          Count this as arbitrarily high cost of 20.  */
14255       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
14256         cost += 20;
14257
14258       /* In the case of FP/MMX moves, the registers actually overlap, and we
14259          have to switch modes in order to treat them differently.  */
14260       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
14261           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
14262         cost += 20;
14263
14264       return cost;
14265     }
14266
14267   /* Moves between SSE/MMX and integer unit are expensive.  */
14268   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
14269       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
14270     return ix86_cost->mmxsse_to_integer;
14271   if (MAYBE_FLOAT_CLASS_P (class1))
14272     return ix86_cost->fp_move;
14273   if (MAYBE_SSE_CLASS_P (class1))
14274     return ix86_cost->sse_move;
14275   if (MAYBE_MMX_CLASS_P (class1))
14276     return ix86_cost->mmx_move;
14277   return 2;
14278 }
14279
14280 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
14281 int
14282 ix86_hard_regno_mode_ok (regno, mode)
14283      int regno;
14284      enum machine_mode mode;
14285 {
14286   /* Flags and only flags can only hold CCmode values.  */
14287   if (CC_REGNO_P (regno))
14288     return GET_MODE_CLASS (mode) == MODE_CC;
14289   if (GET_MODE_CLASS (mode) == MODE_CC
14290       || GET_MODE_CLASS (mode) == MODE_RANDOM
14291       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
14292     return 0;
14293   if (FP_REGNO_P (regno))
14294     return VALID_FP_MODE_P (mode);
14295   if (SSE_REGNO_P (regno))
14296     return VALID_SSE_REG_MODE (mode);
14297   if (MMX_REGNO_P (regno))
14298     return VALID_MMX_REG_MODE (mode) || VALID_MMX_REG_MODE_3DNOW (mode);
14299   /* We handle both integer and floats in the general purpose registers.
14300      In future we should be able to handle vector modes as well.  */
14301   if (!VALID_INT_MODE_P (mode) && !VALID_FP_MODE_P (mode))
14302     return 0;
14303   /* Take care for QImode values - they can be in non-QI regs, but then
14304      they do cause partial register stalls.  */
14305   if (regno < 4 || mode != QImode || TARGET_64BIT)
14306     return 1;
14307   return reload_in_progress || reload_completed || !TARGET_PARTIAL_REG_STALL;
14308 }
14309
14310 /* Return the cost of moving data of mode M between a
14311    register and memory.  A value of 2 is the default; this cost is
14312    relative to those in `REGISTER_MOVE_COST'.
14313
14314    If moving between registers and memory is more expensive than
14315    between two registers, you should define this macro to express the
14316    relative cost.
14317
14318    Model also increased moving costs of QImode registers in non
14319    Q_REGS classes.
14320  */
14321 int
14322 ix86_memory_move_cost (mode, class, in)
14323      enum machine_mode mode;
14324      enum reg_class class;
14325      int in;
14326 {
14327   if (FLOAT_CLASS_P (class))
14328     {
14329       int index;
14330       switch (mode)
14331         {
14332           case SFmode:
14333             index = 0;
14334             break;
14335           case DFmode:
14336             index = 1;
14337             break;
14338           case XFmode:
14339           case TFmode:
14340             index = 2;
14341             break;
14342           default:
14343             return 100;
14344         }
14345       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
14346     }
14347   if (SSE_CLASS_P (class))
14348     {
14349       int index;
14350       switch (GET_MODE_SIZE (mode))
14351         {
14352           case 4:
14353             index = 0;
14354             break;
14355           case 8:
14356             index = 1;
14357             break;
14358           case 16:
14359             index = 2;
14360             break;
14361           default:
14362             return 100;
14363         }
14364       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
14365     }
14366   if (MMX_CLASS_P (class))
14367     {
14368       int index;
14369       switch (GET_MODE_SIZE (mode))
14370         {
14371           case 4:
14372             index = 0;
14373             break;
14374           case 8:
14375             index = 1;
14376             break;
14377           default:
14378             return 100;
14379         }
14380       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
14381     }
14382   switch (GET_MODE_SIZE (mode))
14383     {
14384       case 1:
14385         if (in)
14386           return (Q_CLASS_P (class) ? ix86_cost->int_load[0]
14387                   : ix86_cost->movzbl_load);
14388         else
14389           return (Q_CLASS_P (class) ? ix86_cost->int_store[0]
14390                   : ix86_cost->int_store[0] + 4);
14391         break;
14392       case 2:
14393         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
14394       default:
14395         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
14396         if (mode == TFmode)
14397           mode = XFmode;
14398         return ((in ? ix86_cost->int_load[2] : ix86_cost->int_store[2])
14399                 * ((int) GET_MODE_SIZE (mode)
14400                    + UNITS_PER_WORD -1 ) / UNITS_PER_WORD);
14401     }
14402 }
14403
14404 #if defined (DO_GLOBAL_CTORS_BODY) && defined (HAS_INIT_SECTION)
14405 static void
14406 ix86_svr3_asm_out_constructor (symbol, priority)
14407      rtx symbol;
14408      int priority ATTRIBUTE_UNUSED;
14409 {
14410   init_section ();
14411   fputs ("\tpushl $", asm_out_file);
14412   assemble_name (asm_out_file, XSTR (symbol, 0));
14413   fputc ('\n', asm_out_file);
14414 }
14415 #endif
14416
14417 #if TARGET_MACHO
14418
14419 static int current_machopic_label_num;
14420
14421 /* Given a symbol name and its associated stub, write out the
14422    definition of the stub.  */
14423
14424 void
14425 machopic_output_stub (file, symb, stub)
14426      FILE *file;
14427      const char *symb, *stub;
14428 {
14429   unsigned int length;
14430   char *binder_name, *symbol_name, lazy_ptr_name[32];
14431   int label = ++current_machopic_label_num;
14432
14433   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
14434   symb = (*targetm.strip_name_encoding) (symb);
14435
14436   length = strlen (stub);
14437   binder_name = alloca (length + 32);
14438   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
14439
14440   length = strlen (symb);
14441   symbol_name = alloca (length + 32);
14442   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
14443
14444   sprintf (lazy_ptr_name, "L%d$lz", label);
14445
14446   if (MACHOPIC_PURE)
14447     machopic_picsymbol_stub_section ();
14448   else
14449     machopic_symbol_stub_section ();
14450
14451   fprintf (file, "%s:\n", stub);
14452   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
14453
14454   if (MACHOPIC_PURE)
14455     {
14456       fprintf (file, "\tcall LPC$%d\nLPC$%d:\tpopl %%eax\n", label, label);
14457       fprintf (file, "\tmovl %s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
14458       fprintf (file, "\tjmp %%edx\n");
14459     }
14460   else
14461     fprintf (file, "\tjmp *%s\n", lazy_ptr_name);
14462   
14463   fprintf (file, "%s:\n", binder_name);
14464   
14465   if (MACHOPIC_PURE)
14466     {
14467       fprintf (file, "\tlea %s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
14468       fprintf (file, "\tpushl %%eax\n");
14469     }
14470   else
14471     fprintf (file, "\t pushl $%s\n", lazy_ptr_name);
14472
14473   fprintf (file, "\tjmp dyld_stub_binding_helper\n");
14474
14475   machopic_lazy_symbol_ptr_section ();
14476   fprintf (file, "%s:\n", lazy_ptr_name);
14477   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
14478   fprintf (file, "\t.long %s\n", binder_name);
14479 }
14480 #endif /* TARGET_MACHO */
14481
14482 /* Order the registers for register allocator.  */
14483
14484 void
14485 x86_order_regs_for_local_alloc ()
14486 {
14487    int pos = 0;
14488    int i;
14489
14490    /* First allocate the local general purpose registers.  */
14491    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
14492      if (GENERAL_REGNO_P (i) && call_used_regs[i])
14493         reg_alloc_order [pos++] = i;
14494
14495    /* Global general purpose registers.  */
14496    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
14497      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
14498         reg_alloc_order [pos++] = i;
14499
14500    /* x87 registers come first in case we are doing FP math
14501       using them.  */
14502    if (!TARGET_SSE_MATH)
14503      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
14504        reg_alloc_order [pos++] = i;
14505
14506    /* SSE registers.  */
14507    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
14508      reg_alloc_order [pos++] = i;
14509    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
14510      reg_alloc_order [pos++] = i;
14511
14512    /* x87 registers.  */
14513    if (TARGET_SSE_MATH)
14514      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
14515        reg_alloc_order [pos++] = i;
14516
14517    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
14518      reg_alloc_order [pos++] = i;
14519
14520    /* Initialize the rest of array as we do not allocate some registers
14521       at all.  */
14522    while (pos < FIRST_PSEUDO_REGISTER)
14523      reg_alloc_order [pos++] = 0;
14524 }
14525
14526 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
14527 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
14528 #endif
14529
14530 static bool
14531 ix86_ms_bitfield_layout_p (record_type)
14532      tree record_type ATTRIBUTE_UNUSED;
14533 {
14534   return TARGET_USE_MS_BITFIELD_LAYOUT;
14535 }
14536
14537 /* Returns an expression indicating where the this parameter is
14538    located on entry to the FUNCTION.  */
14539
14540 static rtx
14541 x86_this_parameter (function)
14542      tree function;
14543 {
14544   tree type = TREE_TYPE (function);
14545
14546   if (TARGET_64BIT)
14547     {
14548       int n = aggregate_value_p (TREE_TYPE (type)) != 0;
14549       return gen_rtx_REG (DImode, x86_64_int_parameter_registers[n]);
14550     }
14551
14552   if (ix86_fntype_regparm (type) > 0)
14553     {
14554       tree parm;
14555
14556       parm = TYPE_ARG_TYPES (type);
14557       /* Figure out whether or not the function has a variable number of
14558          arguments.  */
14559       for (; parm; parm = TREE_CHAIN (parm))
14560         if (TREE_VALUE (parm) == void_type_node)
14561           break;
14562       /* If not, the this parameter is in %eax.  */
14563       if (parm)
14564         return gen_rtx_REG (SImode, 0);
14565     }
14566
14567   if (aggregate_value_p (TREE_TYPE (type)))
14568     return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 8));
14569   else
14570     return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 4));
14571 }
14572
14573 /* Determine whether x86_output_mi_thunk can succeed.  */
14574
14575 static bool
14576 x86_can_output_mi_thunk (thunk, delta, vcall_offset, function)
14577      tree thunk ATTRIBUTE_UNUSED;
14578      HOST_WIDE_INT delta ATTRIBUTE_UNUSED;
14579      HOST_WIDE_INT vcall_offset;
14580      tree function;
14581 {
14582   /* 64-bit can handle anything.  */
14583   if (TARGET_64BIT)
14584     return true;
14585
14586   /* For 32-bit, everything's fine if we have one free register.  */
14587   if (ix86_fntype_regparm (TREE_TYPE (function)) < 3)
14588     return true;
14589
14590   /* Need a free register for vcall_offset.  */
14591   if (vcall_offset)
14592     return false;
14593
14594   /* Need a free register for GOT references.  */
14595   if (flag_pic && !(*targetm.binds_local_p) (function))
14596     return false;
14597
14598   /* Otherwise ok.  */
14599   return true;
14600 }
14601
14602 /* Output the assembler code for a thunk function.  THUNK_DECL is the
14603    declaration for the thunk function itself, FUNCTION is the decl for
14604    the target function.  DELTA is an immediate constant offset to be
14605    added to THIS.  If VCALL_OFFSET is nonzero, the word at
14606    *(*this + vcall_offset) should be added to THIS.  */
14607
14608 static void
14609 x86_output_mi_thunk (file, thunk, delta, vcall_offset, function)
14610      FILE *file ATTRIBUTE_UNUSED;
14611      tree thunk ATTRIBUTE_UNUSED;
14612      HOST_WIDE_INT delta;
14613      HOST_WIDE_INT vcall_offset;
14614      tree function;
14615 {
14616   rtx xops[3];
14617   rtx this = x86_this_parameter (function);
14618   rtx this_reg, tmp;
14619
14620   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
14621      pull it in now and let DELTA benefit.  */
14622   if (REG_P (this))
14623     this_reg = this;
14624   else if (vcall_offset)
14625     {
14626       /* Put the this parameter into %eax.  */
14627       xops[0] = this;
14628       xops[1] = this_reg = gen_rtx_REG (Pmode, 0);
14629       output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
14630     }
14631   else
14632     this_reg = NULL_RTX;
14633
14634   /* Adjust the this parameter by a fixed constant.  */
14635   if (delta)
14636     {
14637       xops[0] = GEN_INT (delta);
14638       xops[1] = this_reg ? this_reg : this;
14639       if (TARGET_64BIT)
14640         {
14641           if (!x86_64_general_operand (xops[0], DImode))
14642             {
14643               tmp = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 2 /* R10 */);
14644               xops[1] = tmp;
14645               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
14646               xops[0] = tmp;
14647               xops[1] = this;
14648             }
14649           output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
14650         }
14651       else
14652         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
14653     }
14654
14655   /* Adjust the this parameter by a value stored in the vtable.  */
14656   if (vcall_offset)
14657     {
14658       if (TARGET_64BIT)
14659         tmp = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 2 /* R10 */);
14660       else
14661         tmp = gen_rtx_REG (SImode, 2 /* ECX */);
14662
14663       xops[0] = gen_rtx_MEM (Pmode, this_reg);
14664       xops[1] = tmp;
14665       if (TARGET_64BIT)
14666         output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
14667       else
14668         output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
14669
14670       /* Adjust the this parameter.  */
14671       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
14672       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
14673         {
14674           rtx tmp2 = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 3 /* R11 */);
14675           xops[0] = GEN_INT (vcall_offset);
14676           xops[1] = tmp2;
14677           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
14678           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
14679         }
14680       xops[1] = this_reg;
14681       if (TARGET_64BIT)
14682         output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
14683       else
14684         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
14685     }
14686
14687   /* If necessary, drop THIS back to its stack slot.  */
14688   if (this_reg && this_reg != this)
14689     {
14690       xops[0] = this_reg;
14691       xops[1] = this;
14692       output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
14693     }
14694
14695   xops[0] = DECL_RTL (function);
14696   if (TARGET_64BIT)
14697     {
14698       if (!flag_pic || (*targetm.binds_local_p) (function))
14699         output_asm_insn ("jmp\t%P0", xops);
14700       else
14701         {
14702           tmp = XEXP (xops[0], 0);
14703           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, tmp), UNSPEC_GOTPCREL);
14704           tmp = gen_rtx_CONST (Pmode, tmp);
14705           tmp = gen_rtx_MEM (QImode, tmp);
14706           xops[0] = tmp;
14707           output_asm_insn ("jmp\t%A0", xops);
14708         }
14709     }
14710   else
14711     {
14712       if (!flag_pic || (*targetm.binds_local_p) (function))
14713         output_asm_insn ("jmp\t%P0", xops);
14714       else
14715         {
14716           tmp = gen_rtx_REG (SImode, 2 /* ECX */);
14717           output_set_got (tmp);
14718
14719           xops[1] = tmp;
14720           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
14721           output_asm_insn ("jmp\t{*}%1", xops);
14722         }
14723     }
14724 }
14725
14726 int
14727 x86_field_alignment (field, computed)
14728      tree field;
14729      int computed;
14730 {
14731   enum machine_mode mode;
14732   tree type = TREE_TYPE (field);
14733
14734   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
14735     return computed;
14736   mode = TYPE_MODE (TREE_CODE (type) == ARRAY_TYPE
14737                     ? get_inner_array_type (type) : type);
14738   if (mode == DFmode || mode == DCmode
14739       || GET_MODE_CLASS (mode) == MODE_INT
14740       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
14741     return MIN (32, computed);
14742   return computed;
14743 }
14744
14745 /* Output assembler code to FILE to increment profiler label # LABELNO
14746    for profiling a function entry.  */
14747 void
14748 x86_function_profiler (file, labelno)
14749      FILE *file;
14750      int labelno ATTRIBUTE_UNUSED;
14751 {
14752   if (TARGET_64BIT)
14753     if (flag_pic)
14754       {
14755 #ifndef NO_PROFILE_COUNTERS
14756         fprintf (file, "\tleaq\t%sP%d@(%%rip),%%r11\n", LPREFIX, labelno);
14757 #endif
14758         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", MCOUNT_NAME);
14759       }
14760     else
14761       {
14762 #ifndef NO_PROFILE_COUNTERS
14763         fprintf (file, "\tmovq\t$%sP%d,%%r11\n", LPREFIX, labelno);
14764 #endif
14765         fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
14766       }
14767   else if (flag_pic)
14768     {
14769 #ifndef NO_PROFILE_COUNTERS
14770       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%%s\n",
14771                LPREFIX, labelno, PROFILE_COUNT_REGISTER);
14772 #endif
14773       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", MCOUNT_NAME);
14774     }
14775   else
14776     {
14777 #ifndef NO_PROFILE_COUNTERS
14778       fprintf (file, "\tmovl\t$%sP%d,%%$s\n", LPREFIX, labelno,
14779                PROFILE_COUNT_REGISTER);
14780 #endif
14781       fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
14782     }
14783 }
14784
14785 /* Implement machine specific optimizations.  
14786    At the moment we implement single transformation: AMD Athlon works faster
14787    when RET is not destination of conditional jump or directly preceded
14788    by other jump instruction.  We avoid the penalty by inserting NOP just
14789    before the RET instructions in such cases.  */
14790 void
14791 x86_machine_dependent_reorg (first)
14792      rtx first ATTRIBUTE_UNUSED;
14793 {
14794   edge e;
14795
14796   if (!TARGET_ATHLON_K8 || !optimize || optimize_size)
14797     return;
14798   for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
14799   {
14800     basic_block bb = e->src;
14801     rtx ret = bb->end;
14802     rtx prev;
14803     bool insert = false;
14804
14805     if (!returnjump_p (ret) || !maybe_hot_bb_p (bb))
14806       continue;
14807     for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
14808       if (active_insn_p (prev) || GET_CODE (prev) == CODE_LABEL)
14809         break;
14810     if (prev && GET_CODE (prev) == CODE_LABEL)
14811       {
14812         edge e;
14813         for (e = bb->pred; e; e = e->pred_next)
14814           if (EDGE_FREQUENCY (e) && e->src->index >= 0
14815               && !(e->flags & EDGE_FALLTHRU))
14816             insert = 1;
14817       }
14818     if (!insert)
14819       {
14820         prev = prev_active_insn (ret);
14821         if (prev && GET_CODE (prev) == JUMP_INSN
14822             && any_condjump_p (prev))
14823           insert = 1;
14824         /* Empty functions get branch misspredict even when the jump destination
14825            is not visible to us.  */
14826         if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
14827           insert = 1;
14828       }
14829     if (insert)
14830       emit_insn_before (gen_nop (), ret);
14831   }
14832 }
14833
14834 /* Return nonzero when QImode register that must be represented via REX prefix
14835    is used.  */
14836 bool
14837 x86_extended_QIreg_mentioned_p (insn)
14838      rtx insn;
14839 {
14840   int i;
14841   extract_insn_cached (insn);
14842   for (i = 0; i < recog_data.n_operands; i++)
14843     if (REG_P (recog_data.operand[i])
14844         && REGNO (recog_data.operand[i]) >= 4)
14845        return true;
14846   return false;
14847 }
14848
14849 /* Return nonzero when P points to register encoded via REX prefix.
14850    Called via for_each_rtx.  */
14851 static int
14852 extended_reg_mentioned_1 (p, data)
14853         rtx *p;
14854         void *data ATTRIBUTE_UNUSED;
14855 {
14856    unsigned int regno;
14857    if (!REG_P (*p))
14858      return 0;
14859    regno = REGNO (*p);
14860    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
14861 }
14862
14863 /* Return true when INSN mentions register that must be encoded using REX
14864    prefix.  */
14865 bool
14866 x86_extended_reg_mentioned_p (insn)
14867      rtx insn;
14868 {
14869   return for_each_rtx (&PATTERN (insn), extended_reg_mentioned_1, NULL);
14870 }
14871
14872 #include "gt-i386.h"