OSDN Git Service

* config/i386/i386-opts.h: New.
[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,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "tm_p.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "output.h"
34 #include "insn-codes.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 "diagnostic-core.h"
43 #include "toplev.h"
44 #include "basic-block.h"
45 #include "ggc.h"
46 #include "target.h"
47 #include "target-def.h"
48 #include "langhooks.h"
49 #include "cgraph.h"
50 #include "gimple.h"
51 #include "dwarf2.h"
52 #include "df.h"
53 #include "tm-constrs.h"
54 #include "params.h"
55 #include "cselib.h"
56 #include "debug.h"
57 #include "dwarf2out.h"
58 #include "sched-int.h"
59 #include "sbitmap.h"
60 #include "fibheap.h"
61 #include "opts.h"
62
63 enum upper_128bits_state
64 {
65   unknown = 0,
66   unused,
67   used
68 };
69
70 typedef struct block_info_def
71 {
72   /* State of the upper 128bits of AVX registers at exit.  */
73   enum upper_128bits_state state;
74   /* TRUE if state of the upper 128bits of AVX registers is unchanged
75      in this block.  */
76   bool unchanged;
77   /* TRUE if block has been processed.  */
78   bool processed;
79   /* TRUE if block has been scanned.  */
80   bool scanned;
81   /* Previous state of the upper 128bits of AVX registers at entry.  */
82   enum upper_128bits_state prev;
83 } *block_info;
84
85 #define BLOCK_INFO(B)   ((block_info) (B)->aux)
86
87 enum call_avx256_state
88 {
89   /* Callee returns 256bit AVX register.  */
90   callee_return_avx256 = -1,
91   /* Callee returns and passes 256bit AVX register.  */
92   callee_return_pass_avx256,
93   /* Callee passes 256bit AVX register.  */
94   callee_pass_avx256,
95   /* Callee doesn't return nor passe 256bit AVX register, or no
96      256bit AVX register in function return.  */
97   call_no_avx256,
98   /* vzeroupper intrinsic.  */
99   vzeroupper_intrinsic
100 };
101
102 /* Check if a 256bit AVX register is referenced in stores.   */
103
104 static void
105 check_avx256_stores (rtx dest, const_rtx set, void *data)
106 {
107   if ((REG_P (dest)
108        && VALID_AVX256_REG_MODE (GET_MODE (dest)))
109       || (GET_CODE (set) == SET
110           && REG_P (SET_SRC (set))
111           && VALID_AVX256_REG_MODE (GET_MODE (SET_SRC (set)))))
112     {
113       enum upper_128bits_state *state
114         = (enum upper_128bits_state *) data;
115       *state = used;
116     }
117 }
118
119 /* Helper function for move_or_delete_vzeroupper_1.  Look for vzeroupper
120    in basic block BB.  Delete it if upper 128bit AVX registers are
121    unused.  If it isn't deleted, move it to just before a jump insn.
122    
123    STATE is state of the upper 128bits of AVX registers at entry.  */
124
125 static void
126 move_or_delete_vzeroupper_2 (basic_block bb,
127                              enum upper_128bits_state state)
128 {
129   rtx insn, bb_end;
130   rtx vzeroupper_insn = NULL_RTX;
131   rtx pat;
132   int avx256;
133   bool unchanged;
134
135   if (BLOCK_INFO (bb)->unchanged)
136     {
137       if (dump_file)
138         fprintf (dump_file, " [bb %i] unchanged: upper 128bits: %d\n",
139                  bb->index, state);
140
141       BLOCK_INFO (bb)->state = state;
142       return;
143     }
144
145   if (BLOCK_INFO (bb)->scanned && BLOCK_INFO (bb)->prev == state)
146     {
147       if (dump_file)
148         fprintf (dump_file, " [bb %i] scanned: upper 128bits: %d\n",
149                  bb->index, BLOCK_INFO (bb)->state);
150       return;
151     }
152
153   BLOCK_INFO (bb)->prev = state;
154
155   if (dump_file)
156     fprintf (dump_file, " [bb %i] entry: upper 128bits: %d\n",
157              bb->index, state);
158
159   unchanged = true;
160
161   /* BB_END changes when it is deleted.  */
162   bb_end = BB_END (bb);
163   insn = BB_HEAD (bb);
164   while (insn != bb_end)
165     {
166       insn = NEXT_INSN (insn);
167
168       if (!NONDEBUG_INSN_P (insn))
169         continue;
170
171       /* Move vzeroupper before jump/call.  */
172       if (JUMP_P (insn) || CALL_P (insn))
173         {
174           if (!vzeroupper_insn)
175             continue;
176
177           if (PREV_INSN (insn) != vzeroupper_insn)
178             {
179               if (dump_file)
180                 {
181                   fprintf (dump_file, "Move vzeroupper after:\n");
182                   print_rtl_single (dump_file, PREV_INSN (insn));
183                   fprintf (dump_file, "before:\n");
184                   print_rtl_single (dump_file, insn);
185                 }
186               reorder_insns_nobb (vzeroupper_insn, vzeroupper_insn,
187                                   PREV_INSN (insn));
188             }
189           vzeroupper_insn = NULL_RTX;
190           continue;
191         }
192
193       pat = PATTERN (insn);
194
195       /* Check insn for vzeroupper intrinsic.  */
196       if (GET_CODE (pat) == UNSPEC_VOLATILE
197           && XINT (pat, 1) == UNSPECV_VZEROUPPER)
198         {
199           if (dump_file)
200             {
201               /* Found vzeroupper intrinsic.  */
202               fprintf (dump_file, "Found vzeroupper:\n");
203               print_rtl_single (dump_file, insn);
204             }
205         }
206       else
207         {
208           /* Check insn for vzeroall intrinsic.  */
209           if (GET_CODE (pat) == PARALLEL
210               && GET_CODE (XVECEXP (pat, 0, 0)) == UNSPEC_VOLATILE
211               && XINT (XVECEXP (pat, 0, 0), 1) == UNSPECV_VZEROALL)
212             {
213               state = unused;
214               unchanged = false;
215
216               /* Delete pending vzeroupper insertion.  */
217               if (vzeroupper_insn)
218                 {
219                   delete_insn (vzeroupper_insn);
220                   vzeroupper_insn = NULL_RTX;
221                 }
222             }
223           else if (state != used)
224             {
225               note_stores (pat, check_avx256_stores, &state);
226               if (state == used)
227                 unchanged = false;
228             }
229           continue;
230         }
231
232       /* Process vzeroupper intrinsic.  */
233       avx256 = INTVAL (XVECEXP (pat, 0, 0));
234
235       if (state == unused)
236         {
237           /* Since the upper 128bits are cleared, callee must not pass
238              256bit AVX register.  We only need to check if callee
239              returns 256bit AVX register.  */
240           if (avx256 == callee_return_avx256)
241             {
242               state = used;
243               unchanged = false;
244             }
245
246           /* Remove unnecessary vzeroupper since upper 128bits are
247              cleared.  */
248           if (dump_file)
249             {
250               fprintf (dump_file, "Delete redundant vzeroupper:\n");
251               print_rtl_single (dump_file, insn);
252             }
253           delete_insn (insn);
254         }
255       else
256         {
257           /* Set state to UNUSED if callee doesn't return 256bit AVX
258              register.  */
259           if (avx256 != callee_return_pass_avx256)
260             state = unused;
261
262           if (avx256 == callee_return_pass_avx256
263               || avx256 == callee_pass_avx256)
264             {
265               /* Must remove vzeroupper since callee passes in 256bit
266                  AVX register.  */
267               if (dump_file)
268                 {
269                   fprintf (dump_file, "Delete callee pass vzeroupper:\n");
270                   print_rtl_single (dump_file, insn);
271                 }
272               delete_insn (insn);
273             }
274           else
275             {
276               vzeroupper_insn = insn;
277               unchanged = false;
278             }
279         }
280     }
281
282   BLOCK_INFO (bb)->state = state;
283   BLOCK_INFO (bb)->unchanged = unchanged;
284   BLOCK_INFO (bb)->scanned = true;
285
286   if (dump_file)
287     fprintf (dump_file, " [bb %i] exit: %s: upper 128bits: %d\n",
288              bb->index, unchanged ? "unchanged" : "changed",
289              state);
290 }
291
292 /* Helper function for move_or_delete_vzeroupper.  Process vzeroupper
293    in BLOCK and check its predecessor blocks.  Treat UNKNOWN state
294    as USED if UNKNOWN_IS_UNUSED is true.  Return TRUE if the exit
295    state is changed.  */
296
297 static bool
298 move_or_delete_vzeroupper_1 (basic_block block, bool unknown_is_unused)
299 {
300   edge e;
301   edge_iterator ei;
302   enum upper_128bits_state state, old_state, new_state;
303   bool seen_unknown;
304
305   if (dump_file)
306     fprintf (dump_file, " Process [bb %i]: status: %d\n",
307              block->index, BLOCK_INFO (block)->processed);
308
309   if (BLOCK_INFO (block)->processed)
310     return false;
311
312   state = unused;
313
314   /* Check all predecessor edges of this block.  */
315   seen_unknown = false;
316   FOR_EACH_EDGE (e, ei, block->preds)
317     {
318       if (e->src == block)
319         continue;
320       switch (BLOCK_INFO (e->src)->state)
321         {
322         case unknown:
323           if (!unknown_is_unused)
324             seen_unknown = true;
325         case unused:
326           break;
327         case used:
328           state = used;
329           goto done;
330         }
331     }
332
333   if (seen_unknown)
334     state = unknown;
335
336 done:
337   old_state = BLOCK_INFO (block)->state;
338   move_or_delete_vzeroupper_2 (block, state);
339   new_state = BLOCK_INFO (block)->state;
340
341   if (state != unknown || new_state == used)
342     BLOCK_INFO (block)->processed = true;
343
344   /* Need to rescan if the upper 128bits of AVX registers are changed
345      to USED at exit.  */
346   if (new_state != old_state)
347     {
348       if (new_state == used)
349         cfun->machine->rescan_vzeroupper_p = 1;
350       return true;
351     }
352   else
353     return false;
354 }
355
356 /* Go through the instruction stream looking for vzeroupper.  Delete
357    it if upper 128bit AVX registers are unused.  If it isn't deleted,
358    move it to just before a jump insn.  */
359
360 static void
361 move_or_delete_vzeroupper (void)
362 {
363   edge e;
364   edge_iterator ei;
365   basic_block bb;
366   fibheap_t worklist, pending, fibheap_swap;
367   sbitmap visited, in_worklist, in_pending, sbitmap_swap;
368   int *bb_order;
369   int *rc_order;
370   int i;
371
372   /* Set up block info for each basic block.  */
373   alloc_aux_for_blocks (sizeof (struct block_info_def));
374
375   /* Process outgoing edges of entry point.  */
376   if (dump_file)
377     fprintf (dump_file, "Process outgoing edges of entry point\n");
378
379   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
380     {
381       move_or_delete_vzeroupper_2 (e->dest,
382                                    cfun->machine->caller_pass_avx256_p
383                                    ? used : unused);
384       BLOCK_INFO (e->dest)->processed = true;
385     }
386
387   /* Compute reverse completion order of depth first search of the CFG
388      so that the data-flow runs faster.  */
389   rc_order = XNEWVEC (int, n_basic_blocks - NUM_FIXED_BLOCKS);
390   bb_order = XNEWVEC (int, last_basic_block);
391   pre_and_rev_post_order_compute (NULL, rc_order, false);
392   for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; i++)
393     bb_order[rc_order[i]] = i;
394   free (rc_order);
395
396   worklist = fibheap_new ();
397   pending = fibheap_new ();
398   visited = sbitmap_alloc (last_basic_block);
399   in_worklist = sbitmap_alloc (last_basic_block);
400   in_pending = sbitmap_alloc (last_basic_block);
401   sbitmap_zero (in_worklist);
402
403   /* Don't check outgoing edges of entry point.  */
404   sbitmap_ones (in_pending);
405   FOR_EACH_BB (bb)
406     if (BLOCK_INFO (bb)->processed)
407       RESET_BIT (in_pending, bb->index);
408     else
409       {
410         move_or_delete_vzeroupper_1 (bb, false);
411         fibheap_insert (pending, bb_order[bb->index], bb);
412       }
413
414   if (dump_file)
415     fprintf (dump_file, "Check remaining basic blocks\n");
416
417   while (!fibheap_empty (pending))
418     {
419       fibheap_swap = pending;
420       pending = worklist;
421       worklist = fibheap_swap;
422       sbitmap_swap = in_pending;
423       in_pending = in_worklist;
424       in_worklist = sbitmap_swap;
425
426       sbitmap_zero (visited);
427
428       cfun->machine->rescan_vzeroupper_p = 0;
429
430       while (!fibheap_empty (worklist))
431         {
432           bb = (basic_block) fibheap_extract_min (worklist);
433           RESET_BIT (in_worklist, bb->index);
434           gcc_assert (!TEST_BIT (visited, bb->index));
435           if (!TEST_BIT (visited, bb->index))
436             {
437               edge_iterator ei;
438
439               SET_BIT (visited, bb->index);
440
441               if (move_or_delete_vzeroupper_1 (bb, false))
442                 FOR_EACH_EDGE (e, ei, bb->succs)
443                   {
444                     if (e->dest == EXIT_BLOCK_PTR
445                         || BLOCK_INFO (e->dest)->processed)
446                       continue;
447
448                     if (TEST_BIT (visited, e->dest->index))
449                       {
450                         if (!TEST_BIT (in_pending, e->dest->index))
451                           {
452                             /* Send E->DEST to next round.  */
453                             SET_BIT (in_pending, e->dest->index);
454                             fibheap_insert (pending,
455                                             bb_order[e->dest->index],
456                                             e->dest);
457                           }
458                       }
459                     else if (!TEST_BIT (in_worklist, e->dest->index))
460                       {
461                         /* Add E->DEST to current round.  */
462                         SET_BIT (in_worklist, e->dest->index);
463                         fibheap_insert (worklist, bb_order[e->dest->index],
464                                         e->dest);
465                       }
466                   }
467             }
468         }
469
470       if (!cfun->machine->rescan_vzeroupper_p)
471         break;
472     }
473
474   free (bb_order);
475   fibheap_delete (worklist);
476   fibheap_delete (pending);
477   sbitmap_free (visited);
478   sbitmap_free (in_worklist);
479   sbitmap_free (in_pending);
480
481   if (dump_file)
482     fprintf (dump_file, "Process remaining basic blocks\n");
483
484   FOR_EACH_BB (bb)
485     move_or_delete_vzeroupper_1 (bb, true);
486
487   free_aux_for_blocks ();
488 }
489
490 static rtx legitimize_dllimport_symbol (rtx, bool);
491
492 #ifndef CHECK_STACK_LIMIT
493 #define CHECK_STACK_LIMIT (-1)
494 #endif
495
496 /* Return index of given mode in mult and division cost tables.  */
497 #define MODE_INDEX(mode)                                        \
498   ((mode) == QImode ? 0                                         \
499    : (mode) == HImode ? 1                                       \
500    : (mode) == SImode ? 2                                       \
501    : (mode) == DImode ? 3                                       \
502    : 4)
503
504 /* Processor costs (relative to an add) */
505 /* We assume COSTS_N_INSNS is defined as (N)*4 and an addition is 2 bytes.  */
506 #define COSTS_N_BYTES(N) ((N) * 2)
507
508 #define DUMMY_STRINGOP_ALGS {libcall, {{-1, libcall}}}
509
510 const
511 struct processor_costs ix86_size_cost = {/* costs for tuning for size */
512   COSTS_N_BYTES (2),                    /* cost of an add instruction */
513   COSTS_N_BYTES (3),                    /* cost of a lea instruction */
514   COSTS_N_BYTES (2),                    /* variable shift costs */
515   COSTS_N_BYTES (3),                    /* constant shift costs */
516   {COSTS_N_BYTES (3),                   /* cost of starting multiply for QI */
517    COSTS_N_BYTES (3),                   /*                               HI */
518    COSTS_N_BYTES (3),                   /*                               SI */
519    COSTS_N_BYTES (3),                   /*                               DI */
520    COSTS_N_BYTES (5)},                  /*                            other */
521   0,                                    /* cost of multiply per each bit set */
522   {COSTS_N_BYTES (3),                   /* cost of a divide/mod for QI */
523    COSTS_N_BYTES (3),                   /*                          HI */
524    COSTS_N_BYTES (3),                   /*                          SI */
525    COSTS_N_BYTES (3),                   /*                          DI */
526    COSTS_N_BYTES (5)},                  /*                          other */
527   COSTS_N_BYTES (3),                    /* cost of movsx */
528   COSTS_N_BYTES (3),                    /* cost of movzx */
529   0,                                    /* "large" insn */
530   2,                                    /* MOVE_RATIO */
531   2,                                 /* cost for loading QImode using movzbl */
532   {2, 2, 2},                            /* cost of loading integer registers
533                                            in QImode, HImode and SImode.
534                                            Relative to reg-reg move (2).  */
535   {2, 2, 2},                            /* cost of storing integer registers */
536   2,                                    /* cost of reg,reg fld/fst */
537   {2, 2, 2},                            /* cost of loading fp registers
538                                            in SFmode, DFmode and XFmode */
539   {2, 2, 2},                            /* cost of storing fp registers
540                                            in SFmode, DFmode and XFmode */
541   3,                                    /* cost of moving MMX register */
542   {3, 3},                               /* cost of loading MMX registers
543                                            in SImode and DImode */
544   {3, 3},                               /* cost of storing MMX registers
545                                            in SImode and DImode */
546   3,                                    /* cost of moving SSE register */
547   {3, 3, 3},                            /* cost of loading SSE registers
548                                            in SImode, DImode and TImode */
549   {3, 3, 3},                            /* cost of storing SSE registers
550                                            in SImode, DImode and TImode */
551   3,                                    /* MMX or SSE register to integer */
552   0,                                    /* size of l1 cache  */
553   0,                                    /* size of l2 cache  */
554   0,                                    /* size of prefetch block */
555   0,                                    /* number of parallel prefetches */
556   2,                                    /* Branch cost */
557   COSTS_N_BYTES (2),                    /* cost of FADD and FSUB insns.  */
558   COSTS_N_BYTES (2),                    /* cost of FMUL instruction.  */
559   COSTS_N_BYTES (2),                    /* cost of FDIV instruction.  */
560   COSTS_N_BYTES (2),                    /* cost of FABS instruction.  */
561   COSTS_N_BYTES (2),                    /* cost of FCHS instruction.  */
562   COSTS_N_BYTES (2),                    /* cost of FSQRT instruction.  */
563   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
564    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
565   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
566    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
567   1,                                    /* scalar_stmt_cost.  */
568   1,                                    /* scalar load_cost.  */
569   1,                                    /* scalar_store_cost.  */
570   1,                                    /* vec_stmt_cost.  */
571   1,                                    /* vec_to_scalar_cost.  */
572   1,                                    /* scalar_to_vec_cost.  */
573   1,                                    /* vec_align_load_cost.  */
574   1,                                    /* vec_unalign_load_cost.  */
575   1,                                    /* vec_store_cost.  */
576   1,                                    /* cond_taken_branch_cost.  */
577   1,                                    /* cond_not_taken_branch_cost.  */
578 };
579
580 /* Processor costs (relative to an add) */
581 static const
582 struct processor_costs i386_cost = {    /* 386 specific costs */
583   COSTS_N_INSNS (1),                    /* cost of an add instruction */
584   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
585   COSTS_N_INSNS (3),                    /* variable shift costs */
586   COSTS_N_INSNS (2),                    /* constant shift costs */
587   {COSTS_N_INSNS (6),                   /* cost of starting multiply for QI */
588    COSTS_N_INSNS (6),                   /*                               HI */
589    COSTS_N_INSNS (6),                   /*                               SI */
590    COSTS_N_INSNS (6),                   /*                               DI */
591    COSTS_N_INSNS (6)},                  /*                            other */
592   COSTS_N_INSNS (1),                    /* cost of multiply per each bit set */
593   {COSTS_N_INSNS (23),                  /* cost of a divide/mod for QI */
594    COSTS_N_INSNS (23),                  /*                          HI */
595    COSTS_N_INSNS (23),                  /*                          SI */
596    COSTS_N_INSNS (23),                  /*                          DI */
597    COSTS_N_INSNS (23)},                 /*                          other */
598   COSTS_N_INSNS (3),                    /* cost of movsx */
599   COSTS_N_INSNS (2),                    /* cost of movzx */
600   15,                                   /* "large" insn */
601   3,                                    /* MOVE_RATIO */
602   4,                                 /* cost for loading QImode using movzbl */
603   {2, 4, 2},                            /* cost of loading integer registers
604                                            in QImode, HImode and SImode.
605                                            Relative to reg-reg move (2).  */
606   {2, 4, 2},                            /* cost of storing integer registers */
607   2,                                    /* cost of reg,reg fld/fst */
608   {8, 8, 8},                            /* cost of loading fp registers
609                                            in SFmode, DFmode and XFmode */
610   {8, 8, 8},                            /* cost of storing fp registers
611                                            in SFmode, DFmode and XFmode */
612   2,                                    /* cost of moving MMX register */
613   {4, 8},                               /* cost of loading MMX registers
614                                            in SImode and DImode */
615   {4, 8},                               /* cost of storing MMX registers
616                                            in SImode and DImode */
617   2,                                    /* cost of moving SSE register */
618   {4, 8, 16},                           /* cost of loading SSE registers
619                                            in SImode, DImode and TImode */
620   {4, 8, 16},                           /* cost of storing SSE registers
621                                            in SImode, DImode and TImode */
622   3,                                    /* MMX or SSE register to integer */
623   0,                                    /* size of l1 cache  */
624   0,                                    /* size of l2 cache  */
625   0,                                    /* size of prefetch block */
626   0,                                    /* number of parallel prefetches */
627   1,                                    /* Branch cost */
628   COSTS_N_INSNS (23),                   /* cost of FADD and FSUB insns.  */
629   COSTS_N_INSNS (27),                   /* cost of FMUL instruction.  */
630   COSTS_N_INSNS (88),                   /* cost of FDIV instruction.  */
631   COSTS_N_INSNS (22),                   /* cost of FABS instruction.  */
632   COSTS_N_INSNS (24),                   /* cost of FCHS instruction.  */
633   COSTS_N_INSNS (122),                  /* cost of FSQRT instruction.  */
634   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
635    DUMMY_STRINGOP_ALGS},
636   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
637    DUMMY_STRINGOP_ALGS},
638   1,                                    /* scalar_stmt_cost.  */
639   1,                                    /* scalar load_cost.  */
640   1,                                    /* scalar_store_cost.  */
641   1,                                    /* vec_stmt_cost.  */
642   1,                                    /* vec_to_scalar_cost.  */
643   1,                                    /* scalar_to_vec_cost.  */
644   1,                                    /* vec_align_load_cost.  */
645   2,                                    /* vec_unalign_load_cost.  */
646   1,                                    /* vec_store_cost.  */
647   3,                                    /* cond_taken_branch_cost.  */
648   1,                                    /* cond_not_taken_branch_cost.  */
649 };
650
651 static const
652 struct processor_costs i486_cost = {    /* 486 specific costs */
653   COSTS_N_INSNS (1),                    /* cost of an add instruction */
654   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
655   COSTS_N_INSNS (3),                    /* variable shift costs */
656   COSTS_N_INSNS (2),                    /* constant shift costs */
657   {COSTS_N_INSNS (12),                  /* cost of starting multiply for QI */
658    COSTS_N_INSNS (12),                  /*                               HI */
659    COSTS_N_INSNS (12),                  /*                               SI */
660    COSTS_N_INSNS (12),                  /*                               DI */
661    COSTS_N_INSNS (12)},                 /*                            other */
662   1,                                    /* cost of multiply per each bit set */
663   {COSTS_N_INSNS (40),                  /* cost of a divide/mod for QI */
664    COSTS_N_INSNS (40),                  /*                          HI */
665    COSTS_N_INSNS (40),                  /*                          SI */
666    COSTS_N_INSNS (40),                  /*                          DI */
667    COSTS_N_INSNS (40)},                 /*                          other */
668   COSTS_N_INSNS (3),                    /* cost of movsx */
669   COSTS_N_INSNS (2),                    /* cost of movzx */
670   15,                                   /* "large" insn */
671   3,                                    /* MOVE_RATIO */
672   4,                                 /* cost for loading QImode using movzbl */
673   {2, 4, 2},                            /* cost of loading integer registers
674                                            in QImode, HImode and SImode.
675                                            Relative to reg-reg move (2).  */
676   {2, 4, 2},                            /* cost of storing integer registers */
677   2,                                    /* cost of reg,reg fld/fst */
678   {8, 8, 8},                            /* cost of loading fp registers
679                                            in SFmode, DFmode and XFmode */
680   {8, 8, 8},                            /* cost of storing fp registers
681                                            in SFmode, DFmode and XFmode */
682   2,                                    /* cost of moving MMX register */
683   {4, 8},                               /* cost of loading MMX registers
684                                            in SImode and DImode */
685   {4, 8},                               /* cost of storing MMX registers
686                                            in SImode and DImode */
687   2,                                    /* cost of moving SSE register */
688   {4, 8, 16},                           /* cost of loading SSE registers
689                                            in SImode, DImode and TImode */
690   {4, 8, 16},                           /* cost of storing SSE registers
691                                            in SImode, DImode and TImode */
692   3,                                    /* MMX or SSE register to integer */
693   4,                                    /* size of l1 cache.  486 has 8kB cache
694                                            shared for code and data, so 4kB is
695                                            not really precise.  */
696   4,                                    /* size of l2 cache  */
697   0,                                    /* size of prefetch block */
698   0,                                    /* number of parallel prefetches */
699   1,                                    /* Branch cost */
700   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
701   COSTS_N_INSNS (16),                   /* cost of FMUL instruction.  */
702   COSTS_N_INSNS (73),                   /* cost of FDIV instruction.  */
703   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
704   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
705   COSTS_N_INSNS (83),                   /* cost of FSQRT instruction.  */
706   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
707    DUMMY_STRINGOP_ALGS},
708   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
709    DUMMY_STRINGOP_ALGS},
710   1,                                    /* scalar_stmt_cost.  */
711   1,                                    /* scalar load_cost.  */
712   1,                                    /* scalar_store_cost.  */
713   1,                                    /* vec_stmt_cost.  */
714   1,                                    /* vec_to_scalar_cost.  */
715   1,                                    /* scalar_to_vec_cost.  */
716   1,                                    /* vec_align_load_cost.  */
717   2,                                    /* vec_unalign_load_cost.  */
718   1,                                    /* vec_store_cost.  */
719   3,                                    /* cond_taken_branch_cost.  */
720   1,                                    /* cond_not_taken_branch_cost.  */
721 };
722
723 static const
724 struct processor_costs pentium_cost = {
725   COSTS_N_INSNS (1),                    /* cost of an add instruction */
726   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
727   COSTS_N_INSNS (4),                    /* variable shift costs */
728   COSTS_N_INSNS (1),                    /* constant shift costs */
729   {COSTS_N_INSNS (11),                  /* cost of starting multiply for QI */
730    COSTS_N_INSNS (11),                  /*                               HI */
731    COSTS_N_INSNS (11),                  /*                               SI */
732    COSTS_N_INSNS (11),                  /*                               DI */
733    COSTS_N_INSNS (11)},                 /*                            other */
734   0,                                    /* cost of multiply per each bit set */
735   {COSTS_N_INSNS (25),                  /* cost of a divide/mod for QI */
736    COSTS_N_INSNS (25),                  /*                          HI */
737    COSTS_N_INSNS (25),                  /*                          SI */
738    COSTS_N_INSNS (25),                  /*                          DI */
739    COSTS_N_INSNS (25)},                 /*                          other */
740   COSTS_N_INSNS (3),                    /* cost of movsx */
741   COSTS_N_INSNS (2),                    /* cost of movzx */
742   8,                                    /* "large" insn */
743   6,                                    /* MOVE_RATIO */
744   6,                                 /* cost for loading QImode using movzbl */
745   {2, 4, 2},                            /* cost of loading integer registers
746                                            in QImode, HImode and SImode.
747                                            Relative to reg-reg move (2).  */
748   {2, 4, 2},                            /* cost of storing integer registers */
749   2,                                    /* cost of reg,reg fld/fst */
750   {2, 2, 6},                            /* cost of loading fp registers
751                                            in SFmode, DFmode and XFmode */
752   {4, 4, 6},                            /* cost of storing fp registers
753                                            in SFmode, DFmode and XFmode */
754   8,                                    /* cost of moving MMX register */
755   {8, 8},                               /* cost of loading MMX registers
756                                            in SImode and DImode */
757   {8, 8},                               /* cost of storing MMX registers
758                                            in SImode and DImode */
759   2,                                    /* cost of moving SSE register */
760   {4, 8, 16},                           /* cost of loading SSE registers
761                                            in SImode, DImode and TImode */
762   {4, 8, 16},                           /* cost of storing SSE registers
763                                            in SImode, DImode and TImode */
764   3,                                    /* MMX or SSE register to integer */
765   8,                                    /* size of l1 cache.  */
766   8,                                    /* size of l2 cache  */
767   0,                                    /* size of prefetch block */
768   0,                                    /* number of parallel prefetches */
769   2,                                    /* Branch cost */
770   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
771   COSTS_N_INSNS (3),                    /* cost of FMUL instruction.  */
772   COSTS_N_INSNS (39),                   /* cost of FDIV instruction.  */
773   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
774   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
775   COSTS_N_INSNS (70),                   /* cost of FSQRT instruction.  */
776   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
777    DUMMY_STRINGOP_ALGS},
778   {{libcall, {{-1, rep_prefix_4_byte}}},
779    DUMMY_STRINGOP_ALGS},
780   1,                                    /* scalar_stmt_cost.  */
781   1,                                    /* scalar load_cost.  */
782   1,                                    /* scalar_store_cost.  */
783   1,                                    /* vec_stmt_cost.  */
784   1,                                    /* vec_to_scalar_cost.  */
785   1,                                    /* scalar_to_vec_cost.  */
786   1,                                    /* vec_align_load_cost.  */
787   2,                                    /* vec_unalign_load_cost.  */
788   1,                                    /* vec_store_cost.  */
789   3,                                    /* cond_taken_branch_cost.  */
790   1,                                    /* cond_not_taken_branch_cost.  */
791 };
792
793 static const
794 struct processor_costs pentiumpro_cost = {
795   COSTS_N_INSNS (1),                    /* cost of an add instruction */
796   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
797   COSTS_N_INSNS (1),                    /* variable shift costs */
798   COSTS_N_INSNS (1),                    /* constant shift costs */
799   {COSTS_N_INSNS (4),                   /* cost of starting multiply for QI */
800    COSTS_N_INSNS (4),                   /*                               HI */
801    COSTS_N_INSNS (4),                   /*                               SI */
802    COSTS_N_INSNS (4),                   /*                               DI */
803    COSTS_N_INSNS (4)},                  /*                            other */
804   0,                                    /* cost of multiply per each bit set */
805   {COSTS_N_INSNS (17),                  /* cost of a divide/mod for QI */
806    COSTS_N_INSNS (17),                  /*                          HI */
807    COSTS_N_INSNS (17),                  /*                          SI */
808    COSTS_N_INSNS (17),                  /*                          DI */
809    COSTS_N_INSNS (17)},                 /*                          other */
810   COSTS_N_INSNS (1),                    /* cost of movsx */
811   COSTS_N_INSNS (1),                    /* cost of movzx */
812   8,                                    /* "large" insn */
813   6,                                    /* MOVE_RATIO */
814   2,                                 /* cost for loading QImode using movzbl */
815   {4, 4, 4},                            /* cost of loading integer registers
816                                            in QImode, HImode and SImode.
817                                            Relative to reg-reg move (2).  */
818   {2, 2, 2},                            /* cost of storing integer registers */
819   2,                                    /* cost of reg,reg fld/fst */
820   {2, 2, 6},                            /* cost of loading fp registers
821                                            in SFmode, DFmode and XFmode */
822   {4, 4, 6},                            /* cost of storing fp registers
823                                            in SFmode, DFmode and XFmode */
824   2,                                    /* cost of moving MMX register */
825   {2, 2},                               /* cost of loading MMX registers
826                                            in SImode and DImode */
827   {2, 2},                               /* cost of storing MMX registers
828                                            in SImode and DImode */
829   2,                                    /* cost of moving SSE register */
830   {2, 2, 8},                            /* cost of loading SSE registers
831                                            in SImode, DImode and TImode */
832   {2, 2, 8},                            /* cost of storing SSE registers
833                                            in SImode, DImode and TImode */
834   3,                                    /* MMX or SSE register to integer */
835   8,                                    /* size of l1 cache.  */
836   256,                                  /* size of l2 cache  */
837   32,                                   /* size of prefetch block */
838   6,                                    /* number of parallel prefetches */
839   2,                                    /* Branch cost */
840   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
841   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
842   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
843   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
844   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
845   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
846   /* PentiumPro has optimized rep instructions for blocks aligned by 8 bytes
847      (we ensure the alignment).  For small blocks inline loop is still a
848      noticeable win, for bigger blocks either rep movsl or rep movsb is
849      way to go.  Rep movsb has apparently more expensive startup time in CPU,
850      but after 4K the difference is down in the noise.  */
851   {{rep_prefix_4_byte, {{128, loop}, {1024, unrolled_loop},
852                         {8192, rep_prefix_4_byte}, {-1, rep_prefix_1_byte}}},
853    DUMMY_STRINGOP_ALGS},
854   {{rep_prefix_4_byte, {{1024, unrolled_loop},
855                         {8192, rep_prefix_4_byte}, {-1, libcall}}},
856    DUMMY_STRINGOP_ALGS},
857   1,                                    /* scalar_stmt_cost.  */
858   1,                                    /* scalar load_cost.  */
859   1,                                    /* scalar_store_cost.  */
860   1,                                    /* vec_stmt_cost.  */
861   1,                                    /* vec_to_scalar_cost.  */
862   1,                                    /* scalar_to_vec_cost.  */
863   1,                                    /* vec_align_load_cost.  */
864   2,                                    /* vec_unalign_load_cost.  */
865   1,                                    /* vec_store_cost.  */
866   3,                                    /* cond_taken_branch_cost.  */
867   1,                                    /* cond_not_taken_branch_cost.  */
868 };
869
870 static const
871 struct processor_costs geode_cost = {
872   COSTS_N_INSNS (1),                    /* cost of an add instruction */
873   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
874   COSTS_N_INSNS (2),                    /* variable shift costs */
875   COSTS_N_INSNS (1),                    /* constant shift costs */
876   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
877    COSTS_N_INSNS (4),                   /*                               HI */
878    COSTS_N_INSNS (7),                   /*                               SI */
879    COSTS_N_INSNS (7),                   /*                               DI */
880    COSTS_N_INSNS (7)},                  /*                            other */
881   0,                                    /* cost of multiply per each bit set */
882   {COSTS_N_INSNS (15),                  /* cost of a divide/mod for QI */
883    COSTS_N_INSNS (23),                  /*                          HI */
884    COSTS_N_INSNS (39),                  /*                          SI */
885    COSTS_N_INSNS (39),                  /*                          DI */
886    COSTS_N_INSNS (39)},                 /*                          other */
887   COSTS_N_INSNS (1),                    /* cost of movsx */
888   COSTS_N_INSNS (1),                    /* cost of movzx */
889   8,                                    /* "large" insn */
890   4,                                    /* MOVE_RATIO */
891   1,                                 /* cost for loading QImode using movzbl */
892   {1, 1, 1},                            /* cost of loading integer registers
893                                            in QImode, HImode and SImode.
894                                            Relative to reg-reg move (2).  */
895   {1, 1, 1},                            /* cost of storing integer registers */
896   1,                                    /* cost of reg,reg fld/fst */
897   {1, 1, 1},                            /* cost of loading fp registers
898                                            in SFmode, DFmode and XFmode */
899   {4, 6, 6},                            /* cost of storing fp registers
900                                            in SFmode, DFmode and XFmode */
901
902   1,                                    /* cost of moving MMX register */
903   {1, 1},                               /* cost of loading MMX registers
904                                            in SImode and DImode */
905   {1, 1},                               /* cost of storing MMX registers
906                                            in SImode and DImode */
907   1,                                    /* cost of moving SSE register */
908   {1, 1, 1},                            /* cost of loading SSE registers
909                                            in SImode, DImode and TImode */
910   {1, 1, 1},                            /* cost of storing SSE registers
911                                            in SImode, DImode and TImode */
912   1,                                    /* MMX or SSE register to integer */
913   64,                                   /* size of l1 cache.  */
914   128,                                  /* size of l2 cache.  */
915   32,                                   /* size of prefetch block */
916   1,                                    /* number of parallel prefetches */
917   1,                                    /* Branch cost */
918   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
919   COSTS_N_INSNS (11),                   /* cost of FMUL instruction.  */
920   COSTS_N_INSNS (47),                   /* cost of FDIV instruction.  */
921   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
922   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
923   COSTS_N_INSNS (54),                   /* cost of FSQRT instruction.  */
924   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
925    DUMMY_STRINGOP_ALGS},
926   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
927    DUMMY_STRINGOP_ALGS},
928   1,                                    /* scalar_stmt_cost.  */
929   1,                                    /* scalar load_cost.  */
930   1,                                    /* scalar_store_cost.  */
931   1,                                    /* vec_stmt_cost.  */
932   1,                                    /* vec_to_scalar_cost.  */
933   1,                                    /* scalar_to_vec_cost.  */
934   1,                                    /* vec_align_load_cost.  */
935   2,                                    /* vec_unalign_load_cost.  */
936   1,                                    /* vec_store_cost.  */
937   3,                                    /* cond_taken_branch_cost.  */
938   1,                                    /* cond_not_taken_branch_cost.  */
939 };
940
941 static const
942 struct processor_costs k6_cost = {
943   COSTS_N_INSNS (1),                    /* cost of an add instruction */
944   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
945   COSTS_N_INSNS (1),                    /* variable shift costs */
946   COSTS_N_INSNS (1),                    /* constant shift costs */
947   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
948    COSTS_N_INSNS (3),                   /*                               HI */
949    COSTS_N_INSNS (3),                   /*                               SI */
950    COSTS_N_INSNS (3),                   /*                               DI */
951    COSTS_N_INSNS (3)},                  /*                            other */
952   0,                                    /* cost of multiply per each bit set */
953   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
954    COSTS_N_INSNS (18),                  /*                          HI */
955    COSTS_N_INSNS (18),                  /*                          SI */
956    COSTS_N_INSNS (18),                  /*                          DI */
957    COSTS_N_INSNS (18)},                 /*                          other */
958   COSTS_N_INSNS (2),                    /* cost of movsx */
959   COSTS_N_INSNS (2),                    /* cost of movzx */
960   8,                                    /* "large" insn */
961   4,                                    /* MOVE_RATIO */
962   3,                                 /* cost for loading QImode using movzbl */
963   {4, 5, 4},                            /* cost of loading integer registers
964                                            in QImode, HImode and SImode.
965                                            Relative to reg-reg move (2).  */
966   {2, 3, 2},                            /* cost of storing integer registers */
967   4,                                    /* cost of reg,reg fld/fst */
968   {6, 6, 6},                            /* cost of loading fp registers
969                                            in SFmode, DFmode and XFmode */
970   {4, 4, 4},                            /* cost of storing fp registers
971                                            in SFmode, DFmode and XFmode */
972   2,                                    /* cost of moving MMX register */
973   {2, 2},                               /* cost of loading MMX registers
974                                            in SImode and DImode */
975   {2, 2},                               /* cost of storing MMX registers
976                                            in SImode and DImode */
977   2,                                    /* cost of moving SSE register */
978   {2, 2, 8},                            /* cost of loading SSE registers
979                                            in SImode, DImode and TImode */
980   {2, 2, 8},                            /* cost of storing SSE registers
981                                            in SImode, DImode and TImode */
982   6,                                    /* MMX or SSE register to integer */
983   32,                                   /* size of l1 cache.  */
984   32,                                   /* size of l2 cache.  Some models
985                                            have integrated l2 cache, but
986                                            optimizing for k6 is not important
987                                            enough to worry about that.  */
988   32,                                   /* size of prefetch block */
989   1,                                    /* number of parallel prefetches */
990   1,                                    /* Branch cost */
991   COSTS_N_INSNS (2),                    /* cost of FADD and FSUB insns.  */
992   COSTS_N_INSNS (2),                    /* cost of FMUL instruction.  */
993   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
994   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
995   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
996   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
997   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
998    DUMMY_STRINGOP_ALGS},
999   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
1000    DUMMY_STRINGOP_ALGS},
1001   1,                                    /* scalar_stmt_cost.  */
1002   1,                                    /* scalar load_cost.  */
1003   1,                                    /* scalar_store_cost.  */
1004   1,                                    /* vec_stmt_cost.  */
1005   1,                                    /* vec_to_scalar_cost.  */
1006   1,                                    /* scalar_to_vec_cost.  */
1007   1,                                    /* vec_align_load_cost.  */
1008   2,                                    /* vec_unalign_load_cost.  */
1009   1,                                    /* vec_store_cost.  */
1010   3,                                    /* cond_taken_branch_cost.  */
1011   1,                                    /* cond_not_taken_branch_cost.  */
1012 };
1013
1014 static const
1015 struct processor_costs athlon_cost = {
1016   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1017   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
1018   COSTS_N_INSNS (1),                    /* variable shift costs */
1019   COSTS_N_INSNS (1),                    /* constant shift costs */
1020   {COSTS_N_INSNS (5),                   /* cost of starting multiply for QI */
1021    COSTS_N_INSNS (5),                   /*                               HI */
1022    COSTS_N_INSNS (5),                   /*                               SI */
1023    COSTS_N_INSNS (5),                   /*                               DI */
1024    COSTS_N_INSNS (5)},                  /*                            other */
1025   0,                                    /* cost of multiply per each bit set */
1026   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1027    COSTS_N_INSNS (26),                  /*                          HI */
1028    COSTS_N_INSNS (42),                  /*                          SI */
1029    COSTS_N_INSNS (74),                  /*                          DI */
1030    COSTS_N_INSNS (74)},                 /*                          other */
1031   COSTS_N_INSNS (1),                    /* cost of movsx */
1032   COSTS_N_INSNS (1),                    /* cost of movzx */
1033   8,                                    /* "large" insn */
1034   9,                                    /* MOVE_RATIO */
1035   4,                                 /* cost for loading QImode using movzbl */
1036   {3, 4, 3},                            /* cost of loading integer registers
1037                                            in QImode, HImode and SImode.
1038                                            Relative to reg-reg move (2).  */
1039   {3, 4, 3},                            /* cost of storing integer registers */
1040   4,                                    /* cost of reg,reg fld/fst */
1041   {4, 4, 12},                           /* cost of loading fp registers
1042                                            in SFmode, DFmode and XFmode */
1043   {6, 6, 8},                            /* cost of storing fp registers
1044                                            in SFmode, DFmode and XFmode */
1045   2,                                    /* cost of moving MMX register */
1046   {4, 4},                               /* cost of loading MMX registers
1047                                            in SImode and DImode */
1048   {4, 4},                               /* cost of storing MMX registers
1049                                            in SImode and DImode */
1050   2,                                    /* cost of moving SSE register */
1051   {4, 4, 6},                            /* cost of loading SSE registers
1052                                            in SImode, DImode and TImode */
1053   {4, 4, 5},                            /* cost of storing SSE registers
1054                                            in SImode, DImode and TImode */
1055   5,                                    /* MMX or SSE register to integer */
1056   64,                                   /* size of l1 cache.  */
1057   256,                                  /* size of l2 cache.  */
1058   64,                                   /* size of prefetch block */
1059   6,                                    /* number of parallel prefetches */
1060   5,                                    /* Branch cost */
1061   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
1062   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
1063   COSTS_N_INSNS (24),                   /* cost of FDIV instruction.  */
1064   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
1065   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
1066   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
1067   /* For some reason, Athlon deals better with REP prefix (relative to loops)
1068      compared to K8. Alignment becomes important after 8 bytes for memcpy and
1069      128 bytes for memset.  */
1070   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
1071    DUMMY_STRINGOP_ALGS},
1072   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
1073    DUMMY_STRINGOP_ALGS},
1074   1,                                    /* scalar_stmt_cost.  */
1075   1,                                    /* scalar load_cost.  */
1076   1,                                    /* scalar_store_cost.  */
1077   1,                                    /* vec_stmt_cost.  */
1078   1,                                    /* vec_to_scalar_cost.  */
1079   1,                                    /* scalar_to_vec_cost.  */
1080   1,                                    /* vec_align_load_cost.  */
1081   2,                                    /* vec_unalign_load_cost.  */
1082   1,                                    /* vec_store_cost.  */
1083   3,                                    /* cond_taken_branch_cost.  */
1084   1,                                    /* cond_not_taken_branch_cost.  */
1085 };
1086
1087 static const
1088 struct processor_costs k8_cost = {
1089   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1090   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
1091   COSTS_N_INSNS (1),                    /* variable shift costs */
1092   COSTS_N_INSNS (1),                    /* constant shift costs */
1093   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1094    COSTS_N_INSNS (4),                   /*                               HI */
1095    COSTS_N_INSNS (3),                   /*                               SI */
1096    COSTS_N_INSNS (4),                   /*                               DI */
1097    COSTS_N_INSNS (5)},                  /*                            other */
1098   0,                                    /* cost of multiply per each bit set */
1099   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1100    COSTS_N_INSNS (26),                  /*                          HI */
1101    COSTS_N_INSNS (42),                  /*                          SI */
1102    COSTS_N_INSNS (74),                  /*                          DI */
1103    COSTS_N_INSNS (74)},                 /*                          other */
1104   COSTS_N_INSNS (1),                    /* cost of movsx */
1105   COSTS_N_INSNS (1),                    /* cost of movzx */
1106   8,                                    /* "large" insn */
1107   9,                                    /* MOVE_RATIO */
1108   4,                                 /* cost for loading QImode using movzbl */
1109   {3, 4, 3},                            /* cost of loading integer registers
1110                                            in QImode, HImode and SImode.
1111                                            Relative to reg-reg move (2).  */
1112   {3, 4, 3},                            /* cost of storing integer registers */
1113   4,                                    /* cost of reg,reg fld/fst */
1114   {4, 4, 12},                           /* cost of loading fp registers
1115                                            in SFmode, DFmode and XFmode */
1116   {6, 6, 8},                            /* cost of storing fp registers
1117                                            in SFmode, DFmode and XFmode */
1118   2,                                    /* cost of moving MMX register */
1119   {3, 3},                               /* cost of loading MMX registers
1120                                            in SImode and DImode */
1121   {4, 4},                               /* cost of storing MMX registers
1122                                            in SImode and DImode */
1123   2,                                    /* cost of moving SSE register */
1124   {4, 3, 6},                            /* cost of loading SSE registers
1125                                            in SImode, DImode and TImode */
1126   {4, 4, 5},                            /* cost of storing SSE registers
1127                                            in SImode, DImode and TImode */
1128   5,                                    /* MMX or SSE register to integer */
1129   64,                                   /* size of l1 cache.  */
1130   512,                                  /* size of l2 cache.  */
1131   64,                                   /* size of prefetch block */
1132   /* New AMD processors never drop prefetches; if they cannot be performed
1133      immediately, they are queued.  We set number of simultaneous prefetches
1134      to a large constant to reflect this (it probably is not a good idea not
1135      to limit number of prefetches at all, as their execution also takes some
1136      time).  */
1137   100,                                  /* number of parallel prefetches */
1138   3,                                    /* Branch cost */
1139   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
1140   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
1141   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
1142   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
1143   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
1144   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
1145   /* K8 has optimized REP instruction for medium sized blocks, but for very
1146      small blocks it is better to use loop. For large blocks, libcall can
1147      do nontemporary accesses and beat inline considerably.  */
1148   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
1149    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1150   {{libcall, {{8, loop}, {24, unrolled_loop},
1151               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1152    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1153   4,                                    /* scalar_stmt_cost.  */
1154   2,                                    /* scalar load_cost.  */
1155   2,                                    /* scalar_store_cost.  */
1156   5,                                    /* vec_stmt_cost.  */
1157   0,                                    /* vec_to_scalar_cost.  */
1158   2,                                    /* scalar_to_vec_cost.  */
1159   2,                                    /* vec_align_load_cost.  */
1160   3,                                    /* vec_unalign_load_cost.  */
1161   3,                                    /* vec_store_cost.  */
1162   3,                                    /* cond_taken_branch_cost.  */
1163   2,                                    /* cond_not_taken_branch_cost.  */
1164 };
1165
1166 struct processor_costs amdfam10_cost = {
1167   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1168   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
1169   COSTS_N_INSNS (1),                    /* variable shift costs */
1170   COSTS_N_INSNS (1),                    /* constant shift costs */
1171   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1172    COSTS_N_INSNS (4),                   /*                               HI */
1173    COSTS_N_INSNS (3),                   /*                               SI */
1174    COSTS_N_INSNS (4),                   /*                               DI */
1175    COSTS_N_INSNS (5)},                  /*                            other */
1176   0,                                    /* cost of multiply per each bit set */
1177   {COSTS_N_INSNS (19),                  /* cost of a divide/mod for QI */
1178    COSTS_N_INSNS (35),                  /*                          HI */
1179    COSTS_N_INSNS (51),                  /*                          SI */
1180    COSTS_N_INSNS (83),                  /*                          DI */
1181    COSTS_N_INSNS (83)},                 /*                          other */
1182   COSTS_N_INSNS (1),                    /* cost of movsx */
1183   COSTS_N_INSNS (1),                    /* cost of movzx */
1184   8,                                    /* "large" insn */
1185   9,                                    /* MOVE_RATIO */
1186   4,                                 /* cost for loading QImode using movzbl */
1187   {3, 4, 3},                            /* cost of loading integer registers
1188                                            in QImode, HImode and SImode.
1189                                            Relative to reg-reg move (2).  */
1190   {3, 4, 3},                            /* cost of storing integer registers */
1191   4,                                    /* cost of reg,reg fld/fst */
1192   {4, 4, 12},                           /* cost of loading fp registers
1193                                            in SFmode, DFmode and XFmode */
1194   {6, 6, 8},                            /* cost of storing fp registers
1195                                            in SFmode, DFmode and XFmode */
1196   2,                                    /* cost of moving MMX register */
1197   {3, 3},                               /* cost of loading MMX registers
1198                                            in SImode and DImode */
1199   {4, 4},                               /* cost of storing MMX registers
1200                                            in SImode and DImode */
1201   2,                                    /* cost of moving SSE register */
1202   {4, 4, 3},                            /* cost of loading SSE registers
1203                                            in SImode, DImode and TImode */
1204   {4, 4, 5},                            /* cost of storing SSE registers
1205                                            in SImode, DImode and TImode */
1206   3,                                    /* MMX or SSE register to integer */
1207                                         /* On K8:
1208                                             MOVD reg64, xmmreg Double FSTORE 4
1209                                             MOVD reg32, xmmreg Double FSTORE 4
1210                                            On AMDFAM10:
1211                                             MOVD reg64, xmmreg Double FADD 3
1212                                                                1/1  1/1
1213                                             MOVD reg32, xmmreg Double FADD 3
1214                                                                1/1  1/1 */
1215   64,                                   /* size of l1 cache.  */
1216   512,                                  /* size of l2 cache.  */
1217   64,                                   /* size of prefetch block */
1218   /* New AMD processors never drop prefetches; if they cannot be performed
1219      immediately, they are queued.  We set number of simultaneous prefetches
1220      to a large constant to reflect this (it probably is not a good idea not
1221      to limit number of prefetches at all, as their execution also takes some
1222      time).  */
1223   100,                                  /* number of parallel prefetches */
1224   2,                                    /* Branch cost */
1225   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
1226   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
1227   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
1228   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
1229   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
1230   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
1231
1232   /* AMDFAM10 has optimized REP instruction for medium sized blocks, but for
1233      very small blocks it is better to use loop. For large blocks, libcall can
1234      do nontemporary accesses and beat inline considerably.  */
1235   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
1236    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1237   {{libcall, {{8, loop}, {24, unrolled_loop},
1238               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1239    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1240   4,                                    /* scalar_stmt_cost.  */
1241   2,                                    /* scalar load_cost.  */
1242   2,                                    /* scalar_store_cost.  */
1243   6,                                    /* vec_stmt_cost.  */
1244   0,                                    /* vec_to_scalar_cost.  */
1245   2,                                    /* scalar_to_vec_cost.  */
1246   2,                                    /* vec_align_load_cost.  */
1247   2,                                    /* vec_unalign_load_cost.  */
1248   2,                                    /* vec_store_cost.  */
1249   2,                                    /* cond_taken_branch_cost.  */
1250   1,                                    /* cond_not_taken_branch_cost.  */
1251 };
1252
1253 struct processor_costs bdver1_cost = {
1254   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1255   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
1256   COSTS_N_INSNS (1),                    /* variable shift costs */
1257   COSTS_N_INSNS (1),                    /* constant shift costs */
1258   {COSTS_N_INSNS (4),                   /* cost of starting multiply for QI */
1259    COSTS_N_INSNS (4),                   /*                               HI */
1260    COSTS_N_INSNS (4),                   /*                               SI */
1261    COSTS_N_INSNS (6),                   /*                               DI */
1262    COSTS_N_INSNS (6)},                  /*                            other */
1263   0,                                    /* cost of multiply per each bit set */
1264   {COSTS_N_INSNS (19),                  /* cost of a divide/mod for QI */
1265    COSTS_N_INSNS (35),                  /*                          HI */
1266    COSTS_N_INSNS (51),                  /*                          SI */
1267    COSTS_N_INSNS (83),                  /*                          DI */
1268    COSTS_N_INSNS (83)},                 /*                          other */
1269   COSTS_N_INSNS (1),                    /* cost of movsx */
1270   COSTS_N_INSNS (1),                    /* cost of movzx */
1271   8,                                    /* "large" insn */
1272   9,                                    /* MOVE_RATIO */
1273   4,                                 /* cost for loading QImode using movzbl */
1274   {5, 5, 4},                            /* cost of loading integer registers
1275                                            in QImode, HImode and SImode.
1276                                            Relative to reg-reg move (2).  */
1277   {4, 4, 4},                            /* cost of storing integer registers */
1278   2,                                    /* cost of reg,reg fld/fst */
1279   {5, 5, 12},                           /* cost of loading fp registers
1280                                            in SFmode, DFmode and XFmode */
1281   {4, 4, 8},                            /* cost of storing fp registers
1282                                            in SFmode, DFmode and XFmode */
1283   2,                                    /* cost of moving MMX register */
1284   {4, 4},                               /* cost of loading MMX registers
1285                                            in SImode and DImode */
1286   {4, 4},                               /* cost of storing MMX registers
1287                                            in SImode and DImode */
1288   2,                                    /* cost of moving SSE register */
1289   {4, 4, 4},                            /* cost of loading SSE registers
1290                                            in SImode, DImode and TImode */
1291   {4, 4, 4},                            /* cost of storing SSE registers
1292                                            in SImode, DImode and TImode */
1293   2,                                    /* MMX or SSE register to integer */
1294                                         /* On K8:
1295                                             MOVD reg64, xmmreg Double FSTORE 4
1296                                             MOVD reg32, xmmreg Double FSTORE 4
1297                                            On AMDFAM10:
1298                                             MOVD reg64, xmmreg Double FADD 3
1299                                                                1/1  1/1
1300                                             MOVD reg32, xmmreg Double FADD 3
1301                                                                1/1  1/1 */
1302   16,                                   /* size of l1 cache.  */
1303   2048,                                 /* size of l2 cache.  */
1304   64,                                   /* size of prefetch block */
1305   /* New AMD processors never drop prefetches; if they cannot be performed
1306      immediately, they are queued.  We set number of simultaneous prefetches
1307      to a large constant to reflect this (it probably is not a good idea not
1308      to limit number of prefetches at all, as their execution also takes some
1309      time).  */
1310   100,                                  /* number of parallel prefetches */
1311   2,                                    /* Branch cost */
1312   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
1313   COSTS_N_INSNS (6),                    /* cost of FMUL instruction.  */
1314   COSTS_N_INSNS (42),                   /* cost of FDIV instruction.  */
1315   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
1316   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
1317   COSTS_N_INSNS (52),                   /* cost of FSQRT instruction.  */
1318
1319   /*  BDVER1 has optimized REP instruction for medium sized blocks, but for
1320       very small blocks it is better to use loop. For large blocks, libcall
1321       can do nontemporary accesses and beat inline considerably.  */
1322   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
1323    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1324   {{libcall, {{8, loop}, {24, unrolled_loop},
1325               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1326    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1327   6,                                    /* scalar_stmt_cost.  */
1328   4,                                    /* scalar load_cost.  */
1329   4,                                    /* scalar_store_cost.  */
1330   6,                                    /* vec_stmt_cost.  */
1331   0,                                    /* vec_to_scalar_cost.  */
1332   2,                                    /* scalar_to_vec_cost.  */
1333   4,                                    /* vec_align_load_cost.  */
1334   4,                                    /* vec_unalign_load_cost.  */
1335   4,                                    /* vec_store_cost.  */
1336   2,                                    /* cond_taken_branch_cost.  */
1337   1,                                    /* cond_not_taken_branch_cost.  */
1338 };
1339
1340 struct processor_costs btver1_cost = {
1341   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1342   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
1343   COSTS_N_INSNS (1),                    /* variable shift costs */
1344   COSTS_N_INSNS (1),                    /* constant shift costs */
1345   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1346    COSTS_N_INSNS (4),                   /*                               HI */
1347    COSTS_N_INSNS (3),                   /*                               SI */
1348    COSTS_N_INSNS (4),                   /*                               DI */
1349    COSTS_N_INSNS (5)},                  /*                            other */
1350   0,                                    /* cost of multiply per each bit set */
1351   {COSTS_N_INSNS (19),                  /* cost of a divide/mod for QI */
1352    COSTS_N_INSNS (35),                  /*                          HI */
1353    COSTS_N_INSNS (51),                  /*                          SI */
1354    COSTS_N_INSNS (83),                  /*                          DI */
1355    COSTS_N_INSNS (83)},                 /*                          other */
1356   COSTS_N_INSNS (1),                    /* cost of movsx */
1357   COSTS_N_INSNS (1),                    /* cost of movzx */
1358   8,                                    /* "large" insn */
1359   9,                                    /* MOVE_RATIO */
1360   4,                                 /* cost for loading QImode using movzbl */
1361   {3, 4, 3},                            /* cost of loading integer registers
1362                                            in QImode, HImode and SImode.
1363                                            Relative to reg-reg move (2).  */
1364   {3, 4, 3},                            /* cost of storing integer registers */
1365   4,                                    /* cost of reg,reg fld/fst */
1366   {4, 4, 12},                           /* cost of loading fp registers
1367                                            in SFmode, DFmode and XFmode */
1368   {6, 6, 8},                            /* cost of storing fp registers
1369                                            in SFmode, DFmode and XFmode */
1370   2,                                    /* cost of moving MMX register */
1371   {3, 3},                               /* cost of loading MMX registers
1372                                            in SImode and DImode */
1373   {4, 4},                               /* cost of storing MMX registers
1374                                            in SImode and DImode */
1375   2,                                    /* cost of moving SSE register */
1376   {4, 4, 3},                            /* cost of loading SSE registers
1377                                            in SImode, DImode and TImode */
1378   {4, 4, 5},                            /* cost of storing SSE registers
1379                                            in SImode, DImode and TImode */
1380   3,                                    /* MMX or SSE register to integer */
1381                                         /* On K8:
1382                                            MOVD reg64, xmmreg Double FSTORE 4
1383                                            MOVD reg32, xmmreg Double FSTORE 4
1384                                            On AMDFAM10:
1385                                            MOVD reg64, xmmreg Double FADD 3
1386                                                                1/1  1/1
1387                                             MOVD reg32, xmmreg Double FADD 3
1388                                                                1/1  1/1 */
1389   32,                                   /* size of l1 cache.  */
1390   512,                                  /* size of l2 cache.  */
1391   64,                                   /* size of prefetch block */
1392   100,                                  /* number of parallel prefetches */
1393   2,                                    /* Branch cost */
1394   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
1395   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
1396   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
1397   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
1398   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
1399   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
1400
1401   /* BTVER1 has optimized REP instruction for medium sized blocks, but for
1402      very small blocks it is better to use loop. For large blocks, libcall can
1403      do nontemporary accesses and beat inline considerably.  */
1404   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
1405    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1406   {{libcall, {{8, loop}, {24, unrolled_loop},
1407               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1408    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1409   4,                                    /* scalar_stmt_cost.  */
1410   2,                                    /* scalar load_cost.  */
1411   2,                                    /* scalar_store_cost.  */
1412   6,                                    /* vec_stmt_cost.  */
1413   0,                                    /* vec_to_scalar_cost.  */
1414   2,                                    /* scalar_to_vec_cost.  */
1415   2,                                    /* vec_align_load_cost.  */
1416   2,                                    /* vec_unalign_load_cost.  */
1417   2,                                    /* vec_store_cost.  */
1418   2,                                    /* cond_taken_branch_cost.  */
1419   1,                                    /* cond_not_taken_branch_cost.  */
1420 };
1421
1422 static const
1423 struct processor_costs pentium4_cost = {
1424   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1425   COSTS_N_INSNS (3),                    /* cost of a lea instruction */
1426   COSTS_N_INSNS (4),                    /* variable shift costs */
1427   COSTS_N_INSNS (4),                    /* constant shift costs */
1428   {COSTS_N_INSNS (15),                  /* cost of starting multiply for QI */
1429    COSTS_N_INSNS (15),                  /*                               HI */
1430    COSTS_N_INSNS (15),                  /*                               SI */
1431    COSTS_N_INSNS (15),                  /*                               DI */
1432    COSTS_N_INSNS (15)},                 /*                            other */
1433   0,                                    /* cost of multiply per each bit set */
1434   {COSTS_N_INSNS (56),                  /* cost of a divide/mod for QI */
1435    COSTS_N_INSNS (56),                  /*                          HI */
1436    COSTS_N_INSNS (56),                  /*                          SI */
1437    COSTS_N_INSNS (56),                  /*                          DI */
1438    COSTS_N_INSNS (56)},                 /*                          other */
1439   COSTS_N_INSNS (1),                    /* cost of movsx */
1440   COSTS_N_INSNS (1),                    /* cost of movzx */
1441   16,                                   /* "large" insn */
1442   6,                                    /* MOVE_RATIO */
1443   2,                                 /* cost for loading QImode using movzbl */
1444   {4, 5, 4},                            /* cost of loading integer registers
1445                                            in QImode, HImode and SImode.
1446                                            Relative to reg-reg move (2).  */
1447   {2, 3, 2},                            /* cost of storing integer registers */
1448   2,                                    /* cost of reg,reg fld/fst */
1449   {2, 2, 6},                            /* cost of loading fp registers
1450                                            in SFmode, DFmode and XFmode */
1451   {4, 4, 6},                            /* cost of storing fp registers
1452                                            in SFmode, DFmode and XFmode */
1453   2,                                    /* cost of moving MMX register */
1454   {2, 2},                               /* cost of loading MMX registers
1455                                            in SImode and DImode */
1456   {2, 2},                               /* cost of storing MMX registers
1457                                            in SImode and DImode */
1458   12,                                   /* cost of moving SSE register */
1459   {12, 12, 12},                         /* cost of loading SSE registers
1460                                            in SImode, DImode and TImode */
1461   {2, 2, 8},                            /* cost of storing SSE registers
1462                                            in SImode, DImode and TImode */
1463   10,                                   /* MMX or SSE register to integer */
1464   8,                                    /* size of l1 cache.  */
1465   256,                                  /* size of l2 cache.  */
1466   64,                                   /* size of prefetch block */
1467   6,                                    /* number of parallel prefetches */
1468   2,                                    /* Branch cost */
1469   COSTS_N_INSNS (5),                    /* cost of FADD and FSUB insns.  */
1470   COSTS_N_INSNS (7),                    /* cost of FMUL instruction.  */
1471   COSTS_N_INSNS (43),                   /* cost of FDIV instruction.  */
1472   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
1473   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
1474   COSTS_N_INSNS (43),                   /* cost of FSQRT instruction.  */
1475   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
1476    DUMMY_STRINGOP_ALGS},
1477   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
1478    {-1, libcall}}},
1479    DUMMY_STRINGOP_ALGS},
1480   1,                                    /* scalar_stmt_cost.  */
1481   1,                                    /* scalar load_cost.  */
1482   1,                                    /* scalar_store_cost.  */
1483   1,                                    /* vec_stmt_cost.  */
1484   1,                                    /* vec_to_scalar_cost.  */
1485   1,                                    /* scalar_to_vec_cost.  */
1486   1,                                    /* vec_align_load_cost.  */
1487   2,                                    /* vec_unalign_load_cost.  */
1488   1,                                    /* vec_store_cost.  */
1489   3,                                    /* cond_taken_branch_cost.  */
1490   1,                                    /* cond_not_taken_branch_cost.  */
1491 };
1492
1493 static const
1494 struct processor_costs nocona_cost = {
1495   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1496   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
1497   COSTS_N_INSNS (1),                    /* variable shift costs */
1498   COSTS_N_INSNS (1),                    /* constant shift costs */
1499   {COSTS_N_INSNS (10),                  /* cost of starting multiply for QI */
1500    COSTS_N_INSNS (10),                  /*                               HI */
1501    COSTS_N_INSNS (10),                  /*                               SI */
1502    COSTS_N_INSNS (10),                  /*                               DI */
1503    COSTS_N_INSNS (10)},                 /*                            other */
1504   0,                                    /* cost of multiply per each bit set */
1505   {COSTS_N_INSNS (66),                  /* cost of a divide/mod for QI */
1506    COSTS_N_INSNS (66),                  /*                          HI */
1507    COSTS_N_INSNS (66),                  /*                          SI */
1508    COSTS_N_INSNS (66),                  /*                          DI */
1509    COSTS_N_INSNS (66)},                 /*                          other */
1510   COSTS_N_INSNS (1),                    /* cost of movsx */
1511   COSTS_N_INSNS (1),                    /* cost of movzx */
1512   16,                                   /* "large" insn */
1513   17,                                   /* MOVE_RATIO */
1514   4,                                 /* cost for loading QImode using movzbl */
1515   {4, 4, 4},                            /* cost of loading integer registers
1516                                            in QImode, HImode and SImode.
1517                                            Relative to reg-reg move (2).  */
1518   {4, 4, 4},                            /* cost of storing integer registers */
1519   3,                                    /* cost of reg,reg fld/fst */
1520   {12, 12, 12},                         /* cost of loading fp registers
1521                                            in SFmode, DFmode and XFmode */
1522   {4, 4, 4},                            /* cost of storing fp registers
1523                                            in SFmode, DFmode and XFmode */
1524   6,                                    /* cost of moving MMX register */
1525   {12, 12},                             /* cost of loading MMX registers
1526                                            in SImode and DImode */
1527   {12, 12},                             /* cost of storing MMX registers
1528                                            in SImode and DImode */
1529   6,                                    /* cost of moving SSE register */
1530   {12, 12, 12},                         /* cost of loading SSE registers
1531                                            in SImode, DImode and TImode */
1532   {12, 12, 12},                         /* cost of storing SSE registers
1533                                            in SImode, DImode and TImode */
1534   8,                                    /* MMX or SSE register to integer */
1535   8,                                    /* size of l1 cache.  */
1536   1024,                                 /* size of l2 cache.  */
1537   128,                                  /* size of prefetch block */
1538   8,                                    /* number of parallel prefetches */
1539   1,                                    /* Branch cost */
1540   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
1541   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1542   COSTS_N_INSNS (40),                   /* cost of FDIV instruction.  */
1543   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
1544   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
1545   COSTS_N_INSNS (44),                   /* cost of FSQRT instruction.  */
1546   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
1547    {libcall, {{32, loop}, {20000, rep_prefix_8_byte},
1548               {100000, unrolled_loop}, {-1, libcall}}}},
1549   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
1550    {-1, libcall}}},
1551    {libcall, {{24, loop}, {64, unrolled_loop},
1552               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1553   1,                                    /* scalar_stmt_cost.  */
1554   1,                                    /* scalar load_cost.  */
1555   1,                                    /* scalar_store_cost.  */
1556   1,                                    /* vec_stmt_cost.  */
1557   1,                                    /* vec_to_scalar_cost.  */
1558   1,                                    /* scalar_to_vec_cost.  */
1559   1,                                    /* vec_align_load_cost.  */
1560   2,                                    /* vec_unalign_load_cost.  */
1561   1,                                    /* vec_store_cost.  */
1562   3,                                    /* cond_taken_branch_cost.  */
1563   1,                                    /* cond_not_taken_branch_cost.  */
1564 };
1565
1566 static const
1567 struct processor_costs atom_cost = {
1568   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1569   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1570   COSTS_N_INSNS (1),                    /* variable shift costs */
1571   COSTS_N_INSNS (1),                    /* constant shift costs */
1572   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1573    COSTS_N_INSNS (4),                   /*                               HI */
1574    COSTS_N_INSNS (3),                   /*                               SI */
1575    COSTS_N_INSNS (4),                   /*                               DI */
1576    COSTS_N_INSNS (2)},                  /*                            other */
1577   0,                                    /* cost of multiply per each bit set */
1578   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1579    COSTS_N_INSNS (26),                  /*                          HI */
1580    COSTS_N_INSNS (42),                  /*                          SI */
1581    COSTS_N_INSNS (74),                  /*                          DI */
1582    COSTS_N_INSNS (74)},                 /*                          other */
1583   COSTS_N_INSNS (1),                    /* cost of movsx */
1584   COSTS_N_INSNS (1),                    /* cost of movzx */
1585   8,                                    /* "large" insn */
1586   17,                                   /* MOVE_RATIO */
1587   2,                                 /* cost for loading QImode using movzbl */
1588   {4, 4, 4},                            /* cost of loading integer registers
1589                                            in QImode, HImode and SImode.
1590                                            Relative to reg-reg move (2).  */
1591   {4, 4, 4},                            /* cost of storing integer registers */
1592   4,                                    /* cost of reg,reg fld/fst */
1593   {12, 12, 12},                         /* cost of loading fp registers
1594                                            in SFmode, DFmode and XFmode */
1595   {6, 6, 8},                            /* cost of storing fp registers
1596                                            in SFmode, DFmode and XFmode */
1597   2,                                    /* cost of moving MMX register */
1598   {8, 8},                               /* cost of loading MMX registers
1599                                            in SImode and DImode */
1600   {8, 8},                               /* cost of storing MMX registers
1601                                            in SImode and DImode */
1602   2,                                    /* cost of moving SSE register */
1603   {8, 8, 8},                            /* cost of loading SSE registers
1604                                            in SImode, DImode and TImode */
1605   {8, 8, 8},                            /* cost of storing SSE registers
1606                                            in SImode, DImode and TImode */
1607   5,                                    /* MMX or SSE register to integer */
1608   32,                                   /* size of l1 cache.  */
1609   256,                                  /* size of l2 cache.  */
1610   64,                                   /* size of prefetch block */
1611   6,                                    /* number of parallel prefetches */
1612   3,                                    /* Branch cost */
1613   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1614   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1615   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1616   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1617   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1618   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1619   {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
1620    {libcall, {{32, loop}, {64, rep_prefix_4_byte},
1621           {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1622   {{libcall, {{8, loop}, {15, unrolled_loop},
1623           {2048, rep_prefix_4_byte}, {-1, libcall}}},
1624    {libcall, {{24, loop}, {32, unrolled_loop},
1625           {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1626   1,                                    /* scalar_stmt_cost.  */
1627   1,                                    /* scalar load_cost.  */
1628   1,                                    /* scalar_store_cost.  */
1629   1,                                    /* vec_stmt_cost.  */
1630   1,                                    /* vec_to_scalar_cost.  */
1631   1,                                    /* scalar_to_vec_cost.  */
1632   1,                                    /* vec_align_load_cost.  */
1633   2,                                    /* vec_unalign_load_cost.  */
1634   1,                                    /* vec_store_cost.  */
1635   3,                                    /* cond_taken_branch_cost.  */
1636   1,                                    /* cond_not_taken_branch_cost.  */
1637 };
1638
1639 /* Generic64 should produce code tuned for Nocona and K8.  */
1640 static const
1641 struct processor_costs generic64_cost = {
1642   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1643   /* On all chips taken into consideration lea is 2 cycles and more.  With
1644      this cost however our current implementation of synth_mult results in
1645      use of unnecessary temporary registers causing regression on several
1646      SPECfp benchmarks.  */
1647   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1648   COSTS_N_INSNS (1),                    /* variable shift costs */
1649   COSTS_N_INSNS (1),                    /* constant shift costs */
1650   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1651    COSTS_N_INSNS (4),                   /*                               HI */
1652    COSTS_N_INSNS (3),                   /*                               SI */
1653    COSTS_N_INSNS (4),                   /*                               DI */
1654    COSTS_N_INSNS (2)},                  /*                            other */
1655   0,                                    /* cost of multiply per each bit set */
1656   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1657    COSTS_N_INSNS (26),                  /*                          HI */
1658    COSTS_N_INSNS (42),                  /*                          SI */
1659    COSTS_N_INSNS (74),                  /*                          DI */
1660    COSTS_N_INSNS (74)},                 /*                          other */
1661   COSTS_N_INSNS (1),                    /* cost of movsx */
1662   COSTS_N_INSNS (1),                    /* cost of movzx */
1663   8,                                    /* "large" insn */
1664   17,                                   /* MOVE_RATIO */
1665   4,                                 /* cost for loading QImode using movzbl */
1666   {4, 4, 4},                            /* cost of loading integer registers
1667                                            in QImode, HImode and SImode.
1668                                            Relative to reg-reg move (2).  */
1669   {4, 4, 4},                            /* cost of storing integer registers */
1670   4,                                    /* cost of reg,reg fld/fst */
1671   {12, 12, 12},                         /* cost of loading fp registers
1672                                            in SFmode, DFmode and XFmode */
1673   {6, 6, 8},                            /* cost of storing fp registers
1674                                            in SFmode, DFmode and XFmode */
1675   2,                                    /* cost of moving MMX register */
1676   {8, 8},                               /* cost of loading MMX registers
1677                                            in SImode and DImode */
1678   {8, 8},                               /* cost of storing MMX registers
1679                                            in SImode and DImode */
1680   2,                                    /* cost of moving SSE register */
1681   {8, 8, 8},                            /* cost of loading SSE registers
1682                                            in SImode, DImode and TImode */
1683   {8, 8, 8},                            /* cost of storing SSE registers
1684                                            in SImode, DImode and TImode */
1685   5,                                    /* MMX or SSE register to integer */
1686   32,                                   /* size of l1 cache.  */
1687   512,                                  /* size of l2 cache.  */
1688   64,                                   /* size of prefetch block */
1689   6,                                    /* number of parallel prefetches */
1690   /* Benchmarks shows large regressions on K8 sixtrack benchmark when this
1691      value is increased to perhaps more appropriate value of 5.  */
1692   3,                                    /* Branch cost */
1693   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1694   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1695   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1696   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1697   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1698   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1699   {DUMMY_STRINGOP_ALGS,
1700    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1701   {DUMMY_STRINGOP_ALGS,
1702    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1703   1,                                    /* scalar_stmt_cost.  */
1704   1,                                    /* scalar load_cost.  */
1705   1,                                    /* scalar_store_cost.  */
1706   1,                                    /* vec_stmt_cost.  */
1707   1,                                    /* vec_to_scalar_cost.  */
1708   1,                                    /* scalar_to_vec_cost.  */
1709   1,                                    /* vec_align_load_cost.  */
1710   2,                                    /* vec_unalign_load_cost.  */
1711   1,                                    /* vec_store_cost.  */
1712   3,                                    /* cond_taken_branch_cost.  */
1713   1,                                    /* cond_not_taken_branch_cost.  */
1714 };
1715
1716 /* Generic32 should produce code tuned for PPro, Pentium4, Nocona,
1717    Athlon and K8.  */
1718 static const
1719 struct processor_costs generic32_cost = {
1720   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1721   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1722   COSTS_N_INSNS (1),                    /* variable shift costs */
1723   COSTS_N_INSNS (1),                    /* constant shift costs */
1724   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1725    COSTS_N_INSNS (4),                   /*                               HI */
1726    COSTS_N_INSNS (3),                   /*                               SI */
1727    COSTS_N_INSNS (4),                   /*                               DI */
1728    COSTS_N_INSNS (2)},                  /*                            other */
1729   0,                                    /* cost of multiply per each bit set */
1730   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1731    COSTS_N_INSNS (26),                  /*                          HI */
1732    COSTS_N_INSNS (42),                  /*                          SI */
1733    COSTS_N_INSNS (74),                  /*                          DI */
1734    COSTS_N_INSNS (74)},                 /*                          other */
1735   COSTS_N_INSNS (1),                    /* cost of movsx */
1736   COSTS_N_INSNS (1),                    /* cost of movzx */
1737   8,                                    /* "large" insn */
1738   17,                                   /* MOVE_RATIO */
1739   4,                                 /* cost for loading QImode using movzbl */
1740   {4, 4, 4},                            /* cost of loading integer registers
1741                                            in QImode, HImode and SImode.
1742                                            Relative to reg-reg move (2).  */
1743   {4, 4, 4},                            /* cost of storing integer registers */
1744   4,                                    /* cost of reg,reg fld/fst */
1745   {12, 12, 12},                         /* cost of loading fp registers
1746                                            in SFmode, DFmode and XFmode */
1747   {6, 6, 8},                            /* cost of storing fp registers
1748                                            in SFmode, DFmode and XFmode */
1749   2,                                    /* cost of moving MMX register */
1750   {8, 8},                               /* cost of loading MMX registers
1751                                            in SImode and DImode */
1752   {8, 8},                               /* cost of storing MMX registers
1753                                            in SImode and DImode */
1754   2,                                    /* cost of moving SSE register */
1755   {8, 8, 8},                            /* cost of loading SSE registers
1756                                            in SImode, DImode and TImode */
1757   {8, 8, 8},                            /* cost of storing SSE registers
1758                                            in SImode, DImode and TImode */
1759   5,                                    /* MMX or SSE register to integer */
1760   32,                                   /* size of l1 cache.  */
1761   256,                                  /* size of l2 cache.  */
1762   64,                                   /* size of prefetch block */
1763   6,                                    /* number of parallel prefetches */
1764   3,                                    /* Branch cost */
1765   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1766   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1767   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1768   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1769   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1770   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1771   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1772    DUMMY_STRINGOP_ALGS},
1773   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1774    DUMMY_STRINGOP_ALGS},
1775   1,                                    /* scalar_stmt_cost.  */
1776   1,                                    /* scalar load_cost.  */
1777   1,                                    /* scalar_store_cost.  */
1778   1,                                    /* vec_stmt_cost.  */
1779   1,                                    /* vec_to_scalar_cost.  */
1780   1,                                    /* scalar_to_vec_cost.  */
1781   1,                                    /* vec_align_load_cost.  */
1782   2,                                    /* vec_unalign_load_cost.  */
1783   1,                                    /* vec_store_cost.  */
1784   3,                                    /* cond_taken_branch_cost.  */
1785   1,                                    /* cond_not_taken_branch_cost.  */
1786 };
1787
1788 const struct processor_costs *ix86_cost = &pentium_cost;
1789
1790 /* Processor feature/optimization bitmasks.  */
1791 #define m_386 (1<<PROCESSOR_I386)
1792 #define m_486 (1<<PROCESSOR_I486)
1793 #define m_PENT (1<<PROCESSOR_PENTIUM)
1794 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
1795 #define m_PENT4  (1<<PROCESSOR_PENTIUM4)
1796 #define m_NOCONA  (1<<PROCESSOR_NOCONA)
1797 #define m_CORE2_32  (1<<PROCESSOR_CORE2_32)
1798 #define m_CORE2_64  (1<<PROCESSOR_CORE2_64)
1799 #define m_COREI7_32  (1<<PROCESSOR_COREI7_32)
1800 #define m_COREI7_64  (1<<PROCESSOR_COREI7_64)
1801 #define m_COREI7  (m_COREI7_32 | m_COREI7_64)
1802 #define m_CORE2I7_32  (m_CORE2_32 | m_COREI7_32)
1803 #define m_CORE2I7_64  (m_CORE2_64 | m_COREI7_64)
1804 #define m_CORE2I7  (m_CORE2I7_32 | m_CORE2I7_64)
1805 #define m_ATOM  (1<<PROCESSOR_ATOM)
1806
1807 #define m_GEODE  (1<<PROCESSOR_GEODE)
1808 #define m_K6  (1<<PROCESSOR_K6)
1809 #define m_K6_GEODE  (m_K6 | m_GEODE)
1810 #define m_K8  (1<<PROCESSOR_K8)
1811 #define m_ATHLON  (1<<PROCESSOR_ATHLON)
1812 #define m_ATHLON_K8  (m_K8 | m_ATHLON)
1813 #define m_AMDFAM10  (1<<PROCESSOR_AMDFAM10)
1814 #define m_BDVER1  (1<<PROCESSOR_BDVER1)
1815 #define m_BTVER1  (1<<PROCESSOR_BTVER1)
1816 #define m_AMD_MULTIPLE  (m_K8 | m_ATHLON | m_AMDFAM10 | m_BDVER1 | m_BTVER1)
1817
1818 #define m_GENERIC32 (1<<PROCESSOR_GENERIC32)
1819 #define m_GENERIC64 (1<<PROCESSOR_GENERIC64)
1820
1821 /* Generic instruction choice should be common subset of supported CPUs
1822    (PPro/PENT4/NOCONA/CORE2/Athlon/K8).  */
1823 #define m_GENERIC (m_GENERIC32 | m_GENERIC64)
1824
1825 /* Feature tests against the various tunings.  */
1826 unsigned char ix86_tune_features[X86_TUNE_LAST];
1827
1828 /* Feature tests against the various tunings used to create ix86_tune_features
1829    based on the processor mask.  */
1830 static unsigned int initial_ix86_tune_features[X86_TUNE_LAST] = {
1831   /* X86_TUNE_USE_LEAVE: Leave does not affect Nocona SPEC2000 results
1832      negatively, so enabling for Generic64 seems like good code size
1833      tradeoff.  We can't enable it for 32bit generic because it does not
1834      work well with PPro base chips.  */
1835   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_CORE2I7_64 | m_GENERIC64,
1836
1837   /* X86_TUNE_PUSH_MEMORY */
1838   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4
1839   | m_NOCONA | m_CORE2I7 | m_GENERIC,
1840
1841   /* X86_TUNE_ZERO_EXTEND_WITH_AND */
1842   m_486 | m_PENT,
1843
1844   /* X86_TUNE_UNROLL_STRLEN */
1845   m_486 | m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_K6
1846   | m_CORE2I7 | m_GENERIC,
1847
1848   /* X86_TUNE_DEEP_BRANCH_PREDICTION */
1849   m_ATOM | m_PPRO | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4
1850   | m_CORE2I7 | m_GENERIC,
1851
1852   /* X86_TUNE_BRANCH_PREDICTION_HINTS: Branch hints were put in P4 based
1853      on simulation result. But after P4 was made, no performance benefit
1854      was observed with branch hints.  It also increases the code size.
1855      As a result, icc never generates branch hints.  */
1856   0,
1857
1858   /* X86_TUNE_DOUBLE_WITH_ADD */
1859   ~m_386,
1860
1861   /* X86_TUNE_USE_SAHF */
1862   m_ATOM | m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_BDVER1 | m_BTVER1
1863   | m_PENT4 | m_NOCONA | m_CORE2I7 | m_GENERIC,
1864
1865   /* X86_TUNE_MOVX: Enable to zero extend integer registers to avoid
1866      partial dependencies.  */
1867   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_PENT4 | m_NOCONA
1868   | m_CORE2I7 | m_GENERIC | m_GEODE /* m_386 | m_K6 */,
1869
1870   /* X86_TUNE_PARTIAL_REG_STALL: We probably ought to watch for partial
1871      register stalls on Generic32 compilation setting as well.  However
1872      in current implementation the partial register stalls are not eliminated
1873      very well - they can be introduced via subregs synthesized by combine
1874      and can happen in caller/callee saving sequences.  Because this option
1875      pays back little on PPro based chips and is in conflict with partial reg
1876      dependencies used by Athlon/P4 based chips, it is better to leave it off
1877      for generic32 for now.  */
1878   m_PPRO,
1879
1880   /* X86_TUNE_PARTIAL_FLAG_REG_STALL */
1881   m_CORE2I7 | m_GENERIC,
1882
1883   /* X86_TUNE_USE_HIMODE_FIOP */
1884   m_386 | m_486 | m_K6_GEODE,
1885
1886   /* X86_TUNE_USE_SIMODE_FIOP */
1887   ~(m_PPRO | m_AMD_MULTIPLE | m_PENT | m_ATOM | m_CORE2I7 | m_GENERIC),
1888
1889   /* X86_TUNE_USE_MOV0 */
1890   m_K6,
1891
1892   /* X86_TUNE_USE_CLTD */
1893   ~(m_PENT | m_ATOM | m_K6 | m_CORE2I7 | m_GENERIC),
1894
1895   /* X86_TUNE_USE_XCHGB: Use xchgb %rh,%rl instead of rolw/rorw $8,rx.  */
1896   m_PENT4,
1897
1898   /* X86_TUNE_SPLIT_LONG_MOVES */
1899   m_PPRO,
1900
1901   /* X86_TUNE_READ_MODIFY_WRITE */
1902   ~m_PENT,
1903
1904   /* X86_TUNE_READ_MODIFY */
1905   ~(m_PENT | m_PPRO),
1906
1907   /* X86_TUNE_PROMOTE_QIMODE */
1908   m_K6_GEODE | m_PENT | m_ATOM | m_386 | m_486 | m_AMD_MULTIPLE
1909   | m_CORE2I7 | m_GENERIC /* | m_PENT4 ? */,
1910
1911   /* X86_TUNE_FAST_PREFIX */
1912   ~(m_PENT | m_486 | m_386),
1913
1914   /* X86_TUNE_SINGLE_STRINGOP */
1915   m_386 | m_PENT4 | m_NOCONA,
1916
1917   /* X86_TUNE_QIMODE_MATH */
1918   ~0,
1919
1920   /* X86_TUNE_HIMODE_MATH: On PPro this flag is meant to avoid partial
1921      register stalls.  Just like X86_TUNE_PARTIAL_REG_STALL this option
1922      might be considered for Generic32 if our scheme for avoiding partial
1923      stalls was more effective.  */
1924   ~m_PPRO,
1925
1926   /* X86_TUNE_PROMOTE_QI_REGS */
1927   0,
1928
1929   /* X86_TUNE_PROMOTE_HI_REGS */
1930   m_PPRO,
1931
1932   /* X86_TUNE_SINGLE_POP: Enable if single pop insn is preferred
1933      over esp addition.  */
1934   m_386 | m_486 | m_PENT | m_PPRO,
1935
1936   /* X86_TUNE_DOUBLE_POP: Enable if double pop insn is preferred
1937      over esp addition.  */
1938   m_PENT,
1939
1940   /* X86_TUNE_SINGLE_PUSH: Enable if single push insn is preferred
1941      over esp subtraction.  */
1942   m_386 | m_486 | m_PENT | m_K6_GEODE,
1943
1944   /* X86_TUNE_DOUBLE_PUSH. Enable if double push insn is preferred
1945      over esp subtraction.  */
1946   m_PENT | m_K6_GEODE,
1947
1948   /* X86_TUNE_INTEGER_DFMODE_MOVES: Enable if integer moves are preferred
1949      for DFmode copies */
1950   ~(m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2I7
1951     | m_GENERIC | m_GEODE),
1952
1953   /* X86_TUNE_PARTIAL_REG_DEPENDENCY */
1954   m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2I7 | m_GENERIC,
1955
1956   /* X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY: In the Generic model we have a
1957      conflict here in between PPro/Pentium4 based chips that thread 128bit
1958      SSE registers as single units versus K8 based chips that divide SSE
1959      registers to two 64bit halves.  This knob promotes all store destinations
1960      to be 128bit to allow register renaming on 128bit SSE units, but usually
1961      results in one extra microop on 64bit SSE units.  Experimental results
1962      shows that disabling this option on P4 brings over 20% SPECfp regression,
1963      while enabling it on K8 brings roughly 2.4% regression that can be partly
1964      masked by careful scheduling of moves.  */
1965   m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2I7 | m_GENERIC
1966   | m_AMDFAM10 | m_BDVER1,
1967
1968   /* X86_TUNE_SSE_UNALIGNED_LOAD_OPTIMAL */
1969   m_AMDFAM10 | m_BDVER1 | m_BTVER1 | m_COREI7,
1970
1971   /* X86_TUNE_SSE_UNALIGNED_STORE_OPTIMAL */
1972   m_BDVER1 | m_COREI7,
1973
1974   /* X86_TUNE_SSE_PACKED_SINGLE_INSN_OPTIMAL */
1975   m_BDVER1,
1976
1977   /* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
1978      are resolved on SSE register parts instead of whole registers, so we may
1979      maintain just lower part of scalar values in proper format leaving the
1980      upper part undefined.  */
1981   m_ATHLON_K8,
1982
1983   /* X86_TUNE_SSE_TYPELESS_STORES */
1984   m_AMD_MULTIPLE,
1985
1986   /* X86_TUNE_SSE_LOAD0_BY_PXOR */
1987   m_PPRO | m_PENT4 | m_NOCONA,
1988
1989   /* X86_TUNE_MEMORY_MISMATCH_STALL */
1990   m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2I7 | m_GENERIC,
1991
1992   /* X86_TUNE_PROLOGUE_USING_MOVE */
1993   m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2I7 | m_GENERIC,
1994
1995   /* X86_TUNE_EPILOGUE_USING_MOVE */
1996   m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2I7 | m_GENERIC,
1997
1998   /* X86_TUNE_SHIFT1 */
1999   ~m_486,
2000
2001   /* X86_TUNE_USE_FFREEP */
2002   m_AMD_MULTIPLE,
2003
2004   /* X86_TUNE_INTER_UNIT_MOVES */
2005   ~(m_AMD_MULTIPLE | m_GENERIC),
2006
2007   /* X86_TUNE_INTER_UNIT_CONVERSIONS */
2008   ~(m_AMDFAM10 | m_BDVER1),
2009
2010   /* X86_TUNE_FOUR_JUMP_LIMIT: Some CPU cores are not able to predict more
2011      than 4 branch instructions in the 16 byte window.  */
2012   m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2I7
2013   | m_GENERIC,
2014
2015   /* X86_TUNE_SCHEDULE */
2016   m_PPRO | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT | m_ATOM | m_CORE2I7
2017   | m_GENERIC,
2018
2019   /* X86_TUNE_USE_BT */
2020   m_AMD_MULTIPLE | m_ATOM | m_CORE2I7 | m_GENERIC,
2021
2022   /* X86_TUNE_USE_INCDEC */
2023   ~(m_PENT4 | m_NOCONA | m_CORE2I7 | m_GENERIC | m_ATOM),
2024
2025   /* X86_TUNE_PAD_RETURNS */
2026   m_AMD_MULTIPLE | m_CORE2I7 | m_GENERIC,
2027
2028   /* X86_TUNE_PAD_SHORT_FUNCTION: Pad short funtion.  */
2029   m_ATOM,
2030
2031   /* X86_TUNE_EXT_80387_CONSTANTS */
2032   m_K6_GEODE | m_ATHLON_K8 | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO
2033   | m_CORE2I7 | m_GENERIC,
2034
2035   /* X86_TUNE_SHORTEN_X87_SSE */
2036   ~m_K8,
2037
2038   /* X86_TUNE_AVOID_VECTOR_DECODE */
2039   m_K8 | m_CORE2I7_64 | m_GENERIC64,
2040
2041   /* X86_TUNE_PROMOTE_HIMODE_IMUL: Modern CPUs have same latency for HImode
2042      and SImode multiply, but 386 and 486 do HImode multiply faster.  */
2043   ~(m_386 | m_486),
2044
2045   /* X86_TUNE_SLOW_IMUL_IMM32_MEM: Imul of 32-bit constant and memory is
2046      vector path on AMD machines.  */
2047   m_K8 | m_CORE2I7_64 | m_GENERIC64 | m_AMDFAM10 | m_BDVER1 | m_BTVER1,
2048
2049   /* X86_TUNE_SLOW_IMUL_IMM8: Imul of 8-bit constant is vector path on AMD
2050      machines.  */
2051   m_K8 | m_CORE2I7_64 | m_GENERIC64 | m_AMDFAM10 | m_BDVER1 | m_BTVER1,
2052
2053   /* X86_TUNE_MOVE_M1_VIA_OR: On pentiums, it is faster to load -1 via OR
2054      than a MOV.  */
2055   m_PENT,
2056
2057   /* X86_TUNE_NOT_UNPAIRABLE: NOT is not pairable on Pentium, while XOR is,
2058      but one byte longer.  */
2059   m_PENT,
2060
2061   /* X86_TUNE_NOT_VECTORMODE: On AMD K6, NOT is vector decoded with memory
2062      operand that cannot be represented using a modRM byte.  The XOR
2063      replacement is long decoded, so this split helps here as well.  */
2064   m_K6,
2065
2066   /* X86_TUNE_USE_VECTOR_FP_CONVERTS: Prefer vector packed SSE conversion
2067      from FP to FP. */
2068   m_AMDFAM10 | m_CORE2I7 | m_GENERIC,
2069
2070   /* X86_TUNE_USE_VECTOR_CONVERTS: Prefer vector packed SSE conversion
2071      from integer to FP. */
2072   m_AMDFAM10,
2073
2074   /* X86_TUNE_FUSE_CMP_AND_BRANCH: Fuse a compare or test instruction
2075      with a subsequent conditional jump instruction into a single
2076      compare-and-branch uop.  */
2077   m_BDVER1,
2078
2079   /* X86_TUNE_OPT_AGU: Optimize for Address Generation Unit. This flag
2080      will impact LEA instruction selection. */
2081   m_ATOM,
2082
2083   /* X86_TUNE_VECTORIZE_DOUBLE: Enable double precision vector
2084      instructions.  */
2085   ~m_ATOM,
2086
2087   /* X86_SOFTARE_PREFETCHING_BENEFICIAL: Enable software prefetching
2088      at -O3.  For the moment, the prefetching seems badly tuned for Intel
2089      chips.  */
2090   m_K6_GEODE | m_AMD_MULTIPLE
2091 };
2092
2093 /* Feature tests against the various architecture variations.  */
2094 unsigned char ix86_arch_features[X86_ARCH_LAST];
2095
2096 /* Feature tests against the various architecture variations, used to create
2097    ix86_arch_features based on the processor mask.  */
2098 static unsigned int initial_ix86_arch_features[X86_ARCH_LAST] = {
2099   /* X86_ARCH_CMOVE: Conditional move was added for pentiumpro.  */
2100   ~(m_386 | m_486 | m_PENT | m_K6),
2101
2102   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
2103   ~m_386,
2104
2105   /* X86_ARCH_CMPXCHG8B: Compare and exchange 8 bytes was added for pentium. */
2106   ~(m_386 | m_486),
2107
2108   /* X86_ARCH_XADD: Exchange and add was added for 80486.  */
2109   ~m_386,
2110
2111   /* X86_ARCH_BSWAP: Byteswap was added for 80486.  */
2112   ~m_386,
2113 };
2114
2115 static const unsigned int x86_accumulate_outgoing_args
2116   = m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2I7
2117     | m_GENERIC;
2118
2119 static const unsigned int x86_arch_always_fancy_math_387
2120   = m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4
2121     | m_NOCONA | m_CORE2I7 | m_GENERIC;
2122
2123 /* In case the average insn count for single function invocation is
2124    lower than this constant, emit fast (but longer) prologue and
2125    epilogue code.  */
2126 #define FAST_PROLOGUE_INSN_COUNT 20
2127
2128 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
2129 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
2130 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
2131 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
2132
2133 /* Array of the smallest class containing reg number REGNO, indexed by
2134    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
2135
2136 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
2137 {
2138   /* ax, dx, cx, bx */
2139   AREG, DREG, CREG, BREG,
2140   /* si, di, bp, sp */
2141   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
2142   /* FP registers */
2143   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
2144   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
2145   /* arg pointer */
2146   NON_Q_REGS,
2147   /* flags, fpsr, fpcr, frame */
2148   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
2149   /* SSE registers */
2150   SSE_FIRST_REG, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
2151   SSE_REGS, SSE_REGS,
2152   /* MMX registers */
2153   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
2154   MMX_REGS, MMX_REGS,
2155   /* REX registers */
2156   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
2157   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
2158   /* SSE REX registers */
2159   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
2160   SSE_REGS, SSE_REGS,
2161 };
2162
2163 /* The "default" register map used in 32bit mode.  */
2164
2165 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
2166 {
2167   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
2168   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
2169   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
2170   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
2171   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
2172   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
2173   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
2174 };
2175
2176 /* The "default" register map used in 64bit mode.  */
2177
2178 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
2179 {
2180   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
2181   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
2182   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
2183   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
2184   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
2185   8,9,10,11,12,13,14,15,                /* extended integer registers */
2186   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
2187 };
2188
2189 /* Define the register numbers to be used in Dwarf debugging information.
2190    The SVR4 reference port C compiler uses the following register numbers
2191    in its Dwarf output code:
2192         0 for %eax (gcc regno = 0)
2193         1 for %ecx (gcc regno = 2)
2194         2 for %edx (gcc regno = 1)
2195         3 for %ebx (gcc regno = 3)
2196         4 for %esp (gcc regno = 7)
2197         5 for %ebp (gcc regno = 6)
2198         6 for %esi (gcc regno = 4)
2199         7 for %edi (gcc regno = 5)
2200    The following three DWARF register numbers are never generated by
2201    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
2202    believes these numbers have these meanings.
2203         8  for %eip    (no gcc equivalent)
2204         9  for %eflags (gcc regno = 17)
2205         10 for %trapno (no gcc equivalent)
2206    It is not at all clear how we should number the FP stack registers
2207    for the x86 architecture.  If the version of SDB on x86/svr4 were
2208    a bit less brain dead with respect to floating-point then we would
2209    have a precedent to follow with respect to DWARF register numbers
2210    for x86 FP registers, but the SDB on x86/svr4 is so completely
2211    broken with respect to FP registers that it is hardly worth thinking
2212    of it as something to strive for compatibility with.
2213    The version of x86/svr4 SDB I have at the moment does (partially)
2214    seem to believe that DWARF register number 11 is associated with
2215    the x86 register %st(0), but that's about all.  Higher DWARF
2216    register numbers don't seem to be associated with anything in
2217    particular, and even for DWARF regno 11, SDB only seems to under-
2218    stand that it should say that a variable lives in %st(0) (when
2219    asked via an `=' command) if we said it was in DWARF regno 11,
2220    but SDB still prints garbage when asked for the value of the
2221    variable in question (via a `/' command).
2222    (Also note that the labels SDB prints for various FP stack regs
2223    when doing an `x' command are all wrong.)
2224    Note that these problems generally don't affect the native SVR4
2225    C compiler because it doesn't allow the use of -O with -g and
2226    because when it is *not* optimizing, it allocates a memory
2227    location for each floating-point variable, and the memory
2228    location is what gets described in the DWARF AT_location
2229    attribute for the variable in question.
2230    Regardless of the severe mental illness of the x86/svr4 SDB, we
2231    do something sensible here and we use the following DWARF
2232    register numbers.  Note that these are all stack-top-relative
2233    numbers.
2234         11 for %st(0) (gcc regno = 8)
2235         12 for %st(1) (gcc regno = 9)
2236         13 for %st(2) (gcc regno = 10)
2237         14 for %st(3) (gcc regno = 11)
2238         15 for %st(4) (gcc regno = 12)
2239         16 for %st(5) (gcc regno = 13)
2240         17 for %st(6) (gcc regno = 14)
2241         18 for %st(7) (gcc regno = 15)
2242 */
2243 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
2244 {
2245   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
2246   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
2247   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
2248   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
2249   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
2250   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
2251   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
2252 };
2253
2254 /* Define parameter passing and return registers.  */
2255
2256 static int const x86_64_int_parameter_registers[6] =
2257 {
2258   DI_REG, SI_REG, DX_REG, CX_REG, R8_REG, R9_REG
2259 };
2260
2261 static int const x86_64_ms_abi_int_parameter_registers[4] =
2262 {
2263   CX_REG, DX_REG, R8_REG, R9_REG
2264 };
2265
2266 static int const x86_64_int_return_registers[4] =
2267 {
2268   AX_REG, DX_REG, DI_REG, SI_REG
2269 };
2270
2271 /* Define the structure for the machine field in struct function.  */
2272
2273 struct GTY(()) stack_local_entry {
2274   unsigned short mode;
2275   unsigned short n;
2276   rtx rtl;
2277   struct stack_local_entry *next;
2278 };
2279
2280 /* Structure describing stack frame layout.
2281    Stack grows downward:
2282
2283    [arguments]
2284                                         <- ARG_POINTER
2285    saved pc
2286
2287    saved static chain                   if ix86_static_chain_on_stack
2288
2289    saved frame pointer                  if frame_pointer_needed
2290                                         <- HARD_FRAME_POINTER
2291    [saved regs]
2292                                         <- regs_save_offset
2293    [padding0]
2294
2295    [saved SSE regs]
2296                                         <- sse_regs_save_offset
2297    [padding1]          |
2298                        |                <- FRAME_POINTER
2299    [va_arg registers]  |
2300                        |
2301    [frame]             |
2302                        |
2303    [padding2]          | = to_allocate
2304                                         <- STACK_POINTER
2305   */
2306 struct ix86_frame
2307 {
2308   int nsseregs;
2309   int nregs;
2310   int va_arg_size;
2311   int red_zone_size;
2312   int outgoing_arguments_size;
2313   HOST_WIDE_INT frame;
2314
2315   /* The offsets relative to ARG_POINTER.  */
2316   HOST_WIDE_INT frame_pointer_offset;
2317   HOST_WIDE_INT hard_frame_pointer_offset;
2318   HOST_WIDE_INT stack_pointer_offset;
2319   HOST_WIDE_INT hfp_save_offset;
2320   HOST_WIDE_INT reg_save_offset;
2321   HOST_WIDE_INT sse_reg_save_offset;
2322
2323   /* When save_regs_using_mov is set, emit prologue using
2324      move instead of push instructions.  */
2325   bool save_regs_using_mov;
2326 };
2327
2328 /* Which unit we are generating floating point math for.  */
2329 enum fpmath_unit ix86_fpmath;
2330
2331 /* Which cpu are we scheduling for.  */
2332 enum attr_cpu ix86_schedule;
2333
2334 /* Which cpu are we optimizing for.  */
2335 enum processor_type ix86_tune;
2336
2337 /* Which instruction set architecture to use.  */
2338 enum processor_type ix86_arch;
2339
2340 /* true if sse prefetch instruction is not NOOP.  */
2341 int x86_prefetch_sse;
2342
2343 /* -mstackrealign option */
2344 static const char ix86_force_align_arg_pointer_string[]
2345   = "force_align_arg_pointer";
2346
2347 static rtx (*ix86_gen_leave) (void);
2348 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
2349 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
2350 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx, rtx);
2351 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
2352 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
2353 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
2354 static rtx (*ix86_gen_allocate_stack_worker) (rtx, rtx);
2355 static rtx (*ix86_gen_adjust_stack_and_probe) (rtx, rtx, rtx);
2356 static rtx (*ix86_gen_probe_stack_range) (rtx, rtx, rtx);
2357
2358 /* Preferred alignment for stack boundary in bits.  */
2359 unsigned int ix86_preferred_stack_boundary;
2360
2361 /* Alignment for incoming stack boundary in bits specified at
2362    command line.  */
2363 static unsigned int ix86_user_incoming_stack_boundary;
2364
2365 /* Default alignment for incoming stack boundary in bits.  */
2366 static unsigned int ix86_default_incoming_stack_boundary;
2367
2368 /* Alignment for incoming stack boundary in bits.  */
2369 unsigned int ix86_incoming_stack_boundary;
2370
2371 /* Calling abi specific va_list type nodes.  */
2372 static GTY(()) tree sysv_va_list_type_node;
2373 static GTY(()) tree ms_va_list_type_node;
2374
2375 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
2376 char internal_label_prefix[16];
2377 int internal_label_prefix_len;
2378
2379 /* Fence to use after loop using movnt.  */
2380 tree x86_mfence;
2381
2382 /* Register class used for passing given 64bit part of the argument.
2383    These represent classes as documented by the PS ABI, with the exception
2384    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
2385    use SF or DFmode move instead of DImode to avoid reformatting penalties.
2386
2387    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
2388    whenever possible (upper half does contain padding).  */
2389 enum x86_64_reg_class
2390   {
2391     X86_64_NO_CLASS,
2392     X86_64_INTEGER_CLASS,
2393     X86_64_INTEGERSI_CLASS,
2394     X86_64_SSE_CLASS,
2395     X86_64_SSESF_CLASS,
2396     X86_64_SSEDF_CLASS,
2397     X86_64_SSEUP_CLASS,
2398     X86_64_X87_CLASS,
2399     X86_64_X87UP_CLASS,
2400     X86_64_COMPLEX_X87_CLASS,
2401     X86_64_MEMORY_CLASS
2402   };
2403
2404 #define MAX_CLASSES 4
2405
2406 /* Table of constants used by fldpi, fldln2, etc....  */
2407 static REAL_VALUE_TYPE ext_80387_constants_table [5];
2408 static bool ext_80387_constants_init = 0;
2409
2410 \f
2411 static struct machine_function * ix86_init_machine_status (void);
2412 static rtx ix86_function_value (const_tree, const_tree, bool);
2413 static bool ix86_function_value_regno_p (const unsigned int);
2414 static unsigned int ix86_function_arg_boundary (enum machine_mode,
2415                                                 const_tree);
2416 static rtx ix86_static_chain (const_tree, bool);
2417 static int ix86_function_regparm (const_tree, const_tree);
2418 static void ix86_compute_frame_layout (struct ix86_frame *);
2419 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
2420                                                  rtx, rtx, int);
2421 static void ix86_add_new_builtins (int);
2422 static rtx ix86_expand_vec_perm_builtin (tree);
2423 static tree ix86_canonical_va_list_type (tree);
2424 static void predict_jump (int);
2425 static unsigned int split_stack_prologue_scratch_regno (void);
2426 static bool i386_asm_output_addr_const_extra (FILE *, rtx);
2427
2428 enum ix86_function_specific_strings
2429 {
2430   IX86_FUNCTION_SPECIFIC_ARCH,
2431   IX86_FUNCTION_SPECIFIC_TUNE,
2432   IX86_FUNCTION_SPECIFIC_FPMATH,
2433   IX86_FUNCTION_SPECIFIC_MAX
2434 };
2435
2436 static char *ix86_target_string (int, int, const char *, const char *,
2437                                  const char *, bool);
2438 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
2439 static void ix86_function_specific_save (struct cl_target_option *);
2440 static void ix86_function_specific_restore (struct cl_target_option *);
2441 static void ix86_function_specific_print (FILE *, int,
2442                                           struct cl_target_option *);
2443 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
2444 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
2445 static bool ix86_can_inline_p (tree, tree);
2446 static void ix86_set_current_function (tree);
2447 static unsigned int ix86_minimum_incoming_stack_boundary (bool);
2448
2449 static enum calling_abi ix86_function_abi (const_tree);
2450
2451 \f
2452 #ifndef SUBTARGET32_DEFAULT_CPU
2453 #define SUBTARGET32_DEFAULT_CPU "i386"
2454 #endif
2455
2456 /* The svr4 ABI for the i386 says that records and unions are returned
2457    in memory.  */
2458 #ifndef DEFAULT_PCC_STRUCT_RETURN
2459 #define DEFAULT_PCC_STRUCT_RETURN 1
2460 #endif
2461
2462 /* Whether -mtune= or -march= were specified */
2463 static int ix86_tune_defaulted;
2464 static int ix86_arch_specified;
2465
2466 /* Define a set of ISAs which are available when a given ISA is
2467    enabled.  MMX and SSE ISAs are handled separately.  */
2468
2469 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
2470 #define OPTION_MASK_ISA_3DNOW_SET \
2471   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
2472
2473 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
2474 #define OPTION_MASK_ISA_SSE2_SET \
2475   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
2476 #define OPTION_MASK_ISA_SSE3_SET \
2477   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
2478 #define OPTION_MASK_ISA_SSSE3_SET \
2479   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
2480 #define OPTION_MASK_ISA_SSE4_1_SET \
2481   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
2482 #define OPTION_MASK_ISA_SSE4_2_SET \
2483   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
2484 #define OPTION_MASK_ISA_AVX_SET \
2485   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
2486 #define OPTION_MASK_ISA_FMA_SET \
2487   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
2488
2489 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
2490    as -msse4.2.  */
2491 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
2492
2493 #define OPTION_MASK_ISA_SSE4A_SET \
2494   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
2495 #define OPTION_MASK_ISA_FMA4_SET \
2496   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
2497    | OPTION_MASK_ISA_AVX_SET)
2498 #define OPTION_MASK_ISA_XOP_SET \
2499   (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
2500 #define OPTION_MASK_ISA_LWP_SET \
2501   OPTION_MASK_ISA_LWP
2502
2503 /* AES and PCLMUL need SSE2 because they use xmm registers */
2504 #define OPTION_MASK_ISA_AES_SET \
2505   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
2506 #define OPTION_MASK_ISA_PCLMUL_SET \
2507   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
2508
2509 #define OPTION_MASK_ISA_ABM_SET \
2510   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
2511
2512 #define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI
2513 #define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM
2514 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
2515 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
2516 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
2517 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
2518 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
2519
2520 #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
2521 #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
2522 #define OPTION_MASK_ISA_F16C_SET \
2523   (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
2524
2525 /* Define a set of ISAs which aren't available when a given ISA is
2526    disabled.  MMX and SSE ISAs are handled separately.  */
2527
2528 #define OPTION_MASK_ISA_MMX_UNSET \
2529   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
2530 #define OPTION_MASK_ISA_3DNOW_UNSET \
2531   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
2532 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
2533
2534 #define OPTION_MASK_ISA_SSE_UNSET \
2535   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
2536 #define OPTION_MASK_ISA_SSE2_UNSET \
2537   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
2538 #define OPTION_MASK_ISA_SSE3_UNSET \
2539   (OPTION_MASK_ISA_SSE3 \
2540    | OPTION_MASK_ISA_SSSE3_UNSET \
2541    | OPTION_MASK_ISA_SSE4A_UNSET )
2542 #define OPTION_MASK_ISA_SSSE3_UNSET \
2543   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
2544 #define OPTION_MASK_ISA_SSE4_1_UNSET \
2545   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
2546 #define OPTION_MASK_ISA_SSE4_2_UNSET \
2547   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
2548 #define OPTION_MASK_ISA_AVX_UNSET \
2549   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
2550    | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET)
2551 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
2552
2553 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
2554    as -mno-sse4.1. */
2555 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
2556
2557 #define OPTION_MASK_ISA_SSE4A_UNSET \
2558   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
2559
2560 #define OPTION_MASK_ISA_FMA4_UNSET \
2561   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
2562 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
2563 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
2564
2565 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
2566 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
2567 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
2568 #define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI
2569 #define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM
2570 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
2571 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
2572 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
2573 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
2574 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
2575
2576 #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
2577 #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
2578 #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
2579
2580 /* Vectorization library interface and handlers.  */
2581 static tree (*ix86_veclib_handler) (enum built_in_function, tree, tree);
2582
2583 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
2584 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
2585
2586 /* Processor target table, indexed by processor number */
2587 struct ptt
2588 {
2589   const struct processor_costs *cost;           /* Processor costs */
2590   const int align_loop;                         /* Default alignments.  */
2591   const int align_loop_max_skip;
2592   const int align_jump;
2593   const int align_jump_max_skip;
2594   const int align_func;
2595 };
2596
2597 static const struct ptt processor_target_table[PROCESSOR_max] =
2598 {
2599   {&i386_cost, 4, 3, 4, 3, 4},
2600   {&i486_cost, 16, 15, 16, 15, 16},
2601   {&pentium_cost, 16, 7, 16, 7, 16},
2602   {&pentiumpro_cost, 16, 15, 16, 10, 16},
2603   {&geode_cost, 0, 0, 0, 0, 0},
2604   {&k6_cost, 32, 7, 32, 7, 32},
2605   {&athlon_cost, 16, 7, 16, 7, 16},
2606   {&pentium4_cost, 0, 0, 0, 0, 0},
2607   {&k8_cost, 16, 7, 16, 7, 16},
2608   {&nocona_cost, 0, 0, 0, 0, 0},
2609   /* Core 2 32-bit.  */
2610   {&generic32_cost, 16, 10, 16, 10, 16},
2611   /* Core 2 64-bit.  */
2612   {&generic64_cost, 16, 10, 16, 10, 16},
2613   /* Core i7 32-bit.  */
2614   {&generic32_cost, 16, 10, 16, 10, 16},
2615   /* Core i7 64-bit.  */
2616   {&generic64_cost, 16, 10, 16, 10, 16},
2617   {&generic32_cost, 16, 7, 16, 7, 16},
2618   {&generic64_cost, 16, 10, 16, 10, 16},
2619   {&amdfam10_cost, 32, 24, 32, 7, 32},
2620   {&bdver1_cost, 32, 24, 32, 7, 32},
2621   {&btver1_cost, 32, 24, 32, 7, 32},
2622   {&atom_cost, 16, 7, 16, 7, 16}
2623 };
2624
2625 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
2626 {
2627   "generic",
2628   "i386",
2629   "i486",
2630   "pentium",
2631   "pentium-mmx",
2632   "pentiumpro",
2633   "pentium2",
2634   "pentium3",
2635   "pentium4",
2636   "pentium-m",
2637   "prescott",
2638   "nocona",
2639   "core2",
2640   "corei7",
2641   "atom",
2642   "geode",
2643   "k6",
2644   "k6-2",
2645   "k6-3",
2646   "athlon",
2647   "athlon-4",
2648   "k8",
2649   "amdfam10",
2650   "bdver1",
2651   "btver1"
2652 };
2653 \f
2654 /* Return true if a red-zone is in use.  */
2655
2656 static inline bool
2657 ix86_using_red_zone (void)
2658 {
2659   return TARGET_RED_ZONE && !TARGET_64BIT_MS_ABI;
2660 }
2661
2662 /* Implement TARGET_HANDLE_OPTION.  */
2663
2664 static bool
2665 ix86_handle_option (struct gcc_options *opts,
2666                     struct gcc_options *opts_set ATTRIBUTE_UNUSED,
2667                     const struct cl_decoded_option *decoded,
2668                     location_t loc)
2669 {
2670   size_t code = decoded->opt_index;
2671   int value = decoded->value;
2672
2673   switch (code)
2674     {
2675     case OPT_mmmx:
2676       if (value)
2677         {
2678           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
2679           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
2680         }
2681       else
2682         {
2683           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
2684           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2685         }
2686       return true;
2687
2688     case OPT_m3dnow:
2689       if (value)
2690         {
2691           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2692           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2693         }
2694       else
2695         {
2696           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2697           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2698         }
2699       return true;
2700
2701     case OPT_m3dnowa:
2702       return false;
2703
2704     case OPT_msse:
2705       if (value)
2706         {
2707           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2708           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2709         }
2710       else
2711         {
2712           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2713           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2714         }
2715       return true;
2716
2717     case OPT_msse2:
2718       if (value)
2719         {
2720           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2721           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2722         }
2723       else
2724         {
2725           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2726           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2727         }
2728       return true;
2729
2730     case OPT_msse3:
2731       if (value)
2732         {
2733           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2734           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2735         }
2736       else
2737         {
2738           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2739           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2740         }
2741       return true;
2742
2743     case OPT_mssse3:
2744       if (value)
2745         {
2746           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2747           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2748         }
2749       else
2750         {
2751           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2752           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2753         }
2754       return true;
2755
2756     case OPT_msse4_1:
2757       if (value)
2758         {
2759           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2760           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2761         }
2762       else
2763         {
2764           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2765           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2766         }
2767       return true;
2768
2769     case OPT_msse4_2:
2770       if (value)
2771         {
2772           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2773           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2774         }
2775       else
2776         {
2777           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2778           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2779         }
2780       return true;
2781
2782     case OPT_mavx:
2783       if (value)
2784         {
2785           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2786           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2787         }
2788       else
2789         {
2790           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2791           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2792         }
2793       return true;
2794
2795     case OPT_mfma:
2796       if (value)
2797         {
2798           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2799           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2800         }
2801       else
2802         {
2803           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2804           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2805         }
2806       return true;
2807
2808     case OPT_msse4:
2809       opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2810       opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2811       return true;
2812
2813     case OPT_mno_sse4:
2814       opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2815       opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2816       return true;
2817
2818     case OPT_msse4a:
2819       if (value)
2820         {
2821           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2822           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2823         }
2824       else
2825         {
2826           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2827           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2828         }
2829       return true;
2830
2831     case OPT_mfma4:
2832       if (value)
2833         {
2834           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
2835           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
2836         }
2837       else
2838         {
2839           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
2840           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
2841         }
2842       return true;
2843
2844    case OPT_mxop:
2845       if (value)
2846         {
2847           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
2848           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
2849         }
2850       else
2851         {
2852           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
2853           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
2854         }
2855       return true;
2856
2857    case OPT_mlwp:
2858       if (value)
2859         {
2860           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
2861           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
2862         }
2863       else
2864         {
2865           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
2866           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
2867         }
2868       return true;
2869
2870     case OPT_mabm:
2871       if (value)
2872         {
2873           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2874           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2875         }
2876       else
2877         {
2878           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2879           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2880         }
2881       return true;
2882
2883     case OPT_mbmi:
2884       if (value)
2885         {
2886           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI_SET;
2887           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_SET;
2888         }
2889       else
2890         {
2891           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI_UNSET;
2892           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_UNSET;
2893         }
2894       return true;
2895
2896     case OPT_mtbm:
2897       if (value)
2898         {
2899           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_TBM_SET;
2900           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_SET;
2901         }
2902       else
2903         {
2904           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_TBM_UNSET;
2905           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_UNSET;
2906         }
2907       return true;
2908
2909     case OPT_mpopcnt:
2910       if (value)
2911         {
2912           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2913           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2914         }
2915       else
2916         {
2917           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2918           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2919         }
2920       return true;
2921
2922     case OPT_msahf:
2923       if (value)
2924         {
2925           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2926           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2927         }
2928       else
2929         {
2930           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2931           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2932         }
2933       return true;
2934
2935     case OPT_mcx16:
2936       if (value)
2937         {
2938           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2939           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2940         }
2941       else
2942         {
2943           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2944           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2945         }
2946       return true;
2947
2948     case OPT_mmovbe:
2949       if (value)
2950         {
2951           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
2952           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
2953         }
2954       else
2955         {
2956           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
2957           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
2958         }
2959       return true;
2960
2961     case OPT_mcrc32:
2962       if (value)
2963         {
2964           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
2965           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
2966         }
2967       else
2968         {
2969           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
2970           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
2971         }
2972       return true;
2973
2974     case OPT_maes:
2975       if (value)
2976         {
2977           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2978           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2979         }
2980       else
2981         {
2982           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
2983           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
2984         }
2985       return true;
2986
2987     case OPT_mpclmul:
2988       if (value)
2989         {
2990           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
2991           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
2992         }
2993       else
2994         {
2995           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
2996           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
2997         }
2998       return true;
2999
3000     case OPT_mfsgsbase:
3001       if (value)
3002         {
3003           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE_SET;
3004           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_SET;
3005         }
3006       else
3007         {
3008           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FSGSBASE_UNSET;
3009           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_UNSET;
3010         }
3011       return true;
3012
3013     case OPT_mrdrnd:
3014       if (value)
3015         {
3016           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDRND_SET;
3017           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_SET;
3018         }
3019       else
3020         {
3021           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDRND_UNSET;
3022           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_UNSET;
3023         }
3024       return true;
3025
3026     case OPT_mf16c:
3027       if (value)
3028         {
3029           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_F16C_SET;
3030           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_SET;
3031         }
3032       else
3033         {
3034           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_F16C_UNSET;
3035           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_UNSET;
3036         }
3037       return true;
3038
3039   /* Comes from final.c -- no real reason to change it.  */
3040 #define MAX_CODE_ALIGN 16
3041
3042     case OPT_malign_loops_:
3043       warning_at (loc, 0, "-malign-loops is obsolete, use -falign-loops");
3044       if (value > MAX_CODE_ALIGN)
3045         error_at (loc, "-malign-loops=%d is not between 0 and %d",
3046                   value, MAX_CODE_ALIGN);
3047       else
3048         opts->x_align_loops = 1 << value;
3049       return true;
3050
3051     case OPT_malign_jumps_:
3052       warning_at (loc, 0, "-malign-jumps is obsolete, use -falign-jumps");
3053       if (value > MAX_CODE_ALIGN)
3054         error_at (loc, "-malign-jumps=%d is not between 0 and %d",
3055                   value, MAX_CODE_ALIGN);
3056       else
3057         opts->x_align_jumps = 1 << value;
3058       return true;
3059
3060     case OPT_malign_functions_:
3061       warning_at (loc, 0,
3062                   "-malign-functions is obsolete, use -falign-functions");
3063       if (value > MAX_CODE_ALIGN)
3064         error_at (loc, "-malign-functions=%d is not between 0 and %d",
3065                   value, MAX_CODE_ALIGN);
3066       else
3067         opts->x_align_functions = 1 << value;
3068       return true;
3069
3070     case OPT_mbranch_cost_:
3071       if (value > 5)
3072         {
3073           error_at (loc, "-mbranch-cost=%d is not between 0 and 5", value);
3074           opts->x_ix86_branch_cost = 5;
3075         }
3076       return true;
3077
3078     default:
3079       return true;
3080     }
3081 }
3082 \f
3083 /* Return a string that documents the current -m options.  The caller is
3084    responsible for freeing the string.  */
3085
3086 static char *
3087 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
3088                     const char *fpmath, bool add_nl_p)
3089 {
3090   struct ix86_target_opts
3091   {
3092     const char *option;         /* option string */
3093     int mask;                   /* isa mask options */
3094   };
3095
3096   /* This table is ordered so that options like -msse4.2 that imply
3097      preceding options while match those first.  */
3098   static struct ix86_target_opts isa_opts[] =
3099   {
3100     { "-m64",           OPTION_MASK_ISA_64BIT },
3101     { "-mfma4",         OPTION_MASK_ISA_FMA4 },
3102     { "-mfma",          OPTION_MASK_ISA_FMA },
3103     { "-mxop",          OPTION_MASK_ISA_XOP },
3104     { "-mlwp",          OPTION_MASK_ISA_LWP },
3105     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
3106     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
3107     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
3108     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
3109     { "-msse3",         OPTION_MASK_ISA_SSE3 },
3110     { "-msse2",         OPTION_MASK_ISA_SSE2 },
3111     { "-msse",          OPTION_MASK_ISA_SSE },
3112     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
3113     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
3114     { "-mmmx",          OPTION_MASK_ISA_MMX },
3115     { "-mabm",          OPTION_MASK_ISA_ABM },
3116     { "-mbmi",          OPTION_MASK_ISA_BMI },
3117     { "-mtbm",          OPTION_MASK_ISA_TBM },
3118     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
3119     { "-mmovbe",        OPTION_MASK_ISA_MOVBE },
3120     { "-mcrc32",        OPTION_MASK_ISA_CRC32 },
3121     { "-maes",          OPTION_MASK_ISA_AES },
3122     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
3123     { "-mfsgsbase",     OPTION_MASK_ISA_FSGSBASE },
3124     { "-mrdrnd",        OPTION_MASK_ISA_RDRND },
3125     { "-mf16c",         OPTION_MASK_ISA_F16C },
3126   };
3127
3128   /* Flag options.  */
3129   static struct ix86_target_opts flag_opts[] =
3130   {
3131     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
3132     { "-m80387",                        MASK_80387 },
3133     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
3134     { "-malign-double",                 MASK_ALIGN_DOUBLE },
3135     { "-mcld",                          MASK_CLD },
3136     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
3137     { "-mieee-fp",                      MASK_IEEE_FP },
3138     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
3139     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
3140     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
3141     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
3142     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
3143     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
3144     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
3145     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
3146     { "-mrecip",                        MASK_RECIP },
3147     { "-mrtd",                          MASK_RTD },
3148     { "-msseregparm",                   MASK_SSEREGPARM },
3149     { "-mstack-arg-probe",              MASK_STACK_PROBE },
3150     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
3151     { "-mvect8-ret-in-mem",             MASK_VECT8_RETURNS },
3152     { "-m8bit-idiv",                    MASK_USE_8BIT_IDIV },
3153     { "-mvzeroupper",                   MASK_VZEROUPPER },
3154     { "-mavx256-split-unaligned-load",  MASK_AVX256_SPLIT_UNALIGNED_LOAD},
3155     { "-mavx256-split-unaligned-store", MASK_AVX256_SPLIT_UNALIGNED_STORE},
3156   };
3157
3158   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
3159
3160   char isa_other[40];
3161   char target_other[40];
3162   unsigned num = 0;
3163   unsigned i, j;
3164   char *ret;
3165   char *ptr;
3166   size_t len;
3167   size_t line_len;
3168   size_t sep_len;
3169
3170   memset (opts, '\0', sizeof (opts));
3171
3172   /* Add -march= option.  */
3173   if (arch)
3174     {
3175       opts[num][0] = "-march=";
3176       opts[num++][1] = arch;
3177     }
3178
3179   /* Add -mtune= option.  */
3180   if (tune)
3181     {
3182       opts[num][0] = "-mtune=";
3183       opts[num++][1] = tune;
3184     }
3185
3186   /* Pick out the options in isa options.  */
3187   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
3188     {
3189       if ((isa & isa_opts[i].mask) != 0)
3190         {
3191           opts[num++][0] = isa_opts[i].option;
3192           isa &= ~ isa_opts[i].mask;
3193         }
3194     }
3195
3196   if (isa && add_nl_p)
3197     {
3198       opts[num++][0] = isa_other;
3199       sprintf (isa_other, "(other isa: %#x)", isa);
3200     }
3201
3202   /* Add flag options.  */
3203   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
3204     {
3205       if ((flags & flag_opts[i].mask) != 0)
3206         {
3207           opts[num++][0] = flag_opts[i].option;
3208           flags &= ~ flag_opts[i].mask;
3209         }
3210     }
3211
3212   if (flags && add_nl_p)
3213     {
3214       opts[num++][0] = target_other;
3215       sprintf (target_other, "(other flags: %#x)", flags);
3216     }
3217
3218   /* Add -fpmath= option.  */
3219   if (fpmath)
3220     {
3221       opts[num][0] = "-mfpmath=";
3222       opts[num++][1] = fpmath;
3223     }
3224
3225   /* Any options?  */
3226   if (num == 0)
3227     return NULL;
3228
3229   gcc_assert (num < ARRAY_SIZE (opts));
3230
3231   /* Size the string.  */
3232   len = 0;
3233   sep_len = (add_nl_p) ? 3 : 1;
3234   for (i = 0; i < num; i++)
3235     {
3236       len += sep_len;
3237       for (j = 0; j < 2; j++)
3238         if (opts[i][j])
3239           len += strlen (opts[i][j]);
3240     }
3241
3242   /* Build the string.  */
3243   ret = ptr = (char *) xmalloc (len);
3244   line_len = 0;
3245
3246   for (i = 0; i < num; i++)
3247     {
3248       size_t len2[2];
3249
3250       for (j = 0; j < 2; j++)
3251         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
3252
3253       if (i != 0)
3254         {
3255           *ptr++ = ' ';
3256           line_len++;
3257
3258           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
3259             {
3260               *ptr++ = '\\';
3261               *ptr++ = '\n';
3262               line_len = 0;
3263             }
3264         }
3265
3266       for (j = 0; j < 2; j++)
3267         if (opts[i][j])
3268           {
3269             memcpy (ptr, opts[i][j], len2[j]);
3270             ptr += len2[j];
3271             line_len += len2[j];
3272           }
3273     }
3274
3275   *ptr = '\0';
3276   gcc_assert (ret + len >= ptr);
3277
3278   return ret;
3279 }
3280
3281 /* Return true, if profiling code should be emitted before
3282    prologue. Otherwise it returns false.
3283    Note: For x86 with "hotfix" it is sorried.  */
3284 static bool
3285 ix86_profile_before_prologue (void)
3286 {
3287   return flag_fentry != 0;
3288 }
3289
3290 /* Function that is callable from the debugger to print the current
3291    options.  */
3292 void
3293 ix86_debug_options (void)
3294 {
3295   char *opts = ix86_target_string (ix86_isa_flags, target_flags,
3296                                    ix86_arch_string, ix86_tune_string,
3297                                    ix86_fpmath_string, true);
3298
3299   if (opts)
3300     {
3301       fprintf (stderr, "%s\n\n", opts);
3302       free (opts);
3303     }
3304   else
3305     fputs ("<no options>\n\n", stderr);
3306
3307   return;
3308 }
3309 \f
3310 /* Override various settings based on options.  If MAIN_ARGS_P, the
3311    options are from the command line, otherwise they are from
3312    attributes.  */
3313
3314 static void
3315 ix86_option_override_internal (bool main_args_p)
3316 {
3317   int i;
3318   unsigned int ix86_arch_mask, ix86_tune_mask;
3319   const bool ix86_tune_specified = (ix86_tune_string != NULL);
3320   const char *prefix;
3321   const char *suffix;
3322   const char *sw;
3323
3324   enum pta_flags
3325     {
3326       PTA_SSE = 1 << 0,
3327       PTA_SSE2 = 1 << 1,
3328       PTA_SSE3 = 1 << 2,
3329       PTA_MMX = 1 << 3,
3330       PTA_PREFETCH_SSE = 1 << 4,
3331       PTA_3DNOW = 1 << 5,
3332       PTA_3DNOW_A = 1 << 6,
3333       PTA_64BIT = 1 << 7,
3334       PTA_SSSE3 = 1 << 8,
3335       PTA_CX16 = 1 << 9,
3336       PTA_POPCNT = 1 << 10,
3337       PTA_ABM = 1 << 11,
3338       PTA_SSE4A = 1 << 12,
3339       PTA_NO_SAHF = 1 << 13,
3340       PTA_SSE4_1 = 1 << 14,
3341       PTA_SSE4_2 = 1 << 15,
3342       PTA_AES = 1 << 16,
3343       PTA_PCLMUL = 1 << 17,
3344       PTA_AVX = 1 << 18,
3345       PTA_FMA = 1 << 19,
3346       PTA_MOVBE = 1 << 20,
3347       PTA_FMA4 = 1 << 21,
3348       PTA_XOP = 1 << 22,
3349       PTA_LWP = 1 << 23,
3350       PTA_FSGSBASE = 1 << 24,
3351       PTA_RDRND = 1 << 25,
3352       PTA_F16C = 1 << 26,
3353       PTA_BMI = 1 << 27,
3354       PTA_TBM = 1 << 28
3355       /* if this reaches 32, need to widen struct pta flags below */
3356     };
3357
3358   static struct pta
3359     {
3360       const char *const name;           /* processor name or nickname.  */
3361       const enum processor_type processor;
3362       const enum attr_cpu schedule;
3363       const unsigned /*enum pta_flags*/ flags;
3364     }
3365   const processor_alias_table[] =
3366     {
3367       {"i386", PROCESSOR_I386, CPU_NONE, 0},
3368       {"i486", PROCESSOR_I486, CPU_NONE, 0},
3369       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
3370       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
3371       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
3372       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
3373       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
3374       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
3375       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
3376       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
3377       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
3378       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
3379       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
3380         PTA_MMX | PTA_SSE},
3381       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
3382         PTA_MMX | PTA_SSE},
3383       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
3384         PTA_MMX | PTA_SSE | PTA_SSE2},
3385       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
3386         PTA_MMX |PTA_SSE | PTA_SSE2},
3387       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
3388         PTA_MMX | PTA_SSE | PTA_SSE2},
3389       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
3390         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
3391       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
3392         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3393         | PTA_CX16 | PTA_NO_SAHF},
3394       {"core2", PROCESSOR_CORE2_64, CPU_CORE2,
3395         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3396         | PTA_SSSE3 | PTA_CX16},
3397       {"corei7", PROCESSOR_COREI7_64, CPU_COREI7,
3398         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3399         | PTA_SSSE3 | PTA_SSE4_1 | PTA_SSE4_2 | PTA_CX16},
3400       {"corei7-avx", PROCESSOR_COREI7_64, CPU_COREI7,
3401         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3402         | PTA_SSSE3 | PTA_SSE4_1 | PTA_SSE4_2 | PTA_AVX
3403         | PTA_CX16 | PTA_POPCNT | PTA_AES | PTA_PCLMUL},
3404       {"atom", PROCESSOR_ATOM, CPU_ATOM,
3405         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3406         | PTA_SSSE3 | PTA_CX16 | PTA_MOVBE},
3407       {"geode", PROCESSOR_GEODE, CPU_GEODE,
3408         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
3409       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
3410       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
3411       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
3412       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
3413         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
3414       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
3415         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
3416       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
3417         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
3418       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
3419         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
3420       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
3421         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
3422       {"x86-64", PROCESSOR_K8, CPU_K8,
3423         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
3424       {"k8", PROCESSOR_K8, CPU_K8,
3425         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3426         | PTA_SSE2 | PTA_NO_SAHF},
3427       {"k8-sse3", PROCESSOR_K8, CPU_K8,
3428         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3429         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
3430       {"opteron", PROCESSOR_K8, CPU_K8,
3431         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3432         | PTA_SSE2 | PTA_NO_SAHF},
3433       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
3434         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3435         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
3436       {"athlon64", PROCESSOR_K8, CPU_K8,
3437         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3438         | PTA_SSE2 | PTA_NO_SAHF},
3439       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
3440         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3441         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
3442       {"athlon-fx", PROCESSOR_K8, CPU_K8,
3443         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3444         | PTA_SSE2 | PTA_NO_SAHF},
3445       {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
3446         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3447         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
3448       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
3449         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3450         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
3451       {"bdver1", PROCESSOR_BDVER1, CPU_BDVER1,
3452         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3453         | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
3454         | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
3455         | PTA_XOP | PTA_LWP},
3456       {"btver1", PROCESSOR_BTVER1, CPU_GENERIC64,
3457         PTA_64BIT | PTA_MMX |  PTA_SSE  | PTA_SSE2 | PTA_SSE3
3458         | PTA_SSSE3 | PTA_SSE4A |PTA_ABM | PTA_CX16},
3459       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
3460         0 /* flags are only used for -march switch.  */ },
3461       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
3462         PTA_64BIT /* flags are only used for -march switch.  */ },
3463     };
3464
3465   int const pta_size = ARRAY_SIZE (processor_alias_table);
3466
3467   /* Set up prefix/suffix so the error messages refer to either the command
3468      line argument, or the attribute(target).  */
3469   if (main_args_p)
3470     {
3471       prefix = "-m";
3472       suffix = "";
3473       sw = "switch";
3474     }
3475   else
3476     {
3477       prefix = "option(\"";
3478       suffix = "\")";
3479       sw = "attribute";
3480     }
3481
3482 #ifdef SUBTARGET_OVERRIDE_OPTIONS
3483   SUBTARGET_OVERRIDE_OPTIONS;
3484 #endif
3485
3486 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
3487   SUBSUBTARGET_OVERRIDE_OPTIONS;
3488 #endif
3489
3490   /* -fPIC is the default for x86_64.  */
3491   if (TARGET_MACHO && TARGET_64BIT)
3492     flag_pic = 2;
3493
3494   /* Need to check -mtune=generic first.  */
3495   if (ix86_tune_string)
3496     {
3497       if (!strcmp (ix86_tune_string, "generic")
3498           || !strcmp (ix86_tune_string, "i686")
3499           /* As special support for cross compilers we read -mtune=native
3500              as -mtune=generic.  With native compilers we won't see the
3501              -mtune=native, as it was changed by the driver.  */
3502           || !strcmp (ix86_tune_string, "native"))
3503         {
3504           if (TARGET_64BIT)
3505             ix86_tune_string = "generic64";
3506           else
3507             ix86_tune_string = "generic32";
3508         }
3509       /* If this call is for setting the option attribute, allow the
3510          generic32/generic64 that was previously set.  */
3511       else if (!main_args_p
3512                && (!strcmp (ix86_tune_string, "generic32")
3513                    || !strcmp (ix86_tune_string, "generic64")))
3514         ;
3515       else if (!strncmp (ix86_tune_string, "generic", 7))
3516         error ("bad value (%s) for %stune=%s %s",
3517                ix86_tune_string, prefix, suffix, sw);
3518       else if (!strcmp (ix86_tune_string, "x86-64"))
3519         warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated; use "
3520                  "%stune=k8%s or %stune=generic%s instead as appropriate",
3521                  prefix, suffix, prefix, suffix, prefix, suffix);
3522     }
3523   else
3524     {
3525       if (ix86_arch_string)
3526         ix86_tune_string = ix86_arch_string;
3527       if (!ix86_tune_string)
3528         {
3529           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
3530           ix86_tune_defaulted = 1;
3531         }
3532
3533       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
3534          need to use a sensible tune option.  */
3535       if (!strcmp (ix86_tune_string, "generic")
3536           || !strcmp (ix86_tune_string, "x86-64")
3537           || !strcmp (ix86_tune_string, "i686"))
3538         {
3539           if (TARGET_64BIT)
3540             ix86_tune_string = "generic64";
3541           else
3542             ix86_tune_string = "generic32";
3543         }
3544     }
3545
3546   if (ix86_stringop_alg == rep_prefix_8_byte && !TARGET_64BIT)
3547     {
3548       /* rep; movq isn't available in 32-bit code.  */
3549       error ("-mstringop-strategy=rep_8byte not supported for 32-bit code");
3550       ix86_stringop_alg = no_stringop;
3551     }
3552
3553   if (!ix86_arch_string)
3554     ix86_arch_string = TARGET_64BIT ? "x86-64" : SUBTARGET32_DEFAULT_CPU;
3555   else
3556     ix86_arch_specified = 1;
3557
3558   if (!global_options_set.x_ix86_abi)
3559     ix86_abi = DEFAULT_ABI;
3560
3561   if (global_options_set.x_ix86_cmodel)
3562     {
3563       switch (ix86_cmodel)
3564         {
3565         case CM_SMALL:
3566         case CM_SMALL_PIC:
3567           if (flag_pic)
3568             ix86_cmodel = CM_SMALL_PIC;
3569           if (!TARGET_64BIT)
3570             error ("code model %qs not supported in the %s bit mode",
3571                    "small", "32");
3572           break;
3573
3574         case CM_MEDIUM:
3575         case CM_MEDIUM_PIC:
3576           if (flag_pic)
3577             ix86_cmodel = CM_MEDIUM_PIC;
3578           if (!TARGET_64BIT)
3579             error ("code model %qs not supported in the %s bit mode",
3580                    "medium", "32");
3581           break;
3582
3583         case CM_LARGE:
3584         case CM_LARGE_PIC:
3585           if (flag_pic)
3586             ix86_cmodel = CM_LARGE_PIC;
3587           if (!TARGET_64BIT)
3588             error ("code model %qs not supported in the %s bit mode",
3589                    "large", "32");
3590           break;
3591
3592         case CM_32:
3593           if (flag_pic)
3594             error ("code model %s does not support PIC mode", "32");
3595           if (TARGET_64BIT)
3596             error ("code model %qs not supported in the %s bit mode",
3597                    "32", "64");
3598           break;
3599
3600         case CM_KERNEL:
3601           if (flag_pic)
3602             {
3603               error ("code model %s does not support PIC mode", "kernel");
3604               ix86_cmodel = CM_32;
3605             }
3606           if (!TARGET_64BIT)
3607             error ("code model %qs not supported in the %s bit mode",
3608                    "kernel", "32");
3609           break;
3610
3611         default:
3612           gcc_unreachable ();
3613         }
3614     }
3615   else
3616     {
3617       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
3618          use of rip-relative addressing.  This eliminates fixups that
3619          would otherwise be needed if this object is to be placed in a
3620          DLL, and is essentially just as efficient as direct addressing.  */
3621       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
3622         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
3623       else if (TARGET_64BIT)
3624         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
3625       else
3626         ix86_cmodel = CM_32;
3627     }
3628   if (TARGET_MACHO && ix86_asm_dialect == ASM_INTEL)
3629     {
3630       error ("-masm=intel not supported in this configuration");
3631       ix86_asm_dialect = ASM_ATT;
3632     }
3633   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
3634     sorry ("%i-bit mode not compiled in",
3635            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
3636
3637   for (i = 0; i < pta_size; i++)
3638     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
3639       {
3640         ix86_schedule = processor_alias_table[i].schedule;
3641         ix86_arch = processor_alias_table[i].processor;
3642         /* Default cpu tuning to the architecture.  */
3643         ix86_tune = ix86_arch;
3644
3645         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
3646           error ("CPU you selected does not support x86-64 "
3647                  "instruction set");
3648
3649         if (processor_alias_table[i].flags & PTA_MMX
3650             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
3651           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
3652         if (processor_alias_table[i].flags & PTA_3DNOW
3653             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
3654           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
3655         if (processor_alias_table[i].flags & PTA_3DNOW_A
3656             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
3657           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
3658         if (processor_alias_table[i].flags & PTA_SSE
3659             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
3660           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
3661         if (processor_alias_table[i].flags & PTA_SSE2
3662             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
3663           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
3664         if (processor_alias_table[i].flags & PTA_SSE3
3665             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
3666           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
3667         if (processor_alias_table[i].flags & PTA_SSSE3
3668             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
3669           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
3670         if (processor_alias_table[i].flags & PTA_SSE4_1
3671             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
3672           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
3673         if (processor_alias_table[i].flags & PTA_SSE4_2
3674             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
3675           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
3676         if (processor_alias_table[i].flags & PTA_AVX
3677             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
3678           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
3679         if (processor_alias_table[i].flags & PTA_FMA
3680             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
3681           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
3682         if (processor_alias_table[i].flags & PTA_SSE4A
3683             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
3684           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
3685         if (processor_alias_table[i].flags & PTA_FMA4
3686             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA4))
3687           ix86_isa_flags |= OPTION_MASK_ISA_FMA4;
3688         if (processor_alias_table[i].flags & PTA_XOP
3689             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_XOP))
3690           ix86_isa_flags |= OPTION_MASK_ISA_XOP;
3691         if (processor_alias_table[i].flags & PTA_LWP
3692             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_LWP))
3693           ix86_isa_flags |= OPTION_MASK_ISA_LWP;
3694         if (processor_alias_table[i].flags & PTA_ABM
3695             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
3696           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
3697         if (processor_alias_table[i].flags & PTA_BMI
3698             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_BMI))
3699           ix86_isa_flags |= OPTION_MASK_ISA_BMI;
3700         if (processor_alias_table[i].flags & PTA_TBM
3701             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_TBM))
3702           ix86_isa_flags |= OPTION_MASK_ISA_TBM;
3703         if (processor_alias_table[i].flags & PTA_CX16
3704             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
3705           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
3706         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
3707             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
3708           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
3709         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
3710             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
3711           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
3712         if (processor_alias_table[i].flags & PTA_MOVBE
3713             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MOVBE))
3714           ix86_isa_flags |= OPTION_MASK_ISA_MOVBE;
3715         if (processor_alias_table[i].flags & PTA_AES
3716             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
3717           ix86_isa_flags |= OPTION_MASK_ISA_AES;
3718         if (processor_alias_table[i].flags & PTA_PCLMUL
3719             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
3720           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
3721         if (processor_alias_table[i].flags & PTA_FSGSBASE
3722             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FSGSBASE))
3723           ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE;
3724         if (processor_alias_table[i].flags & PTA_RDRND
3725             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_RDRND))
3726           ix86_isa_flags |= OPTION_MASK_ISA_RDRND;
3727         if (processor_alias_table[i].flags & PTA_F16C
3728             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_F16C))
3729           ix86_isa_flags |= OPTION_MASK_ISA_F16C;
3730         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
3731           x86_prefetch_sse = true;
3732
3733         break;
3734       }
3735
3736   if (!strcmp (ix86_arch_string, "generic"))
3737     error ("generic CPU can be used only for %stune=%s %s",
3738            prefix, suffix, sw);
3739   else if (!strncmp (ix86_arch_string, "generic", 7) || i == pta_size)
3740     error ("bad value (%s) for %sarch=%s %s",
3741            ix86_arch_string, prefix, suffix, sw);
3742
3743   ix86_arch_mask = 1u << ix86_arch;
3744   for (i = 0; i < X86_ARCH_LAST; ++i)
3745     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3746
3747   for (i = 0; i < pta_size; i++)
3748     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
3749       {
3750         ix86_schedule = processor_alias_table[i].schedule;
3751         ix86_tune = processor_alias_table[i].processor;
3752         if (TARGET_64BIT)
3753           {
3754             if (!(processor_alias_table[i].flags & PTA_64BIT))
3755               {
3756                 if (ix86_tune_defaulted)
3757                   {
3758                     ix86_tune_string = "x86-64";
3759                     for (i = 0; i < pta_size; i++)
3760                       if (! strcmp (ix86_tune_string,
3761                                     processor_alias_table[i].name))
3762                         break;
3763                     ix86_schedule = processor_alias_table[i].schedule;
3764                     ix86_tune = processor_alias_table[i].processor;
3765                   }
3766                 else
3767                   error ("CPU you selected does not support x86-64 "
3768                          "instruction set");
3769               }
3770           }
3771         else
3772           {
3773             /* Adjust tuning when compiling for 32-bit ABI.  */
3774             switch (ix86_tune)
3775               {
3776               case PROCESSOR_GENERIC64:
3777                 ix86_tune = PROCESSOR_GENERIC32;
3778                 ix86_schedule = CPU_PENTIUMPRO;
3779                 break;
3780
3781               case PROCESSOR_CORE2_64:
3782                 ix86_tune = PROCESSOR_CORE2_32;
3783                 break;
3784
3785               case PROCESSOR_COREI7_64:
3786                 ix86_tune = PROCESSOR_COREI7_32;
3787                 break;
3788
3789               default:
3790                 break;
3791               }
3792           }
3793         /* Intel CPUs have always interpreted SSE prefetch instructions as
3794            NOPs; so, we can enable SSE prefetch instructions even when
3795            -mtune (rather than -march) points us to a processor that has them.
3796            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
3797            higher processors.  */
3798         if (TARGET_CMOVE
3799             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
3800           x86_prefetch_sse = true;
3801         break;
3802       }
3803
3804   if (ix86_tune_specified && i == pta_size)
3805     error ("bad value (%s) for %stune=%s %s",
3806            ix86_tune_string, prefix, suffix, sw);
3807
3808   ix86_tune_mask = 1u << ix86_tune;
3809   for (i = 0; i < X86_TUNE_LAST; ++i)
3810     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3811
3812 #ifndef USE_IX86_FRAME_POINTER
3813 #define USE_IX86_FRAME_POINTER 0
3814 #endif
3815
3816 #ifndef USE_X86_64_FRAME_POINTER
3817 #define USE_X86_64_FRAME_POINTER 0
3818 #endif
3819
3820   /* Set the default values for switches whose default depends on TARGET_64BIT
3821      in case they weren't overwritten by command line options.  */
3822   if (TARGET_64BIT)
3823     {
3824       if (optimize > 1 && !global_options_set.x_flag_zee)
3825         flag_zee = 1;
3826       if (optimize >= 1 && !global_options_set.x_flag_omit_frame_pointer)
3827         flag_omit_frame_pointer = !USE_X86_64_FRAME_POINTER;
3828       if (flag_asynchronous_unwind_tables == 2)
3829         flag_unwind_tables = flag_asynchronous_unwind_tables = 1;
3830       if (flag_pcc_struct_return == 2)
3831         flag_pcc_struct_return = 0;
3832     }
3833   else
3834     {
3835       if (optimize >= 1 && !global_options_set.x_flag_omit_frame_pointer)
3836         flag_omit_frame_pointer = !(USE_IX86_FRAME_POINTER || optimize_size);
3837       if (flag_asynchronous_unwind_tables == 2)
3838         flag_asynchronous_unwind_tables = !USE_IX86_FRAME_POINTER;
3839       if (flag_pcc_struct_return == 2)
3840         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
3841     }
3842
3843   if (optimize_size)
3844     ix86_cost = &ix86_size_cost;
3845   else
3846     ix86_cost = processor_target_table[ix86_tune].cost;
3847
3848   /* Arrange to set up i386_stack_locals for all functions.  */
3849   init_machine_status = ix86_init_machine_status;
3850
3851   /* Validate -mregparm= value.  */
3852   if (global_options_set.x_ix86_regparm)
3853     {
3854       if (TARGET_64BIT)
3855         warning (0, "-mregparm is ignored in 64-bit mode");
3856       if (ix86_regparm > REGPARM_MAX)
3857         {
3858           error ("-mregparm=%d is not between 0 and %d",
3859                  ix86_regparm, REGPARM_MAX);
3860           ix86_regparm = 0;
3861         }
3862     }
3863   if (TARGET_64BIT)
3864     ix86_regparm = REGPARM_MAX;
3865
3866   /* Default align_* from the processor table.  */
3867   if (align_loops == 0)
3868     {
3869       align_loops = processor_target_table[ix86_tune].align_loop;
3870       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
3871     }
3872   if (align_jumps == 0)
3873     {
3874       align_jumps = processor_target_table[ix86_tune].align_jump;
3875       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
3876     }
3877   if (align_functions == 0)
3878     {
3879       align_functions = processor_target_table[ix86_tune].align_func;
3880     }
3881
3882   /* Provide default for -mbranch-cost= value.  */
3883   if (!global_options_set.x_ix86_branch_cost)
3884     ix86_branch_cost = ix86_cost->branch_cost;
3885
3886   if (TARGET_64BIT)
3887     {
3888       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3889
3890       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3891          explicitly disable any of these.  In particular, disabling SSE and
3892          MMX for kernel code is extremely useful.  */
3893       if (!ix86_arch_specified)
3894       ix86_isa_flags
3895         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3896              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3897
3898       if (TARGET_RTD)
3899         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3900     }
3901   else
3902     {
3903       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3904
3905       if (!ix86_arch_specified)
3906       ix86_isa_flags
3907         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3908
3909       /* i386 ABI does not specify red zone.  It still makes sense to use it
3910          when programmer takes care to stack from being destroyed.  */
3911       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3912         target_flags |= MASK_NO_RED_ZONE;
3913     }
3914
3915   /* Keep nonleaf frame pointers.  */
3916   if (flag_omit_frame_pointer)
3917     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
3918   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
3919     flag_omit_frame_pointer = 1;
3920
3921   /* If we're doing fast math, we don't care about comparison order
3922      wrt NaNs.  This lets us use a shorter comparison sequence.  */
3923   if (flag_finite_math_only)
3924     target_flags &= ~MASK_IEEE_FP;
3925
3926   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
3927      since the insns won't need emulation.  */
3928   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
3929     target_flags &= ~MASK_NO_FANCY_MATH_387;
3930
3931   /* Likewise, if the target doesn't have a 387, or we've specified
3932      software floating point, don't use 387 inline intrinsics.  */
3933   if (!TARGET_80387)
3934     target_flags |= MASK_NO_FANCY_MATH_387;
3935
3936   /* Turn on MMX builtins for -msse.  */
3937   if (TARGET_SSE)
3938     {
3939       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
3940       x86_prefetch_sse = true;
3941     }
3942
3943   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
3944   if (TARGET_SSE4_2 || TARGET_ABM)
3945     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
3946
3947   /* Validate -mpreferred-stack-boundary= value or default it to
3948      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
3949   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
3950   if (global_options_set.x_ix86_preferred_stack_boundary_arg)
3951     {
3952       int min = (TARGET_64BIT ? 4 : 2);
3953       int max = (TARGET_SEH ? 4 : 12);
3954
3955       if (ix86_preferred_stack_boundary_arg < min
3956           || ix86_preferred_stack_boundary_arg > max)
3957         {
3958           if (min == max)
3959             error ("-mpreferred-stack-boundary is not supported "
3960                    "for this target");
3961           else
3962             error ("-mpreferred-stack-boundary=%d is not between %d and %d",
3963                    ix86_preferred_stack_boundary_arg, min, max);
3964         }
3965       else
3966         ix86_preferred_stack_boundary
3967           = (1 << ix86_preferred_stack_boundary_arg) * BITS_PER_UNIT;
3968     }
3969
3970   /* Set the default value for -mstackrealign.  */
3971   if (ix86_force_align_arg_pointer == -1)
3972     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
3973
3974   ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
3975
3976   /* Validate -mincoming-stack-boundary= value or default it to
3977      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
3978   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
3979   if (global_options_set.x_ix86_incoming_stack_boundary_arg)
3980     {
3981       if (ix86_incoming_stack_boundary_arg < (TARGET_64BIT ? 4 : 2)
3982           || ix86_incoming_stack_boundary_arg > 12)
3983         error ("-mincoming-stack-boundary=%d is not between %d and 12",
3984                ix86_incoming_stack_boundary_arg, TARGET_64BIT ? 4 : 2);
3985       else
3986         {
3987           ix86_user_incoming_stack_boundary
3988             = (1 << ix86_incoming_stack_boundary_arg) * BITS_PER_UNIT;
3989           ix86_incoming_stack_boundary
3990             = ix86_user_incoming_stack_boundary;
3991         }
3992     }
3993
3994   /* Accept -msseregparm only if at least SSE support is enabled.  */
3995   if (TARGET_SSEREGPARM
3996       && ! TARGET_SSE)
3997     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
3998
3999   ix86_fpmath = TARGET_FPMATH_DEFAULT;
4000   if (ix86_fpmath_string != 0)
4001     {
4002       if (! strcmp (ix86_fpmath_string, "387"))
4003         ix86_fpmath = FPMATH_387;
4004       else if (! strcmp (ix86_fpmath_string, "sse"))
4005         {
4006           if (!TARGET_SSE)
4007             {
4008               warning (0, "SSE instruction set disabled, using 387 arithmetics");
4009               ix86_fpmath = FPMATH_387;
4010             }
4011           else
4012             ix86_fpmath = FPMATH_SSE;
4013         }
4014       else if (! strcmp (ix86_fpmath_string, "387,sse")
4015                || ! strcmp (ix86_fpmath_string, "387+sse")
4016                || ! strcmp (ix86_fpmath_string, "sse,387")
4017                || ! strcmp (ix86_fpmath_string, "sse+387")
4018                || ! strcmp (ix86_fpmath_string, "both"))
4019         {
4020           if (!TARGET_SSE)
4021             {
4022               warning (0, "SSE instruction set disabled, using 387 arithmetics");
4023               ix86_fpmath = FPMATH_387;
4024             }
4025           else if (!TARGET_80387)
4026             {
4027               warning (0, "387 instruction set disabled, using SSE arithmetics");
4028               ix86_fpmath = FPMATH_SSE;
4029             }
4030           else
4031             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
4032         }
4033       else
4034         error ("bad value (%s) for %sfpmath=%s %s",
4035                ix86_fpmath_string, prefix, suffix, sw);
4036     }
4037
4038   /* If the i387 is disabled, then do not return values in it. */
4039   if (!TARGET_80387)
4040     target_flags &= ~MASK_FLOAT_RETURNS;
4041
4042   /* Use external vectorized library in vectorizing intrinsics.  */
4043   if (global_options_set.x_ix86_veclibabi_type)
4044     switch (ix86_veclibabi_type)
4045       {
4046       case ix86_veclibabi_type_svml:
4047         ix86_veclib_handler = ix86_veclibabi_svml;
4048         break;
4049
4050       case ix86_veclibabi_type_acml:
4051         ix86_veclib_handler = ix86_veclibabi_acml;
4052         break;
4053
4054       default:
4055         gcc_unreachable ();
4056       }
4057
4058   if ((!USE_IX86_FRAME_POINTER
4059        || (x86_accumulate_outgoing_args & ix86_tune_mask))
4060       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
4061       && !optimize_size)
4062     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
4063
4064   /* ??? Unwind info is not correct around the CFG unless either a frame
4065      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
4066      unwind info generation to be aware of the CFG and propagating states
4067      around edges.  */
4068   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
4069        || flag_exceptions || flag_non_call_exceptions)
4070       && flag_omit_frame_pointer
4071       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
4072     {
4073       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
4074         warning (0, "unwind tables currently require either a frame pointer "
4075                  "or %saccumulate-outgoing-args%s for correctness",
4076                  prefix, suffix);
4077       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
4078     }
4079
4080   /* If stack probes are required, the space used for large function
4081      arguments on the stack must also be probed, so enable
4082      -maccumulate-outgoing-args so this happens in the prologue.  */
4083   if (TARGET_STACK_PROBE
4084       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
4085     {
4086       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
4087         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
4088                  "for correctness", prefix, suffix);
4089       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
4090     }
4091
4092   /* For sane SSE instruction set generation we need fcomi instruction.
4093      It is safe to enable all CMOVE instructions.  */
4094   if (TARGET_SSE)
4095     TARGET_CMOVE = 1;
4096
4097   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
4098   {
4099     char *p;
4100     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
4101     p = strchr (internal_label_prefix, 'X');
4102     internal_label_prefix_len = p - internal_label_prefix;
4103     *p = '\0';
4104   }
4105
4106   /* When scheduling description is not available, disable scheduler pass
4107      so it won't slow down the compilation and make x87 code slower.  */
4108   if (!TARGET_SCHEDULE)
4109     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
4110
4111   maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
4112                          ix86_cost->simultaneous_prefetches,
4113                          global_options.x_param_values,
4114                          global_options_set.x_param_values);
4115   maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE, ix86_cost->prefetch_block,
4116                          global_options.x_param_values,
4117                          global_options_set.x_param_values);
4118   maybe_set_param_value (PARAM_L1_CACHE_SIZE, ix86_cost->l1_cache_size,
4119                          global_options.x_param_values,
4120                          global_options_set.x_param_values);
4121   maybe_set_param_value (PARAM_L2_CACHE_SIZE, ix86_cost->l2_cache_size,
4122                          global_options.x_param_values,
4123                          global_options_set.x_param_values);
4124
4125   /* Enable sw prefetching at -O3 for CPUS that prefetching is helpful.  */
4126   if (flag_prefetch_loop_arrays < 0
4127       && HAVE_prefetch
4128       && optimize >= 3
4129       && TARGET_SOFTWARE_PREFETCHING_BENEFICIAL)
4130     flag_prefetch_loop_arrays = 1;
4131
4132   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
4133      can be optimized to ap = __builtin_next_arg (0).  */
4134   if (!TARGET_64BIT && !flag_split_stack)
4135     targetm.expand_builtin_va_start = NULL;
4136
4137   if (TARGET_64BIT)
4138     {
4139       ix86_gen_leave = gen_leave_rex64;
4140       ix86_gen_add3 = gen_adddi3;
4141       ix86_gen_sub3 = gen_subdi3;
4142       ix86_gen_sub3_carry = gen_subdi3_carry;
4143       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
4144       ix86_gen_monitor = gen_sse3_monitor64;
4145       ix86_gen_andsp = gen_anddi3;
4146       ix86_gen_allocate_stack_worker = gen_allocate_stack_worker_probe_di;
4147       ix86_gen_adjust_stack_and_probe = gen_adjust_stack_and_probedi;
4148       ix86_gen_probe_stack_range = gen_probe_stack_rangedi;
4149     }
4150   else
4151     {
4152       ix86_gen_leave = gen_leave;
4153       ix86_gen_add3 = gen_addsi3;
4154       ix86_gen_sub3 = gen_subsi3;
4155       ix86_gen_sub3_carry = gen_subsi3_carry;
4156       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
4157       ix86_gen_monitor = gen_sse3_monitor;
4158       ix86_gen_andsp = gen_andsi3;
4159       ix86_gen_allocate_stack_worker = gen_allocate_stack_worker_probe_si;
4160       ix86_gen_adjust_stack_and_probe = gen_adjust_stack_and_probesi;
4161       ix86_gen_probe_stack_range = gen_probe_stack_rangesi;
4162     }
4163
4164 #ifdef USE_IX86_CLD
4165   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
4166   if (!TARGET_64BIT)
4167     target_flags |= MASK_CLD & ~target_flags_explicit;
4168 #endif
4169
4170   if (!TARGET_64BIT && flag_pic)
4171     {
4172       if (flag_fentry > 0)
4173         sorry ("-mfentry isn%'t supported for 32-bit in combination "
4174                "with -fpic");
4175       flag_fentry = 0;
4176     }
4177   else if (TARGET_SEH)
4178     {
4179       if (flag_fentry == 0)
4180         sorry ("-mno-fentry isn%'t compatible with SEH");
4181       flag_fentry = 1;
4182     }
4183   else if (flag_fentry < 0)
4184    {
4185 #if defined(PROFILE_BEFORE_PROLOGUE)
4186      flag_fentry = 1;
4187 #else
4188      flag_fentry = 0;
4189 #endif
4190    }
4191
4192   /* Save the initial options in case the user does function specific options */
4193   if (main_args_p)
4194     target_option_default_node = target_option_current_node
4195       = build_target_option_node ();
4196
4197   if (TARGET_AVX)
4198     {
4199       /* When not optimize for size, enable vzeroupper optimization for
4200          TARGET_AVX with -fexpensive-optimizations and split 32-byte
4201          AVX unaligned load/store.  */
4202       if (!optimize_size)
4203         {
4204           if (flag_expensive_optimizations
4205               && !(target_flags_explicit & MASK_VZEROUPPER))
4206             target_flags |= MASK_VZEROUPPER;
4207           if (!(target_flags_explicit & MASK_AVX256_SPLIT_UNALIGNED_LOAD))
4208             target_flags |= MASK_AVX256_SPLIT_UNALIGNED_LOAD;
4209           if (!(target_flags_explicit & MASK_AVX256_SPLIT_UNALIGNED_STORE))
4210             target_flags |= MASK_AVX256_SPLIT_UNALIGNED_STORE;
4211         }
4212     }
4213   else 
4214     {
4215       /* Disable vzeroupper pass if TARGET_AVX is disabled.  */
4216       target_flags &= ~MASK_VZEROUPPER;
4217     }
4218 }
4219
4220 /* Return TRUE if VAL is passed in register with 256bit AVX modes.  */
4221
4222 static bool
4223 function_pass_avx256_p (const_rtx val)
4224 {
4225   if (!val)
4226     return false;
4227
4228   if (REG_P (val) && VALID_AVX256_REG_MODE (GET_MODE (val)))
4229     return true;
4230
4231   if (GET_CODE (val) == PARALLEL)
4232     {
4233       int i;
4234       rtx r;
4235
4236       for (i = XVECLEN (val, 0) - 1; i >= 0; i--)
4237         {
4238           r = XVECEXP (val, 0, i);
4239           if (GET_CODE (r) == EXPR_LIST
4240               && XEXP (r, 0)
4241               && REG_P (XEXP (r, 0))
4242               && (GET_MODE (XEXP (r, 0)) == OImode
4243                   || VALID_AVX256_REG_MODE (GET_MODE (XEXP (r, 0)))))
4244             return true;
4245         }
4246     }
4247
4248   return false;
4249 }
4250
4251 /* Implement the TARGET_OPTION_OVERRIDE hook.  */
4252
4253 static void
4254 ix86_option_override (void)
4255 {
4256   ix86_option_override_internal (true);
4257 }
4258
4259 /* Update register usage after having seen the compiler flags.  */
4260
4261 static void
4262 ix86_conditional_register_usage (void)
4263 {
4264   int i;
4265   unsigned int j;
4266
4267   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4268     {
4269       if (fixed_regs[i] > 1)
4270         fixed_regs[i] = (fixed_regs[i] == (TARGET_64BIT ? 3 : 2));
4271       if (call_used_regs[i] > 1)
4272         call_used_regs[i] = (call_used_regs[i] == (TARGET_64BIT ? 3 : 2));
4273     }
4274
4275   /* The PIC register, if it exists, is fixed.  */
4276   j = PIC_OFFSET_TABLE_REGNUM;
4277   if (j != INVALID_REGNUM)
4278     fixed_regs[j] = call_used_regs[j] = 1;
4279
4280   /* The 64-bit MS_ABI changes the set of call-used registers.  */
4281   if (TARGET_64BIT_MS_ABI)
4282     {
4283       call_used_regs[SI_REG] = 0;
4284       call_used_regs[DI_REG] = 0;
4285       call_used_regs[XMM6_REG] = 0;
4286       call_used_regs[XMM7_REG] = 0;
4287       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
4288         call_used_regs[i] = 0;
4289     }
4290
4291   /* The default setting of CLOBBERED_REGS is for 32-bit; add in the
4292      other call-clobbered regs for 64-bit.  */
4293   if (TARGET_64BIT)
4294     {
4295       CLEAR_HARD_REG_SET (reg_class_contents[(int)CLOBBERED_REGS]);
4296
4297       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4298         if (TEST_HARD_REG_BIT (reg_class_contents[(int)GENERAL_REGS], i)
4299             && call_used_regs[i])
4300           SET_HARD_REG_BIT (reg_class_contents[(int)CLOBBERED_REGS], i);
4301     }
4302
4303   /* If MMX is disabled, squash the registers.  */
4304   if (! TARGET_MMX)
4305     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4306       if (TEST_HARD_REG_BIT (reg_class_contents[(int)MMX_REGS], i))
4307         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
4308
4309   /* If SSE is disabled, squash the registers.  */
4310   if (! TARGET_SSE)
4311     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4312       if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i))
4313         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
4314
4315   /* If the FPU is disabled, squash the registers.  */
4316   if (! (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387))
4317     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4318       if (TEST_HARD_REG_BIT (reg_class_contents[(int)FLOAT_REGS], i))
4319         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
4320
4321   /* If 32-bit, squash the 64-bit registers.  */
4322   if (! TARGET_64BIT)
4323     {
4324       for (i = FIRST_REX_INT_REG; i <= LAST_REX_INT_REG; i++)
4325         reg_names[i] = "";
4326       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
4327         reg_names[i] = "";
4328     }
4329 }
4330
4331 \f
4332 /* Save the current options */
4333
4334 static void
4335 ix86_function_specific_save (struct cl_target_option *ptr)
4336 {
4337   ptr->arch = ix86_arch;
4338   ptr->schedule = ix86_schedule;
4339   ptr->tune = ix86_tune;
4340   ptr->fpmath = ix86_fpmath;
4341   ptr->branch_cost = ix86_branch_cost;
4342   ptr->tune_defaulted = ix86_tune_defaulted;
4343   ptr->arch_specified = ix86_arch_specified;
4344   ptr->x_ix86_isa_flags_explicit = ix86_isa_flags_explicit;
4345   ptr->ix86_target_flags_explicit = target_flags_explicit;
4346
4347   /* The fields are char but the variables are not; make sure the
4348      values fit in the fields.  */
4349   gcc_assert (ptr->arch == ix86_arch);
4350   gcc_assert (ptr->schedule == ix86_schedule);
4351   gcc_assert (ptr->tune == ix86_tune);
4352   gcc_assert (ptr->fpmath == ix86_fpmath);
4353   gcc_assert (ptr->branch_cost == ix86_branch_cost);
4354 }
4355
4356 /* Restore the current options */
4357
4358 static void
4359 ix86_function_specific_restore (struct cl_target_option *ptr)
4360 {
4361   enum processor_type old_tune = ix86_tune;
4362   enum processor_type old_arch = ix86_arch;
4363   unsigned int ix86_arch_mask, ix86_tune_mask;
4364   int i;
4365
4366   ix86_arch = (enum processor_type) ptr->arch;
4367   ix86_schedule = (enum attr_cpu) ptr->schedule;
4368   ix86_tune = (enum processor_type) ptr->tune;
4369   ix86_fpmath = (enum fpmath_unit) ptr->fpmath;
4370   ix86_branch_cost = ptr->branch_cost;
4371   ix86_tune_defaulted = ptr->tune_defaulted;
4372   ix86_arch_specified = ptr->arch_specified;
4373   ix86_isa_flags_explicit = ptr->x_ix86_isa_flags_explicit;
4374   target_flags_explicit = ptr->ix86_target_flags_explicit;
4375
4376   /* Recreate the arch feature tests if the arch changed */
4377   if (old_arch != ix86_arch)
4378     {
4379       ix86_arch_mask = 1u << ix86_arch;
4380       for (i = 0; i < X86_ARCH_LAST; ++i)
4381         ix86_arch_features[i]
4382           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
4383     }
4384
4385   /* Recreate the tune optimization tests */
4386   if (old_tune != ix86_tune)
4387     {
4388       ix86_tune_mask = 1u << ix86_tune;
4389       for (i = 0; i < X86_TUNE_LAST; ++i)
4390         ix86_tune_features[i]
4391           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
4392     }
4393 }
4394
4395 /* Print the current options */
4396
4397 static void
4398 ix86_function_specific_print (FILE *file, int indent,
4399                               struct cl_target_option *ptr)
4400 {
4401   char *target_string
4402     = ix86_target_string (ptr->x_ix86_isa_flags, ptr->x_target_flags,
4403                           NULL, NULL, NULL, false);
4404
4405   fprintf (file, "%*sarch = %d (%s)\n",
4406            indent, "",
4407            ptr->arch,
4408            ((ptr->arch < TARGET_CPU_DEFAULT_max)
4409             ? cpu_names[ptr->arch]
4410             : "<unknown>"));
4411
4412   fprintf (file, "%*stune = %d (%s)\n",
4413            indent, "",
4414            ptr->tune,
4415            ((ptr->tune < TARGET_CPU_DEFAULT_max)
4416             ? cpu_names[ptr->tune]
4417             : "<unknown>"));
4418
4419   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
4420            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
4421            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
4422   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
4423
4424   if (target_string)
4425     {
4426       fprintf (file, "%*s%s\n", indent, "", target_string);
4427       free (target_string);
4428     }
4429 }
4430
4431 \f
4432 /* Inner function to process the attribute((target(...))), take an argument and
4433    set the current options from the argument. If we have a list, recursively go
4434    over the list.  */
4435
4436 static bool
4437 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
4438 {
4439   char *next_optstr;
4440   bool ret = true;
4441
4442 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
4443 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
4444 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
4445 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
4446
4447   enum ix86_opt_type
4448   {
4449     ix86_opt_unknown,
4450     ix86_opt_yes,
4451     ix86_opt_no,
4452     ix86_opt_str,
4453     ix86_opt_isa
4454   };
4455
4456   static const struct
4457   {
4458     const char *string;
4459     size_t len;
4460     enum ix86_opt_type type;
4461     int opt;
4462     int mask;
4463   } attrs[] = {
4464     /* isa options */
4465     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
4466     IX86_ATTR_ISA ("abm",       OPT_mabm),
4467     IX86_ATTR_ISA ("bmi",       OPT_mbmi),
4468     IX86_ATTR_ISA ("tbm",       OPT_mtbm),
4469     IX86_ATTR_ISA ("aes",       OPT_maes),
4470     IX86_ATTR_ISA ("avx",       OPT_mavx),
4471     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
4472     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
4473     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
4474     IX86_ATTR_ISA ("sse",       OPT_msse),
4475     IX86_ATTR_ISA ("sse2",      OPT_msse2),
4476     IX86_ATTR_ISA ("sse3",      OPT_msse3),
4477     IX86_ATTR_ISA ("sse4",      OPT_msse4),
4478     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
4479     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
4480     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
4481     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
4482     IX86_ATTR_ISA ("fma4",      OPT_mfma4),
4483     IX86_ATTR_ISA ("xop",       OPT_mxop),
4484     IX86_ATTR_ISA ("lwp",       OPT_mlwp),
4485     IX86_ATTR_ISA ("fsgsbase",  OPT_mfsgsbase),
4486     IX86_ATTR_ISA ("rdrnd",     OPT_mrdrnd),
4487     IX86_ATTR_ISA ("f16c",      OPT_mf16c),
4488
4489     /* string options */
4490     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
4491     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
4492     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
4493
4494     /* flag options */
4495     IX86_ATTR_YES ("cld",
4496                    OPT_mcld,
4497                    MASK_CLD),
4498
4499     IX86_ATTR_NO ("fancy-math-387",
4500                   OPT_mfancy_math_387,
4501                   MASK_NO_FANCY_MATH_387),
4502
4503     IX86_ATTR_YES ("ieee-fp",
4504                    OPT_mieee_fp,
4505                    MASK_IEEE_FP),
4506
4507     IX86_ATTR_YES ("inline-all-stringops",
4508                    OPT_minline_all_stringops,
4509                    MASK_INLINE_ALL_STRINGOPS),
4510
4511     IX86_ATTR_YES ("inline-stringops-dynamically",
4512                    OPT_minline_stringops_dynamically,
4513                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
4514
4515     IX86_ATTR_NO ("align-stringops",
4516                   OPT_mno_align_stringops,
4517                   MASK_NO_ALIGN_STRINGOPS),
4518
4519     IX86_ATTR_YES ("recip",
4520                    OPT_mrecip,
4521                    MASK_RECIP),
4522
4523   };
4524
4525   /* If this is a list, recurse to get the options.  */
4526   if (TREE_CODE (args) == TREE_LIST)
4527     {
4528       bool ret = true;
4529
4530       for (; args; args = TREE_CHAIN (args))
4531         if (TREE_VALUE (args)
4532             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
4533           ret = false;
4534
4535       return ret;
4536     }
4537
4538   else if (TREE_CODE (args) != STRING_CST)
4539     gcc_unreachable ();
4540
4541   /* Handle multiple arguments separated by commas.  */
4542   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
4543
4544   while (next_optstr && *next_optstr != '\0')
4545     {
4546       char *p = next_optstr;
4547       char *orig_p = p;
4548       char *comma = strchr (next_optstr, ',');
4549       const char *opt_string;
4550       size_t len, opt_len;
4551       int opt;
4552       bool opt_set_p;
4553       char ch;
4554       unsigned i;
4555       enum ix86_opt_type type = ix86_opt_unknown;
4556       int mask = 0;
4557
4558       if (comma)
4559         {
4560           *comma = '\0';
4561           len = comma - next_optstr;
4562           next_optstr = comma + 1;
4563         }
4564       else
4565         {
4566           len = strlen (p);
4567           next_optstr = NULL;
4568         }
4569
4570       /* Recognize no-xxx.  */
4571       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
4572         {
4573           opt_set_p = false;
4574           p += 3;
4575           len -= 3;
4576         }
4577       else
4578         opt_set_p = true;
4579
4580       /* Find the option.  */
4581       ch = *p;
4582       opt = N_OPTS;
4583       for (i = 0; i < ARRAY_SIZE (attrs); i++)
4584         {
4585           type = attrs[i].type;
4586           opt_len = attrs[i].len;
4587           if (ch == attrs[i].string[0]
4588               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
4589               && memcmp (p, attrs[i].string, opt_len) == 0)
4590             {
4591               opt = attrs[i].opt;
4592               mask = attrs[i].mask;
4593               opt_string = attrs[i].string;
4594               break;
4595             }
4596         }
4597
4598       /* Process the option.  */
4599       if (opt == N_OPTS)
4600         {
4601           error ("attribute(target(\"%s\")) is unknown", orig_p);
4602           ret = false;
4603         }
4604
4605       else if (type == ix86_opt_isa)
4606         {
4607           struct cl_decoded_option decoded;
4608
4609           generate_option (opt, NULL, opt_set_p, CL_TARGET, &decoded);
4610           ix86_handle_option (&global_options, &global_options_set,
4611                               &decoded, input_location);
4612         }
4613
4614       else if (type == ix86_opt_yes || type == ix86_opt_no)
4615         {
4616           if (type == ix86_opt_no)
4617             opt_set_p = !opt_set_p;
4618
4619           if (opt_set_p)
4620             target_flags |= mask;
4621           else
4622             target_flags &= ~mask;
4623         }
4624
4625       else if (type == ix86_opt_str)
4626         {
4627           if (p_strings[opt])
4628             {
4629               error ("option(\"%s\") was already specified", opt_string);
4630               ret = false;
4631             }
4632           else
4633             p_strings[opt] = xstrdup (p + opt_len);
4634         }
4635
4636       else
4637         gcc_unreachable ();
4638     }
4639
4640   return ret;
4641 }
4642
4643 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
4644
4645 tree
4646 ix86_valid_target_attribute_tree (tree args)
4647 {
4648   const char *orig_arch_string = ix86_arch_string;
4649   const char *orig_tune_string = ix86_tune_string;
4650   const char *orig_fpmath_string = ix86_fpmath_string;
4651   int orig_tune_defaulted = ix86_tune_defaulted;
4652   int orig_arch_specified = ix86_arch_specified;
4653   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
4654   tree t = NULL_TREE;
4655   int i;
4656   struct cl_target_option *def
4657     = TREE_TARGET_OPTION (target_option_default_node);
4658
4659   /* Process each of the options on the chain.  */
4660   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
4661     return NULL_TREE;
4662
4663   /* If the changed options are different from the default, rerun
4664      ix86_option_override_internal, and then save the options away.
4665      The string options are are attribute options, and will be undone
4666      when we copy the save structure.  */
4667   if (ix86_isa_flags != def->x_ix86_isa_flags
4668       || target_flags != def->x_target_flags
4669       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
4670       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
4671       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
4672     {
4673       /* If we are using the default tune= or arch=, undo the string assigned,
4674          and use the default.  */
4675       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
4676         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
4677       else if (!orig_arch_specified)
4678         ix86_arch_string = NULL;
4679
4680       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
4681         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
4682       else if (orig_tune_defaulted)
4683         ix86_tune_string = NULL;
4684
4685       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
4686       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
4687         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
4688       else if (!TARGET_64BIT && TARGET_SSE)
4689         ix86_fpmath_string = "sse,387";
4690
4691       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
4692       ix86_option_override_internal (false);
4693
4694       /* Add any builtin functions with the new isa if any.  */
4695       ix86_add_new_builtins (ix86_isa_flags);
4696
4697       /* Save the current options unless we are validating options for
4698          #pragma.  */
4699       t = build_target_option_node ();
4700
4701       ix86_arch_string = orig_arch_string;
4702       ix86_tune_string = orig_tune_string;
4703       ix86_fpmath_string = orig_fpmath_string;
4704
4705       /* Free up memory allocated to hold the strings */
4706       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
4707         free (option_strings[i]);
4708     }
4709
4710   return t;
4711 }
4712
4713 /* Hook to validate attribute((target("string"))).  */
4714
4715 static bool
4716 ix86_valid_target_attribute_p (tree fndecl,
4717                                tree ARG_UNUSED (name),
4718                                tree args,
4719                                int ARG_UNUSED (flags))
4720 {
4721   struct cl_target_option cur_target;
4722   bool ret = true;
4723   tree old_optimize = build_optimization_node ();
4724   tree new_target, new_optimize;
4725   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
4726
4727   /* If the function changed the optimization levels as well as setting target
4728      options, start with the optimizations specified.  */
4729   if (func_optimize && func_optimize != old_optimize)
4730     cl_optimization_restore (&global_options,
4731                              TREE_OPTIMIZATION (func_optimize));
4732
4733   /* The target attributes may also change some optimization flags, so update
4734      the optimization options if necessary.  */
4735   cl_target_option_save (&cur_target, &global_options);
4736   new_target = ix86_valid_target_attribute_tree (args);
4737   new_optimize = build_optimization_node ();
4738
4739   if (!new_target)
4740     ret = false;
4741
4742   else if (fndecl)
4743     {
4744       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
4745
4746       if (old_optimize != new_optimize)
4747         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
4748     }
4749
4750   cl_target_option_restore (&global_options, &cur_target);
4751
4752   if (old_optimize != new_optimize)
4753     cl_optimization_restore (&global_options,
4754                              TREE_OPTIMIZATION (old_optimize));
4755
4756   return ret;
4757 }
4758
4759 \f
4760 /* Hook to determine if one function can safely inline another.  */
4761
4762 static bool
4763 ix86_can_inline_p (tree caller, tree callee)
4764 {
4765   bool ret = false;
4766   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
4767   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
4768
4769   /* If callee has no option attributes, then it is ok to inline.  */
4770   if (!callee_tree)
4771     ret = true;
4772
4773   /* If caller has no option attributes, but callee does then it is not ok to
4774      inline.  */
4775   else if (!caller_tree)
4776     ret = false;
4777
4778   else
4779     {
4780       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
4781       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
4782
4783       /* Callee's isa options should a subset of the caller's, i.e. a SSE4 function
4784          can inline a SSE2 function but a SSE2 function can't inline a SSE4
4785          function.  */
4786       if ((caller_opts->x_ix86_isa_flags & callee_opts->x_ix86_isa_flags)
4787           != callee_opts->x_ix86_isa_flags)
4788         ret = false;
4789
4790       /* See if we have the same non-isa options.  */
4791       else if (caller_opts->x_target_flags != callee_opts->x_target_flags)
4792         ret = false;
4793
4794       /* See if arch, tune, etc. are the same.  */
4795       else if (caller_opts->arch != callee_opts->arch)
4796         ret = false;
4797
4798       else if (caller_opts->tune != callee_opts->tune)
4799         ret = false;
4800
4801       else if (caller_opts->fpmath != callee_opts->fpmath)
4802         ret = false;
4803
4804       else if (caller_opts->branch_cost != callee_opts->branch_cost)
4805         ret = false;
4806
4807       else
4808         ret = true;
4809     }
4810
4811   return ret;
4812 }
4813
4814 \f
4815 /* Remember the last target of ix86_set_current_function.  */
4816 static GTY(()) tree ix86_previous_fndecl;
4817
4818 /* Establish appropriate back-end context for processing the function
4819    FNDECL.  The argument might be NULL to indicate processing at top
4820    level, outside of any function scope.  */
4821 static void
4822 ix86_set_current_function (tree fndecl)
4823 {
4824   /* Only change the context if the function changes.  This hook is called
4825      several times in the course of compiling a function, and we don't want to
4826      slow things down too much or call target_reinit when it isn't safe.  */
4827   if (fndecl && fndecl != ix86_previous_fndecl)
4828     {
4829       tree old_tree = (ix86_previous_fndecl
4830                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
4831                        : NULL_TREE);
4832
4833       tree new_tree = (fndecl
4834                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
4835                        : NULL_TREE);
4836
4837       ix86_previous_fndecl = fndecl;
4838       if (old_tree == new_tree)
4839         ;
4840
4841       else if (new_tree)
4842         {
4843           cl_target_option_restore (&global_options,
4844                                     TREE_TARGET_OPTION (new_tree));
4845           target_reinit ();
4846         }
4847
4848       else if (old_tree)
4849         {
4850           struct cl_target_option *def
4851             = TREE_TARGET_OPTION (target_option_current_node);
4852
4853           cl_target_option_restore (&global_options, def);
4854           target_reinit ();
4855         }
4856     }
4857 }
4858
4859 \f
4860 /* Return true if this goes in large data/bss.  */
4861
4862 static bool
4863 ix86_in_large_data_p (tree exp)
4864 {
4865   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
4866     return false;
4867
4868   /* Functions are never large data.  */
4869   if (TREE_CODE (exp) == FUNCTION_DECL)
4870     return false;
4871
4872   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
4873     {
4874       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
4875       if (strcmp (section, ".ldata") == 0
4876           || strcmp (section, ".lbss") == 0)
4877         return true;
4878       return false;
4879     }
4880   else
4881     {
4882       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
4883
4884       /* If this is an incomplete type with size 0, then we can't put it
4885          in data because it might be too big when completed.  */
4886       if (!size || size > ix86_section_threshold)
4887         return true;
4888     }
4889
4890   return false;
4891 }
4892
4893 /* Switch to the appropriate section for output of DECL.
4894    DECL is either a `VAR_DECL' node or a constant of some sort.
4895    RELOC indicates whether forming the initial value of DECL requires
4896    link-time relocations.  */
4897
4898 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
4899         ATTRIBUTE_UNUSED;
4900
4901 static section *
4902 x86_64_elf_select_section (tree decl, int reloc,
4903                            unsigned HOST_WIDE_INT align)
4904 {
4905   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4906       && ix86_in_large_data_p (decl))
4907     {
4908       const char *sname = NULL;
4909       unsigned int flags = SECTION_WRITE;
4910       switch (categorize_decl_for_section (decl, reloc))
4911         {
4912         case SECCAT_DATA:
4913           sname = ".ldata";
4914           break;
4915         case SECCAT_DATA_REL:
4916           sname = ".ldata.rel";
4917           break;
4918         case SECCAT_DATA_REL_LOCAL:
4919           sname = ".ldata.rel.local";
4920           break;
4921         case SECCAT_DATA_REL_RO:
4922           sname = ".ldata.rel.ro";
4923           break;
4924         case SECCAT_DATA_REL_RO_LOCAL:
4925           sname = ".ldata.rel.ro.local";
4926           break;
4927         case SECCAT_BSS:
4928           sname = ".lbss";
4929           flags |= SECTION_BSS;
4930           break;
4931         case SECCAT_RODATA:
4932         case SECCAT_RODATA_MERGE_STR:
4933         case SECCAT_RODATA_MERGE_STR_INIT:
4934         case SECCAT_RODATA_MERGE_CONST:
4935           sname = ".lrodata";
4936           flags = 0;
4937           break;
4938         case SECCAT_SRODATA:
4939         case SECCAT_SDATA:
4940         case SECCAT_SBSS:
4941           gcc_unreachable ();
4942         case SECCAT_TEXT:
4943         case SECCAT_TDATA:
4944         case SECCAT_TBSS:
4945           /* We don't split these for medium model.  Place them into
4946              default sections and hope for best.  */
4947           break;
4948         }
4949       if (sname)
4950         {
4951           /* We might get called with string constants, but get_named_section
4952              doesn't like them as they are not DECLs.  Also, we need to set
4953              flags in that case.  */
4954           if (!DECL_P (decl))
4955             return get_section (sname, flags, NULL);
4956           return get_named_section (decl, sname, reloc);
4957         }
4958     }
4959   return default_elf_select_section (decl, reloc, align);
4960 }
4961
4962 /* Build up a unique section name, expressed as a
4963    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
4964    RELOC indicates whether the initial value of EXP requires
4965    link-time relocations.  */
4966
4967 static void ATTRIBUTE_UNUSED
4968 x86_64_elf_unique_section (tree decl, int reloc)
4969 {
4970   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4971       && ix86_in_large_data_p (decl))
4972     {
4973       const char *prefix = NULL;
4974       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
4975       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
4976
4977       switch (categorize_decl_for_section (decl, reloc))
4978         {
4979         case SECCAT_DATA:
4980         case SECCAT_DATA_REL:
4981         case SECCAT_DATA_REL_LOCAL:
4982         case SECCAT_DATA_REL_RO:
4983         case SECCAT_DATA_REL_RO_LOCAL:
4984           prefix = one_only ? ".ld" : ".ldata";
4985           break;
4986         case SECCAT_BSS:
4987           prefix = one_only ? ".lb" : ".lbss";
4988           break;
4989         case SECCAT_RODATA:
4990         case SECCAT_RODATA_MERGE_STR:
4991         case SECCAT_RODATA_MERGE_STR_INIT:
4992         case SECCAT_RODATA_MERGE_CONST:
4993           prefix = one_only ? ".lr" : ".lrodata";
4994           break;
4995         case SECCAT_SRODATA:
4996         case SECCAT_SDATA:
4997         case SECCAT_SBSS:
4998           gcc_unreachable ();
4999         case SECCAT_TEXT:
5000         case SECCAT_TDATA:
5001         case SECCAT_TBSS:
5002           /* We don't split these for medium model.  Place them into
5003              default sections and hope for best.  */
5004           break;
5005         }
5006       if (prefix)
5007         {
5008           const char *name, *linkonce;
5009           char *string;
5010
5011           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5012           name = targetm.strip_name_encoding (name);
5013
5014           /* If we're using one_only, then there needs to be a .gnu.linkonce
5015              prefix to the section name.  */
5016           linkonce = one_only ? ".gnu.linkonce" : "";
5017
5018           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
5019
5020           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
5021           return;
5022         }
5023     }
5024   default_unique_section (decl, reloc);
5025 }
5026
5027 #ifdef COMMON_ASM_OP
5028 /* This says how to output assembler code to declare an
5029    uninitialized external linkage data object.
5030
5031    For medium model x86-64 we need to use .largecomm opcode for
5032    large objects.  */
5033 void
5034 x86_elf_aligned_common (FILE *file,
5035                         const char *name, unsigned HOST_WIDE_INT size,
5036                         int align)
5037 {
5038   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5039       && size > (unsigned int)ix86_section_threshold)
5040     fputs (".largecomm\t", file);
5041   else
5042     fputs (COMMON_ASM_OP, file);
5043   assemble_name (file, name);
5044   fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
5045            size, align / BITS_PER_UNIT);
5046 }
5047 #endif
5048
5049 /* Utility function for targets to use in implementing
5050    ASM_OUTPUT_ALIGNED_BSS.  */
5051
5052 void
5053 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
5054                         const char *name, unsigned HOST_WIDE_INT size,
5055                         int align)
5056 {
5057   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5058       && size > (unsigned int)ix86_section_threshold)
5059     switch_to_section (get_named_section (decl, ".lbss", 0));
5060   else
5061     switch_to_section (bss_section);
5062   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
5063 #ifdef ASM_DECLARE_OBJECT_NAME
5064   last_assemble_variable_decl = decl;
5065   ASM_DECLARE_OBJECT_NAME (file, name, decl);
5066 #else
5067   /* Standard thing is just output label for the object.  */
5068   ASM_OUTPUT_LABEL (file, name);
5069 #endif /* ASM_DECLARE_OBJECT_NAME */
5070   ASM_OUTPUT_SKIP (file, size ? size : 1);
5071 }
5072 \f
5073 static const struct default_options ix86_option_optimization_table[] =
5074   {
5075     /* Turn off -fschedule-insns by default.  It tends to make the
5076        problem with not enough registers even worse.  */
5077 #ifdef INSN_SCHEDULING
5078     { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
5079 #endif
5080
5081 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
5082     SUBTARGET_OPTIMIZATION_OPTIONS,
5083 #endif
5084     { OPT_LEVELS_NONE, 0, NULL, 0 }
5085   };
5086
5087 /* Implement TARGET_OPTION_INIT_STRUCT.  */
5088
5089 static void
5090 ix86_option_init_struct (struct gcc_options *opts)
5091 {
5092   if (TARGET_MACHO)
5093     /* The Darwin libraries never set errno, so we might as well
5094        avoid calling them when that's the only reason we would.  */
5095     opts->x_flag_errno_math = 0;
5096
5097   opts->x_flag_pcc_struct_return = 2;
5098   opts->x_flag_asynchronous_unwind_tables = 2;
5099   opts->x_flag_vect_cost_model = 1;
5100 }
5101
5102 /* Decide whether we must probe the stack before any space allocation
5103    on this target.  It's essentially TARGET_STACK_PROBE except when
5104    -fstack-check causes the stack to be already probed differently.  */
5105
5106 bool
5107 ix86_target_stack_probe (void)
5108 {
5109   /* Do not probe the stack twice if static stack checking is enabled.  */
5110   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5111     return false;
5112
5113   return TARGET_STACK_PROBE;
5114 }
5115 \f
5116 /* Decide whether we can make a sibling call to a function.  DECL is the
5117    declaration of the function being targeted by the call and EXP is the
5118    CALL_EXPR representing the call.  */
5119
5120 static bool
5121 ix86_function_ok_for_sibcall (tree decl, tree exp)
5122 {
5123   tree type, decl_or_type;
5124   rtx a, b;
5125
5126   /* If we are generating position-independent code, we cannot sibcall
5127      optimize any indirect call, or a direct call to a global function,
5128      as the PLT requires %ebx be live. (Darwin does not have a PLT.)  */
5129   if (!TARGET_MACHO
5130       && !TARGET_64BIT 
5131       && flag_pic 
5132       && (!decl || !targetm.binds_local_p (decl)))
5133     return false;
5134
5135   /* If we need to align the outgoing stack, then sibcalling would
5136      unalign the stack, which may break the called function.  */
5137   if (ix86_minimum_incoming_stack_boundary (true)
5138       < PREFERRED_STACK_BOUNDARY)
5139     return false;
5140
5141   if (decl)
5142     {
5143       decl_or_type = decl;
5144       type = TREE_TYPE (decl);
5145     }
5146   else
5147     {
5148       /* We're looking at the CALL_EXPR, we need the type of the function.  */
5149       type = CALL_EXPR_FN (exp);                /* pointer expression */
5150       type = TREE_TYPE (type);                  /* pointer type */
5151       type = TREE_TYPE (type);                  /* function type */
5152       decl_or_type = type;
5153     }
5154
5155   /* Check that the return value locations are the same.  Like
5156      if we are returning floats on the 80387 register stack, we cannot
5157      make a sibcall from a function that doesn't return a float to a
5158      function that does or, conversely, from a function that does return
5159      a float to a function that doesn't; the necessary stack adjustment
5160      would not be executed.  This is also the place we notice
5161      differences in the return value ABI.  Note that it is ok for one
5162      of the functions to have void return type as long as the return
5163      value of the other is passed in a register.  */
5164   a = ix86_function_value (TREE_TYPE (exp), decl_or_type, false);
5165   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
5166                            cfun->decl, false);
5167   if (STACK_REG_P (a) || STACK_REG_P (b))
5168     {
5169       if (!rtx_equal_p (a, b))
5170         return false;
5171     }
5172   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
5173     {
5174       /* Disable sibcall if we need to generate vzeroupper after
5175          callee returns.  */
5176       if (TARGET_VZEROUPPER
5177           && cfun->machine->callee_return_avx256_p
5178           && !cfun->machine->caller_return_avx256_p)
5179         return false;
5180     }
5181   else if (!rtx_equal_p (a, b))
5182     return false;
5183
5184   if (TARGET_64BIT)
5185     {
5186       /* The SYSV ABI has more call-clobbered registers;
5187          disallow sibcalls from MS to SYSV.  */
5188       if (cfun->machine->call_abi == MS_ABI
5189           && ix86_function_type_abi (type) == SYSV_ABI)
5190         return false;
5191     }
5192   else
5193     {
5194       /* If this call is indirect, we'll need to be able to use a
5195          call-clobbered register for the address of the target function.
5196          Make sure that all such registers are not used for passing
5197          parameters.  Note that DLLIMPORT functions are indirect.  */
5198       if (!decl
5199           || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl)))
5200         {
5201           if (ix86_function_regparm (type, NULL) >= 3)
5202             {
5203               /* ??? Need to count the actual number of registers to be used,
5204                  not the possible number of registers.  Fix later.  */
5205               return false;
5206             }
5207         }
5208     }
5209
5210   /* Otherwise okay.  That also includes certain types of indirect calls.  */
5211   return true;
5212 }
5213
5214 /* Handle "cdecl", "stdcall", "fastcall", "regparm", "thiscall",
5215    and "sseregparm" calling convention attributes;
5216    arguments as in struct attribute_spec.handler.  */
5217
5218 static tree
5219 ix86_handle_cconv_attribute (tree *node, tree name,
5220                                    tree args,
5221                                    int flags ATTRIBUTE_UNUSED,
5222                                    bool *no_add_attrs)
5223 {
5224   if (TREE_CODE (*node) != FUNCTION_TYPE
5225       && TREE_CODE (*node) != METHOD_TYPE
5226       && TREE_CODE (*node) != FIELD_DECL
5227       && TREE_CODE (*node) != TYPE_DECL)
5228     {
5229       warning (OPT_Wattributes, "%qE attribute only applies to functions",
5230                name);
5231       *no_add_attrs = true;
5232       return NULL_TREE;
5233     }
5234
5235   /* Can combine regparm with all attributes but fastcall, and thiscall.  */
5236   if (is_attribute_p ("regparm", name))
5237     {
5238       tree cst;
5239
5240       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5241         {
5242           error ("fastcall and regparm attributes are not compatible");
5243         }
5244
5245       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5246         {
5247           error ("regparam and thiscall attributes are not compatible");
5248         }
5249
5250       cst = TREE_VALUE (args);
5251       if (TREE_CODE (cst) != INTEGER_CST)
5252         {
5253           warning (OPT_Wattributes,
5254                    "%qE attribute requires an integer constant argument",
5255                    name);
5256           *no_add_attrs = true;
5257         }
5258       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
5259         {
5260           warning (OPT_Wattributes, "argument to %qE attribute larger than %d",
5261                    name, REGPARM_MAX);
5262           *no_add_attrs = true;
5263         }
5264
5265       return NULL_TREE;
5266     }
5267
5268   if (TARGET_64BIT)
5269     {
5270       /* Do not warn when emulating the MS ABI.  */
5271       if ((TREE_CODE (*node) != FUNCTION_TYPE
5272            && TREE_CODE (*node) != METHOD_TYPE)
5273           || ix86_function_type_abi (*node) != MS_ABI)
5274         warning (OPT_Wattributes, "%qE attribute ignored",
5275                  name);
5276       *no_add_attrs = true;
5277       return NULL_TREE;
5278     }
5279
5280   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
5281   if (is_attribute_p ("fastcall", name))
5282     {
5283       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5284         {
5285           error ("fastcall and cdecl attributes are not compatible");
5286         }
5287       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5288         {
5289           error ("fastcall and stdcall attributes are not compatible");
5290         }
5291       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
5292         {
5293           error ("fastcall and regparm attributes are not compatible");
5294         }
5295       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5296         {
5297           error ("fastcall and thiscall attributes are not compatible");
5298         }
5299     }
5300
5301   /* Can combine stdcall with fastcall (redundant), regparm and
5302      sseregparm.  */
5303   else if (is_attribute_p ("stdcall", name))
5304     {
5305       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5306         {
5307           error ("stdcall and cdecl attributes are not compatible");
5308         }
5309       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5310         {
5311           error ("stdcall and fastcall attributes are not compatible");
5312         }
5313       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5314         {
5315           error ("stdcall and thiscall attributes are not compatible");
5316         }
5317     }
5318
5319   /* Can combine cdecl with regparm and sseregparm.  */
5320   else if (is_attribute_p ("cdecl", name))
5321     {
5322       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5323         {
5324           error ("stdcall and cdecl attributes are not compatible");
5325         }
5326       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5327         {
5328           error ("fastcall and cdecl attributes are not compatible");
5329         }
5330       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5331         {
5332           error ("cdecl and thiscall attributes are not compatible");
5333         }
5334     }
5335   else if (is_attribute_p ("thiscall", name))
5336     {
5337       if (TREE_CODE (*node) != METHOD_TYPE && pedantic)
5338         warning (OPT_Wattributes, "%qE attribute is used for none class-method",
5339                  name);
5340       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5341         {
5342           error ("stdcall and thiscall attributes are not compatible");
5343         }
5344       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5345         {
5346           error ("fastcall and thiscall attributes are not compatible");
5347         }
5348       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5349         {
5350           error ("cdecl and thiscall attributes are not compatible");
5351         }
5352     }
5353
5354   /* Can combine sseregparm with all attributes.  */
5355
5356   return NULL_TREE;
5357 }
5358
5359 /* This function determines from TYPE the calling-convention.  */
5360
5361 unsigned int
5362 ix86_get_callcvt (const_tree type)
5363 {
5364   unsigned int ret = 0;
5365   bool is_stdarg;
5366   tree attrs;
5367
5368   if (TARGET_64BIT)
5369     return IX86_CALLCVT_CDECL;
5370
5371   attrs = TYPE_ATTRIBUTES (type);
5372   if (attrs != NULL_TREE)
5373     {
5374       if (lookup_attribute ("cdecl", attrs))
5375         ret |= IX86_CALLCVT_CDECL;
5376       else if (lookup_attribute ("stdcall", attrs))
5377         ret |= IX86_CALLCVT_STDCALL;
5378       else if (lookup_attribute ("fastcall", attrs))
5379         ret |= IX86_CALLCVT_FASTCALL;
5380       else if (lookup_attribute ("thiscall", attrs))
5381         ret |= IX86_CALLCVT_THISCALL;
5382
5383       /* Regparam isn't allowed for thiscall and fastcall.  */
5384       if ((ret & (IX86_CALLCVT_THISCALL | IX86_CALLCVT_FASTCALL)) == 0)
5385         {
5386           if (lookup_attribute ("regparm", attrs))
5387             ret |= IX86_CALLCVT_REGPARM;
5388           if (lookup_attribute ("sseregparm", attrs))
5389             ret |= IX86_CALLCVT_SSEREGPARM;
5390         }
5391
5392       if (IX86_BASE_CALLCVT(ret) != 0)
5393         return ret;
5394     }
5395
5396   is_stdarg = stdarg_p (type);
5397   if (TARGET_RTD && !is_stdarg)
5398     return IX86_CALLCVT_STDCALL | ret;
5399
5400   if (ret != 0
5401       || is_stdarg
5402       || TREE_CODE (type) != METHOD_TYPE
5403       || ix86_function_type_abi (type) != MS_ABI)
5404     return IX86_CALLCVT_CDECL | ret;
5405
5406   return IX86_CALLCVT_THISCALL;
5407 }
5408
5409 /* Return 0 if the attributes for two types are incompatible, 1 if they
5410    are compatible, and 2 if they are nearly compatible (which causes a
5411    warning to be generated).  */
5412
5413 static int
5414 ix86_comp_type_attributes (const_tree type1, const_tree type2)
5415 {
5416   unsigned int ccvt1, ccvt2;
5417
5418   if (TREE_CODE (type1) != FUNCTION_TYPE
5419       && TREE_CODE (type1) != METHOD_TYPE)
5420     return 1;
5421
5422   ccvt1 = ix86_get_callcvt (type1);
5423   ccvt2 = ix86_get_callcvt (type2);
5424   if (ccvt1 != ccvt2)
5425     return 0;
5426   if (ix86_function_regparm (type1, NULL)
5427       != ix86_function_regparm (type2, NULL))
5428     return 0;
5429
5430   return 1;
5431 }
5432 \f
5433 /* Return the regparm value for a function with the indicated TYPE and DECL.
5434    DECL may be NULL when calling function indirectly
5435    or considering a libcall.  */
5436
5437 static int
5438 ix86_function_regparm (const_tree type, const_tree decl)
5439 {
5440   tree attr;
5441   int regparm;
5442   unsigned int ccvt;
5443
5444   if (TARGET_64BIT)
5445     return (ix86_function_type_abi (type) == SYSV_ABI
5446             ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
5447   ccvt = ix86_get_callcvt (type);
5448   regparm = ix86_regparm;
5449
5450   if ((ccvt & IX86_CALLCVT_REGPARM) != 0)
5451     {
5452       attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
5453       if (attr)
5454         {
5455           regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
5456           return regparm;
5457         }
5458     }
5459   else if ((ccvt & IX86_CALLCVT_FASTCALL) != 0)
5460     return 2;
5461   else if ((ccvt & IX86_CALLCVT_THISCALL) != 0)
5462     return 1;
5463
5464   /* Use register calling convention for local functions when possible.  */
5465   if (decl
5466       && TREE_CODE (decl) == FUNCTION_DECL
5467       && optimize
5468       && !(profile_flag && !flag_fentry))
5469     {
5470       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
5471       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE (decl));
5472       if (i && i->local && i->can_change_signature)
5473         {
5474           int local_regparm, globals = 0, regno;
5475
5476           /* Make sure no regparm register is taken by a
5477              fixed register variable.  */
5478           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
5479             if (fixed_regs[local_regparm])
5480               break;
5481
5482           /* We don't want to use regparm(3) for nested functions as
5483              these use a static chain pointer in the third argument.  */
5484           if (local_regparm == 3 && DECL_STATIC_CHAIN (decl))
5485             local_regparm = 2;
5486
5487           /* In 32-bit mode save a register for the split stack.  */
5488           if (!TARGET_64BIT && local_regparm == 3 && flag_split_stack)
5489             local_regparm = 2;
5490
5491           /* Each fixed register usage increases register pressure,
5492              so less registers should be used for argument passing.
5493              This functionality can be overriden by an explicit
5494              regparm value.  */
5495           for (regno = 0; regno <= DI_REG; regno++)
5496             if (fixed_regs[regno])
5497               globals++;
5498
5499           local_regparm
5500             = globals < local_regparm ? local_regparm - globals : 0;
5501
5502           if (local_regparm > regparm)
5503             regparm = local_regparm;
5504         }
5505     }
5506
5507   return regparm;
5508 }
5509
5510 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
5511    DFmode (2) arguments in SSE registers for a function with the
5512    indicated TYPE and DECL.  DECL may be NULL when calling function
5513    indirectly or considering a libcall.  Otherwise return 0.  */
5514
5515 static int
5516 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
5517 {
5518   gcc_assert (!TARGET_64BIT);
5519
5520   /* Use SSE registers to pass SFmode and DFmode arguments if requested
5521      by the sseregparm attribute.  */
5522   if (TARGET_SSEREGPARM
5523       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
5524     {
5525       if (!TARGET_SSE)
5526         {
5527           if (warn)
5528             {
5529               if (decl)
5530                 error ("calling %qD with attribute sseregparm without "
5531                        "SSE/SSE2 enabled", decl);
5532               else
5533                 error ("calling %qT with attribute sseregparm without "
5534                        "SSE/SSE2 enabled", type);
5535             }
5536           return 0;
5537         }
5538
5539       return 2;
5540     }
5541
5542   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
5543      (and DFmode for SSE2) arguments in SSE registers.  */
5544   if (decl && TARGET_SSE_MATH && optimize
5545       && !(profile_flag && !flag_fentry))
5546     {
5547       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
5548       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
5549       if (i && i->local && i->can_change_signature)
5550         return TARGET_SSE2 ? 2 : 1;
5551     }
5552
5553   return 0;
5554 }
5555
5556 /* Return true if EAX is live at the start of the function.  Used by
5557    ix86_expand_prologue to determine if we need special help before
5558    calling allocate_stack_worker.  */
5559
5560 static bool
5561 ix86_eax_live_at_start_p (void)
5562 {
5563   /* Cheat.  Don't bother working forward from ix86_function_regparm
5564      to the function type to whether an actual argument is located in
5565      eax.  Instead just look at cfg info, which is still close enough
5566      to correct at this point.  This gives false positives for broken
5567      functions that might use uninitialized data that happens to be
5568      allocated in eax, but who cares?  */
5569   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
5570 }
5571
5572 static bool
5573 ix86_keep_aggregate_return_pointer (tree fntype)
5574 {
5575   tree attr;
5576
5577   if (!TARGET_64BIT)
5578     {
5579       attr = lookup_attribute ("callee_pop_aggregate_return",
5580                                TYPE_ATTRIBUTES (fntype));
5581       if (attr)
5582         return (TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))) == 0);
5583
5584       /* For 32-bit MS-ABI the default is to keep aggregate
5585          return pointer.  */
5586       if (ix86_function_type_abi (fntype) == MS_ABI)
5587         return true;
5588     }
5589   return KEEP_AGGREGATE_RETURN_POINTER != 0;
5590 }
5591
5592 /* Value is the number of bytes of arguments automatically
5593    popped when returning from a subroutine call.
5594    FUNDECL is the declaration node of the function (as a tree),
5595    FUNTYPE is the data type of the function (as a tree),
5596    or for a library call it is an identifier node for the subroutine name.
5597    SIZE is the number of bytes of arguments passed on the stack.
5598
5599    On the 80386, the RTD insn may be used to pop them if the number
5600      of args is fixed, but if the number is variable then the caller
5601      must pop them all.  RTD can't be used for library calls now
5602      because the library is compiled with the Unix compiler.
5603    Use of RTD is a selectable option, since it is incompatible with
5604    standard Unix calling sequences.  If the option is not selected,
5605    the caller must always pop the args.
5606
5607    The attribute stdcall is equivalent to RTD on a per module basis.  */
5608
5609 static int
5610 ix86_return_pops_args (tree fundecl, tree funtype, int size)
5611 {
5612   unsigned int ccvt;
5613
5614   /* None of the 64-bit ABIs pop arguments.  */
5615   if (TARGET_64BIT)
5616     return 0;
5617
5618   ccvt = ix86_get_callcvt (funtype);
5619
5620   if ((ccvt & (IX86_CALLCVT_STDCALL | IX86_CALLCVT_FASTCALL
5621                | IX86_CALLCVT_THISCALL)) != 0
5622       && ! stdarg_p (funtype))
5623     return size;
5624
5625   /* Lose any fake structure return argument if it is passed on the stack.  */
5626   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
5627       && !ix86_keep_aggregate_return_pointer (funtype))
5628     {
5629       int nregs = ix86_function_regparm (funtype, fundecl);
5630       if (nregs == 0)
5631         return GET_MODE_SIZE (Pmode);
5632     }
5633
5634   return 0;
5635 }
5636 \f
5637 /* Argument support functions.  */
5638
5639 /* Return true when register may be used to pass function parameters.  */
5640 bool
5641 ix86_function_arg_regno_p (int regno)
5642 {
5643   int i;
5644   const int *parm_regs;
5645
5646   if (!TARGET_64BIT)
5647     {
5648       if (TARGET_MACHO)
5649         return (regno < REGPARM_MAX
5650                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
5651       else
5652         return (regno < REGPARM_MAX
5653                 || (TARGET_MMX && MMX_REGNO_P (regno)
5654                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
5655                 || (TARGET_SSE && SSE_REGNO_P (regno)
5656                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
5657     }
5658
5659   if (TARGET_MACHO)
5660     {
5661       if (SSE_REGNO_P (regno) && TARGET_SSE)
5662         return true;
5663     }
5664   else
5665     {
5666       if (TARGET_SSE && SSE_REGNO_P (regno)
5667           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
5668         return true;
5669     }
5670
5671   /* TODO: The function should depend on current function ABI but
5672      builtins.c would need updating then. Therefore we use the
5673      default ABI.  */
5674
5675   /* RAX is used as hidden argument to va_arg functions.  */
5676   if (ix86_abi == SYSV_ABI && regno == AX_REG)
5677     return true;
5678
5679   if (ix86_abi == MS_ABI)
5680     parm_regs = x86_64_ms_abi_int_parameter_registers;
5681   else
5682     parm_regs = x86_64_int_parameter_registers;
5683   for (i = 0; i < (ix86_abi == MS_ABI
5684                    ? X86_64_MS_REGPARM_MAX : X86_64_REGPARM_MAX); i++)
5685     if (regno == parm_regs[i])
5686       return true;
5687   return false;
5688 }
5689
5690 /* Return if we do not know how to pass TYPE solely in registers.  */
5691
5692 static bool
5693 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
5694 {
5695   if (must_pass_in_stack_var_size_or_pad (mode, type))
5696     return true;
5697
5698   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
5699      The layout_type routine is crafty and tries to trick us into passing
5700      currently unsupported vector types on the stack by using TImode.  */
5701   return (!TARGET_64BIT && mode == TImode
5702           && type && TREE_CODE (type) != VECTOR_TYPE);
5703 }
5704
5705 /* It returns the size, in bytes, of the area reserved for arguments passed
5706    in registers for the function represented by fndecl dependent to the used
5707    abi format.  */
5708 int
5709 ix86_reg_parm_stack_space (const_tree fndecl)
5710 {
5711   enum calling_abi call_abi = SYSV_ABI;
5712   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
5713     call_abi = ix86_function_abi (fndecl);
5714   else
5715     call_abi = ix86_function_type_abi (fndecl);
5716   if (TARGET_64BIT && call_abi == MS_ABI)
5717     return 32;
5718   return 0;
5719 }
5720
5721 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
5722    call abi used.  */
5723 enum calling_abi
5724 ix86_function_type_abi (const_tree fntype)
5725 {
5726   if (fntype != NULL_TREE && TYPE_ATTRIBUTES (fntype) != NULL_TREE)
5727     {
5728       enum calling_abi abi = ix86_abi;
5729       if (abi == SYSV_ABI)
5730         {
5731           if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
5732             abi = MS_ABI;
5733         }
5734       else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
5735         abi = SYSV_ABI;
5736       return abi;
5737     }
5738   return ix86_abi;
5739 }
5740
5741 static bool
5742 ix86_function_ms_hook_prologue (const_tree fn)
5743 {
5744   if (fn && lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fn)))
5745     {
5746       if (decl_function_context (fn) != NULL_TREE)
5747         error_at (DECL_SOURCE_LOCATION (fn),
5748                   "ms_hook_prologue is not compatible with nested function");
5749       else
5750         return true;
5751     }
5752   return false;
5753 }
5754
5755 static enum calling_abi
5756 ix86_function_abi (const_tree fndecl)
5757 {
5758   if (! fndecl)
5759     return ix86_abi;
5760   return ix86_function_type_abi (TREE_TYPE (fndecl));
5761 }
5762
5763 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
5764    call abi used.  */
5765 enum calling_abi
5766 ix86_cfun_abi (void)
5767 {
5768   if (! cfun)
5769     return ix86_abi;
5770   return cfun->machine->call_abi;
5771 }
5772
5773 /* Write the extra assembler code needed to declare a function properly.  */
5774
5775 void
5776 ix86_asm_output_function_label (FILE *asm_out_file, const char *fname,
5777                                 tree decl)
5778 {
5779   bool is_ms_hook = ix86_function_ms_hook_prologue (decl);
5780
5781   if (is_ms_hook)
5782     {
5783       int i, filler_count = (TARGET_64BIT ? 32 : 16);
5784       unsigned int filler_cc = 0xcccccccc;
5785
5786       for (i = 0; i < filler_count; i += 4)
5787         fprintf (asm_out_file, ASM_LONG " %#x\n", filler_cc);
5788     }
5789
5790 #ifdef SUBTARGET_ASM_UNWIND_INIT
5791   SUBTARGET_ASM_UNWIND_INIT (asm_out_file);
5792 #endif
5793
5794   ASM_OUTPUT_LABEL (asm_out_file, fname);
5795
5796   /* Output magic byte marker, if hot-patch attribute is set.  */
5797   if (is_ms_hook)
5798     {
5799       if (TARGET_64BIT)
5800         {
5801           /* leaq [%rsp + 0], %rsp  */
5802           asm_fprintf (asm_out_file, ASM_BYTE
5803                        "0x48, 0x8d, 0xa4, 0x24, 0x00, 0x00, 0x00, 0x00\n");
5804         }
5805       else
5806         {
5807           /* movl.s %edi, %edi
5808              push   %ebp
5809              movl.s %esp, %ebp */
5810           asm_fprintf (asm_out_file, ASM_BYTE
5811                        "0x8b, 0xff, 0x55, 0x8b, 0xec\n");
5812         }
5813     }
5814 }
5815
5816 /* regclass.c  */
5817 extern void init_regs (void);
5818
5819 /* Implementation of call abi switching target hook. Specific to FNDECL
5820    the specific call register sets are set.  See also
5821    ix86_conditional_register_usage for more details.  */
5822 void
5823 ix86_call_abi_override (const_tree fndecl)
5824 {
5825   if (fndecl == NULL_TREE)
5826     cfun->machine->call_abi = ix86_abi;
5827   else
5828     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
5829 }
5830
5831 /* 64-bit MS and SYSV ABI have different set of call used registers.  Avoid
5832    expensive re-initialization of init_regs each time we switch function context
5833    since this is needed only during RTL expansion.  */
5834 static void
5835 ix86_maybe_switch_abi (void)
5836 {
5837   if (TARGET_64BIT &&
5838       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
5839     reinit_regs ();
5840 }
5841
5842 /* Initialize a variable CUM of type CUMULATIVE_ARGS
5843    for a call to a function whose data type is FNTYPE.
5844    For a library call, FNTYPE is 0.  */
5845
5846 void
5847 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
5848                       tree fntype,      /* tree ptr for function decl */
5849                       rtx libname,      /* SYMBOL_REF of library name or 0 */
5850                       tree fndecl,
5851                       int caller)
5852 {
5853   struct cgraph_local_info *i;
5854   tree fnret_type;
5855
5856   memset (cum, 0, sizeof (*cum));
5857
5858   /* Initialize for the current callee.  */
5859   if (caller)
5860     {
5861       cfun->machine->callee_pass_avx256_p = false;
5862       cfun->machine->callee_return_avx256_p = false;
5863     }
5864
5865   if (fndecl)
5866     {
5867       i = cgraph_local_info (fndecl);
5868       cum->call_abi = ix86_function_abi (fndecl);
5869       fnret_type = TREE_TYPE (TREE_TYPE (fndecl));
5870     }
5871   else
5872     {
5873       i = NULL;
5874       cum->call_abi = ix86_function_type_abi (fntype);
5875       if (fntype)
5876         fnret_type = TREE_TYPE (fntype);
5877       else
5878         fnret_type = NULL;
5879     }
5880
5881   if (TARGET_VZEROUPPER && fnret_type)
5882     {
5883       rtx fnret_value = ix86_function_value (fnret_type, fntype,
5884                                              false);
5885       if (function_pass_avx256_p (fnret_value))
5886         {
5887           /* The return value of this function uses 256bit AVX modes.  */
5888           if (caller)
5889             cfun->machine->callee_return_avx256_p = true;
5890           else
5891             cfun->machine->caller_return_avx256_p = true;
5892         }
5893     }
5894
5895   cum->caller = caller;
5896
5897   /* Set up the number of registers to use for passing arguments.  */
5898
5899   if (TARGET_64BIT && cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
5900     sorry ("ms_abi attribute requires -maccumulate-outgoing-args "
5901            "or subtarget optimization implying it");
5902   cum->nregs = ix86_regparm;
5903   if (TARGET_64BIT)
5904     {
5905       cum->nregs = (cum->call_abi == SYSV_ABI
5906                    ? X86_64_REGPARM_MAX
5907                    : X86_64_MS_REGPARM_MAX);
5908     }
5909   if (TARGET_SSE)
5910     {
5911       cum->sse_nregs = SSE_REGPARM_MAX;
5912       if (TARGET_64BIT)
5913         {
5914           cum->sse_nregs = (cum->call_abi == SYSV_ABI
5915                            ? X86_64_SSE_REGPARM_MAX
5916                            : X86_64_MS_SSE_REGPARM_MAX);
5917         }
5918     }
5919   if (TARGET_MMX)
5920     cum->mmx_nregs = MMX_REGPARM_MAX;
5921   cum->warn_avx = true;
5922   cum->warn_sse = true;
5923   cum->warn_mmx = true;
5924
5925   /* Because type might mismatch in between caller and callee, we need to
5926      use actual type of function for local calls.
5927      FIXME: cgraph_analyze can be told to actually record if function uses
5928      va_start so for local functions maybe_vaarg can be made aggressive
5929      helping K&R code.
5930      FIXME: once typesytem is fixed, we won't need this code anymore.  */
5931   if (i && i->local && i->can_change_signature)
5932     fntype = TREE_TYPE (fndecl);
5933   cum->maybe_vaarg = (fntype
5934                       ? (!prototype_p (fntype) || stdarg_p (fntype))
5935                       : !libname);
5936
5937   if (!TARGET_64BIT)
5938     {
5939       /* If there are variable arguments, then we won't pass anything
5940          in registers in 32-bit mode. */
5941       if (stdarg_p (fntype))
5942         {
5943           cum->nregs = 0;
5944           cum->sse_nregs = 0;
5945           cum->mmx_nregs = 0;
5946           cum->warn_avx = 0;
5947           cum->warn_sse = 0;
5948           cum->warn_mmx = 0;
5949           return;
5950         }
5951
5952       /* Use ecx and edx registers if function has fastcall attribute,
5953          else look for regparm information.  */
5954       if (fntype)
5955         {
5956           unsigned int ccvt = ix86_get_callcvt (fntype);
5957           if ((ccvt & IX86_CALLCVT_THISCALL) != 0)
5958             {
5959               cum->nregs = 1;
5960               cum->fastcall = 1; /* Same first register as in fastcall.  */
5961             }
5962           else if ((ccvt & IX86_CALLCVT_FASTCALL) != 0)
5963             {
5964               cum->nregs = 2;
5965               cum->fastcall = 1;
5966             }
5967           else
5968             cum->nregs = ix86_function_regparm (fntype, fndecl);
5969         }
5970
5971       /* Set up the number of SSE registers used for passing SFmode
5972          and DFmode arguments.  Warn for mismatching ABI.  */
5973       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
5974     }
5975 }
5976
5977 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
5978    But in the case of vector types, it is some vector mode.
5979
5980    When we have only some of our vector isa extensions enabled, then there
5981    are some modes for which vector_mode_supported_p is false.  For these
5982    modes, the generic vector support in gcc will choose some non-vector mode
5983    in order to implement the type.  By computing the natural mode, we'll
5984    select the proper ABI location for the operand and not depend on whatever
5985    the middle-end decides to do with these vector types.
5986
5987    The midde-end can't deal with the vector types > 16 bytes.  In this
5988    case, we return the original mode and warn ABI change if CUM isn't
5989    NULL.  */
5990
5991 static enum machine_mode
5992 type_natural_mode (const_tree type, const CUMULATIVE_ARGS *cum)
5993 {
5994   enum machine_mode mode = TYPE_MODE (type);
5995
5996   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
5997     {
5998       HOST_WIDE_INT size = int_size_in_bytes (type);
5999       if ((size == 8 || size == 16 || size == 32)
6000           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
6001           && TYPE_VECTOR_SUBPARTS (type) > 1)
6002         {
6003           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
6004
6005           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6006             mode = MIN_MODE_VECTOR_FLOAT;
6007           else
6008             mode = MIN_MODE_VECTOR_INT;
6009
6010           /* Get the mode which has this inner mode and number of units.  */
6011           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
6012             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
6013                 && GET_MODE_INNER (mode) == innermode)
6014               {
6015                 if (size == 32 && !TARGET_AVX)
6016                   {
6017                     static bool warnedavx;
6018
6019                     if (cum
6020                         && !warnedavx
6021                         && cum->warn_avx)
6022                       {
6023                         warnedavx = true;
6024                         warning (0, "AVX vector argument without AVX "
6025                                  "enabled changes the ABI");
6026                       }
6027                     return TYPE_MODE (type);
6028                   }
6029                 else
6030                   return mode;
6031               }
6032
6033           gcc_unreachable ();
6034         }
6035     }
6036
6037   return mode;
6038 }
6039
6040 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
6041    this may not agree with the mode that the type system has chosen for the
6042    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
6043    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
6044
6045 static rtx
6046 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
6047                      unsigned int regno)
6048 {
6049   rtx tmp;
6050
6051   if (orig_mode != BLKmode)
6052     tmp = gen_rtx_REG (orig_mode, regno);
6053   else
6054     {
6055       tmp = gen_rtx_REG (mode, regno);
6056       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
6057       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
6058     }
6059
6060   return tmp;
6061 }
6062
6063 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
6064    of this code is to classify each 8bytes of incoming argument by the register
6065    class and assign registers accordingly.  */
6066
6067 /* Return the union class of CLASS1 and CLASS2.
6068    See the x86-64 PS ABI for details.  */
6069
6070 static enum x86_64_reg_class
6071 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
6072 {
6073   /* Rule #1: If both classes are equal, this is the resulting class.  */
6074   if (class1 == class2)
6075     return class1;
6076
6077   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
6078      the other class.  */
6079   if (class1 == X86_64_NO_CLASS)
6080     return class2;
6081   if (class2 == X86_64_NO_CLASS)
6082     return class1;
6083
6084   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
6085   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
6086     return X86_64_MEMORY_CLASS;
6087
6088   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
6089   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
6090       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
6091     return X86_64_INTEGERSI_CLASS;
6092   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
6093       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
6094     return X86_64_INTEGER_CLASS;
6095
6096   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
6097      MEMORY is used.  */
6098   if (class1 == X86_64_X87_CLASS
6099       || class1 == X86_64_X87UP_CLASS
6100       || class1 == X86_64_COMPLEX_X87_CLASS
6101       || class2 == X86_64_X87_CLASS
6102       || class2 == X86_64_X87UP_CLASS
6103       || class2 == X86_64_COMPLEX_X87_CLASS)
6104     return X86_64_MEMORY_CLASS;
6105
6106   /* Rule #6: Otherwise class SSE is used.  */
6107   return X86_64_SSE_CLASS;
6108 }
6109
6110 /* Classify the argument of type TYPE and mode MODE.
6111    CLASSES will be filled by the register class used to pass each word
6112    of the operand.  The number of words is returned.  In case the parameter
6113    should be passed in memory, 0 is returned. As a special case for zero
6114    sized containers, classes[0] will be NO_CLASS and 1 is returned.
6115
6116    BIT_OFFSET is used internally for handling records and specifies offset
6117    of the offset in bits modulo 256 to avoid overflow cases.
6118
6119    See the x86-64 PS ABI for details.
6120 */
6121
6122 static int
6123 classify_argument (enum machine_mode mode, const_tree type,
6124                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
6125 {
6126   HOST_WIDE_INT bytes =
6127     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
6128   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6129
6130   /* Variable sized entities are always passed/returned in memory.  */
6131   if (bytes < 0)
6132     return 0;
6133
6134   if (mode != VOIDmode
6135       && targetm.calls.must_pass_in_stack (mode, type))
6136     return 0;
6137
6138   if (type && AGGREGATE_TYPE_P (type))
6139     {
6140       int i;
6141       tree field;
6142       enum x86_64_reg_class subclasses[MAX_CLASSES];
6143
6144       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
6145       if (bytes > 32)
6146         return 0;
6147
6148       for (i = 0; i < words; i++)
6149         classes[i] = X86_64_NO_CLASS;
6150
6151       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
6152          signalize memory class, so handle it as special case.  */
6153       if (!words)
6154         {
6155           classes[0] = X86_64_NO_CLASS;
6156           return 1;
6157         }
6158
6159       /* Classify each field of record and merge classes.  */
6160       switch (TREE_CODE (type))
6161         {
6162         case RECORD_TYPE:
6163           /* And now merge the fields of structure.  */
6164           for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6165             {
6166               if (TREE_CODE (field) == FIELD_DECL)
6167                 {
6168                   int num;
6169
6170                   if (TREE_TYPE (field) == error_mark_node)
6171                     continue;
6172
6173                   /* Bitfields are always classified as integer.  Handle them
6174                      early, since later code would consider them to be
6175                      misaligned integers.  */
6176                   if (DECL_BIT_FIELD (field))
6177                     {
6178                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
6179                            i < ((int_bit_position (field) + (bit_offset % 64))
6180                                 + tree_low_cst (DECL_SIZE (field), 0)
6181                                 + 63) / 8 / 8; i++)
6182                         classes[i] =
6183                           merge_classes (X86_64_INTEGER_CLASS,
6184                                          classes[i]);
6185                     }
6186                   else
6187                     {
6188                       int pos;
6189
6190                       type = TREE_TYPE (field);
6191
6192                       /* Flexible array member is ignored.  */
6193                       if (TYPE_MODE (type) == BLKmode
6194                           && TREE_CODE (type) == ARRAY_TYPE
6195                           && TYPE_SIZE (type) == NULL_TREE
6196                           && TYPE_DOMAIN (type) != NULL_TREE
6197                           && (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
6198                               == NULL_TREE))
6199                         {
6200                           static bool warned;
6201
6202                           if (!warned && warn_psabi)
6203                             {
6204                               warned = true;
6205                               inform (input_location,
6206                                       "the ABI of passing struct with"
6207                                       " a flexible array member has"
6208                                       " changed in GCC 4.4");
6209                             }
6210                           continue;
6211                         }
6212                       num = classify_argument (TYPE_MODE (type), type,
6213                                                subclasses,
6214                                                (int_bit_position (field)
6215                                                 + bit_offset) % 256);
6216                       if (!num)
6217                         return 0;
6218                       pos = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
6219                       for (i = 0; i < num && (i + pos) < words; i++)
6220                         classes[i + pos] =
6221                           merge_classes (subclasses[i], classes[i + pos]);
6222                     }
6223                 }
6224             }
6225           break;
6226
6227         case ARRAY_TYPE:
6228           /* Arrays are handled as small records.  */
6229           {
6230             int num;
6231             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
6232                                      TREE_TYPE (type), subclasses, bit_offset);
6233             if (!num)
6234               return 0;
6235
6236             /* The partial classes are now full classes.  */
6237             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
6238               subclasses[0] = X86_64_SSE_CLASS;
6239             if (subclasses[0] == X86_64_INTEGERSI_CLASS
6240                 && !((bit_offset % 64) == 0 && bytes == 4))
6241               subclasses[0] = X86_64_INTEGER_CLASS;
6242
6243             for (i = 0; i < words; i++)
6244               classes[i] = subclasses[i % num];
6245
6246             break;
6247           }
6248         case UNION_TYPE:
6249         case QUAL_UNION_TYPE:
6250           /* Unions are similar to RECORD_TYPE but offset is always 0.
6251              */
6252           for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6253             {
6254               if (TREE_CODE (field) == FIELD_DECL)
6255                 {
6256                   int num;
6257
6258                   if (TREE_TYPE (field) == error_mark_node)
6259                     continue;
6260
6261                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
6262                                            TREE_TYPE (field), subclasses,
6263                                            bit_offset);
6264                   if (!num)
6265                     return 0;
6266                   for (i = 0; i < num; i++)
6267                     classes[i] = merge_classes (subclasses[i], classes[i]);
6268                 }
6269             }
6270           break;
6271
6272         default:
6273           gcc_unreachable ();
6274         }
6275
6276       if (words > 2)
6277         {
6278           /* When size > 16 bytes, if the first one isn't
6279              X86_64_SSE_CLASS or any other ones aren't
6280              X86_64_SSEUP_CLASS, everything should be passed in
6281              memory.  */
6282           if (classes[0] != X86_64_SSE_CLASS)
6283               return 0;
6284
6285           for (i = 1; i < words; i++)
6286             if (classes[i] != X86_64_SSEUP_CLASS)
6287               return 0;
6288         }
6289
6290       /* Final merger cleanup.  */
6291       for (i = 0; i < words; i++)
6292         {
6293           /* If one class is MEMORY, everything should be passed in
6294              memory.  */
6295           if (classes[i] == X86_64_MEMORY_CLASS)
6296             return 0;
6297
6298           /* The X86_64_SSEUP_CLASS should be always preceded by
6299              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
6300           if (classes[i] == X86_64_SSEUP_CLASS
6301               && classes[i - 1] != X86_64_SSE_CLASS
6302               && classes[i - 1] != X86_64_SSEUP_CLASS)
6303             {
6304               /* The first one should never be X86_64_SSEUP_CLASS.  */
6305               gcc_assert (i != 0);
6306               classes[i] = X86_64_SSE_CLASS;
6307             }
6308
6309           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
6310                everything should be passed in memory.  */
6311           if (classes[i] == X86_64_X87UP_CLASS
6312               && (classes[i - 1] != X86_64_X87_CLASS))
6313             {
6314               static bool warned;
6315
6316               /* The first one should never be X86_64_X87UP_CLASS.  */
6317               gcc_assert (i != 0);
6318               if (!warned && warn_psabi)
6319                 {
6320                   warned = true;
6321                   inform (input_location,
6322                           "the ABI of passing union with long double"
6323                           " has changed in GCC 4.4");
6324                 }
6325               return 0;
6326             }
6327         }
6328       return words;
6329     }
6330
6331   /* Compute alignment needed.  We align all types to natural boundaries with
6332      exception of XFmode that is aligned to 64bits.  */
6333   if (mode != VOIDmode && mode != BLKmode)
6334     {
6335       int mode_alignment = GET_MODE_BITSIZE (mode);
6336
6337       if (mode == XFmode)
6338         mode_alignment = 128;
6339       else if (mode == XCmode)
6340         mode_alignment = 256;
6341       if (COMPLEX_MODE_P (mode))
6342         mode_alignment /= 2;
6343       /* Misaligned fields are always returned in memory.  */
6344       if (bit_offset % mode_alignment)
6345         return 0;
6346     }
6347
6348   /* for V1xx modes, just use the base mode */
6349   if (VECTOR_MODE_P (mode) && mode != V1DImode && mode != V1TImode
6350       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
6351     mode = GET_MODE_INNER (mode);
6352
6353   /* Classification of atomic types.  */
6354   switch (mode)
6355     {
6356     case SDmode:
6357     case DDmode:
6358       classes[0] = X86_64_SSE_CLASS;
6359       return 1;
6360     case TDmode:
6361       classes[0] = X86_64_SSE_CLASS;
6362       classes[1] = X86_64_SSEUP_CLASS;
6363       return 2;
6364     case DImode:
6365     case SImode:
6366     case HImode:
6367     case QImode:
6368     case CSImode:
6369     case CHImode:
6370     case CQImode:
6371       {
6372         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
6373
6374         if (size <= 32)
6375           {
6376             classes[0] = X86_64_INTEGERSI_CLASS;
6377             return 1;
6378           }
6379         else if (size <= 64)
6380           {
6381             classes[0] = X86_64_INTEGER_CLASS;
6382             return 1;
6383           }
6384         else if (size <= 64+32)
6385           {
6386             classes[0] = X86_64_INTEGER_CLASS;
6387             classes[1] = X86_64_INTEGERSI_CLASS;
6388             return 2;
6389           }
6390         else if (size <= 64+64)
6391           {
6392             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
6393             return 2;
6394           }
6395         else
6396           gcc_unreachable ();
6397       }
6398     case CDImode:
6399     case TImode:
6400       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
6401       return 2;
6402     case COImode:
6403     case OImode:
6404       /* OImode shouldn't be used directly.  */
6405       gcc_unreachable ();
6406     case CTImode:
6407       return 0;
6408     case SFmode:
6409       if (!(bit_offset % 64))
6410         classes[0] = X86_64_SSESF_CLASS;
6411       else
6412         classes[0] = X86_64_SSE_CLASS;
6413       return 1;
6414     case DFmode:
6415       classes[0] = X86_64_SSEDF_CLASS;
6416       return 1;
6417     case XFmode:
6418       classes[0] = X86_64_X87_CLASS;
6419       classes[1] = X86_64_X87UP_CLASS;
6420       return 2;
6421     case TFmode:
6422       classes[0] = X86_64_SSE_CLASS;
6423       classes[1] = X86_64_SSEUP_CLASS;
6424       return 2;
6425     case SCmode:
6426       classes[0] = X86_64_SSE_CLASS;
6427       if (!(bit_offset % 64))
6428         return 1;
6429       else
6430         {
6431           static bool warned;
6432
6433           if (!warned && warn_psabi)
6434             {
6435               warned = true;
6436               inform (input_location,
6437                       "the ABI of passing structure with complex float"
6438                       " member has changed in GCC 4.4");
6439             }
6440           classes[1] = X86_64_SSESF_CLASS;
6441           return 2;
6442         }
6443     case DCmode:
6444       classes[0] = X86_64_SSEDF_CLASS;
6445       classes[1] = X86_64_SSEDF_CLASS;
6446       return 2;
6447     case XCmode:
6448       classes[0] = X86_64_COMPLEX_X87_CLASS;
6449       return 1;
6450     case TCmode:
6451       /* This modes is larger than 16 bytes.  */
6452       return 0;
6453     case V8SFmode:
6454     case V8SImode:
6455     case V32QImode:
6456     case V16HImode:
6457     case V4DFmode:
6458     case V4DImode:
6459       classes[0] = X86_64_SSE_CLASS;
6460       classes[1] = X86_64_SSEUP_CLASS;
6461       classes[2] = X86_64_SSEUP_CLASS;
6462       classes[3] = X86_64_SSEUP_CLASS;
6463       return 4;
6464     case V4SFmode:
6465     case V4SImode:
6466     case V16QImode:
6467     case V8HImode:
6468     case V2DFmode:
6469     case V2DImode:
6470       classes[0] = X86_64_SSE_CLASS;
6471       classes[1] = X86_64_SSEUP_CLASS;
6472       return 2;
6473     case V1TImode:
6474     case V1DImode:
6475     case V2SFmode:
6476     case V2SImode:
6477     case V4HImode:
6478     case V8QImode:
6479       classes[0] = X86_64_SSE_CLASS;
6480       return 1;
6481     case BLKmode:
6482     case VOIDmode:
6483       return 0;
6484     default:
6485       gcc_assert (VECTOR_MODE_P (mode));
6486
6487       if (bytes > 16)
6488         return 0;
6489
6490       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
6491
6492       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
6493         classes[0] = X86_64_INTEGERSI_CLASS;
6494       else
6495         classes[0] = X86_64_INTEGER_CLASS;
6496       classes[1] = X86_64_INTEGER_CLASS;
6497       return 1 + (bytes > 8);
6498     }
6499 }
6500
6501 /* Examine the argument and return set number of register required in each
6502    class.  Return 0 iff parameter should be passed in memory.  */
6503 static int
6504 examine_argument (enum machine_mode mode, const_tree type, int in_return,
6505                   int *int_nregs, int *sse_nregs)
6506 {
6507   enum x86_64_reg_class regclass[MAX_CLASSES];
6508   int n = classify_argument (mode, type, regclass, 0);
6509
6510   *int_nregs = 0;
6511   *sse_nregs = 0;
6512   if (!n)
6513     return 0;
6514   for (n--; n >= 0; n--)
6515     switch (regclass[n])
6516       {
6517       case X86_64_INTEGER_CLASS:
6518       case X86_64_INTEGERSI_CLASS:
6519         (*int_nregs)++;
6520         break;
6521       case X86_64_SSE_CLASS:
6522       case X86_64_SSESF_CLASS:
6523       case X86_64_SSEDF_CLASS:
6524         (*sse_nregs)++;
6525         break;
6526       case X86_64_NO_CLASS:
6527       case X86_64_SSEUP_CLASS:
6528         break;
6529       case X86_64_X87_CLASS:
6530       case X86_64_X87UP_CLASS:
6531         if (!in_return)
6532           return 0;
6533         break;
6534       case X86_64_COMPLEX_X87_CLASS:
6535         return in_return ? 2 : 0;
6536       case X86_64_MEMORY_CLASS:
6537         gcc_unreachable ();
6538       }
6539   return 1;
6540 }
6541
6542 /* Construct container for the argument used by GCC interface.  See
6543    FUNCTION_ARG for the detailed description.  */
6544
6545 static rtx
6546 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
6547                      const_tree type, int in_return, int nintregs, int nsseregs,
6548                      const int *intreg, int sse_regno)
6549 {
6550   /* The following variables hold the static issued_error state.  */
6551   static bool issued_sse_arg_error;
6552   static bool issued_sse_ret_error;
6553   static bool issued_x87_ret_error;
6554
6555   enum machine_mode tmpmode;
6556   int bytes =
6557     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
6558   enum x86_64_reg_class regclass[MAX_CLASSES];
6559   int n;
6560   int i;
6561   int nexps = 0;
6562   int needed_sseregs, needed_intregs;
6563   rtx exp[MAX_CLASSES];
6564   rtx ret;
6565
6566   n = classify_argument (mode, type, regclass, 0);
6567   if (!n)
6568     return NULL;
6569   if (!examine_argument (mode, type, in_return, &needed_intregs,
6570                          &needed_sseregs))
6571     return NULL;
6572   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
6573     return NULL;
6574
6575   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
6576      some less clueful developer tries to use floating-point anyway.  */
6577   if (needed_sseregs && !TARGET_SSE)
6578     {
6579       if (in_return)
6580         {
6581           if (!issued_sse_ret_error)
6582             {
6583               error ("SSE register return with SSE disabled");
6584               issued_sse_ret_error = true;
6585             }
6586         }
6587       else if (!issued_sse_arg_error)
6588         {
6589           error ("SSE register argument with SSE disabled");
6590           issued_sse_arg_error = true;
6591         }
6592       return NULL;
6593     }
6594
6595   /* Likewise, error if the ABI requires us to return values in the
6596      x87 registers and the user specified -mno-80387.  */
6597   if (!TARGET_80387 && in_return)
6598     for (i = 0; i < n; i++)
6599       if (regclass[i] == X86_64_X87_CLASS
6600           || regclass[i] == X86_64_X87UP_CLASS
6601           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
6602         {
6603           if (!issued_x87_ret_error)
6604             {
6605               error ("x87 register return with x87 disabled");
6606               issued_x87_ret_error = true;
6607             }
6608           return NULL;
6609         }
6610
6611   /* First construct simple cases.  Avoid SCmode, since we want to use
6612      single register to pass this type.  */
6613   if (n == 1 && mode != SCmode)
6614     switch (regclass[0])
6615       {
6616       case X86_64_INTEGER_CLASS:
6617       case X86_64_INTEGERSI_CLASS:
6618         return gen_rtx_REG (mode, intreg[0]);
6619       case X86_64_SSE_CLASS:
6620       case X86_64_SSESF_CLASS:
6621       case X86_64_SSEDF_CLASS:
6622         if (mode != BLKmode)
6623           return gen_reg_or_parallel (mode, orig_mode,
6624                                       SSE_REGNO (sse_regno));
6625         break;
6626       case X86_64_X87_CLASS:
6627       case X86_64_COMPLEX_X87_CLASS:
6628         return gen_rtx_REG (mode, FIRST_STACK_REG);
6629       case X86_64_NO_CLASS:
6630         /* Zero sized array, struct or class.  */
6631         return NULL;
6632       default:
6633         gcc_unreachable ();
6634       }
6635   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
6636       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
6637     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
6638   if (n == 4
6639       && regclass[0] == X86_64_SSE_CLASS
6640       && regclass[1] == X86_64_SSEUP_CLASS
6641       && regclass[2] == X86_64_SSEUP_CLASS
6642       && regclass[3] == X86_64_SSEUP_CLASS
6643       && mode != BLKmode)
6644     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
6645
6646   if (n == 2
6647       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
6648     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
6649   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
6650       && regclass[1] == X86_64_INTEGER_CLASS
6651       && (mode == CDImode || mode == TImode || mode == TFmode)
6652       && intreg[0] + 1 == intreg[1])
6653     return gen_rtx_REG (mode, intreg[0]);
6654
6655   /* Otherwise figure out the entries of the PARALLEL.  */
6656   for (i = 0; i < n; i++)
6657     {
6658       int pos;
6659
6660       switch (regclass[i])
6661         {
6662           case X86_64_NO_CLASS:
6663             break;
6664           case X86_64_INTEGER_CLASS:
6665           case X86_64_INTEGERSI_CLASS:
6666             /* Merge TImodes on aligned occasions here too.  */
6667             if (i * 8 + 8 > bytes)
6668               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
6669             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
6670               tmpmode = SImode;
6671             else
6672               tmpmode = DImode;
6673             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
6674             if (tmpmode == BLKmode)
6675               tmpmode = DImode;
6676             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6677                                                gen_rtx_REG (tmpmode, *intreg),
6678                                                GEN_INT (i*8));
6679             intreg++;
6680             break;
6681           case X86_64_SSESF_CLASS:
6682             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6683                                                gen_rtx_REG (SFmode,
6684                                                             SSE_REGNO (sse_regno)),
6685                                                GEN_INT (i*8));
6686             sse_regno++;
6687             break;
6688           case X86_64_SSEDF_CLASS:
6689             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6690                                                gen_rtx_REG (DFmode,
6691                                                             SSE_REGNO (sse_regno)),
6692                                                GEN_INT (i*8));
6693             sse_regno++;
6694             break;
6695           case X86_64_SSE_CLASS:
6696             pos = i;
6697             switch (n)
6698               {
6699               case 1:
6700                 tmpmode = DImode;
6701                 break;
6702               case 2:
6703                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
6704                   {
6705                     tmpmode = TImode;
6706                     i++;
6707                   }
6708                 else
6709                   tmpmode = DImode;
6710                 break;
6711               case 4:
6712                 gcc_assert (i == 0
6713                             && regclass[1] == X86_64_SSEUP_CLASS
6714                             && regclass[2] == X86_64_SSEUP_CLASS
6715                             && regclass[3] == X86_64_SSEUP_CLASS);
6716                 tmpmode = OImode;
6717                 i += 3;
6718                 break;
6719               default:
6720                 gcc_unreachable ();
6721               }
6722             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6723                                                gen_rtx_REG (tmpmode,
6724                                                             SSE_REGNO (sse_regno)),
6725                                                GEN_INT (pos*8));
6726             sse_regno++;
6727             break;
6728           default:
6729             gcc_unreachable ();
6730         }
6731     }
6732
6733   /* Empty aligned struct, union or class.  */
6734   if (nexps == 0)
6735     return NULL;
6736
6737   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
6738   for (i = 0; i < nexps; i++)
6739     XVECEXP (ret, 0, i) = exp [i];
6740   return ret;
6741 }
6742
6743 /* Update the data in CUM to advance over an argument of mode MODE
6744    and data type TYPE.  (TYPE is null for libcalls where that information
6745    may not be available.)  */
6746
6747 static void
6748 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6749                          const_tree type, HOST_WIDE_INT bytes,
6750                          HOST_WIDE_INT words)
6751 {
6752   switch (mode)
6753     {
6754     default:
6755       break;
6756
6757     case BLKmode:
6758       if (bytes < 0)
6759         break;
6760       /* FALLTHRU */
6761
6762     case DImode:
6763     case SImode:
6764     case HImode:
6765     case QImode:
6766       cum->words += words;
6767       cum->nregs -= words;
6768       cum->regno += words;
6769
6770       if (cum->nregs <= 0)
6771         {
6772           cum->nregs = 0;
6773           cum->regno = 0;
6774         }
6775       break;
6776
6777     case OImode:
6778       /* OImode shouldn't be used directly.  */
6779       gcc_unreachable ();
6780
6781     case DFmode:
6782       if (cum->float_in_sse < 2)
6783         break;
6784     case SFmode:
6785       if (cum->float_in_sse < 1)
6786         break;
6787       /* FALLTHRU */
6788
6789     case V8SFmode:
6790     case V8SImode:
6791     case V32QImode:
6792     case V16HImode:
6793     case V4DFmode:
6794     case V4DImode:
6795     case TImode:
6796     case V16QImode:
6797     case V8HImode:
6798     case V4SImode:
6799     case V2DImode:
6800     case V4SFmode:
6801     case V2DFmode:
6802       if (!type || !AGGREGATE_TYPE_P (type))
6803         {
6804           cum->sse_words += words;
6805           cum->sse_nregs -= 1;
6806           cum->sse_regno += 1;
6807           if (cum->sse_nregs <= 0)
6808             {
6809               cum->sse_nregs = 0;
6810               cum->sse_regno = 0;
6811             }
6812         }
6813       break;
6814
6815     case V8QImode:
6816     case V4HImode:
6817     case V2SImode:
6818     case V2SFmode:
6819     case V1TImode:
6820     case V1DImode:
6821       if (!type || !AGGREGATE_TYPE_P (type))
6822         {
6823           cum->mmx_words += words;
6824           cum->mmx_nregs -= 1;
6825           cum->mmx_regno += 1;
6826           if (cum->mmx_nregs <= 0)
6827             {
6828               cum->mmx_nregs = 0;
6829               cum->mmx_regno = 0;
6830             }
6831         }
6832       break;
6833     }
6834 }
6835
6836 static void
6837 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6838                          const_tree type, HOST_WIDE_INT words, bool named)
6839 {
6840   int int_nregs, sse_nregs;
6841
6842   /* Unnamed 256bit vector mode parameters are passed on stack.  */
6843   if (!named && VALID_AVX256_REG_MODE (mode))
6844     return;
6845
6846   if (examine_argument (mode, type, 0, &int_nregs, &sse_nregs)
6847       && sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
6848     {
6849       cum->nregs -= int_nregs;
6850       cum->sse_nregs -= sse_nregs;
6851       cum->regno += int_nregs;
6852       cum->sse_regno += sse_nregs;
6853     }
6854   else
6855     {
6856       int align = ix86_function_arg_boundary (mode, type) / BITS_PER_WORD;
6857       cum->words = (cum->words + align - 1) & ~(align - 1);
6858       cum->words += words;
6859     }
6860 }
6861
6862 static void
6863 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
6864                             HOST_WIDE_INT words)
6865 {
6866   /* Otherwise, this should be passed indirect.  */
6867   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
6868
6869   cum->words += words;
6870   if (cum->nregs > 0)
6871     {
6872       cum->nregs -= 1;
6873       cum->regno += 1;
6874     }
6875 }
6876
6877 /* Update the data in CUM to advance over an argument of mode MODE and
6878    data type TYPE.  (TYPE is null for libcalls where that information
6879    may not be available.)  */
6880
6881 static void
6882 ix86_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6883                            const_tree type, bool named)
6884 {
6885   HOST_WIDE_INT bytes, words;
6886
6887   if (mode == BLKmode)
6888     bytes = int_size_in_bytes (type);
6889   else
6890     bytes = GET_MODE_SIZE (mode);
6891   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6892
6893   if (type)
6894     mode = type_natural_mode (type, NULL);
6895
6896   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
6897     function_arg_advance_ms_64 (cum, bytes, words);
6898   else if (TARGET_64BIT)
6899     function_arg_advance_64 (cum, mode, type, words, named);
6900   else
6901     function_arg_advance_32 (cum, mode, type, bytes, words);
6902 }
6903
6904 /* Define where to put the arguments to a function.
6905    Value is zero to push the argument on the stack,
6906    or a hard register in which to store the argument.
6907
6908    MODE is the argument's machine mode.
6909    TYPE is the data type of the argument (as a tree).
6910     This is null for libcalls where that information may
6911     not be available.
6912    CUM is a variable of type CUMULATIVE_ARGS which gives info about
6913     the preceding args and about the function being called.
6914    NAMED is nonzero if this argument is a named parameter
6915     (otherwise it is an extra parameter matching an ellipsis).  */
6916
6917 static rtx
6918 function_arg_32 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
6919                  enum machine_mode orig_mode, const_tree type,
6920                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
6921 {
6922   static bool warnedsse, warnedmmx;
6923
6924   /* Avoid the AL settings for the Unix64 ABI.  */
6925   if (mode == VOIDmode)
6926     return constm1_rtx;
6927
6928   switch (mode)
6929     {
6930     default:
6931       break;
6932
6933     case BLKmode:
6934       if (bytes < 0)
6935         break;
6936       /* FALLTHRU */
6937     case DImode:
6938     case SImode:
6939     case HImode:
6940     case QImode:
6941       if (words <= cum->nregs)
6942         {
6943           int regno = cum->regno;
6944
6945           /* Fastcall allocates the first two DWORD (SImode) or
6946             smaller arguments to ECX and EDX if it isn't an
6947             aggregate type .  */
6948           if (cum->fastcall)
6949             {
6950               if (mode == BLKmode
6951                   || mode == DImode
6952                   || (type && AGGREGATE_TYPE_P (type)))
6953                 break;
6954
6955               /* ECX not EAX is the first allocated register.  */
6956               if (regno == AX_REG)
6957                 regno = CX_REG;
6958             }
6959           return gen_rtx_REG (mode, regno);
6960         }
6961       break;
6962
6963     case DFmode:
6964       if (cum->float_in_sse < 2)
6965         break;
6966     case SFmode:
6967       if (cum->float_in_sse < 1)
6968         break;
6969       /* FALLTHRU */
6970     case TImode:
6971       /* In 32bit, we pass TImode in xmm registers.  */
6972     case V16QImode:
6973     case V8HImode:
6974     case V4SImode:
6975     case V2DImode:
6976     case V4SFmode:
6977     case V2DFmode:
6978       if (!type || !AGGREGATE_TYPE_P (type))
6979         {
6980           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
6981             {
6982               warnedsse = true;
6983               warning (0, "SSE vector argument without SSE enabled "
6984                        "changes the ABI");
6985             }
6986           if (cum->sse_nregs)
6987             return gen_reg_or_parallel (mode, orig_mode,
6988                                         cum->sse_regno + FIRST_SSE_REG);
6989         }
6990       break;
6991
6992     case OImode:
6993       /* OImode shouldn't be used directly.  */
6994       gcc_unreachable ();
6995
6996     case V8SFmode:
6997     case V8SImode:
6998     case V32QImode:
6999     case V16HImode:
7000     case V4DFmode:
7001     case V4DImode:
7002       if (!type || !AGGREGATE_TYPE_P (type))
7003         {
7004           if (cum->sse_nregs)
7005             return gen_reg_or_parallel (mode, orig_mode,
7006                                         cum->sse_regno + FIRST_SSE_REG);
7007         }
7008       break;
7009
7010     case V8QImode:
7011     case V4HImode:
7012     case V2SImode:
7013     case V2SFmode:
7014     case V1TImode:
7015     case V1DImode:
7016       if (!type || !AGGREGATE_TYPE_P (type))
7017         {
7018           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
7019             {
7020               warnedmmx = true;
7021               warning (0, "MMX vector argument without MMX enabled "
7022                        "changes the ABI");
7023             }
7024           if (cum->mmx_nregs)
7025             return gen_reg_or_parallel (mode, orig_mode,
7026                                         cum->mmx_regno + FIRST_MMX_REG);
7027         }
7028       break;
7029     }
7030
7031   return NULL_RTX;
7032 }
7033
7034 static rtx
7035 function_arg_64 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
7036                  enum machine_mode orig_mode, const_tree type, bool named)
7037 {
7038   /* Handle a hidden AL argument containing number of registers
7039      for varargs x86-64 functions.  */
7040   if (mode == VOIDmode)
7041     return GEN_INT (cum->maybe_vaarg
7042                     ? (cum->sse_nregs < 0
7043                        ? X86_64_SSE_REGPARM_MAX
7044                        : cum->sse_regno)
7045                     : -1);
7046
7047   switch (mode)
7048     {
7049     default:
7050       break;
7051
7052     case V8SFmode:
7053     case V8SImode:
7054     case V32QImode:
7055     case V16HImode:
7056     case V4DFmode:
7057     case V4DImode:
7058       /* Unnamed 256bit vector mode parameters are passed on stack.  */
7059       if (!named)
7060         return NULL;
7061       break;
7062     }
7063
7064   return construct_container (mode, orig_mode, type, 0, cum->nregs,
7065                               cum->sse_nregs,
7066                               &x86_64_int_parameter_registers [cum->regno],
7067                               cum->sse_regno);
7068 }
7069
7070 static rtx
7071 function_arg_ms_64 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
7072                     enum machine_mode orig_mode, bool named,
7073                     HOST_WIDE_INT bytes)
7074 {
7075   unsigned int regno;
7076
7077   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
7078      We use value of -2 to specify that current function call is MSABI.  */
7079   if (mode == VOIDmode)
7080     return GEN_INT (-2);
7081
7082   /* If we've run out of registers, it goes on the stack.  */
7083   if (cum->nregs == 0)
7084     return NULL_RTX;
7085
7086   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
7087
7088   /* Only floating point modes are passed in anything but integer regs.  */
7089   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
7090     {
7091       if (named)
7092         regno = cum->regno + FIRST_SSE_REG;
7093       else
7094         {
7095           rtx t1, t2;
7096
7097           /* Unnamed floating parameters are passed in both the
7098              SSE and integer registers.  */
7099           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
7100           t2 = gen_rtx_REG (mode, regno);
7101           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
7102           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
7103           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
7104         }
7105     }
7106   /* Handle aggregated types passed in register.  */
7107   if (orig_mode == BLKmode)
7108     {
7109       if (bytes > 0 && bytes <= 8)
7110         mode = (bytes > 4 ? DImode : SImode);
7111       if (mode == BLKmode)
7112         mode = DImode;
7113     }
7114
7115   return gen_reg_or_parallel (mode, orig_mode, regno);
7116 }
7117
7118 /* Return where to put the arguments to a function.
7119    Return zero to push the argument on the stack, or a hard register in which to store the argument.
7120
7121    MODE is the argument's machine mode.  TYPE is the data type of the
7122    argument.  It is null for libcalls where that information may not be
7123    available.  CUM gives information about the preceding args and about
7124    the function being called.  NAMED is nonzero if this argument is a
7125    named parameter (otherwise it is an extra parameter matching an
7126    ellipsis).  */
7127
7128 static rtx
7129 ix86_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
7130                    const_tree type, bool named)
7131 {
7132   enum machine_mode mode = omode;
7133   HOST_WIDE_INT bytes, words;
7134   rtx arg;
7135
7136   if (mode == BLKmode)
7137     bytes = int_size_in_bytes (type);
7138   else
7139     bytes = GET_MODE_SIZE (mode);
7140   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7141
7142   /* To simplify the code below, represent vector types with a vector mode
7143      even if MMX/SSE are not active.  */
7144   if (type && TREE_CODE (type) == VECTOR_TYPE)
7145     mode = type_natural_mode (type, cum);
7146
7147   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
7148     arg = function_arg_ms_64 (cum, mode, omode, named, bytes);
7149   else if (TARGET_64BIT)
7150     arg = function_arg_64 (cum, mode, omode, type, named);
7151   else
7152     arg = function_arg_32 (cum, mode, omode, type, bytes, words);
7153
7154   if (TARGET_VZEROUPPER && function_pass_avx256_p (arg))
7155     {
7156       /* This argument uses 256bit AVX modes.  */
7157       if (cum->caller)
7158         cfun->machine->callee_pass_avx256_p = true;
7159       else
7160         cfun->machine->caller_pass_avx256_p = true;
7161     }
7162
7163   return arg;
7164 }
7165
7166 /* A C expression that indicates when an argument must be passed by
7167    reference.  If nonzero for an argument, a copy of that argument is
7168    made in memory and a pointer to the argument is passed instead of
7169    the argument itself.  The pointer is passed in whatever way is
7170    appropriate for passing a pointer to that type.  */
7171
7172 static bool
7173 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
7174                         enum machine_mode mode ATTRIBUTE_UNUSED,
7175                         const_tree type, bool named ATTRIBUTE_UNUSED)
7176 {
7177   /* See Windows x64 Software Convention.  */
7178   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
7179     {
7180       int msize = (int) GET_MODE_SIZE (mode);
7181       if (type)
7182         {
7183           /* Arrays are passed by reference.  */
7184           if (TREE_CODE (type) == ARRAY_TYPE)
7185             return true;
7186
7187           if (AGGREGATE_TYPE_P (type))
7188             {
7189               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
7190                  are passed by reference.  */
7191               msize = int_size_in_bytes (type);
7192             }
7193         }
7194
7195       /* __m128 is passed by reference.  */
7196       switch (msize) {
7197       case 1: case 2: case 4: case 8:
7198         break;
7199       default:
7200         return true;
7201       }
7202     }
7203   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
7204     return 1;
7205
7206   return 0;
7207 }
7208
7209 /* Return true when TYPE should be 128bit aligned for 32bit argument
7210    passing ABI.  XXX: This function is obsolete and is only used for
7211    checking psABI compatibility with previous versions of GCC.  */
7212
7213 static bool
7214 ix86_compat_aligned_value_p (const_tree type)
7215 {
7216   enum machine_mode mode = TYPE_MODE (type);
7217   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
7218        || mode == TDmode
7219        || mode == TFmode
7220        || mode == TCmode)
7221       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
7222     return true;
7223   if (TYPE_ALIGN (type) < 128)
7224     return false;
7225
7226   if (AGGREGATE_TYPE_P (type))
7227     {
7228       /* Walk the aggregates recursively.  */
7229       switch (TREE_CODE (type))
7230         {
7231         case RECORD_TYPE:
7232         case UNION_TYPE:
7233         case QUAL_UNION_TYPE:
7234           {
7235             tree field;
7236
7237             /* Walk all the structure fields.  */
7238             for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
7239               {
7240                 if (TREE_CODE (field) == FIELD_DECL
7241                     && ix86_compat_aligned_value_p (TREE_TYPE (field)))
7242                   return true;
7243               }
7244             break;
7245           }
7246
7247         case ARRAY_TYPE:
7248           /* Just for use if some languages passes arrays by value.  */
7249           if (ix86_compat_aligned_value_p (TREE_TYPE (type)))
7250             return true;
7251           break;
7252
7253         default:
7254           gcc_unreachable ();
7255         }
7256     }
7257   return false;
7258 }
7259
7260 /* Return the alignment boundary for MODE and TYPE with alignment ALIGN.
7261    XXX: This function is obsolete and is only used for checking psABI
7262    compatibility with previous versions of GCC.  */
7263
7264 static unsigned int
7265 ix86_compat_function_arg_boundary (enum machine_mode mode,
7266                                    const_tree type, unsigned int align)
7267 {
7268   /* In 32bit, only _Decimal128 and __float128 are aligned to their
7269      natural boundaries.  */
7270   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
7271     {
7272       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
7273          make an exception for SSE modes since these require 128bit
7274          alignment.
7275
7276          The handling here differs from field_alignment.  ICC aligns MMX
7277          arguments to 4 byte boundaries, while structure fields are aligned
7278          to 8 byte boundaries.  */
7279       if (!type)
7280         {
7281           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
7282             align = PARM_BOUNDARY;
7283         }
7284       else
7285         {
7286           if (!ix86_compat_aligned_value_p (type))
7287             align = PARM_BOUNDARY;
7288         }
7289     }
7290   if (align > BIGGEST_ALIGNMENT)
7291     align = BIGGEST_ALIGNMENT;
7292   return align;
7293 }
7294
7295 /* Return true when TYPE should be 128bit aligned for 32bit argument
7296    passing ABI.  */
7297
7298 static bool
7299 ix86_contains_aligned_value_p (const_tree type)
7300 {
7301   enum machine_mode mode = TYPE_MODE (type);
7302
7303   if (mode == XFmode || mode == XCmode)
7304     return false;
7305
7306   if (TYPE_ALIGN (type) < 128)
7307     return false;
7308
7309   if (AGGREGATE_TYPE_P (type))
7310     {
7311       /* Walk the aggregates recursively.  */
7312       switch (TREE_CODE (type))
7313         {
7314         case RECORD_TYPE:
7315         case UNION_TYPE:
7316         case QUAL_UNION_TYPE:
7317           {
7318             tree field;
7319
7320             /* Walk all the structure fields.  */
7321             for (field = TYPE_FIELDS (type);
7322                  field;
7323                  field = DECL_CHAIN (field))
7324               {
7325                 if (TREE_CODE (field) == FIELD_DECL
7326                     && ix86_contains_aligned_value_p (TREE_TYPE (field)))
7327                   return true;
7328               }
7329             break;
7330           }
7331
7332         case ARRAY_TYPE:
7333           /* Just for use if some languages passes arrays by value.  */
7334           if (ix86_contains_aligned_value_p (TREE_TYPE (type)))
7335             return true;
7336           break;
7337
7338         default:
7339           gcc_unreachable ();
7340         }
7341     }
7342   else
7343     return TYPE_ALIGN (type) >= 128;
7344
7345   return false;
7346 }
7347
7348 /* Gives the alignment boundary, in bits, of an argument with the
7349    specified mode and type.  */
7350
7351 static unsigned int
7352 ix86_function_arg_boundary (enum machine_mode mode, const_tree type)
7353 {
7354   unsigned int align;
7355   if (type)
7356     {
7357       /* Since the main variant type is used for call, we convert it to
7358          the main variant type.  */
7359       type = TYPE_MAIN_VARIANT (type);
7360       align = TYPE_ALIGN (type);
7361     }
7362   else
7363     align = GET_MODE_ALIGNMENT (mode);
7364   if (align < PARM_BOUNDARY)
7365     align = PARM_BOUNDARY;
7366   else
7367     {
7368       static bool warned;
7369       unsigned int saved_align = align;
7370
7371       if (!TARGET_64BIT)
7372         {
7373           /* i386 ABI defines XFmode arguments to be 4 byte aligned.  */
7374           if (!type)
7375             {
7376               if (mode == XFmode || mode == XCmode)
7377                 align = PARM_BOUNDARY;
7378             }
7379           else if (!ix86_contains_aligned_value_p (type))
7380             align = PARM_BOUNDARY;
7381
7382           if (align < 128)
7383             align = PARM_BOUNDARY;
7384         }
7385
7386       if (warn_psabi
7387           && !warned
7388           && align != ix86_compat_function_arg_boundary (mode, type,
7389                                                          saved_align))
7390         {
7391           warned = true;
7392           inform (input_location,
7393                   "The ABI for passing parameters with %d-byte"
7394                   " alignment has changed in GCC 4.6",
7395                   align / BITS_PER_UNIT);
7396         }
7397     }
7398
7399   return align;
7400 }
7401
7402 /* Return true if N is a possible register number of function value.  */
7403
7404 static bool
7405 ix86_function_value_regno_p (const unsigned int regno)
7406 {
7407   switch (regno)
7408     {
7409     case 0:
7410       return true;
7411
7412     case FIRST_FLOAT_REG:
7413       /* TODO: The function should depend on current function ABI but
7414        builtins.c would need updating then. Therefore we use the
7415        default ABI.  */
7416       if (TARGET_64BIT && ix86_abi == MS_ABI)
7417         return false;
7418       return TARGET_FLOAT_RETURNS_IN_80387;
7419
7420     case FIRST_SSE_REG:
7421       return TARGET_SSE;
7422
7423     case FIRST_MMX_REG:
7424       if (TARGET_MACHO || TARGET_64BIT)
7425         return false;
7426       return TARGET_MMX;
7427     }
7428
7429   return false;
7430 }
7431
7432 /* Define how to find the value returned by a function.
7433    VALTYPE is the data type of the value (as a tree).
7434    If the precise function being called is known, FUNC is its FUNCTION_DECL;
7435    otherwise, FUNC is 0.  */
7436
7437 static rtx
7438 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
7439                    const_tree fntype, const_tree fn)
7440 {
7441   unsigned int regno;
7442
7443   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
7444      we normally prevent this case when mmx is not available.  However
7445      some ABIs may require the result to be returned like DImode.  */
7446   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
7447     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
7448
7449   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
7450      we prevent this case when sse is not available.  However some ABIs
7451      may require the result to be returned like integer TImode.  */
7452   else if (mode == TImode
7453            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
7454     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
7455
7456   /* 32-byte vector modes in %ymm0.   */
7457   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
7458     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
7459
7460   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
7461   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
7462     regno = FIRST_FLOAT_REG;
7463   else
7464     /* Most things go in %eax.  */
7465     regno = AX_REG;
7466
7467   /* Override FP return register with %xmm0 for local functions when
7468      SSE math is enabled or for functions with sseregparm attribute.  */
7469   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
7470     {
7471       int sse_level = ix86_function_sseregparm (fntype, fn, false);
7472       if ((sse_level >= 1 && mode == SFmode)
7473           || (sse_level == 2 && mode == DFmode))
7474         regno = FIRST_SSE_REG;
7475     }
7476
7477   /* OImode shouldn't be used directly.  */
7478   gcc_assert (mode != OImode);
7479
7480   return gen_rtx_REG (orig_mode, regno);
7481 }
7482
7483 static rtx
7484 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
7485                    const_tree valtype)
7486 {
7487   rtx ret;
7488
7489   /* Handle libcalls, which don't provide a type node.  */
7490   if (valtype == NULL)
7491     {
7492       switch (mode)
7493         {
7494         case SFmode:
7495         case SCmode:
7496         case DFmode:
7497         case DCmode:
7498         case TFmode:
7499         case SDmode:
7500         case DDmode:
7501         case TDmode:
7502           return gen_rtx_REG (mode, FIRST_SSE_REG);
7503         case XFmode:
7504         case XCmode:
7505           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
7506         case TCmode:
7507           return NULL;
7508         default:
7509           return gen_rtx_REG (mode, AX_REG);
7510         }
7511     }
7512
7513   ret = construct_container (mode, orig_mode, valtype, 1,
7514                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
7515                              x86_64_int_return_registers, 0);
7516
7517   /* For zero sized structures, construct_container returns NULL, but we
7518      need to keep rest of compiler happy by returning meaningful value.  */
7519   if (!ret)
7520     ret = gen_rtx_REG (orig_mode, AX_REG);
7521
7522   return ret;
7523 }
7524
7525 static rtx
7526 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
7527 {
7528   unsigned int regno = AX_REG;
7529
7530   if (TARGET_SSE)
7531     {
7532       switch (GET_MODE_SIZE (mode))
7533         {
7534         case 16:
7535           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
7536              && !COMPLEX_MODE_P (mode))
7537             regno = FIRST_SSE_REG;
7538           break;
7539         case 8:
7540         case 4:
7541           if (mode == SFmode || mode == DFmode)
7542             regno = FIRST_SSE_REG;
7543           break;
7544         default:
7545           break;
7546         }
7547     }
7548   return gen_rtx_REG (orig_mode, regno);
7549 }
7550
7551 static rtx
7552 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
7553                        enum machine_mode orig_mode, enum machine_mode mode)
7554 {
7555   const_tree fn, fntype;
7556
7557   fn = NULL_TREE;
7558   if (fntype_or_decl && DECL_P (fntype_or_decl))
7559     fn = fntype_or_decl;
7560   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
7561
7562   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
7563     return function_value_ms_64 (orig_mode, mode);
7564   else if (TARGET_64BIT)
7565     return function_value_64 (orig_mode, mode, valtype);
7566   else
7567     return function_value_32 (orig_mode, mode, fntype, fn);
7568 }
7569
7570 static rtx
7571 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
7572                      bool outgoing ATTRIBUTE_UNUSED)
7573 {
7574   enum machine_mode mode, orig_mode;
7575
7576   orig_mode = TYPE_MODE (valtype);
7577   mode = type_natural_mode (valtype, NULL);
7578   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
7579 }
7580
7581 rtx
7582 ix86_libcall_value (enum machine_mode mode)
7583 {
7584   return ix86_function_value_1 (NULL, NULL, mode, mode);
7585 }
7586
7587 /* Return true iff type is returned in memory.  */
7588
7589 static bool ATTRIBUTE_UNUSED
7590 return_in_memory_32 (const_tree type, enum machine_mode mode)
7591 {
7592   HOST_WIDE_INT size;
7593
7594   if (mode == BLKmode)
7595     return true;
7596
7597   size = int_size_in_bytes (type);
7598
7599   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
7600     return false;
7601
7602   if (VECTOR_MODE_P (mode) || mode == TImode)
7603     {
7604       /* User-created vectors small enough to fit in EAX.  */
7605       if (size < 8)
7606         return false;
7607
7608       /* MMX/3dNow values are returned in MM0,
7609          except when it doesn't exits or the ABI prescribes otherwise.  */
7610       if (size == 8)
7611         return !TARGET_MMX || TARGET_VECT8_RETURNS;
7612
7613       /* SSE values are returned in XMM0, except when it doesn't exist.  */
7614       if (size == 16)
7615         return !TARGET_SSE;
7616
7617       /* AVX values are returned in YMM0, except when it doesn't exist.  */
7618       if (size == 32)
7619         return !TARGET_AVX;
7620     }
7621
7622   if (mode == XFmode)
7623     return false;
7624
7625   if (size > 12)
7626     return true;
7627
7628   /* OImode shouldn't be used directly.  */
7629   gcc_assert (mode != OImode);
7630
7631   return false;
7632 }
7633
7634 static bool ATTRIBUTE_UNUSED
7635 return_in_memory_64 (const_tree type, enum machine_mode mode)
7636 {
7637   int needed_intregs, needed_sseregs;
7638   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
7639 }
7640
7641 static bool ATTRIBUTE_UNUSED
7642 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
7643 {
7644   HOST_WIDE_INT size = int_size_in_bytes (type);
7645
7646   /* __m128 is returned in xmm0.  */
7647   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
7648       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
7649     return false;
7650
7651   /* Otherwise, the size must be exactly in [1248]. */
7652   return size != 1 && size != 2 && size != 4 && size != 8;
7653 }
7654
7655 static bool
7656 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7657 {
7658 #ifdef SUBTARGET_RETURN_IN_MEMORY
7659   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
7660 #else
7661   const enum machine_mode mode = type_natural_mode (type, NULL);
7662
7663   if (TARGET_64BIT)
7664     {
7665       if (ix86_function_type_abi (fntype) == MS_ABI)
7666         return return_in_memory_ms_64 (type, mode);
7667       else
7668         return return_in_memory_64 (type, mode);
7669     }
7670   else
7671     return return_in_memory_32 (type, mode);
7672 #endif
7673 }
7674
7675 /* When returning SSE vector types, we have a choice of either
7676      (1) being abi incompatible with a -march switch, or
7677      (2) generating an error.
7678    Given no good solution, I think the safest thing is one warning.
7679    The user won't be able to use -Werror, but....
7680
7681    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
7682    called in response to actually generating a caller or callee that
7683    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
7684    via aggregate_value_p for general type probing from tree-ssa.  */
7685
7686 static rtx
7687 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
7688 {
7689   static bool warnedsse, warnedmmx;
7690
7691   if (!TARGET_64BIT && type)
7692     {
7693       /* Look at the return type of the function, not the function type.  */
7694       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
7695
7696       if (!TARGET_SSE && !warnedsse)
7697         {
7698           if (mode == TImode
7699               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
7700             {
7701               warnedsse = true;
7702               warning (0, "SSE vector return without SSE enabled "
7703                        "changes the ABI");
7704             }
7705         }
7706
7707       if (!TARGET_MMX && !warnedmmx)
7708         {
7709           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
7710             {
7711               warnedmmx = true;
7712               warning (0, "MMX vector return without MMX enabled "
7713                        "changes the ABI");
7714             }
7715         }
7716     }
7717
7718   return NULL;
7719 }
7720
7721 \f
7722 /* Create the va_list data type.  */
7723
7724 /* Returns the calling convention specific va_list date type.
7725    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
7726
7727 static tree
7728 ix86_build_builtin_va_list_abi (enum calling_abi abi)
7729 {
7730   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
7731
7732   /* For i386 we use plain pointer to argument area.  */
7733   if (!TARGET_64BIT || abi == MS_ABI)
7734     return build_pointer_type (char_type_node);
7735
7736   record = lang_hooks.types.make_type (RECORD_TYPE);
7737   type_decl = build_decl (BUILTINS_LOCATION,
7738                           TYPE_DECL, get_identifier ("__va_list_tag"), record);
7739
7740   f_gpr = build_decl (BUILTINS_LOCATION,
7741                       FIELD_DECL, get_identifier ("gp_offset"),
7742                       unsigned_type_node);
7743   f_fpr = build_decl (BUILTINS_LOCATION,
7744                       FIELD_DECL, get_identifier ("fp_offset"),
7745                       unsigned_type_node);
7746   f_ovf = build_decl (BUILTINS_LOCATION,
7747                       FIELD_DECL, get_identifier ("overflow_arg_area"),
7748                       ptr_type_node);
7749   f_sav = build_decl (BUILTINS_LOCATION,
7750                       FIELD_DECL, get_identifier ("reg_save_area"),
7751                       ptr_type_node);
7752
7753   va_list_gpr_counter_field = f_gpr;
7754   va_list_fpr_counter_field = f_fpr;
7755
7756   DECL_FIELD_CONTEXT (f_gpr) = record;
7757   DECL_FIELD_CONTEXT (f_fpr) = record;
7758   DECL_FIELD_CONTEXT (f_ovf) = record;
7759   DECL_FIELD_CONTEXT (f_sav) = record;
7760
7761   TYPE_STUB_DECL (record) = type_decl;
7762   TYPE_NAME (record) = type_decl;
7763   TYPE_FIELDS (record) = f_gpr;
7764   DECL_CHAIN (f_gpr) = f_fpr;
7765   DECL_CHAIN (f_fpr) = f_ovf;
7766   DECL_CHAIN (f_ovf) = f_sav;
7767
7768   layout_type (record);
7769
7770   /* The correct type is an array type of one element.  */
7771   return build_array_type (record, build_index_type (size_zero_node));
7772 }
7773
7774 /* Setup the builtin va_list data type and for 64-bit the additional
7775    calling convention specific va_list data types.  */
7776
7777 static tree
7778 ix86_build_builtin_va_list (void)
7779 {
7780   tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
7781
7782   /* Initialize abi specific va_list builtin types.  */
7783   if (TARGET_64BIT)
7784     {
7785       tree t;
7786       if (ix86_abi == MS_ABI)
7787         {
7788           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
7789           if (TREE_CODE (t) != RECORD_TYPE)
7790             t = build_variant_type_copy (t);
7791           sysv_va_list_type_node = t;
7792         }
7793       else
7794         {
7795           t = ret;
7796           if (TREE_CODE (t) != RECORD_TYPE)
7797             t = build_variant_type_copy (t);
7798           sysv_va_list_type_node = t;
7799         }
7800       if (ix86_abi != MS_ABI)
7801         {
7802           t = ix86_build_builtin_va_list_abi (MS_ABI);
7803           if (TREE_CODE (t) != RECORD_TYPE)
7804             t = build_variant_type_copy (t);
7805           ms_va_list_type_node = t;
7806         }
7807       else
7808         {
7809           t = ret;
7810           if (TREE_CODE (t) != RECORD_TYPE)
7811             t = build_variant_type_copy (t);
7812           ms_va_list_type_node = t;
7813         }
7814     }
7815
7816   return ret;
7817 }
7818
7819 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
7820
7821 static void
7822 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
7823 {
7824   rtx save_area, mem;
7825   alias_set_type set;
7826   int i, max;
7827
7828   /* GPR size of varargs save area.  */
7829   if (cfun->va_list_gpr_size)
7830     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
7831   else
7832     ix86_varargs_gpr_size = 0;
7833
7834   /* FPR size of varargs save area.  We don't need it if we don't pass
7835      anything in SSE registers.  */
7836   if (TARGET_SSE && cfun->va_list_fpr_size)
7837     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
7838   else
7839     ix86_varargs_fpr_size = 0;
7840
7841   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
7842     return;
7843
7844   save_area = frame_pointer_rtx;
7845   set = get_varargs_alias_set ();
7846
7847   max = cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
7848   if (max > X86_64_REGPARM_MAX)
7849     max = X86_64_REGPARM_MAX;
7850
7851   for (i = cum->regno; i < max; i++)
7852     {
7853       mem = gen_rtx_MEM (Pmode,
7854                          plus_constant (save_area, i * UNITS_PER_WORD));
7855       MEM_NOTRAP_P (mem) = 1;
7856       set_mem_alias_set (mem, set);
7857       emit_move_insn (mem, gen_rtx_REG (Pmode,
7858                                         x86_64_int_parameter_registers[i]));
7859     }
7860
7861   if (ix86_varargs_fpr_size)
7862     {
7863       enum machine_mode smode;
7864       rtx label, test;
7865
7866       /* Now emit code to save SSE registers.  The AX parameter contains number
7867          of SSE parameter registers used to call this function, though all we
7868          actually check here is the zero/non-zero status.  */
7869
7870       label = gen_label_rtx ();
7871       test = gen_rtx_EQ (VOIDmode, gen_rtx_REG (QImode, AX_REG), const0_rtx);
7872       emit_jump_insn (gen_cbranchqi4 (test, XEXP (test, 0), XEXP (test, 1),
7873                                       label));
7874
7875       /* ??? If !TARGET_SSE_TYPELESS_STORES, would we perform better if
7876          we used movdqa (i.e. TImode) instead?  Perhaps even better would
7877          be if we could determine the real mode of the data, via a hook
7878          into pass_stdarg.  Ignore all that for now.  */
7879       smode = V4SFmode;
7880       if (crtl->stack_alignment_needed < GET_MODE_ALIGNMENT (smode))
7881         crtl->stack_alignment_needed = GET_MODE_ALIGNMENT (smode);
7882
7883       max = cum->sse_regno + cfun->va_list_fpr_size / 16;
7884       if (max > X86_64_SSE_REGPARM_MAX)
7885         max = X86_64_SSE_REGPARM_MAX;
7886
7887       for (i = cum->sse_regno; i < max; ++i)
7888         {
7889           mem = plus_constant (save_area, i * 16 + ix86_varargs_gpr_size);
7890           mem = gen_rtx_MEM (smode, mem);
7891           MEM_NOTRAP_P (mem) = 1;
7892           set_mem_alias_set (mem, set);
7893           set_mem_align (mem, GET_MODE_ALIGNMENT (smode));
7894
7895           emit_move_insn (mem, gen_rtx_REG (smode, SSE_REGNO (i)));
7896         }
7897
7898       emit_label (label);
7899     }
7900 }
7901
7902 static void
7903 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
7904 {
7905   alias_set_type set = get_varargs_alias_set ();
7906   int i;
7907
7908   for (i = cum->regno; i < X86_64_MS_REGPARM_MAX; i++)
7909     {
7910       rtx reg, mem;
7911
7912       mem = gen_rtx_MEM (Pmode,
7913                          plus_constant (virtual_incoming_args_rtx,
7914                                         i * UNITS_PER_WORD));
7915       MEM_NOTRAP_P (mem) = 1;
7916       set_mem_alias_set (mem, set);
7917
7918       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
7919       emit_move_insn (mem, reg);
7920     }
7921 }
7922
7923 static void
7924 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
7925                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
7926                              int no_rtl)
7927 {
7928   CUMULATIVE_ARGS next_cum;
7929   tree fntype;
7930
7931   /* This argument doesn't appear to be used anymore.  Which is good,
7932      because the old code here didn't suppress rtl generation.  */
7933   gcc_assert (!no_rtl);
7934
7935   if (!TARGET_64BIT)
7936     return;
7937
7938   fntype = TREE_TYPE (current_function_decl);
7939
7940   /* For varargs, we do not want to skip the dummy va_dcl argument.
7941      For stdargs, we do want to skip the last named argument.  */
7942   next_cum = *cum;
7943   if (stdarg_p (fntype))
7944     ix86_function_arg_advance (&next_cum, mode, type, true);
7945
7946   if (cum->call_abi == MS_ABI)
7947     setup_incoming_varargs_ms_64 (&next_cum);
7948   else
7949     setup_incoming_varargs_64 (&next_cum);
7950 }
7951
7952 /* Checks if TYPE is of kind va_list char *.  */
7953
7954 static bool
7955 is_va_list_char_pointer (tree type)
7956 {
7957   tree canonic;
7958
7959   /* For 32-bit it is always true.  */
7960   if (!TARGET_64BIT)
7961     return true;
7962   canonic = ix86_canonical_va_list_type (type);
7963   return (canonic == ms_va_list_type_node
7964           || (ix86_abi == MS_ABI && canonic == va_list_type_node));
7965 }
7966
7967 /* Implement va_start.  */
7968
7969 static void
7970 ix86_va_start (tree valist, rtx nextarg)
7971 {
7972   HOST_WIDE_INT words, n_gpr, n_fpr;
7973   tree f_gpr, f_fpr, f_ovf, f_sav;
7974   tree gpr, fpr, ovf, sav, t;
7975   tree type;
7976   rtx ovf_rtx;
7977
7978   if (flag_split_stack
7979       && cfun->machine->split_stack_varargs_pointer == NULL_RTX)
7980     {
7981       unsigned int scratch_regno;
7982
7983       /* When we are splitting the stack, we can't refer to the stack
7984          arguments using internal_arg_pointer, because they may be on
7985          the old stack.  The split stack prologue will arrange to
7986          leave a pointer to the old stack arguments in a scratch
7987          register, which we here copy to a pseudo-register.  The split
7988          stack prologue can't set the pseudo-register directly because
7989          it (the prologue) runs before any registers have been saved.  */
7990
7991       scratch_regno = split_stack_prologue_scratch_regno ();
7992       if (scratch_regno != INVALID_REGNUM)
7993         {
7994           rtx reg, seq;
7995
7996           reg = gen_reg_rtx (Pmode);
7997           cfun->machine->split_stack_varargs_pointer = reg;
7998
7999           start_sequence ();
8000           emit_move_insn (reg, gen_rtx_REG (Pmode, scratch_regno));
8001           seq = get_insns ();
8002           end_sequence ();
8003
8004           push_topmost_sequence ();
8005           emit_insn_after (seq, entry_of_function ());
8006           pop_topmost_sequence ();
8007         }
8008     }
8009
8010   /* Only 64bit target needs something special.  */
8011   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
8012     {
8013       if (cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8014         std_expand_builtin_va_start (valist, nextarg);
8015       else
8016         {
8017           rtx va_r, next;
8018
8019           va_r = expand_expr (valist, NULL_RTX, VOIDmode, EXPAND_WRITE);
8020           next = expand_binop (ptr_mode, add_optab,
8021                                cfun->machine->split_stack_varargs_pointer,
8022                                crtl->args.arg_offset_rtx,
8023                                NULL_RTX, 0, OPTAB_LIB_WIDEN);
8024           convert_move (va_r, next, 0);
8025         }
8026       return;
8027     }
8028
8029   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
8030   f_fpr = DECL_CHAIN (f_gpr);
8031   f_ovf = DECL_CHAIN (f_fpr);
8032   f_sav = DECL_CHAIN (f_ovf);
8033
8034   valist = build_simple_mem_ref (valist);
8035   TREE_TYPE (valist) = TREE_TYPE (sysv_va_list_type_node);
8036   /* The following should be folded into the MEM_REF offset.  */
8037   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), unshare_expr (valist),
8038                 f_gpr, NULL_TREE);
8039   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
8040                 f_fpr, NULL_TREE);
8041   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
8042                 f_ovf, NULL_TREE);
8043   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
8044                 f_sav, NULL_TREE);
8045
8046   /* Count number of gp and fp argument registers used.  */
8047   words = crtl->args.info.words;
8048   n_gpr = crtl->args.info.regno;
8049   n_fpr = crtl->args.info.sse_regno;
8050
8051   if (cfun->va_list_gpr_size)
8052     {
8053       type = TREE_TYPE (gpr);
8054       t = build2 (MODIFY_EXPR, type,
8055                   gpr, build_int_cst (type, n_gpr * 8));
8056       TREE_SIDE_EFFECTS (t) = 1;
8057       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8058     }
8059
8060   if (TARGET_SSE && cfun->va_list_fpr_size)
8061     {
8062       type = TREE_TYPE (fpr);
8063       t = build2 (MODIFY_EXPR, type, fpr,
8064                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
8065       TREE_SIDE_EFFECTS (t) = 1;
8066       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8067     }
8068
8069   /* Find the overflow area.  */
8070   type = TREE_TYPE (ovf);
8071   if (cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8072     ovf_rtx = crtl->args.internal_arg_pointer;
8073   else
8074     ovf_rtx = cfun->machine->split_stack_varargs_pointer;
8075   t = make_tree (type, ovf_rtx);
8076   if (words != 0)
8077     t = build2 (POINTER_PLUS_EXPR, type, t,
8078                 size_int (words * UNITS_PER_WORD));
8079   t = build2 (MODIFY_EXPR, type, ovf, t);
8080   TREE_SIDE_EFFECTS (t) = 1;
8081   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8082
8083   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
8084     {
8085       /* Find the register save area.
8086          Prologue of the function save it right above stack frame.  */
8087       type = TREE_TYPE (sav);
8088       t = make_tree (type, frame_pointer_rtx);
8089       if (!ix86_varargs_gpr_size)
8090         t = build2 (POINTER_PLUS_EXPR, type, t,
8091                     size_int (-8 * X86_64_REGPARM_MAX));
8092       t = build2 (MODIFY_EXPR, type, sav, t);
8093       TREE_SIDE_EFFECTS (t) = 1;
8094       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8095     }
8096 }
8097
8098 /* Implement va_arg.  */
8099
8100 static tree
8101 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
8102                       gimple_seq *post_p)
8103 {
8104   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
8105   tree f_gpr, f_fpr, f_ovf, f_sav;
8106   tree gpr, fpr, ovf, sav, t;
8107   int size, rsize;
8108   tree lab_false, lab_over = NULL_TREE;
8109   tree addr, t2;
8110   rtx container;
8111   int indirect_p = 0;
8112   tree ptrtype;
8113   enum machine_mode nat_mode;
8114   unsigned int arg_boundary;
8115
8116   /* Only 64bit target needs something special.  */
8117   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
8118     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
8119
8120   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
8121   f_fpr = DECL_CHAIN (f_gpr);
8122   f_ovf = DECL_CHAIN (f_fpr);
8123   f_sav = DECL_CHAIN (f_ovf);
8124
8125   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
8126                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
8127   valist = build_va_arg_indirect_ref (valist);
8128   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
8129   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
8130   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
8131
8132   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
8133   if (indirect_p)
8134     type = build_pointer_type (type);
8135   size = int_size_in_bytes (type);
8136   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8137
8138   nat_mode = type_natural_mode (type, NULL);
8139   switch (nat_mode)
8140     {
8141     case V8SFmode:
8142     case V8SImode:
8143     case V32QImode:
8144     case V16HImode:
8145     case V4DFmode:
8146     case V4DImode:
8147       /* Unnamed 256bit vector mode parameters are passed on stack.  */
8148       if (!TARGET_64BIT_MS_ABI)
8149         {
8150           container = NULL;
8151           break;
8152         }
8153
8154     default:
8155       container = construct_container (nat_mode, TYPE_MODE (type),
8156                                        type, 0, X86_64_REGPARM_MAX,
8157                                        X86_64_SSE_REGPARM_MAX, intreg,
8158                                        0);
8159       break;
8160     }
8161
8162   /* Pull the value out of the saved registers.  */
8163
8164   addr = create_tmp_var (ptr_type_node, "addr");
8165
8166   if (container)
8167     {
8168       int needed_intregs, needed_sseregs;
8169       bool need_temp;
8170       tree int_addr, sse_addr;
8171
8172       lab_false = create_artificial_label (UNKNOWN_LOCATION);
8173       lab_over = create_artificial_label (UNKNOWN_LOCATION);
8174
8175       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
8176
8177       need_temp = (!REG_P (container)
8178                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
8179                        || TYPE_ALIGN (type) > 128));
8180
8181       /* In case we are passing structure, verify that it is consecutive block
8182          on the register save area.  If not we need to do moves.  */
8183       if (!need_temp && !REG_P (container))
8184         {
8185           /* Verify that all registers are strictly consecutive  */
8186           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
8187             {
8188               int i;
8189
8190               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
8191                 {
8192                   rtx slot = XVECEXP (container, 0, i);
8193                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
8194                       || INTVAL (XEXP (slot, 1)) != i * 16)
8195                     need_temp = 1;
8196                 }
8197             }
8198           else
8199             {
8200               int i;
8201
8202               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
8203                 {
8204                   rtx slot = XVECEXP (container, 0, i);
8205                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
8206                       || INTVAL (XEXP (slot, 1)) != i * 8)
8207                     need_temp = 1;
8208                 }
8209             }
8210         }
8211       if (!need_temp)
8212         {
8213           int_addr = addr;
8214           sse_addr = addr;
8215         }
8216       else
8217         {
8218           int_addr = create_tmp_var (ptr_type_node, "int_addr");
8219           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
8220         }
8221
8222       /* First ensure that we fit completely in registers.  */
8223       if (needed_intregs)
8224         {
8225           t = build_int_cst (TREE_TYPE (gpr),
8226                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
8227           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
8228           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
8229           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
8230           gimplify_and_add (t, pre_p);
8231         }
8232       if (needed_sseregs)
8233         {
8234           t = build_int_cst (TREE_TYPE (fpr),
8235                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
8236                              + X86_64_REGPARM_MAX * 8);
8237           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
8238           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
8239           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
8240           gimplify_and_add (t, pre_p);
8241         }
8242
8243       /* Compute index to start of area used for integer regs.  */
8244       if (needed_intregs)
8245         {
8246           /* int_addr = gpr + sav; */
8247           t = fold_convert (sizetype, gpr);
8248           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
8249           gimplify_assign (int_addr, t, pre_p);
8250         }
8251       if (needed_sseregs)
8252         {
8253           /* sse_addr = fpr + sav; */
8254           t = fold_convert (sizetype, fpr);
8255           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
8256           gimplify_assign (sse_addr, t, pre_p);
8257         }
8258       if (need_temp)
8259         {
8260           int i, prev_size = 0;
8261           tree temp = create_tmp_var (type, "va_arg_tmp");
8262
8263           /* addr = &temp; */
8264           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
8265           gimplify_assign (addr, t, pre_p);
8266
8267           for (i = 0; i < XVECLEN (container, 0); i++)
8268             {
8269               rtx slot = XVECEXP (container, 0, i);
8270               rtx reg = XEXP (slot, 0);
8271               enum machine_mode mode = GET_MODE (reg);
8272               tree piece_type;
8273               tree addr_type;
8274               tree daddr_type;
8275               tree src_addr, src;
8276               int src_offset;
8277               tree dest_addr, dest;
8278               int cur_size = GET_MODE_SIZE (mode);
8279
8280               gcc_assert (prev_size <= INTVAL (XEXP (slot, 1)));
8281               prev_size = INTVAL (XEXP (slot, 1));
8282               if (prev_size + cur_size > size)
8283                 {
8284                   cur_size = size - prev_size;
8285                   mode = mode_for_size (cur_size * BITS_PER_UNIT, MODE_INT, 1);
8286                   if (mode == BLKmode)
8287                     mode = QImode;
8288                 }
8289               piece_type = lang_hooks.types.type_for_mode (mode, 1);
8290               if (mode == GET_MODE (reg))
8291                 addr_type = build_pointer_type (piece_type);
8292               else
8293                 addr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
8294                                                          true);
8295               daddr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
8296                                                         true);
8297
8298               if (SSE_REGNO_P (REGNO (reg)))
8299                 {
8300                   src_addr = sse_addr;
8301                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
8302                 }
8303               else
8304                 {
8305                   src_addr = int_addr;
8306                   src_offset = REGNO (reg) * 8;
8307                 }
8308               src_addr = fold_convert (addr_type, src_addr);
8309               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
8310                                       size_int (src_offset));
8311
8312               dest_addr = fold_convert (daddr_type, addr);
8313               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
8314                                        size_int (prev_size));
8315               if (cur_size == GET_MODE_SIZE (mode))
8316                 {
8317                   src = build_va_arg_indirect_ref (src_addr);
8318                   dest = build_va_arg_indirect_ref (dest_addr);
8319
8320                   gimplify_assign (dest, src, pre_p);
8321                 }
8322               else
8323                 {
8324                   tree copy
8325                     = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
8326                                        3, dest_addr, src_addr,
8327                                        size_int (cur_size));
8328                   gimplify_and_add (copy, pre_p);
8329                 }
8330               prev_size += cur_size;
8331             }
8332         }
8333
8334       if (needed_intregs)
8335         {
8336           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
8337                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
8338           gimplify_assign (gpr, t, pre_p);
8339         }
8340
8341       if (needed_sseregs)
8342         {
8343           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
8344                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
8345           gimplify_assign (fpr, t, pre_p);
8346         }
8347
8348       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
8349
8350       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
8351     }
8352
8353   /* ... otherwise out of the overflow area.  */
8354
8355   /* When we align parameter on stack for caller, if the parameter
8356      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
8357      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
8358      here with caller.  */
8359   arg_boundary = ix86_function_arg_boundary (VOIDmode, type);
8360   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
8361     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
8362
8363   /* Care for on-stack alignment if needed.  */
8364   if (arg_boundary <= 64 || size == 0)
8365     t = ovf;
8366  else
8367     {
8368       HOST_WIDE_INT align = arg_boundary / 8;
8369       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
8370                   size_int (align - 1));
8371       t = fold_convert (sizetype, t);
8372       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
8373                   size_int (-align));
8374       t = fold_convert (TREE_TYPE (ovf), t);
8375     }
8376
8377   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
8378   gimplify_assign (addr, t, pre_p);
8379
8380   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
8381               size_int (rsize * UNITS_PER_WORD));
8382   gimplify_assign (unshare_expr (ovf), t, pre_p);
8383
8384   if (container)
8385     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
8386
8387   ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
8388   addr = fold_convert (ptrtype, addr);
8389
8390   if (indirect_p)
8391     addr = build_va_arg_indirect_ref (addr);
8392   return build_va_arg_indirect_ref (addr);
8393 }
8394 \f
8395 /* Return true if OPNUM's MEM should be matched
8396    in movabs* patterns.  */
8397
8398 bool
8399 ix86_check_movabs (rtx insn, int opnum)
8400 {
8401   rtx set, mem;
8402
8403   set = PATTERN (insn);
8404   if (GET_CODE (set) == PARALLEL)
8405     set = XVECEXP (set, 0, 0);
8406   gcc_assert (GET_CODE (set) == SET);
8407   mem = XEXP (set, opnum);
8408   while (GET_CODE (mem) == SUBREG)
8409     mem = SUBREG_REG (mem);
8410   gcc_assert (MEM_P (mem));
8411   return volatile_ok || !MEM_VOLATILE_P (mem);
8412 }
8413 \f
8414 /* Initialize the table of extra 80387 mathematical constants.  */
8415
8416 static void
8417 init_ext_80387_constants (void)
8418 {
8419   static const char * cst[5] =
8420   {
8421     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
8422     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
8423     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
8424     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
8425     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
8426   };
8427   int i;
8428
8429   for (i = 0; i < 5; i++)
8430     {
8431       real_from_string (&ext_80387_constants_table[i], cst[i]);
8432       /* Ensure each constant is rounded to XFmode precision.  */
8433       real_convert (&ext_80387_constants_table[i],
8434                     XFmode, &ext_80387_constants_table[i]);
8435     }
8436
8437   ext_80387_constants_init = 1;
8438 }
8439
8440 /* Return non-zero if the constant is something that
8441    can be loaded with a special instruction.  */
8442
8443 int
8444 standard_80387_constant_p (rtx x)
8445 {
8446   enum machine_mode mode = GET_MODE (x);
8447
8448   REAL_VALUE_TYPE r;
8449
8450   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
8451     return -1;
8452
8453   if (x == CONST0_RTX (mode))
8454     return 1;
8455   if (x == CONST1_RTX (mode))
8456     return 2;
8457
8458   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
8459
8460   /* For XFmode constants, try to find a special 80387 instruction when
8461      optimizing for size or on those CPUs that benefit from them.  */
8462   if (mode == XFmode
8463       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
8464     {
8465       int i;
8466
8467       if (! ext_80387_constants_init)
8468         init_ext_80387_constants ();
8469
8470       for (i = 0; i < 5; i++)
8471         if (real_identical (&r, &ext_80387_constants_table[i]))
8472           return i + 3;
8473     }
8474
8475   /* Load of the constant -0.0 or -1.0 will be split as
8476      fldz;fchs or fld1;fchs sequence.  */
8477   if (real_isnegzero (&r))
8478     return 8;
8479   if (real_identical (&r, &dconstm1))
8480     return 9;
8481
8482   return 0;
8483 }
8484
8485 /* Return the opcode of the special instruction to be used to load
8486    the constant X.  */
8487
8488 const char *
8489 standard_80387_constant_opcode (rtx x)
8490 {
8491   switch (standard_80387_constant_p (x))
8492     {
8493     case 1:
8494       return "fldz";
8495     case 2:
8496       return "fld1";
8497     case 3:
8498       return "fldlg2";
8499     case 4:
8500       return "fldln2";
8501     case 5:
8502       return "fldl2e";
8503     case 6:
8504       return "fldl2t";
8505     case 7:
8506       return "fldpi";
8507     case 8:
8508     case 9:
8509       return "#";
8510     default:
8511       gcc_unreachable ();
8512     }
8513 }
8514
8515 /* Return the CONST_DOUBLE representing the 80387 constant that is
8516    loaded by the specified special instruction.  The argument IDX
8517    matches the return value from standard_80387_constant_p.  */
8518
8519 rtx
8520 standard_80387_constant_rtx (int idx)
8521 {
8522   int i;
8523
8524   if (! ext_80387_constants_init)
8525     init_ext_80387_constants ();
8526
8527   switch (idx)
8528     {
8529     case 3:
8530     case 4:
8531     case 5:
8532     case 6:
8533     case 7:
8534       i = idx - 3;
8535       break;
8536
8537     default:
8538       gcc_unreachable ();
8539     }
8540
8541   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
8542                                        XFmode);
8543 }
8544
8545 /* Return 1 if X is all 0s and 2 if x is all 1s
8546    in supported SSE vector mode.  */
8547
8548 int
8549 standard_sse_constant_p (rtx x)
8550 {
8551   enum machine_mode mode = GET_MODE (x);
8552
8553   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
8554     return 1;
8555   if (vector_all_ones_operand (x, mode))
8556     switch (mode)
8557       {
8558       case V16QImode:
8559       case V8HImode:
8560       case V4SImode:
8561       case V2DImode:
8562         if (TARGET_SSE2)
8563           return 2;
8564       default:
8565         break;
8566       }
8567
8568   return 0;
8569 }
8570
8571 /* Return the opcode of the special instruction to be used to load
8572    the constant X.  */
8573
8574 const char *
8575 standard_sse_constant_opcode (rtx insn, rtx x)
8576 {
8577   switch (standard_sse_constant_p (x))
8578     {
8579     case 1:
8580       switch (get_attr_mode (insn))
8581         {
8582         case MODE_V4SF:
8583           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8584         case MODE_V2DF:
8585           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8586             return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8587           else
8588             return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
8589         case MODE_TI:
8590           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8591             return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8592           else
8593             return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
8594         case MODE_V8SF:
8595           return "vxorps\t%x0, %x0, %x0";
8596         case MODE_V4DF:
8597           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8598             return "vxorps\t%x0, %x0, %x0";
8599           else
8600             return "vxorpd\t%x0, %x0, %x0";
8601         case MODE_OI:
8602           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8603             return "vxorps\t%x0, %x0, %x0";
8604           else
8605             return "vpxor\t%x0, %x0, %x0";
8606         default:
8607           break;
8608         }
8609     case 2:
8610       return TARGET_AVX ? "vpcmpeqd\t%0, %0, %0" : "pcmpeqd\t%0, %0";
8611     default:
8612       break;
8613     }
8614   gcc_unreachable ();
8615 }
8616
8617 /* Returns true if OP contains a symbol reference */
8618
8619 bool
8620 symbolic_reference_mentioned_p (rtx op)
8621 {
8622   const char *fmt;
8623   int i;
8624
8625   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
8626     return true;
8627
8628   fmt = GET_RTX_FORMAT (GET_CODE (op));
8629   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
8630     {
8631       if (fmt[i] == 'E')
8632         {
8633           int j;
8634
8635           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
8636             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
8637               return true;
8638         }
8639
8640       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
8641         return true;
8642     }
8643
8644   return false;
8645 }
8646
8647 /* Return true if it is appropriate to emit `ret' instructions in the
8648    body of a function.  Do this only if the epilogue is simple, needing a
8649    couple of insns.  Prior to reloading, we can't tell how many registers
8650    must be saved, so return false then.  Return false if there is no frame
8651    marker to de-allocate.  */
8652
8653 bool
8654 ix86_can_use_return_insn_p (void)
8655 {
8656   struct ix86_frame frame;
8657
8658   if (! reload_completed || frame_pointer_needed)
8659     return 0;
8660
8661   /* Don't allow more than 32k pop, since that's all we can do
8662      with one instruction.  */
8663   if (crtl->args.pops_args && crtl->args.size >= 32768)
8664     return 0;
8665
8666   ix86_compute_frame_layout (&frame);
8667   return (frame.stack_pointer_offset == UNITS_PER_WORD
8668           && (frame.nregs + frame.nsseregs) == 0);
8669 }
8670 \f
8671 /* Value should be nonzero if functions must have frame pointers.
8672    Zero means the frame pointer need not be set up (and parms may
8673    be accessed via the stack pointer) in functions that seem suitable.  */
8674
8675 static bool
8676 ix86_frame_pointer_required (void)
8677 {
8678   /* If we accessed previous frames, then the generated code expects
8679      to be able to access the saved ebp value in our frame.  */
8680   if (cfun->machine->accesses_prev_frame)
8681     return true;
8682
8683   /* Several x86 os'es need a frame pointer for other reasons,
8684      usually pertaining to setjmp.  */
8685   if (SUBTARGET_FRAME_POINTER_REQUIRED)
8686     return true;
8687
8688   /* In ix86_option_override_internal, TARGET_OMIT_LEAF_FRAME_POINTER
8689      turns off the frame pointer by default.  Turn it back on now if
8690      we've not got a leaf function.  */
8691   if (TARGET_OMIT_LEAF_FRAME_POINTER
8692       && (!current_function_is_leaf
8693           || ix86_current_function_calls_tls_descriptor))
8694     return true;
8695
8696   if (crtl->profile && !flag_fentry)
8697     return true;
8698
8699   return false;
8700 }
8701
8702 /* Record that the current function accesses previous call frames.  */
8703
8704 void
8705 ix86_setup_frame_addresses (void)
8706 {
8707   cfun->machine->accesses_prev_frame = 1;
8708 }
8709 \f
8710 #ifndef USE_HIDDEN_LINKONCE
8711 # if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
8712 #  define USE_HIDDEN_LINKONCE 1
8713 # else
8714 #  define USE_HIDDEN_LINKONCE 0
8715 # endif
8716 #endif
8717
8718 static int pic_labels_used;
8719
8720 /* Fills in the label name that should be used for a pc thunk for
8721    the given register.  */
8722
8723 static void
8724 get_pc_thunk_name (char name[32], unsigned int regno)
8725 {
8726   gcc_assert (!TARGET_64BIT);
8727
8728   if (USE_HIDDEN_LINKONCE)
8729     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
8730   else
8731     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
8732 }
8733
8734
8735 /* This function generates code for -fpic that loads %ebx with
8736    the return address of the caller and then returns.  */
8737
8738 static void
8739 ix86_code_end (void)
8740 {
8741   rtx xops[2];
8742   int regno;
8743
8744   for (regno = AX_REG; regno <= SP_REG; regno++)
8745     {
8746       char name[32];
8747       tree decl;
8748
8749       if (!(pic_labels_used & (1 << regno)))
8750         continue;
8751
8752       get_pc_thunk_name (name, regno);
8753
8754       decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
8755                          get_identifier (name),
8756                          build_function_type_list (void_type_node, NULL_TREE));
8757       DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
8758                                        NULL_TREE, void_type_node);
8759       TREE_PUBLIC (decl) = 1;
8760       TREE_STATIC (decl) = 1;
8761
8762 #if TARGET_MACHO
8763       if (TARGET_MACHO)
8764         {
8765           switch_to_section (darwin_sections[text_coal_section]);
8766           fputs ("\t.weak_definition\t", asm_out_file);
8767           assemble_name (asm_out_file, name);
8768           fputs ("\n\t.private_extern\t", asm_out_file);
8769           assemble_name (asm_out_file, name);
8770           putc ('\n', asm_out_file);
8771           ASM_OUTPUT_LABEL (asm_out_file, name);
8772           DECL_WEAK (decl) = 1;
8773         }
8774       else
8775 #endif
8776       if (USE_HIDDEN_LINKONCE)
8777         {
8778           DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
8779
8780           targetm.asm_out.unique_section (decl, 0);
8781           switch_to_section (get_named_section (decl, NULL, 0));
8782
8783           targetm.asm_out.globalize_label (asm_out_file, name);
8784           fputs ("\t.hidden\t", asm_out_file);
8785           assemble_name (asm_out_file, name);
8786           putc ('\n', asm_out_file);
8787           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
8788         }
8789       else
8790         {
8791           switch_to_section (text_section);
8792           ASM_OUTPUT_LABEL (asm_out_file, name);
8793         }
8794
8795       DECL_INITIAL (decl) = make_node (BLOCK);
8796       current_function_decl = decl;
8797       init_function_start (decl);
8798       first_function_block_is_cold = false;
8799       /* Make sure unwind info is emitted for the thunk if needed.  */
8800       final_start_function (emit_barrier (), asm_out_file, 1);
8801
8802       /* Pad stack IP move with 4 instructions (two NOPs count
8803          as one instruction).  */
8804       if (TARGET_PAD_SHORT_FUNCTION)
8805         {
8806           int i = 8;
8807
8808           while (i--)
8809             fputs ("\tnop\n", asm_out_file);
8810         }
8811
8812       xops[0] = gen_rtx_REG (Pmode, regno);
8813       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
8814       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
8815       fputs ("\tret\n", asm_out_file);
8816       final_end_function ();
8817       init_insn_lengths ();
8818       free_after_compilation (cfun);
8819       set_cfun (NULL);
8820       current_function_decl = NULL;
8821     }
8822
8823   if (flag_split_stack)
8824     file_end_indicate_split_stack ();
8825 }
8826
8827 /* Emit code for the SET_GOT patterns.  */
8828
8829 const char *
8830 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
8831 {
8832   rtx xops[3];
8833
8834   xops[0] = dest;
8835
8836   if (TARGET_VXWORKS_RTP && flag_pic)
8837     {
8838       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
8839       xops[2] = gen_rtx_MEM (Pmode,
8840                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
8841       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
8842
8843       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
8844          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
8845          an unadorned address.  */
8846       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
8847       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
8848       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
8849       return "";
8850     }
8851
8852   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
8853
8854   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
8855     {
8856       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
8857
8858       if (!flag_pic)
8859         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
8860       else
8861         {
8862           output_asm_insn ("call\t%a2", xops);
8863 #ifdef DWARF2_UNWIND_INFO
8864           /* The call to next label acts as a push.  */
8865           if (dwarf2out_do_frame ())
8866             {
8867               rtx insn;
8868               start_sequence ();
8869               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8870                                              gen_rtx_PLUS (Pmode,
8871                                                            stack_pointer_rtx,
8872                                                            GEN_INT (-4))));
8873               RTX_FRAME_RELATED_P (insn) = 1;
8874               dwarf2out_frame_debug (insn, true);
8875               end_sequence ();
8876             }
8877 #endif
8878         }
8879
8880 #if TARGET_MACHO
8881       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
8882          is what will be referenced by the Mach-O PIC subsystem.  */
8883       if (!label)
8884         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
8885 #endif
8886
8887       targetm.asm_out.internal_label (asm_out_file, "L",
8888                                       CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
8889
8890       if (flag_pic)
8891         {
8892           output_asm_insn ("pop%z0\t%0", xops);
8893 #ifdef DWARF2_UNWIND_INFO
8894           /* The pop is a pop and clobbers dest, but doesn't restore it
8895              for unwind info purposes.  */
8896           if (dwarf2out_do_frame ())
8897             {
8898               rtx insn;
8899               start_sequence ();
8900               insn = emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
8901               dwarf2out_frame_debug (insn, true);
8902               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8903                                              gen_rtx_PLUS (Pmode,
8904                                                            stack_pointer_rtx,
8905                                                            GEN_INT (4))));
8906               RTX_FRAME_RELATED_P (insn) = 1;
8907               dwarf2out_frame_debug (insn, true);
8908               end_sequence ();
8909             }
8910 #endif
8911         }
8912     }
8913   else
8914     {
8915       char name[32];
8916       get_pc_thunk_name (name, REGNO (dest));
8917       pic_labels_used |= 1 << REGNO (dest);
8918
8919 #ifdef DWARF2_UNWIND_INFO
8920       /* Ensure all queued register saves are flushed before the
8921          call.  */
8922       if (dwarf2out_do_frame ())
8923         dwarf2out_flush_queued_reg_saves ();
8924 #endif
8925       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
8926       xops[2] = gen_rtx_MEM (QImode, xops[2]);
8927       output_asm_insn ("call\t%X2", xops);
8928       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
8929          is what will be referenced by the Mach-O PIC subsystem.  */
8930 #if TARGET_MACHO
8931       if (!label)
8932         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
8933       else
8934         targetm.asm_out.internal_label (asm_out_file, "L",
8935                                            CODE_LABEL_NUMBER (label));
8936 #endif
8937     }
8938
8939   if (TARGET_MACHO)
8940     return "";
8941
8942   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
8943     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
8944   else
8945     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
8946
8947   return "";
8948 }
8949
8950 /* Generate an "push" pattern for input ARG.  */
8951
8952 static rtx
8953 gen_push (rtx arg)
8954 {
8955   struct machine_function *m = cfun->machine;
8956
8957   if (m->fs.cfa_reg == stack_pointer_rtx)
8958     m->fs.cfa_offset += UNITS_PER_WORD;
8959   m->fs.sp_offset += UNITS_PER_WORD;
8960
8961   return gen_rtx_SET (VOIDmode,
8962                       gen_rtx_MEM (Pmode,
8963                                    gen_rtx_PRE_DEC (Pmode,
8964                                                     stack_pointer_rtx)),
8965                       arg);
8966 }
8967
8968 /* Generate an "pop" pattern for input ARG.  */
8969
8970 static rtx
8971 gen_pop (rtx arg)
8972 {
8973   return gen_rtx_SET (VOIDmode,
8974                       arg,
8975                       gen_rtx_MEM (Pmode,
8976                                    gen_rtx_POST_INC (Pmode,
8977                                                      stack_pointer_rtx)));
8978 }
8979
8980 /* Return >= 0 if there is an unused call-clobbered register available
8981    for the entire function.  */
8982
8983 static unsigned int
8984 ix86_select_alt_pic_regnum (void)
8985 {
8986   if (current_function_is_leaf
8987       && !crtl->profile
8988       && !ix86_current_function_calls_tls_descriptor)
8989     {
8990       int i, drap;
8991       /* Can't use the same register for both PIC and DRAP.  */
8992       if (crtl->drap_reg)
8993         drap = REGNO (crtl->drap_reg);
8994       else
8995         drap = -1;
8996       for (i = 2; i >= 0; --i)
8997         if (i != drap && !df_regs_ever_live_p (i))
8998           return i;
8999     }
9000
9001   return INVALID_REGNUM;
9002 }
9003
9004 /* Return 1 if we need to save REGNO.  */
9005 static int
9006 ix86_save_reg (unsigned int regno, bool maybe_eh_return)
9007 {
9008   if (pic_offset_table_rtx
9009       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
9010       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
9011           || crtl->profile
9012           || crtl->calls_eh_return
9013           || crtl->uses_const_pool))
9014     {
9015       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
9016         return 0;
9017       return 1;
9018     }
9019
9020   if (crtl->calls_eh_return && maybe_eh_return)
9021     {
9022       unsigned i;
9023       for (i = 0; ; i++)
9024         {
9025           unsigned test = EH_RETURN_DATA_REGNO (i);
9026           if (test == INVALID_REGNUM)
9027             break;
9028           if (test == regno)
9029             return 1;
9030         }
9031     }
9032
9033   if (crtl->drap_reg && regno == REGNO (crtl->drap_reg))
9034     return 1;
9035
9036   return (df_regs_ever_live_p (regno)
9037           && !call_used_regs[regno]
9038           && !fixed_regs[regno]
9039           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
9040 }
9041
9042 /* Return number of saved general prupose registers.  */
9043
9044 static int
9045 ix86_nsaved_regs (void)
9046 {
9047   int nregs = 0;
9048   int regno;
9049
9050   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9051     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9052       nregs ++;
9053   return nregs;
9054 }
9055
9056 /* Return number of saved SSE registrers.  */
9057
9058 static int
9059 ix86_nsaved_sseregs (void)
9060 {
9061   int nregs = 0;
9062   int regno;
9063
9064   if (!TARGET_64BIT_MS_ABI)
9065     return 0;
9066   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9067     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9068       nregs ++;
9069   return nregs;
9070 }
9071
9072 /* Given FROM and TO register numbers, say whether this elimination is
9073    allowed.  If stack alignment is needed, we can only replace argument
9074    pointer with hard frame pointer, or replace frame pointer with stack
9075    pointer.  Otherwise, frame pointer elimination is automatically
9076    handled and all other eliminations are valid.  */
9077
9078 static bool
9079 ix86_can_eliminate (const int from, const int to)
9080 {
9081   if (stack_realign_fp)
9082     return ((from == ARG_POINTER_REGNUM
9083              && to == HARD_FRAME_POINTER_REGNUM)
9084             || (from == FRAME_POINTER_REGNUM
9085                 && to == STACK_POINTER_REGNUM));
9086   else
9087     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : true;
9088 }
9089
9090 /* Return the offset between two registers, one to be eliminated, and the other
9091    its replacement, at the start of a routine.  */
9092
9093 HOST_WIDE_INT
9094 ix86_initial_elimination_offset (int from, int to)
9095 {
9096   struct ix86_frame frame;
9097   ix86_compute_frame_layout (&frame);
9098
9099   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
9100     return frame.hard_frame_pointer_offset;
9101   else if (from == FRAME_POINTER_REGNUM
9102            && to == HARD_FRAME_POINTER_REGNUM)
9103     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
9104   else
9105     {
9106       gcc_assert (to == STACK_POINTER_REGNUM);
9107
9108       if (from == ARG_POINTER_REGNUM)
9109         return frame.stack_pointer_offset;
9110
9111       gcc_assert (from == FRAME_POINTER_REGNUM);
9112       return frame.stack_pointer_offset - frame.frame_pointer_offset;
9113     }
9114 }
9115
9116 /* In a dynamically-aligned function, we can't know the offset from
9117    stack pointer to frame pointer, so we must ensure that setjmp
9118    eliminates fp against the hard fp (%ebp) rather than trying to
9119    index from %esp up to the top of the frame across a gap that is
9120    of unknown (at compile-time) size.  */
9121 static rtx
9122 ix86_builtin_setjmp_frame_value (void)
9123 {
9124   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
9125 }
9126
9127 /* On the x86 -fsplit-stack and -fstack-protector both use the same
9128    field in the TCB, so they can not be used together.  */
9129
9130 static bool
9131 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
9132                            struct gcc_options *opts ATTRIBUTE_UNUSED)
9133 {
9134   bool ret = true;
9135
9136 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
9137   if (report)
9138     error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
9139   ret = false;
9140 #else
9141   if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
9142     {
9143       if (report)
9144         error ("%<-fsplit-stack%> requires "
9145                "assembler support for CFI directives");
9146       ret = false;
9147     }
9148 #endif
9149
9150   return ret;
9151 }
9152
9153 /* When using -fsplit-stack, the allocation routines set a field in
9154    the TCB to the bottom of the stack plus this much space, measured
9155    in bytes.  */
9156
9157 #define SPLIT_STACK_AVAILABLE 256
9158
9159 /* Fill structure ix86_frame about frame of currently computed function.  */
9160
9161 static void
9162 ix86_compute_frame_layout (struct ix86_frame *frame)
9163 {
9164   unsigned int stack_alignment_needed;
9165   HOST_WIDE_INT offset;
9166   unsigned int preferred_alignment;
9167   HOST_WIDE_INT size = get_frame_size ();
9168   HOST_WIDE_INT to_allocate;
9169
9170   frame->nregs = ix86_nsaved_regs ();
9171   frame->nsseregs = ix86_nsaved_sseregs ();
9172
9173   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
9174   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
9175
9176   /* 64-bit MS ABI seem to require stack alignment to be always 16 except for
9177      function prologues and leaf.  */
9178   if ((TARGET_64BIT_MS_ABI && preferred_alignment < 16)
9179       && (!current_function_is_leaf || cfun->calls_alloca != 0
9180           || ix86_current_function_calls_tls_descriptor))
9181     {
9182       preferred_alignment = 16;
9183       stack_alignment_needed = 16;
9184       crtl->preferred_stack_boundary = 128;
9185       crtl->stack_alignment_needed = 128;
9186     }
9187
9188   gcc_assert (!size || stack_alignment_needed);
9189   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
9190   gcc_assert (preferred_alignment <= stack_alignment_needed);
9191
9192   /* For SEH we have to limit the amount of code movement into the prologue.
9193      At present we do this via a BLOCKAGE, at which point there's very little
9194      scheduling that can be done, which means that there's very little point
9195      in doing anything except PUSHs.  */
9196   if (TARGET_SEH)
9197     cfun->machine->use_fast_prologue_epilogue = false;
9198
9199   /* During reload iteration the amount of registers saved can change.
9200      Recompute the value as needed.  Do not recompute when amount of registers
9201      didn't change as reload does multiple calls to the function and does not
9202      expect the decision to change within single iteration.  */
9203   else if (!optimize_function_for_size_p (cfun)
9204            && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
9205     {
9206       int count = frame->nregs;
9207       struct cgraph_node *node = cgraph_get_node (current_function_decl);
9208
9209       cfun->machine->use_fast_prologue_epilogue_nregs = count;
9210
9211       /* The fast prologue uses move instead of push to save registers.  This
9212          is significantly longer, but also executes faster as modern hardware
9213          can execute the moves in parallel, but can't do that for push/pop.
9214
9215          Be careful about choosing what prologue to emit:  When function takes
9216          many instructions to execute we may use slow version as well as in
9217          case function is known to be outside hot spot (this is known with
9218          feedback only).  Weight the size of function by number of registers
9219          to save as it is cheap to use one or two push instructions but very
9220          slow to use many of them.  */
9221       if (count)
9222         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
9223       if (node->frequency < NODE_FREQUENCY_NORMAL
9224           || (flag_branch_probabilities
9225               && node->frequency < NODE_FREQUENCY_HOT))
9226         cfun->machine->use_fast_prologue_epilogue = false;
9227       else
9228         cfun->machine->use_fast_prologue_epilogue
9229            = !expensive_function_p (count);
9230     }
9231   if (TARGET_PROLOGUE_USING_MOVE
9232       && cfun->machine->use_fast_prologue_epilogue)
9233     frame->save_regs_using_mov = true;
9234   else
9235     frame->save_regs_using_mov = false;
9236
9237   /* If static stack checking is enabled and done with probes, the registers
9238      need to be saved before allocating the frame.  */
9239   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
9240     frame->save_regs_using_mov = false;
9241
9242   /* Skip return address.  */
9243   offset = UNITS_PER_WORD;
9244
9245   /* Skip pushed static chain.  */
9246   if (ix86_static_chain_on_stack)
9247     offset += UNITS_PER_WORD;
9248
9249   /* Skip saved base pointer.  */
9250   if (frame_pointer_needed)
9251     offset += UNITS_PER_WORD;
9252   frame->hfp_save_offset = offset;
9253
9254   /* The traditional frame pointer location is at the top of the frame.  */
9255   frame->hard_frame_pointer_offset = offset;
9256
9257   /* Register save area */
9258   offset += frame->nregs * UNITS_PER_WORD;
9259   frame->reg_save_offset = offset;
9260
9261   /* Align and set SSE register save area.  */
9262   if (frame->nsseregs)
9263     {
9264       /* The only ABI that has saved SSE registers (Win64) also has a
9265          16-byte aligned default stack, and thus we don't need to be
9266          within the re-aligned local stack frame to save them.  */
9267       gcc_assert (INCOMING_STACK_BOUNDARY >= 128);
9268       offset = (offset + 16 - 1) & -16;
9269       offset += frame->nsseregs * 16;
9270     }
9271   frame->sse_reg_save_offset = offset;
9272
9273   /* The re-aligned stack starts here.  Values before this point are not
9274      directly comparable with values below this point.  In order to make
9275      sure that no value happens to be the same before and after, force
9276      the alignment computation below to add a non-zero value.  */
9277   if (stack_realign_fp)
9278     offset = (offset + stack_alignment_needed) & -stack_alignment_needed;
9279
9280   /* Va-arg area */
9281   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
9282   offset += frame->va_arg_size;
9283
9284   /* Align start of frame for local function.  */
9285   if (stack_realign_fp
9286       || offset != frame->sse_reg_save_offset
9287       || size != 0
9288       || !current_function_is_leaf
9289       || cfun->calls_alloca
9290       || ix86_current_function_calls_tls_descriptor)
9291     offset = (offset + stack_alignment_needed - 1) & -stack_alignment_needed;
9292
9293   /* Frame pointer points here.  */
9294   frame->frame_pointer_offset = offset;
9295
9296   offset += size;
9297
9298   /* Add outgoing arguments area.  Can be skipped if we eliminated
9299      all the function calls as dead code.
9300      Skipping is however impossible when function calls alloca.  Alloca
9301      expander assumes that last crtl->outgoing_args_size
9302      of stack frame are unused.  */
9303   if (ACCUMULATE_OUTGOING_ARGS
9304       && (!current_function_is_leaf || cfun->calls_alloca
9305           || ix86_current_function_calls_tls_descriptor))
9306     {
9307       offset += crtl->outgoing_args_size;
9308       frame->outgoing_arguments_size = crtl->outgoing_args_size;
9309     }
9310   else
9311     frame->outgoing_arguments_size = 0;
9312
9313   /* Align stack boundary.  Only needed if we're calling another function
9314      or using alloca.  */
9315   if (!current_function_is_leaf || cfun->calls_alloca
9316       || ix86_current_function_calls_tls_descriptor)
9317     offset = (offset + preferred_alignment - 1) & -preferred_alignment;
9318
9319   /* We've reached end of stack frame.  */
9320   frame->stack_pointer_offset = offset;
9321
9322   /* Size prologue needs to allocate.  */
9323   to_allocate = offset - frame->sse_reg_save_offset;
9324
9325   if ((!to_allocate && frame->nregs <= 1)
9326       || (TARGET_64BIT && to_allocate >= (HOST_WIDE_INT) 0x80000000))
9327     frame->save_regs_using_mov = false;
9328
9329   if (ix86_using_red_zone ()
9330       && current_function_sp_is_unchanging
9331       && current_function_is_leaf
9332       && !ix86_current_function_calls_tls_descriptor)
9333     {
9334       frame->red_zone_size = to_allocate;
9335       if (frame->save_regs_using_mov)
9336         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
9337       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
9338         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
9339     }
9340   else
9341     frame->red_zone_size = 0;
9342   frame->stack_pointer_offset -= frame->red_zone_size;
9343
9344   /* The SEH frame pointer location is near the bottom of the frame.
9345      This is enforced by the fact that the difference between the
9346      stack pointer and the frame pointer is limited to 240 bytes in
9347      the unwind data structure.  */
9348   if (TARGET_SEH)
9349     {
9350       HOST_WIDE_INT diff;
9351
9352       /* If we can leave the frame pointer where it is, do so.  */
9353       diff = frame->stack_pointer_offset - frame->hard_frame_pointer_offset;
9354       if (diff > 240 || (diff & 15) != 0)
9355         {
9356           /* Ideally we'd determine what portion of the local stack frame
9357              (within the constraint of the lowest 240) is most heavily used.
9358              But without that complication, simply bias the frame pointer
9359              by 128 bytes so as to maximize the amount of the local stack
9360              frame that is addressable with 8-bit offsets.  */
9361           frame->hard_frame_pointer_offset = frame->stack_pointer_offset - 128;
9362         }
9363     }
9364 }
9365
9366 /* This is semi-inlined memory_address_length, but simplified
9367    since we know that we're always dealing with reg+offset, and
9368    to avoid having to create and discard all that rtl.  */
9369
9370 static inline int
9371 choose_baseaddr_len (unsigned int regno, HOST_WIDE_INT offset)
9372 {
9373   int len = 4;
9374
9375   if (offset == 0)
9376     {
9377       /* EBP and R13 cannot be encoded without an offset.  */
9378       len = (regno == BP_REG || regno == R13_REG);
9379     }
9380   else if (IN_RANGE (offset, -128, 127))
9381     len = 1;
9382
9383   /* ESP and R12 must be encoded with a SIB byte.  */
9384   if (regno == SP_REG || regno == R12_REG)
9385     len++;
9386
9387   return len;
9388 }
9389   
9390 /* Return an RTX that points to CFA_OFFSET within the stack frame.
9391    The valid base registers are taken from CFUN->MACHINE->FS.  */
9392
9393 static rtx
9394 choose_baseaddr (HOST_WIDE_INT cfa_offset)
9395 {
9396   const struct machine_function *m = cfun->machine;
9397   rtx base_reg = NULL;
9398   HOST_WIDE_INT base_offset = 0;
9399
9400   if (m->use_fast_prologue_epilogue)
9401     {
9402       /* Choose the base register most likely to allow the most scheduling
9403          opportunities.  Generally FP is valid througout the function,
9404          while DRAP must be reloaded within the epilogue.  But choose either
9405          over the SP due to increased encoding size.  */
9406
9407       if (m->fs.fp_valid)
9408         {
9409           base_reg = hard_frame_pointer_rtx;
9410           base_offset = m->fs.fp_offset - cfa_offset;
9411         }
9412       else if (m->fs.drap_valid)
9413         {
9414           base_reg = crtl->drap_reg;
9415           base_offset = 0 - cfa_offset;
9416         }
9417       else if (m->fs.sp_valid)
9418         {
9419           base_reg = stack_pointer_rtx;
9420           base_offset = m->fs.sp_offset - cfa_offset;
9421         }
9422     }
9423   else
9424     {
9425       HOST_WIDE_INT toffset;
9426       int len = 16, tlen;
9427
9428       /* Choose the base register with the smallest address encoding.
9429          With a tie, choose FP > DRAP > SP.  */
9430       if (m->fs.sp_valid)
9431         {
9432           base_reg = stack_pointer_rtx;
9433           base_offset = m->fs.sp_offset - cfa_offset;
9434           len = choose_baseaddr_len (STACK_POINTER_REGNUM, base_offset);
9435         }
9436       if (m->fs.drap_valid)
9437         {
9438           toffset = 0 - cfa_offset;
9439           tlen = choose_baseaddr_len (REGNO (crtl->drap_reg), toffset);
9440           if (tlen <= len)
9441             {
9442               base_reg = crtl->drap_reg;
9443               base_offset = toffset;
9444               len = tlen;
9445             }
9446         }
9447       if (m->fs.fp_valid)
9448         {
9449           toffset = m->fs.fp_offset - cfa_offset;
9450           tlen = choose_baseaddr_len (HARD_FRAME_POINTER_REGNUM, toffset);
9451           if (tlen <= len)
9452             {
9453               base_reg = hard_frame_pointer_rtx;
9454               base_offset = toffset;
9455               len = tlen;
9456             }
9457         }
9458     }
9459   gcc_assert (base_reg != NULL);
9460
9461   return plus_constant (base_reg, base_offset);
9462 }
9463
9464 /* Emit code to save registers in the prologue.  */
9465
9466 static void
9467 ix86_emit_save_regs (void)
9468 {
9469   unsigned int regno;
9470   rtx insn;
9471
9472   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
9473     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9474       {
9475         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
9476         RTX_FRAME_RELATED_P (insn) = 1;
9477       }
9478 }
9479
9480 /* Emit a single register save at CFA - CFA_OFFSET.  */
9481
9482 static void
9483 ix86_emit_save_reg_using_mov (enum machine_mode mode, unsigned int regno,
9484                               HOST_WIDE_INT cfa_offset)
9485 {
9486   struct machine_function *m = cfun->machine;
9487   rtx reg = gen_rtx_REG (mode, regno);
9488   rtx mem, addr, base, insn;
9489
9490   addr = choose_baseaddr (cfa_offset);
9491   mem = gen_frame_mem (mode, addr);
9492
9493   /* For SSE saves, we need to indicate the 128-bit alignment.  */
9494   set_mem_align (mem, GET_MODE_ALIGNMENT (mode));
9495
9496   insn = emit_move_insn (mem, reg);
9497   RTX_FRAME_RELATED_P (insn) = 1;
9498
9499   base = addr;
9500   if (GET_CODE (base) == PLUS)
9501     base = XEXP (base, 0);
9502   gcc_checking_assert (REG_P (base));
9503
9504   /* When saving registers into a re-aligned local stack frame, avoid
9505      any tricky guessing by dwarf2out.  */
9506   if (m->fs.realigned)
9507     {
9508       gcc_checking_assert (stack_realign_drap);
9509
9510       if (regno == REGNO (crtl->drap_reg))
9511         {
9512           /* A bit of a hack.  We force the DRAP register to be saved in
9513              the re-aligned stack frame, which provides us with a copy
9514              of the CFA that will last past the prologue.  Install it.  */
9515           gcc_checking_assert (cfun->machine->fs.fp_valid);
9516           addr = plus_constant (hard_frame_pointer_rtx,
9517                                 cfun->machine->fs.fp_offset - cfa_offset);
9518           mem = gen_rtx_MEM (mode, addr);
9519           add_reg_note (insn, REG_CFA_DEF_CFA, mem);
9520         }
9521       else
9522         {
9523           /* The frame pointer is a stable reference within the
9524              aligned frame.  Use it.  */
9525           gcc_checking_assert (cfun->machine->fs.fp_valid);
9526           addr = plus_constant (hard_frame_pointer_rtx,
9527                                 cfun->machine->fs.fp_offset - cfa_offset);
9528           mem = gen_rtx_MEM (mode, addr);
9529           add_reg_note (insn, REG_CFA_EXPRESSION,
9530                         gen_rtx_SET (VOIDmode, mem, reg));
9531         }
9532     }
9533
9534   /* The memory may not be relative to the current CFA register,
9535      which means that we may need to generate a new pattern for
9536      use by the unwind info.  */
9537   else if (base != m->fs.cfa_reg)
9538     {
9539       addr = plus_constant (m->fs.cfa_reg, m->fs.cfa_offset - cfa_offset);
9540       mem = gen_rtx_MEM (mode, addr);
9541       add_reg_note (insn, REG_CFA_OFFSET, gen_rtx_SET (VOIDmode, mem, reg));
9542     }
9543 }
9544
9545 /* Emit code to save registers using MOV insns.
9546    First register is stored at CFA - CFA_OFFSET.  */
9547 static void
9548 ix86_emit_save_regs_using_mov (HOST_WIDE_INT cfa_offset)
9549 {
9550   unsigned int regno;
9551
9552   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9553     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9554       {
9555         ix86_emit_save_reg_using_mov (Pmode, regno, cfa_offset);
9556         cfa_offset -= UNITS_PER_WORD;
9557       }
9558 }
9559
9560 /* Emit code to save SSE registers using MOV insns.
9561    First register is stored at CFA - CFA_OFFSET.  */
9562 static void
9563 ix86_emit_save_sse_regs_using_mov (HOST_WIDE_INT cfa_offset)
9564 {
9565   unsigned int regno;
9566
9567   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9568     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9569       {
9570         ix86_emit_save_reg_using_mov (V4SFmode, regno, cfa_offset);
9571         cfa_offset -= 16;
9572       }
9573 }
9574
9575 static GTY(()) rtx queued_cfa_restores;
9576
9577 /* Add a REG_CFA_RESTORE REG note to INSN or queue them until next stack
9578    manipulation insn.  The value is on the stack at CFA - CFA_OFFSET.
9579    Don't add the note if the previously saved value will be left untouched
9580    within stack red-zone till return, as unwinders can find the same value
9581    in the register and on the stack.  */
9582
9583 static void
9584 ix86_add_cfa_restore_note (rtx insn, rtx reg, HOST_WIDE_INT cfa_offset)
9585 {
9586   if (cfa_offset <= cfun->machine->fs.red_zone_offset)
9587     return;
9588
9589   if (insn)
9590     {
9591       add_reg_note (insn, REG_CFA_RESTORE, reg);
9592       RTX_FRAME_RELATED_P (insn) = 1;
9593     }
9594   else
9595     queued_cfa_restores
9596       = alloc_reg_note (REG_CFA_RESTORE, reg, queued_cfa_restores);
9597 }
9598
9599 /* Add queued REG_CFA_RESTORE notes if any to INSN.  */
9600
9601 static void
9602 ix86_add_queued_cfa_restore_notes (rtx insn)
9603 {
9604   rtx last;
9605   if (!queued_cfa_restores)
9606     return;
9607   for (last = queued_cfa_restores; XEXP (last, 1); last = XEXP (last, 1))
9608     ;
9609   XEXP (last, 1) = REG_NOTES (insn);
9610   REG_NOTES (insn) = queued_cfa_restores;
9611   queued_cfa_restores = NULL_RTX;
9612   RTX_FRAME_RELATED_P (insn) = 1;
9613 }
9614
9615 /* Expand prologue or epilogue stack adjustment.
9616    The pattern exist to put a dependency on all ebp-based memory accesses.
9617    STYLE should be negative if instructions should be marked as frame related,
9618    zero if %r11 register is live and cannot be freely used and positive
9619    otherwise.  */
9620
9621 static void
9622 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
9623                            int style, bool set_cfa)
9624 {
9625   struct machine_function *m = cfun->machine;
9626   rtx insn;
9627   bool add_frame_related_expr = false;
9628
9629   if (! TARGET_64BIT)
9630     insn = gen_pro_epilogue_adjust_stack_si_add (dest, src, offset);
9631   else if (x86_64_immediate_operand (offset, DImode))
9632     insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, offset);
9633   else
9634     {
9635       rtx tmp;
9636       /* r11 is used by indirect sibcall return as well, set before the
9637          epilogue and used after the epilogue.  */
9638       if (style)
9639         tmp = gen_rtx_REG (DImode, R11_REG);
9640       else
9641         {
9642           gcc_assert (src != hard_frame_pointer_rtx
9643                       && dest != hard_frame_pointer_rtx);
9644           tmp = hard_frame_pointer_rtx;
9645         }
9646       insn = emit_insn (gen_rtx_SET (DImode, tmp, offset));
9647       if (style < 0)
9648         add_frame_related_expr = true;
9649
9650       insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, tmp);
9651     }
9652
9653   insn = emit_insn (insn);
9654   if (style >= 0)
9655     ix86_add_queued_cfa_restore_notes (insn);
9656
9657   if (set_cfa)
9658     {
9659       rtx r;
9660
9661       gcc_assert (m->fs.cfa_reg == src);
9662       m->fs.cfa_offset += INTVAL (offset);
9663       m->fs.cfa_reg = dest;
9664
9665       r = gen_rtx_PLUS (Pmode, src, offset);
9666       r = gen_rtx_SET (VOIDmode, dest, r);
9667       add_reg_note (insn, REG_CFA_ADJUST_CFA, r);
9668       RTX_FRAME_RELATED_P (insn) = 1;
9669     }
9670   else if (style < 0)
9671     {
9672       RTX_FRAME_RELATED_P (insn) = 1;
9673       if (add_frame_related_expr)
9674         {
9675           rtx r = gen_rtx_PLUS (Pmode, src, offset);
9676           r = gen_rtx_SET (VOIDmode, dest, r);
9677           add_reg_note (insn, REG_FRAME_RELATED_EXPR, r);
9678         }
9679     }
9680
9681   if (dest == stack_pointer_rtx)
9682     {
9683       HOST_WIDE_INT ooffset = m->fs.sp_offset;
9684       bool valid = m->fs.sp_valid;
9685
9686       if (src == hard_frame_pointer_rtx)
9687         {
9688           valid = m->fs.fp_valid;
9689           ooffset = m->fs.fp_offset;
9690         }
9691       else if (src == crtl->drap_reg)
9692         {
9693           valid = m->fs.drap_valid;
9694           ooffset = 0;
9695         }
9696       else
9697         {
9698           /* Else there are two possibilities: SP itself, which we set
9699              up as the default above.  Or EH_RETURN_STACKADJ_RTX, which is
9700              taken care of this by hand along the eh_return path.  */
9701           gcc_checking_assert (src == stack_pointer_rtx
9702                                || offset == const0_rtx);
9703         }
9704
9705       m->fs.sp_offset = ooffset - INTVAL (offset);
9706       m->fs.sp_valid = valid;
9707     }
9708 }
9709
9710 /* Find an available register to be used as dynamic realign argument
9711    pointer regsiter.  Such a register will be written in prologue and
9712    used in begin of body, so it must not be
9713         1. parameter passing register.
9714         2. GOT pointer.
9715    We reuse static-chain register if it is available.  Otherwise, we
9716    use DI for i386 and R13 for x86-64.  We chose R13 since it has
9717    shorter encoding.
9718
9719    Return: the regno of chosen register.  */
9720
9721 static unsigned int
9722 find_drap_reg (void)
9723 {
9724   tree decl = cfun->decl;
9725
9726   if (TARGET_64BIT)
9727     {
9728       /* Use R13 for nested function or function need static chain.
9729          Since function with tail call may use any caller-saved
9730          registers in epilogue, DRAP must not use caller-saved
9731          register in such case.  */
9732       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
9733         return R13_REG;
9734
9735       return R10_REG;
9736     }
9737   else
9738     {
9739       /* Use DI for nested function or function need static chain.
9740          Since function with tail call may use any caller-saved
9741          registers in epilogue, DRAP must not use caller-saved
9742          register in such case.  */
9743       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
9744         return DI_REG;
9745
9746       /* Reuse static chain register if it isn't used for parameter
9747          passing.  */
9748       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2)
9749         {
9750           unsigned int ccvt = ix86_get_callcvt (TREE_TYPE (decl));
9751           if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) == 0)
9752             return CX_REG;
9753         }
9754       return DI_REG;
9755     }
9756 }
9757
9758 /* Return minimum incoming stack alignment.  */
9759
9760 static unsigned int
9761 ix86_minimum_incoming_stack_boundary (bool sibcall)
9762 {
9763   unsigned int incoming_stack_boundary;
9764
9765   /* Prefer the one specified at command line. */
9766   if (ix86_user_incoming_stack_boundary)
9767     incoming_stack_boundary = ix86_user_incoming_stack_boundary;
9768   /* In 32bit, use MIN_STACK_BOUNDARY for incoming stack boundary
9769      if -mstackrealign is used, it isn't used for sibcall check and
9770      estimated stack alignment is 128bit.  */
9771   else if (!sibcall
9772            && !TARGET_64BIT
9773            && ix86_force_align_arg_pointer
9774            && crtl->stack_alignment_estimated == 128)
9775     incoming_stack_boundary = MIN_STACK_BOUNDARY;
9776   else
9777     incoming_stack_boundary = ix86_default_incoming_stack_boundary;
9778
9779   /* Incoming stack alignment can be changed on individual functions
9780      via force_align_arg_pointer attribute.  We use the smallest
9781      incoming stack boundary.  */
9782   if (incoming_stack_boundary > MIN_STACK_BOUNDARY
9783       && lookup_attribute (ix86_force_align_arg_pointer_string,
9784                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
9785     incoming_stack_boundary = MIN_STACK_BOUNDARY;
9786
9787   /* The incoming stack frame has to be aligned at least at
9788      parm_stack_boundary.  */
9789   if (incoming_stack_boundary < crtl->parm_stack_boundary)
9790     incoming_stack_boundary = crtl->parm_stack_boundary;
9791
9792   /* Stack at entrance of main is aligned by runtime.  We use the
9793      smallest incoming stack boundary. */
9794   if (incoming_stack_boundary > MAIN_STACK_BOUNDARY
9795       && DECL_NAME (current_function_decl)
9796       && MAIN_NAME_P (DECL_NAME (current_function_decl))
9797       && DECL_FILE_SCOPE_P (current_function_decl))
9798     incoming_stack_boundary = MAIN_STACK_BOUNDARY;
9799
9800   return incoming_stack_boundary;
9801 }
9802
9803 /* Update incoming stack boundary and estimated stack alignment.  */
9804
9805 static void
9806 ix86_update_stack_boundary (void)
9807 {
9808   ix86_incoming_stack_boundary
9809     = ix86_minimum_incoming_stack_boundary (false);
9810
9811   /* x86_64 vararg needs 16byte stack alignment for register save
9812      area.  */
9813   if (TARGET_64BIT
9814       && cfun->stdarg
9815       && crtl->stack_alignment_estimated < 128)
9816     crtl->stack_alignment_estimated = 128;
9817 }
9818
9819 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
9820    needed or an rtx for DRAP otherwise.  */
9821
9822 static rtx
9823 ix86_get_drap_rtx (void)
9824 {
9825   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
9826     crtl->need_drap = true;
9827
9828   if (stack_realign_drap)
9829     {
9830       /* Assign DRAP to vDRAP and returns vDRAP */
9831       unsigned int regno = find_drap_reg ();
9832       rtx drap_vreg;
9833       rtx arg_ptr;
9834       rtx seq, insn;
9835
9836       arg_ptr = gen_rtx_REG (Pmode, regno);
9837       crtl->drap_reg = arg_ptr;
9838
9839       start_sequence ();
9840       drap_vreg = copy_to_reg (arg_ptr);
9841       seq = get_insns ();
9842       end_sequence ();
9843
9844       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
9845       if (!optimize)
9846         {
9847           add_reg_note (insn, REG_CFA_SET_VDRAP, drap_vreg);
9848           RTX_FRAME_RELATED_P (insn) = 1;
9849         }
9850       return drap_vreg;
9851     }
9852   else
9853     return NULL;
9854 }
9855
9856 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
9857
9858 static rtx
9859 ix86_internal_arg_pointer (void)
9860 {
9861   return virtual_incoming_args_rtx;
9862 }
9863
9864 struct scratch_reg {
9865   rtx reg;
9866   bool saved;
9867 };
9868
9869 /* Return a short-lived scratch register for use on function entry.
9870    In 32-bit mode, it is valid only after the registers are saved
9871    in the prologue.  This register must be released by means of
9872    release_scratch_register_on_entry once it is dead.  */
9873
9874 static void
9875 get_scratch_register_on_entry (struct scratch_reg *sr)
9876 {
9877   int regno;
9878
9879   sr->saved = false;
9880
9881   if (TARGET_64BIT)
9882     {
9883       /* We always use R11 in 64-bit mode.  */
9884       regno = R11_REG;
9885     }
9886   else
9887     {
9888       tree decl = current_function_decl, fntype = TREE_TYPE (decl);
9889       bool fastcall_p
9890         = lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)) != NULL_TREE;
9891       bool static_chain_p = DECL_STATIC_CHAIN (decl);
9892       int regparm = ix86_function_regparm (fntype, decl);
9893       int drap_regno
9894         = crtl->drap_reg ? REGNO (crtl->drap_reg) : INVALID_REGNUM;
9895
9896       /* 'fastcall' sets regparm to 2, uses ecx/edx for arguments and eax
9897           for the static chain register.  */
9898       if ((regparm < 1 || (fastcall_p && !static_chain_p))
9899           && drap_regno != AX_REG)
9900         regno = AX_REG;
9901       else if (regparm < 2 && drap_regno != DX_REG)
9902         regno = DX_REG;
9903       /* ecx is the static chain register.  */
9904       else if (regparm < 3 && !fastcall_p && !static_chain_p
9905                && drap_regno != CX_REG)
9906         regno = CX_REG;
9907       else if (ix86_save_reg (BX_REG, true))
9908         regno = BX_REG;
9909       /* esi is the static chain register.  */
9910       else if (!(regparm == 3 && static_chain_p)
9911                && ix86_save_reg (SI_REG, true))
9912         regno = SI_REG;
9913       else if (ix86_save_reg (DI_REG, true))
9914         regno = DI_REG;
9915       else
9916         {
9917           regno = (drap_regno == AX_REG ? DX_REG : AX_REG);
9918           sr->saved = true;
9919         }
9920     }
9921
9922   sr->reg = gen_rtx_REG (Pmode, regno);
9923   if (sr->saved)
9924     {
9925       rtx insn = emit_insn (gen_push (sr->reg));
9926       RTX_FRAME_RELATED_P (insn) = 1;
9927     }
9928 }
9929
9930 /* Release a scratch register obtained from the preceding function.  */
9931
9932 static void
9933 release_scratch_register_on_entry (struct scratch_reg *sr)
9934 {
9935   if (sr->saved)
9936     {
9937       rtx x, insn = emit_insn (gen_pop (sr->reg));
9938
9939       /* The RTX_FRAME_RELATED_P mechanism doesn't know about pop.  */
9940       RTX_FRAME_RELATED_P (insn) = 1;
9941       x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (UNITS_PER_WORD));
9942       x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x);
9943       add_reg_note (insn, REG_FRAME_RELATED_EXPR, x);
9944     }
9945 }
9946
9947 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
9948
9949 /* Emit code to adjust the stack pointer by SIZE bytes while probing it.  */
9950
9951 static void
9952 ix86_adjust_stack_and_probe (const HOST_WIDE_INT size)
9953 {
9954   /* We skip the probe for the first interval + a small dope of 4 words and
9955      probe that many bytes past the specified size to maintain a protection
9956      area at the botton of the stack.  */
9957   const int dope = 4 * UNITS_PER_WORD;
9958   rtx size_rtx = GEN_INT (size), last;
9959
9960   /* See if we have a constant small number of probes to generate.  If so,
9961      that's the easy case.  The run-time loop is made up of 11 insns in the
9962      generic case while the compile-time loop is made up of 3+2*(n-1) insns
9963      for n # of intervals.  */
9964   if (size <= 5 * PROBE_INTERVAL)
9965     {
9966       HOST_WIDE_INT i, adjust;
9967       bool first_probe = true;
9968
9969       /* Adjust SP and probe at PROBE_INTERVAL + N * PROBE_INTERVAL for
9970          values of N from 1 until it exceeds SIZE.  If only one probe is
9971          needed, this will not generate any code.  Then adjust and probe
9972          to PROBE_INTERVAL + SIZE.  */
9973       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
9974         {
9975           if (first_probe)
9976             {
9977               adjust = 2 * PROBE_INTERVAL + dope;
9978               first_probe = false;
9979             }
9980           else
9981             adjust = PROBE_INTERVAL;
9982
9983           emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
9984                                   plus_constant (stack_pointer_rtx, -adjust)));
9985           emit_stack_probe (stack_pointer_rtx);
9986         }
9987
9988       if (first_probe)
9989         adjust = size + PROBE_INTERVAL + dope;
9990       else
9991         adjust = size + PROBE_INTERVAL - i;
9992
9993       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
9994                               plus_constant (stack_pointer_rtx, -adjust)));
9995       emit_stack_probe (stack_pointer_rtx);
9996
9997       /* Adjust back to account for the additional first interval.  */
9998       last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
9999                                      plus_constant (stack_pointer_rtx,
10000                                                     PROBE_INTERVAL + dope)));
10001     }
10002
10003   /* Otherwise, do the same as above, but in a loop.  Note that we must be
10004      extra careful with variables wrapping around because we might be at
10005      the very top (or the very bottom) of the address space and we have
10006      to be able to handle this case properly; in particular, we use an
10007      equality test for the loop condition.  */
10008   else
10009     {
10010       HOST_WIDE_INT rounded_size;
10011       struct scratch_reg sr;
10012
10013       get_scratch_register_on_entry (&sr);
10014
10015
10016       /* Step 1: round SIZE to the previous multiple of the interval.  */
10017
10018       rounded_size = size & -PROBE_INTERVAL;
10019
10020
10021       /* Step 2: compute initial and final value of the loop counter.  */
10022
10023       /* SP = SP_0 + PROBE_INTERVAL.  */
10024       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10025                               plus_constant (stack_pointer_rtx,
10026                                              - (PROBE_INTERVAL + dope))));
10027
10028       /* LAST_ADDR = SP_0 + PROBE_INTERVAL + ROUNDED_SIZE.  */
10029       emit_move_insn (sr.reg, GEN_INT (-rounded_size));
10030       emit_insn (gen_rtx_SET (VOIDmode, sr.reg,
10031                               gen_rtx_PLUS (Pmode, sr.reg,
10032                                             stack_pointer_rtx)));
10033
10034
10035       /* Step 3: the loop
10036
10037          while (SP != LAST_ADDR)
10038            {
10039              SP = SP + PROBE_INTERVAL
10040              probe at SP
10041            }
10042
10043          adjusts SP and probes to PROBE_INTERVAL + N * PROBE_INTERVAL for
10044          values of N from 1 until it is equal to ROUNDED_SIZE.  */
10045
10046       emit_insn (ix86_gen_adjust_stack_and_probe (sr.reg, sr.reg, size_rtx));
10047
10048
10049       /* Step 4: adjust SP and probe at PROBE_INTERVAL + SIZE if we cannot
10050          assert at compile-time that SIZE is equal to ROUNDED_SIZE.  */
10051
10052       if (size != rounded_size)
10053         {
10054           emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10055                                   plus_constant (stack_pointer_rtx,
10056                                                  rounded_size - size)));
10057           emit_stack_probe (stack_pointer_rtx);
10058         }
10059
10060       /* Adjust back to account for the additional first interval.  */
10061       last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10062                                      plus_constant (stack_pointer_rtx,
10063                                                     PROBE_INTERVAL + dope)));
10064
10065       release_scratch_register_on_entry (&sr);
10066     }
10067
10068   gcc_assert (cfun->machine->fs.cfa_reg != stack_pointer_rtx);
10069
10070   /* Even if the stack pointer isn't the CFA register, we need to correctly
10071      describe the adjustments made to it, in particular differentiate the
10072      frame-related ones from the frame-unrelated ones.  */
10073   if (size > 0)
10074     {
10075       rtx expr = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2));
10076       XVECEXP (expr, 0, 0)
10077         = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10078                        plus_constant (stack_pointer_rtx, -size));
10079       XVECEXP (expr, 0, 1)
10080         = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10081                        plus_constant (stack_pointer_rtx,
10082                                       PROBE_INTERVAL + dope + size));
10083       add_reg_note (last, REG_FRAME_RELATED_EXPR, expr);
10084       RTX_FRAME_RELATED_P (last) = 1;
10085
10086       cfun->machine->fs.sp_offset += size;
10087     }
10088
10089   /* Make sure nothing is scheduled before we are done.  */
10090   emit_insn (gen_blockage ());
10091 }
10092
10093 /* Adjust the stack pointer up to REG while probing it.  */
10094
10095 const char *
10096 output_adjust_stack_and_probe (rtx reg)
10097 {
10098   static int labelno = 0;
10099   char loop_lab[32], end_lab[32];
10100   rtx xops[2];
10101
10102   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
10103   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
10104
10105   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
10106
10107   /* Jump to END_LAB if SP == LAST_ADDR.  */
10108   xops[0] = stack_pointer_rtx;
10109   xops[1] = reg;
10110   output_asm_insn ("cmp%z0\t{%1, %0|%0, %1}", xops);
10111   fputs ("\tje\t", asm_out_file);
10112   assemble_name_raw (asm_out_file, end_lab);
10113   fputc ('\n', asm_out_file);
10114
10115   /* SP = SP + PROBE_INTERVAL.  */
10116   xops[1] = GEN_INT (PROBE_INTERVAL);
10117   output_asm_insn ("sub%z0\t{%1, %0|%0, %1}", xops);
10118
10119   /* Probe at SP.  */
10120   xops[1] = const0_rtx;
10121   output_asm_insn ("or%z0\t{%1, (%0)|DWORD PTR [%0], %1}", xops);
10122
10123   fprintf (asm_out_file, "\tjmp\t");
10124   assemble_name_raw (asm_out_file, loop_lab);
10125   fputc ('\n', asm_out_file);
10126
10127   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
10128
10129   return "";
10130 }
10131
10132 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
10133    inclusive.  These are offsets from the current stack pointer.  */
10134
10135 static void
10136 ix86_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
10137 {
10138   /* See if we have a constant small number of probes to generate.  If so,
10139      that's the easy case.  The run-time loop is made up of 7 insns in the
10140      generic case while the compile-time loop is made up of n insns for n #
10141      of intervals.  */
10142   if (size <= 7 * PROBE_INTERVAL)
10143     {
10144       HOST_WIDE_INT i;
10145
10146       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
10147          it exceeds SIZE.  If only one probe is needed, this will not
10148          generate any code.  Then probe at FIRST + SIZE.  */
10149       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
10150         emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
10151
10152       emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
10153     }
10154
10155   /* Otherwise, do the same as above, but in a loop.  Note that we must be
10156      extra careful with variables wrapping around because we might be at
10157      the very top (or the very bottom) of the address space and we have
10158      to be able to handle this case properly; in particular, we use an
10159      equality test for the loop condition.  */
10160   else
10161     {
10162       HOST_WIDE_INT rounded_size, last;
10163       struct scratch_reg sr;
10164
10165       get_scratch_register_on_entry (&sr);
10166
10167
10168       /* Step 1: round SIZE to the previous multiple of the interval.  */
10169
10170       rounded_size = size & -PROBE_INTERVAL;
10171
10172
10173       /* Step 2: compute initial and final value of the loop counter.  */
10174
10175       /* TEST_OFFSET = FIRST.  */
10176       emit_move_insn (sr.reg, GEN_INT (-first));
10177
10178       /* LAST_OFFSET = FIRST + ROUNDED_SIZE.  */
10179       last = first + rounded_size;
10180
10181
10182       /* Step 3: the loop
10183
10184          while (TEST_ADDR != LAST_ADDR)
10185            {
10186              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
10187              probe at TEST_ADDR
10188            }
10189
10190          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
10191          until it is equal to ROUNDED_SIZE.  */
10192
10193       emit_insn (ix86_gen_probe_stack_range (sr.reg, sr.reg, GEN_INT (-last)));
10194
10195
10196       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
10197          that SIZE is equal to ROUNDED_SIZE.  */
10198
10199       if (size != rounded_size)
10200         emit_stack_probe (plus_constant (gen_rtx_PLUS (Pmode,
10201                                                        stack_pointer_rtx,
10202                                                        sr.reg),
10203                                          rounded_size - size));
10204
10205       release_scratch_register_on_entry (&sr);
10206     }
10207
10208   /* Make sure nothing is scheduled before we are done.  */
10209   emit_insn (gen_blockage ());
10210 }
10211
10212 /* Probe a range of stack addresses from REG to END, inclusive.  These are
10213    offsets from the current stack pointer.  */
10214
10215 const char *
10216 output_probe_stack_range (rtx reg, rtx end)
10217 {
10218   static int labelno = 0;
10219   char loop_lab[32], end_lab[32];
10220   rtx xops[3];
10221
10222   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
10223   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
10224
10225   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
10226
10227   /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
10228   xops[0] = reg;
10229   xops[1] = end;
10230   output_asm_insn ("cmp%z0\t{%1, %0|%0, %1}", xops);
10231   fputs ("\tje\t", asm_out_file);
10232   assemble_name_raw (asm_out_file, end_lab);
10233   fputc ('\n', asm_out_file);
10234
10235   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
10236   xops[1] = GEN_INT (PROBE_INTERVAL);
10237   output_asm_insn ("sub%z0\t{%1, %0|%0, %1}", xops);
10238
10239   /* Probe at TEST_ADDR.  */
10240   xops[0] = stack_pointer_rtx;
10241   xops[1] = reg;
10242   xops[2] = const0_rtx;
10243   output_asm_insn ("or%z0\t{%2, (%0,%1)|DWORD PTR [%0+%1], %2}", xops);
10244
10245   fprintf (asm_out_file, "\tjmp\t");
10246   assemble_name_raw (asm_out_file, loop_lab);
10247   fputc ('\n', asm_out_file);
10248
10249   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
10250
10251   return "";
10252 }
10253
10254 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
10255    to be generated in correct form.  */
10256 static void
10257 ix86_finalize_stack_realign_flags (void)
10258 {
10259   /* Check if stack realign is really needed after reload, and
10260      stores result in cfun */
10261   unsigned int incoming_stack_boundary
10262     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
10263        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
10264   unsigned int stack_realign = (incoming_stack_boundary
10265                                 < (current_function_is_leaf
10266                                    ? crtl->max_used_stack_slot_alignment
10267                                    : crtl->stack_alignment_needed));
10268
10269   if (crtl->stack_realign_finalized)
10270     {
10271       /* After stack_realign_needed is finalized, we can't no longer
10272          change it.  */
10273       gcc_assert (crtl->stack_realign_needed == stack_realign);
10274     }
10275   else
10276     {
10277       crtl->stack_realign_needed = stack_realign;
10278       crtl->stack_realign_finalized = true;
10279     }
10280 }
10281
10282 /* Expand the prologue into a bunch of separate insns.  */
10283
10284 void
10285 ix86_expand_prologue (void)
10286 {
10287   struct machine_function *m = cfun->machine;
10288   rtx insn, t;
10289   bool pic_reg_used;
10290   struct ix86_frame frame;
10291   HOST_WIDE_INT allocate;
10292   bool int_registers_saved;
10293
10294   ix86_finalize_stack_realign_flags ();
10295
10296   /* DRAP should not coexist with stack_realign_fp */
10297   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
10298
10299   memset (&m->fs, 0, sizeof (m->fs));
10300
10301   /* Initialize CFA state for before the prologue.  */
10302   m->fs.cfa_reg = stack_pointer_rtx;
10303   m->fs.cfa_offset = INCOMING_FRAME_SP_OFFSET;
10304
10305   /* Track SP offset to the CFA.  We continue tracking this after we've
10306      swapped the CFA register away from SP.  In the case of re-alignment
10307      this is fudged; we're interested to offsets within the local frame.  */
10308   m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
10309   m->fs.sp_valid = true;
10310
10311   ix86_compute_frame_layout (&frame);
10312
10313   if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
10314     {
10315       /* We should have already generated an error for any use of
10316          ms_hook on a nested function.  */
10317       gcc_checking_assert (!ix86_static_chain_on_stack);
10318
10319       /* Check if profiling is active and we shall use profiling before
10320          prologue variant. If so sorry.  */
10321       if (crtl->profile && flag_fentry != 0)
10322         sorry ("ms_hook_prologue attribute isn%'t compatible "
10323                "with -mfentry for 32-bit");
10324
10325       /* In ix86_asm_output_function_label we emitted:
10326          8b ff     movl.s %edi,%edi
10327          55        push   %ebp
10328          8b ec     movl.s %esp,%ebp
10329
10330          This matches the hookable function prologue in Win32 API
10331          functions in Microsoft Windows XP Service Pack 2 and newer.
10332          Wine uses this to enable Windows apps to hook the Win32 API
10333          functions provided by Wine.
10334
10335          What that means is that we've already set up the frame pointer.  */
10336
10337       if (frame_pointer_needed
10338           && !(crtl->drap_reg && crtl->stack_realign_needed))
10339         {
10340           rtx push, mov;
10341
10342           /* We've decided to use the frame pointer already set up.
10343              Describe this to the unwinder by pretending that both
10344              push and mov insns happen right here.
10345
10346              Putting the unwind info here at the end of the ms_hook
10347              is done so that we can make absolutely certain we get
10348              the required byte sequence at the start of the function,
10349              rather than relying on an assembler that can produce
10350              the exact encoding required.
10351
10352              However it does mean (in the unpatched case) that we have
10353              a 1 insn window where the asynchronous unwind info is
10354              incorrect.  However, if we placed the unwind info at
10355              its correct location we would have incorrect unwind info
10356              in the patched case.  Which is probably all moot since
10357              I don't expect Wine generates dwarf2 unwind info for the
10358              system libraries that use this feature.  */
10359
10360           insn = emit_insn (gen_blockage ());
10361
10362           push = gen_push (hard_frame_pointer_rtx);
10363           mov = gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
10364                              stack_pointer_rtx);
10365           RTX_FRAME_RELATED_P (push) = 1;
10366           RTX_FRAME_RELATED_P (mov) = 1;
10367
10368           RTX_FRAME_RELATED_P (insn) = 1;
10369           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
10370                         gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, push, mov)));
10371
10372           /* Note that gen_push incremented m->fs.cfa_offset, even
10373              though we didn't emit the push insn here.  */
10374           m->fs.cfa_reg = hard_frame_pointer_rtx;
10375           m->fs.fp_offset = m->fs.cfa_offset;
10376           m->fs.fp_valid = true;
10377         }
10378       else
10379         {
10380           /* The frame pointer is not needed so pop %ebp again.
10381              This leaves us with a pristine state.  */
10382           emit_insn (gen_pop (hard_frame_pointer_rtx));
10383         }
10384     }
10385
10386   /* The first insn of a function that accepts its static chain on the
10387      stack is to push the register that would be filled in by a direct
10388      call.  This insn will be skipped by the trampoline.  */
10389   else if (ix86_static_chain_on_stack)
10390     {
10391       insn = emit_insn (gen_push (ix86_static_chain (cfun->decl, false)));
10392       emit_insn (gen_blockage ());
10393
10394       /* We don't want to interpret this push insn as a register save,
10395          only as a stack adjustment.  The real copy of the register as
10396          a save will be done later, if needed.  */
10397       t = plus_constant (stack_pointer_rtx, -UNITS_PER_WORD);
10398       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
10399       add_reg_note (insn, REG_CFA_ADJUST_CFA, t);
10400       RTX_FRAME_RELATED_P (insn) = 1;
10401     }
10402
10403   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
10404      of DRAP is needed and stack realignment is really needed after reload */
10405   if (stack_realign_drap)
10406     {
10407       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
10408
10409       /* Only need to push parameter pointer reg if it is caller saved.  */
10410       if (!call_used_regs[REGNO (crtl->drap_reg)])
10411         {
10412           /* Push arg pointer reg */
10413           insn = emit_insn (gen_push (crtl->drap_reg));
10414           RTX_FRAME_RELATED_P (insn) = 1;
10415         }
10416
10417       /* Grab the argument pointer.  */
10418       t = plus_constant (stack_pointer_rtx, m->fs.sp_offset);
10419       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, t));
10420       RTX_FRAME_RELATED_P (insn) = 1;
10421       m->fs.cfa_reg = crtl->drap_reg;
10422       m->fs.cfa_offset = 0;
10423
10424       /* Align the stack.  */
10425       insn = emit_insn (ix86_gen_andsp (stack_pointer_rtx,
10426                                         stack_pointer_rtx,
10427                                         GEN_INT (-align_bytes)));
10428       RTX_FRAME_RELATED_P (insn) = 1;
10429
10430       /* Replicate the return address on the stack so that return
10431          address can be reached via (argp - 1) slot.  This is needed
10432          to implement macro RETURN_ADDR_RTX and intrinsic function
10433          expand_builtin_return_addr etc.  */
10434       t = plus_constant (crtl->drap_reg, -UNITS_PER_WORD);
10435       t = gen_frame_mem (Pmode, t);
10436       insn = emit_insn (gen_push (t));
10437       RTX_FRAME_RELATED_P (insn) = 1;
10438
10439       /* For the purposes of frame and register save area addressing,
10440          we've started over with a new frame.  */
10441       m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
10442       m->fs.realigned = true;
10443     }
10444
10445   if (frame_pointer_needed && !m->fs.fp_valid)
10446     {
10447       /* Note: AT&T enter does NOT have reversed args.  Enter is probably
10448          slower on all targets.  Also sdb doesn't like it.  */
10449       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
10450       RTX_FRAME_RELATED_P (insn) = 1;
10451
10452       if (m->fs.sp_offset == frame.hard_frame_pointer_offset)
10453         {
10454           insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
10455           RTX_FRAME_RELATED_P (insn) = 1;
10456
10457           if (m->fs.cfa_reg == stack_pointer_rtx)
10458             m->fs.cfa_reg = hard_frame_pointer_rtx;
10459           m->fs.fp_offset = m->fs.sp_offset;
10460           m->fs.fp_valid = true;
10461         }
10462     }
10463
10464   int_registers_saved = (frame.nregs == 0);
10465
10466   if (!int_registers_saved)
10467     {
10468       /* If saving registers via PUSH, do so now.  */
10469       if (!frame.save_regs_using_mov)
10470         {
10471           ix86_emit_save_regs ();
10472           int_registers_saved = true;
10473           gcc_assert (m->fs.sp_offset == frame.reg_save_offset);
10474         }
10475
10476       /* When using red zone we may start register saving before allocating
10477          the stack frame saving one cycle of the prologue.  However, avoid
10478          doing this if we have to probe the stack; at least on x86_64 the
10479          stack probe can turn into a call that clobbers a red zone location. */
10480       else if (ix86_using_red_zone ()
10481                && (! TARGET_STACK_PROBE
10482                    || frame.stack_pointer_offset < CHECK_STACK_LIMIT))
10483         {
10484           ix86_emit_save_regs_using_mov (frame.reg_save_offset);
10485           int_registers_saved = true;
10486         }
10487     }
10488
10489   if (stack_realign_fp)
10490     {
10491       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
10492       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
10493
10494       /* The computation of the size of the re-aligned stack frame means
10495          that we must allocate the size of the register save area before
10496          performing the actual alignment.  Otherwise we cannot guarantee
10497          that there's enough storage above the realignment point.  */
10498       if (m->fs.sp_offset != frame.sse_reg_save_offset)
10499         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
10500                                    GEN_INT (m->fs.sp_offset
10501                                             - frame.sse_reg_save_offset),
10502                                    -1, false);
10503
10504       /* Align the stack.  */
10505       insn = emit_insn (ix86_gen_andsp (stack_pointer_rtx,
10506                                         stack_pointer_rtx,
10507                                         GEN_INT (-align_bytes)));
10508
10509       /* For the purposes of register save area addressing, the stack
10510          pointer is no longer valid.  As for the value of sp_offset,
10511          see ix86_compute_frame_layout, which we need to match in order
10512          to pass verification of stack_pointer_offset at the end.  */
10513       m->fs.sp_offset = (m->fs.sp_offset + align_bytes) & -align_bytes;
10514       m->fs.sp_valid = false;
10515     }
10516
10517   allocate = frame.stack_pointer_offset - m->fs.sp_offset;
10518
10519   if (flag_stack_usage)
10520     {
10521       /* We start to count from ARG_POINTER.  */
10522       HOST_WIDE_INT stack_size = frame.stack_pointer_offset;
10523
10524       /* If it was realigned, take into account the fake frame.  */
10525       if (stack_realign_drap)
10526         {
10527           if (ix86_static_chain_on_stack)
10528             stack_size += UNITS_PER_WORD;
10529
10530           if (!call_used_regs[REGNO (crtl->drap_reg)])
10531             stack_size += UNITS_PER_WORD;
10532
10533           /* This over-estimates by 1 minimal-stack-alignment-unit but
10534              mitigates that by counting in the new return address slot.  */
10535           current_function_dynamic_stack_size
10536             += crtl->stack_alignment_needed / BITS_PER_UNIT;
10537         }
10538
10539       current_function_static_stack_size = stack_size;
10540     }
10541
10542   /* The stack has already been decremented by the instruction calling us
10543      so probe if the size is non-negative to preserve the protection area.  */
10544   if (allocate >= 0 && flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
10545     {
10546       /* We expect the registers to be saved when probes are used.  */
10547       gcc_assert (int_registers_saved);
10548
10549       if (STACK_CHECK_MOVING_SP)
10550         {
10551           ix86_adjust_stack_and_probe (allocate);
10552           allocate = 0;
10553         }
10554       else
10555         {
10556           HOST_WIDE_INT size = allocate;
10557
10558           if (TARGET_64BIT && size >= (HOST_WIDE_INT) 0x80000000)
10559             size = 0x80000000 - STACK_CHECK_PROTECT - 1;
10560
10561           if (TARGET_STACK_PROBE)
10562             ix86_emit_probe_stack_range (0, size + STACK_CHECK_PROTECT);
10563           else
10564             ix86_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
10565         }
10566     }
10567
10568   if (allocate == 0)
10569     ;
10570   else if (!ix86_target_stack_probe ()
10571            || frame.stack_pointer_offset < CHECK_STACK_LIMIT)
10572     {
10573       pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
10574                                  GEN_INT (-allocate), -1,
10575                                  m->fs.cfa_reg == stack_pointer_rtx);
10576     }
10577   else
10578     {
10579       rtx eax = gen_rtx_REG (Pmode, AX_REG);
10580       rtx r10 = NULL;
10581       rtx (*adjust_stack_insn)(rtx, rtx, rtx);
10582
10583       bool eax_live = false;
10584       bool r10_live = false;
10585
10586       if (TARGET_64BIT)
10587         r10_live = (DECL_STATIC_CHAIN (current_function_decl) != 0);
10588       if (!TARGET_64BIT_MS_ABI)
10589         eax_live = ix86_eax_live_at_start_p ();
10590
10591       if (eax_live)
10592         {
10593           emit_insn (gen_push (eax));
10594           allocate -= UNITS_PER_WORD;
10595         }
10596       if (r10_live)
10597         {
10598           r10 = gen_rtx_REG (Pmode, R10_REG);
10599           emit_insn (gen_push (r10));
10600           allocate -= UNITS_PER_WORD;
10601         }
10602
10603       emit_move_insn (eax, GEN_INT (allocate));
10604       emit_insn (ix86_gen_allocate_stack_worker (eax, eax));
10605
10606       /* Use the fact that AX still contains ALLOCATE.  */
10607       adjust_stack_insn = (TARGET_64BIT
10608                            ? gen_pro_epilogue_adjust_stack_di_sub
10609                            : gen_pro_epilogue_adjust_stack_si_sub);
10610
10611       insn = emit_insn (adjust_stack_insn (stack_pointer_rtx,
10612                                            stack_pointer_rtx, eax));
10613
10614       /* Note that SEH directives need to continue tracking the stack
10615          pointer even after the frame pointer has been set up.  */
10616       if (m->fs.cfa_reg == stack_pointer_rtx || TARGET_SEH)
10617         {
10618           if (m->fs.cfa_reg == stack_pointer_rtx)
10619             m->fs.cfa_offset += allocate;
10620
10621           RTX_FRAME_RELATED_P (insn) = 1;
10622           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
10623                         gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10624                                      plus_constant (stack_pointer_rtx,
10625                                                     -allocate)));
10626         }
10627       m->fs.sp_offset += allocate;
10628
10629       if (r10_live && eax_live)
10630         {
10631           t = choose_baseaddr (m->fs.sp_offset - allocate);
10632           emit_move_insn (r10, gen_frame_mem (Pmode, t));
10633           t = choose_baseaddr (m->fs.sp_offset - allocate - UNITS_PER_WORD);
10634           emit_move_insn (eax, gen_frame_mem (Pmode, t));
10635         }
10636       else if (eax_live || r10_live)
10637         {
10638           t = choose_baseaddr (m->fs.sp_offset - allocate);
10639           emit_move_insn ((eax_live ? eax : r10), gen_frame_mem (Pmode, t));
10640         }
10641     }
10642   gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset);
10643
10644   /* If we havn't already set up the frame pointer, do so now.  */
10645   if (frame_pointer_needed && !m->fs.fp_valid)
10646     {
10647       insn = ix86_gen_add3 (hard_frame_pointer_rtx, stack_pointer_rtx,
10648                             GEN_INT (frame.stack_pointer_offset
10649                                      - frame.hard_frame_pointer_offset));
10650       insn = emit_insn (insn);
10651       RTX_FRAME_RELATED_P (insn) = 1;
10652       add_reg_note (insn, REG_CFA_ADJUST_CFA, NULL);
10653
10654       if (m->fs.cfa_reg == stack_pointer_rtx)
10655         m->fs.cfa_reg = hard_frame_pointer_rtx;
10656       m->fs.fp_offset = frame.hard_frame_pointer_offset;
10657       m->fs.fp_valid = true;
10658     }
10659
10660   if (!int_registers_saved)
10661     ix86_emit_save_regs_using_mov (frame.reg_save_offset);
10662   if (frame.nsseregs)
10663     ix86_emit_save_sse_regs_using_mov (frame.sse_reg_save_offset);
10664
10665   pic_reg_used = false;
10666   if (pic_offset_table_rtx
10667       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
10668           || crtl->profile))
10669     {
10670       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
10671
10672       if (alt_pic_reg_used != INVALID_REGNUM)
10673         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
10674
10675       pic_reg_used = true;
10676     }
10677
10678   if (pic_reg_used)
10679     {
10680       if (TARGET_64BIT)
10681         {
10682           if (ix86_cmodel == CM_LARGE_PIC)
10683             {
10684               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
10685               rtx label = gen_label_rtx ();
10686               emit_label (label);
10687               LABEL_PRESERVE_P (label) = 1;
10688               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
10689               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
10690               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
10691               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
10692                                             pic_offset_table_rtx, tmp_reg));
10693             }
10694           else
10695             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
10696         }
10697       else
10698         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
10699     }
10700
10701   /* In the pic_reg_used case, make sure that the got load isn't deleted
10702      when mcount needs it.  Blockage to avoid call movement across mcount
10703      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
10704      note.  */
10705   if (crtl->profile && !flag_fentry && pic_reg_used)
10706     emit_insn (gen_prologue_use (pic_offset_table_rtx));
10707
10708   if (crtl->drap_reg && !crtl->stack_realign_needed)
10709     {
10710       /* vDRAP is setup but after reload it turns out stack realign
10711          isn't necessary, here we will emit prologue to setup DRAP
10712          without stack realign adjustment */
10713       t = choose_baseaddr (0);
10714       emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, t));
10715     }
10716
10717   /* Prevent instructions from being scheduled into register save push
10718      sequence when access to the redzone area is done through frame pointer.
10719      The offset between the frame pointer and the stack pointer is calculated
10720      relative to the value of the stack pointer at the end of the function
10721      prologue, and moving instructions that access redzone area via frame
10722      pointer inside push sequence violates this assumption.  */
10723   if (frame_pointer_needed && frame.red_zone_size)
10724     emit_insn (gen_memory_blockage ());
10725
10726   /* Emit cld instruction if stringops are used in the function.  */
10727   if (TARGET_CLD && ix86_current_function_needs_cld)
10728     emit_insn (gen_cld ());
10729
10730   /* SEH requires that the prologue end within 256 bytes of the start of
10731      the function.  Prevent instruction schedules that would extend that.  */
10732   if (TARGET_SEH)
10733     emit_insn (gen_blockage ());
10734 }
10735
10736 /* Emit code to restore REG using a POP insn.  */
10737
10738 static void
10739 ix86_emit_restore_reg_using_pop (rtx reg)
10740 {
10741   struct machine_function *m = cfun->machine;
10742   rtx insn = emit_insn (gen_pop (reg));
10743
10744   ix86_add_cfa_restore_note (insn, reg, m->fs.sp_offset);
10745   m->fs.sp_offset -= UNITS_PER_WORD;
10746
10747   if (m->fs.cfa_reg == crtl->drap_reg
10748       && REGNO (reg) == REGNO (crtl->drap_reg))
10749     {
10750       /* Previously we'd represented the CFA as an expression
10751          like *(%ebp - 8).  We've just popped that value from
10752          the stack, which means we need to reset the CFA to
10753          the drap register.  This will remain until we restore
10754          the stack pointer.  */
10755       add_reg_note (insn, REG_CFA_DEF_CFA, reg);
10756       RTX_FRAME_RELATED_P (insn) = 1;
10757
10758       /* This means that the DRAP register is valid for addressing too.  */
10759       m->fs.drap_valid = true;
10760       return;
10761     }
10762
10763   if (m->fs.cfa_reg == stack_pointer_rtx)
10764     {
10765       rtx x = plus_constant (stack_pointer_rtx, UNITS_PER_WORD);
10766       x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x);
10767       add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
10768       RTX_FRAME_RELATED_P (insn) = 1;
10769
10770       m->fs.cfa_offset -= UNITS_PER_WORD;
10771     }
10772
10773   /* When the frame pointer is the CFA, and we pop it, we are
10774      swapping back to the stack pointer as the CFA.  This happens
10775      for stack frames that don't allocate other data, so we assume
10776      the stack pointer is now pointing at the return address, i.e.
10777      the function entry state, which makes the offset be 1 word.  */
10778   if (reg == hard_frame_pointer_rtx)
10779     {
10780       m->fs.fp_valid = false;
10781       if (m->fs.cfa_reg == hard_frame_pointer_rtx)
10782         {
10783           m->fs.cfa_reg = stack_pointer_rtx;
10784           m->fs.cfa_offset -= UNITS_PER_WORD;
10785
10786           add_reg_note (insn, REG_CFA_DEF_CFA,
10787                         gen_rtx_PLUS (Pmode, stack_pointer_rtx,
10788                                       GEN_INT (m->fs.cfa_offset)));
10789           RTX_FRAME_RELATED_P (insn) = 1;
10790         }
10791     }
10792 }
10793
10794 /* Emit code to restore saved registers using POP insns.  */
10795
10796 static void
10797 ix86_emit_restore_regs_using_pop (void)
10798 {
10799   unsigned int regno;
10800
10801   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10802     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
10803       ix86_emit_restore_reg_using_pop (gen_rtx_REG (Pmode, regno));
10804 }
10805
10806 /* Emit code and notes for the LEAVE instruction.  */
10807
10808 static void
10809 ix86_emit_leave (void)
10810 {
10811   struct machine_function *m = cfun->machine;
10812   rtx insn = emit_insn (ix86_gen_leave ());
10813
10814   ix86_add_queued_cfa_restore_notes (insn);
10815
10816   gcc_assert (m->fs.fp_valid);
10817   m->fs.sp_valid = true;
10818   m->fs.sp_offset = m->fs.fp_offset - UNITS_PER_WORD;
10819   m->fs.fp_valid = false;
10820
10821   if (m->fs.cfa_reg == hard_frame_pointer_rtx)
10822     {
10823       m->fs.cfa_reg = stack_pointer_rtx;
10824       m->fs.cfa_offset = m->fs.sp_offset;
10825
10826       add_reg_note (insn, REG_CFA_DEF_CFA,
10827                     plus_constant (stack_pointer_rtx, m->fs.sp_offset));
10828       RTX_FRAME_RELATED_P (insn) = 1;
10829       ix86_add_cfa_restore_note (insn, hard_frame_pointer_rtx,
10830                                  m->fs.fp_offset);
10831     }
10832 }
10833
10834 /* Emit code to restore saved registers using MOV insns.
10835    First register is restored from CFA - CFA_OFFSET.  */
10836 static void
10837 ix86_emit_restore_regs_using_mov (HOST_WIDE_INT cfa_offset,
10838                                   bool maybe_eh_return)
10839 {
10840   struct machine_function *m = cfun->machine;
10841   unsigned int regno;
10842
10843   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10844     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
10845       {
10846         rtx reg = gen_rtx_REG (Pmode, regno);
10847         rtx insn, mem;
10848         
10849         mem = choose_baseaddr (cfa_offset);
10850         mem = gen_frame_mem (Pmode, mem);
10851         insn = emit_move_insn (reg, mem);
10852
10853         if (m->fs.cfa_reg == crtl->drap_reg && regno == REGNO (crtl->drap_reg))
10854           {
10855             /* Previously we'd represented the CFA as an expression
10856                like *(%ebp - 8).  We've just popped that value from
10857                the stack, which means we need to reset the CFA to
10858                the drap register.  This will remain until we restore
10859                the stack pointer.  */
10860             add_reg_note (insn, REG_CFA_DEF_CFA, reg);
10861             RTX_FRAME_RELATED_P (insn) = 1;
10862
10863             /* This means that the DRAP register is valid for addressing.  */
10864             m->fs.drap_valid = true;
10865           }
10866         else
10867           ix86_add_cfa_restore_note (NULL_RTX, reg, cfa_offset);
10868
10869         cfa_offset -= UNITS_PER_WORD;
10870       }
10871 }
10872
10873 /* Emit code to restore saved registers using MOV insns.
10874    First register is restored from CFA - CFA_OFFSET.  */
10875 static void
10876 ix86_emit_restore_sse_regs_using_mov (HOST_WIDE_INT cfa_offset,
10877                                       bool maybe_eh_return)
10878 {
10879   unsigned int regno;
10880
10881   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10882     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
10883       {
10884         rtx reg = gen_rtx_REG (V4SFmode, regno);
10885         rtx mem;
10886
10887         mem = choose_baseaddr (cfa_offset);
10888         mem = gen_rtx_MEM (V4SFmode, mem);
10889         set_mem_align (mem, 128);
10890         emit_move_insn (reg, mem);
10891
10892         ix86_add_cfa_restore_note (NULL_RTX, reg, cfa_offset);
10893
10894         cfa_offset -= 16;
10895       }
10896 }
10897
10898 /* Restore function stack, frame, and registers.  */
10899
10900 void
10901 ix86_expand_epilogue (int style)
10902 {
10903   struct machine_function *m = cfun->machine;
10904   struct machine_frame_state frame_state_save = m->fs;
10905   struct ix86_frame frame;
10906   bool restore_regs_via_mov;
10907   bool using_drap;
10908
10909   ix86_finalize_stack_realign_flags ();
10910   ix86_compute_frame_layout (&frame);
10911
10912   m->fs.sp_valid = (!frame_pointer_needed
10913                     || (current_function_sp_is_unchanging
10914                         && !stack_realign_fp));
10915   gcc_assert (!m->fs.sp_valid
10916               || m->fs.sp_offset == frame.stack_pointer_offset);
10917
10918   /* The FP must be valid if the frame pointer is present.  */
10919   gcc_assert (frame_pointer_needed == m->fs.fp_valid);
10920   gcc_assert (!m->fs.fp_valid
10921               || m->fs.fp_offset == frame.hard_frame_pointer_offset);
10922
10923   /* We must have *some* valid pointer to the stack frame.  */
10924   gcc_assert (m->fs.sp_valid || m->fs.fp_valid);
10925
10926   /* The DRAP is never valid at this point.  */
10927   gcc_assert (!m->fs.drap_valid);
10928
10929   /* See the comment about red zone and frame
10930      pointer usage in ix86_expand_prologue.  */
10931   if (frame_pointer_needed && frame.red_zone_size)
10932     emit_insn (gen_memory_blockage ());
10933
10934   using_drap = crtl->drap_reg && crtl->stack_realign_needed;
10935   gcc_assert (!using_drap || m->fs.cfa_reg == crtl->drap_reg);
10936
10937   /* Determine the CFA offset of the end of the red-zone.  */
10938   m->fs.red_zone_offset = 0;
10939   if (ix86_using_red_zone () && crtl->args.pops_args < 65536)
10940     {
10941       /* The red-zone begins below the return address.  */
10942       m->fs.red_zone_offset = RED_ZONE_SIZE + UNITS_PER_WORD;
10943
10944       /* When the register save area is in the aligned portion of
10945          the stack, determine the maximum runtime displacement that
10946          matches up with the aligned frame.  */
10947       if (stack_realign_drap)
10948         m->fs.red_zone_offset -= (crtl->stack_alignment_needed / BITS_PER_UNIT
10949                                   + UNITS_PER_WORD);
10950     }
10951
10952   /* Special care must be taken for the normal return case of a function
10953      using eh_return: the eax and edx registers are marked as saved, but
10954      not restored along this path.  Adjust the save location to match.  */
10955   if (crtl->calls_eh_return && style != 2)
10956     frame.reg_save_offset -= 2 * UNITS_PER_WORD;
10957
10958   /* EH_RETURN requires the use of moves to function properly.  */
10959   if (crtl->calls_eh_return)
10960     restore_regs_via_mov = true;
10961   /* SEH requires the use of pops to identify the epilogue.  */
10962   else if (TARGET_SEH)
10963     restore_regs_via_mov = false;
10964   /* If we're only restoring one register and sp is not valid then
10965      using a move instruction to restore the register since it's
10966      less work than reloading sp and popping the register.  */
10967   else if (!m->fs.sp_valid && frame.nregs <= 1)
10968     restore_regs_via_mov = true;
10969   else if (TARGET_EPILOGUE_USING_MOVE
10970            && cfun->machine->use_fast_prologue_epilogue
10971            && (frame.nregs > 1
10972                || m->fs.sp_offset != frame.reg_save_offset))
10973     restore_regs_via_mov = true;
10974   else if (frame_pointer_needed
10975            && !frame.nregs
10976            && m->fs.sp_offset != frame.reg_save_offset)
10977     restore_regs_via_mov = true;
10978   else if (frame_pointer_needed
10979            && TARGET_USE_LEAVE
10980            && cfun->machine->use_fast_prologue_epilogue
10981            && frame.nregs == 1)
10982     restore_regs_via_mov = true;
10983   else
10984     restore_regs_via_mov = false;
10985
10986   if (restore_regs_via_mov || frame.nsseregs)
10987     {
10988       /* Ensure that the entire register save area is addressable via
10989          the stack pointer, if we will restore via sp.  */
10990       if (TARGET_64BIT
10991           && m->fs.sp_offset > 0x7fffffff
10992           && !(m->fs.fp_valid || m->fs.drap_valid)
10993           && (frame.nsseregs + frame.nregs) != 0)
10994         {
10995           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
10996                                      GEN_INT (m->fs.sp_offset
10997                                               - frame.sse_reg_save_offset),
10998                                      style,
10999                                      m->fs.cfa_reg == stack_pointer_rtx);
11000         }
11001     }
11002
11003   /* If there are any SSE registers to restore, then we have to do it
11004      via moves, since there's obviously no pop for SSE regs.  */
11005   if (frame.nsseregs)
11006     ix86_emit_restore_sse_regs_using_mov (frame.sse_reg_save_offset,
11007                                           style == 2);
11008
11009   if (restore_regs_via_mov)
11010     {
11011       rtx t;
11012
11013       if (frame.nregs)
11014         ix86_emit_restore_regs_using_mov (frame.reg_save_offset, style == 2);
11015
11016       /* eh_return epilogues need %ecx added to the stack pointer.  */
11017       if (style == 2)
11018         {
11019           rtx insn, sa = EH_RETURN_STACKADJ_RTX;
11020
11021           /* Stack align doesn't work with eh_return.  */
11022           gcc_assert (!stack_realign_drap);
11023           /* Neither does regparm nested functions.  */
11024           gcc_assert (!ix86_static_chain_on_stack);
11025
11026           if (frame_pointer_needed)
11027             {
11028               t = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
11029               t = plus_constant (t, m->fs.fp_offset - UNITS_PER_WORD);
11030               emit_insn (gen_rtx_SET (VOIDmode, sa, t));
11031
11032               t = gen_frame_mem (Pmode, hard_frame_pointer_rtx);
11033               insn = emit_move_insn (hard_frame_pointer_rtx, t);
11034
11035               /* Note that we use SA as a temporary CFA, as the return
11036                  address is at the proper place relative to it.  We
11037                  pretend this happens at the FP restore insn because
11038                  prior to this insn the FP would be stored at the wrong
11039                  offset relative to SA, and after this insn we have no
11040                  other reasonable register to use for the CFA.  We don't
11041                  bother resetting the CFA to the SP for the duration of
11042                  the return insn.  */
11043               add_reg_note (insn, REG_CFA_DEF_CFA,
11044                             plus_constant (sa, UNITS_PER_WORD));
11045               ix86_add_queued_cfa_restore_notes (insn);
11046               add_reg_note (insn, REG_CFA_RESTORE, hard_frame_pointer_rtx);
11047               RTX_FRAME_RELATED_P (insn) = 1;
11048
11049               m->fs.cfa_reg = sa;
11050               m->fs.cfa_offset = UNITS_PER_WORD;
11051               m->fs.fp_valid = false;
11052
11053               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
11054                                          const0_rtx, style, false);
11055             }
11056           else
11057             {
11058               t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
11059               t = plus_constant (t, m->fs.sp_offset - UNITS_PER_WORD);
11060               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, t));
11061               ix86_add_queued_cfa_restore_notes (insn);
11062
11063               gcc_assert (m->fs.cfa_reg == stack_pointer_rtx);
11064               if (m->fs.cfa_offset != UNITS_PER_WORD)
11065                 {
11066                   m->fs.cfa_offset = UNITS_PER_WORD;
11067                   add_reg_note (insn, REG_CFA_DEF_CFA,
11068                                 plus_constant (stack_pointer_rtx,
11069                                                UNITS_PER_WORD));
11070                   RTX_FRAME_RELATED_P (insn) = 1;
11071                 }
11072             }
11073           m->fs.sp_offset = UNITS_PER_WORD;
11074           m->fs.sp_valid = true;
11075         }
11076     }
11077   else
11078     {
11079       /* SEH requires that the function end with (1) a stack adjustment
11080          if necessary, (2) a sequence of pops, and (3) a return or
11081          jump instruction.  Prevent insns from the function body from
11082          being scheduled into this sequence.  */
11083       if (TARGET_SEH)
11084         {
11085           /* Prevent a catch region from being adjacent to the standard
11086              epilogue sequence.  Unfortuantely crtl->uses_eh_lsda nor
11087              several other flags that would be interesting to test are
11088              not yet set up.  */
11089           if (flag_non_call_exceptions)
11090             emit_insn (gen_nops (const1_rtx));
11091           else
11092             emit_insn (gen_blockage ());
11093         }
11094
11095       /* First step is to deallocate the stack frame so that we can
11096          pop the registers.  */
11097       if (!m->fs.sp_valid)
11098         {
11099           pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,
11100                                      GEN_INT (m->fs.fp_offset
11101                                               - frame.reg_save_offset),
11102                                      style, false);
11103         }
11104       else if (m->fs.sp_offset != frame.reg_save_offset)
11105         {
11106           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11107                                      GEN_INT (m->fs.sp_offset
11108                                               - frame.reg_save_offset),
11109                                      style,
11110                                      m->fs.cfa_reg == stack_pointer_rtx);
11111         }
11112
11113       ix86_emit_restore_regs_using_pop ();
11114     }
11115
11116   /* If we used a stack pointer and haven't already got rid of it,
11117      then do so now.  */
11118   if (m->fs.fp_valid)
11119     {
11120       /* If the stack pointer is valid and pointing at the frame
11121          pointer store address, then we only need a pop.  */
11122       if (m->fs.sp_valid && m->fs.sp_offset == frame.hfp_save_offset)
11123         ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx);
11124       /* Leave results in shorter dependency chains on CPUs that are
11125          able to grok it fast.  */
11126       else if (TARGET_USE_LEAVE
11127                || optimize_function_for_size_p (cfun)
11128                || !cfun->machine->use_fast_prologue_epilogue)
11129         ix86_emit_leave ();
11130       else
11131         {
11132           pro_epilogue_adjust_stack (stack_pointer_rtx,
11133                                      hard_frame_pointer_rtx,
11134                                      const0_rtx, style, !using_drap);
11135           ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx);
11136         }
11137     }
11138
11139   if (using_drap)
11140     {
11141       int param_ptr_offset = UNITS_PER_WORD;
11142       rtx insn;
11143
11144       gcc_assert (stack_realign_drap);
11145
11146       if (ix86_static_chain_on_stack)
11147         param_ptr_offset += UNITS_PER_WORD;
11148       if (!call_used_regs[REGNO (crtl->drap_reg)])
11149         param_ptr_offset += UNITS_PER_WORD;
11150
11151       insn = emit_insn (gen_rtx_SET
11152                         (VOIDmode, stack_pointer_rtx,
11153                          gen_rtx_PLUS (Pmode,
11154                                        crtl->drap_reg,
11155                                        GEN_INT (-param_ptr_offset))));
11156       m->fs.cfa_reg = stack_pointer_rtx;
11157       m->fs.cfa_offset = param_ptr_offset;
11158       m->fs.sp_offset = param_ptr_offset;
11159       m->fs.realigned = false;
11160
11161       add_reg_note (insn, REG_CFA_DEF_CFA,
11162                     gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11163                                   GEN_INT (param_ptr_offset)));
11164       RTX_FRAME_RELATED_P (insn) = 1;
11165
11166       if (!call_used_regs[REGNO (crtl->drap_reg)])
11167         ix86_emit_restore_reg_using_pop (crtl->drap_reg);
11168     }
11169
11170   /* At this point the stack pointer must be valid, and we must have
11171      restored all of the registers.  We may not have deallocated the
11172      entire stack frame.  We've delayed this until now because it may
11173      be possible to merge the local stack deallocation with the
11174      deallocation forced by ix86_static_chain_on_stack.   */
11175   gcc_assert (m->fs.sp_valid);
11176   gcc_assert (!m->fs.fp_valid);
11177   gcc_assert (!m->fs.realigned);
11178   if (m->fs.sp_offset != UNITS_PER_WORD)
11179     {
11180       pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11181                                  GEN_INT (m->fs.sp_offset - UNITS_PER_WORD),
11182                                  style, true);
11183     }
11184
11185   /* Sibcall epilogues don't want a return instruction.  */
11186   if (style == 0)
11187     {
11188       m->fs = frame_state_save;
11189       return;
11190     }
11191
11192   /* Emit vzeroupper if needed.  */
11193   if (TARGET_VZEROUPPER
11194       && !TREE_THIS_VOLATILE (cfun->decl)
11195       && !cfun->machine->caller_return_avx256_p)
11196     emit_insn (gen_avx_vzeroupper (GEN_INT (call_no_avx256))); 
11197
11198   if (crtl->args.pops_args && crtl->args.size)
11199     {
11200       rtx popc = GEN_INT (crtl->args.pops_args);
11201
11202       /* i386 can only pop 64K bytes.  If asked to pop more, pop return
11203          address, do explicit add, and jump indirectly to the caller.  */
11204
11205       if (crtl->args.pops_args >= 65536)
11206         {
11207           rtx ecx = gen_rtx_REG (SImode, CX_REG);
11208           rtx insn;
11209
11210           /* There is no "pascal" calling convention in any 64bit ABI.  */
11211           gcc_assert (!TARGET_64BIT);
11212
11213           insn = emit_insn (gen_pop (ecx));
11214           m->fs.cfa_offset -= UNITS_PER_WORD;
11215           m->fs.sp_offset -= UNITS_PER_WORD;
11216
11217           add_reg_note (insn, REG_CFA_ADJUST_CFA,
11218                         copy_rtx (XVECEXP (PATTERN (insn), 0, 1)));
11219           add_reg_note (insn, REG_CFA_REGISTER,
11220                         gen_rtx_SET (VOIDmode, ecx, pc_rtx));
11221           RTX_FRAME_RELATED_P (insn) = 1;
11222
11223           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11224                                      popc, -1, true);
11225           emit_jump_insn (gen_return_indirect_internal (ecx));
11226         }
11227       else
11228         emit_jump_insn (gen_return_pop_internal (popc));
11229     }
11230   else
11231     emit_jump_insn (gen_return_internal ());
11232
11233   /* Restore the state back to the state from the prologue,
11234      so that it's correct for the next epilogue.  */
11235   m->fs = frame_state_save;
11236 }
11237
11238 /* Reset from the function's potential modifications.  */
11239
11240 static void
11241 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
11242                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
11243 {
11244   if (pic_offset_table_rtx)
11245     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
11246 #if TARGET_MACHO
11247   /* Mach-O doesn't support labels at the end of objects, so if
11248      it looks like we might want one, insert a NOP.  */
11249   {
11250     rtx insn = get_last_insn ();
11251     while (insn
11252            && NOTE_P (insn)
11253            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
11254       insn = PREV_INSN (insn);
11255     if (insn
11256         && (LABEL_P (insn)
11257             || (NOTE_P (insn)
11258                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
11259       fputs ("\tnop\n", file);
11260   }
11261 #endif
11262
11263 }
11264
11265 /* Return a scratch register to use in the split stack prologue.  The
11266    split stack prologue is used for -fsplit-stack.  It is the first
11267    instructions in the function, even before the regular prologue.
11268    The scratch register can be any caller-saved register which is not
11269    used for parameters or for the static chain.  */
11270
11271 static unsigned int
11272 split_stack_prologue_scratch_regno (void)
11273 {
11274   if (TARGET_64BIT)
11275     return R11_REG;
11276   else
11277     {
11278       bool is_fastcall;
11279       int regparm;
11280
11281       is_fastcall = (lookup_attribute ("fastcall",
11282                                        TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl)))
11283                      != NULL);
11284       regparm = ix86_function_regparm (TREE_TYPE (cfun->decl), cfun->decl);
11285
11286       if (is_fastcall)
11287         {
11288           if (DECL_STATIC_CHAIN (cfun->decl))
11289             {
11290               sorry ("-fsplit-stack does not support fastcall with "
11291                      "nested function");
11292               return INVALID_REGNUM;
11293             }
11294           return AX_REG;
11295         }
11296       else if (regparm < 3)
11297         {
11298           if (!DECL_STATIC_CHAIN (cfun->decl))
11299             return CX_REG;
11300           else
11301             {
11302               if (regparm >= 2)
11303                 {
11304                   sorry ("-fsplit-stack does not support 2 register "
11305                          " parameters for a nested function");
11306                   return INVALID_REGNUM;
11307                 }
11308               return DX_REG;
11309             }
11310         }
11311       else
11312         {
11313           /* FIXME: We could make this work by pushing a register
11314              around the addition and comparison.  */
11315           sorry ("-fsplit-stack does not support 3 register parameters");
11316           return INVALID_REGNUM;
11317         }
11318     }
11319 }
11320
11321 /* A SYMBOL_REF for the function which allocates new stackspace for
11322    -fsplit-stack.  */
11323
11324 static GTY(()) rtx split_stack_fn;
11325
11326 /* A SYMBOL_REF for the more stack function when using the large
11327    model.  */
11328
11329 static GTY(()) rtx split_stack_fn_large;
11330
11331 /* Handle -fsplit-stack.  These are the first instructions in the
11332    function, even before the regular prologue.  */
11333
11334 void
11335 ix86_expand_split_stack_prologue (void)
11336 {
11337   struct ix86_frame frame;
11338   HOST_WIDE_INT allocate;
11339   unsigned HOST_WIDE_INT args_size;
11340   rtx label, limit, current, jump_insn, allocate_rtx, call_insn, call_fusage;
11341   rtx scratch_reg = NULL_RTX;
11342   rtx varargs_label = NULL_RTX;
11343   rtx fn;
11344
11345   gcc_assert (flag_split_stack && reload_completed);
11346
11347   ix86_finalize_stack_realign_flags ();
11348   ix86_compute_frame_layout (&frame);
11349   allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;
11350
11351   /* This is the label we will branch to if we have enough stack
11352      space.  We expect the basic block reordering pass to reverse this
11353      branch if optimizing, so that we branch in the unlikely case.  */
11354   label = gen_label_rtx ();
11355
11356   /* We need to compare the stack pointer minus the frame size with
11357      the stack boundary in the TCB.  The stack boundary always gives
11358      us SPLIT_STACK_AVAILABLE bytes, so if we need less than that we
11359      can compare directly.  Otherwise we need to do an addition.  */
11360
11361   limit = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
11362                           UNSPEC_STACK_CHECK);
11363   limit = gen_rtx_CONST (Pmode, limit);
11364   limit = gen_rtx_MEM (Pmode, limit);
11365   if (allocate < SPLIT_STACK_AVAILABLE)
11366     current = stack_pointer_rtx;
11367   else
11368     {
11369       unsigned int scratch_regno;
11370       rtx offset;
11371
11372       /* We need a scratch register to hold the stack pointer minus
11373          the required frame size.  Since this is the very start of the
11374          function, the scratch register can be any caller-saved
11375          register which is not used for parameters.  */
11376       offset = GEN_INT (- allocate);
11377       scratch_regno = split_stack_prologue_scratch_regno ();
11378       if (scratch_regno == INVALID_REGNUM)
11379         return;
11380       scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
11381       if (!TARGET_64BIT || x86_64_immediate_operand (offset, Pmode))
11382         {
11383           /* We don't use ix86_gen_add3 in this case because it will
11384              want to split to lea, but when not optimizing the insn
11385              will not be split after this point.  */
11386           emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11387                                   gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11388                                                 offset)));
11389         }
11390       else
11391         {
11392           emit_move_insn (scratch_reg, offset);
11393           emit_insn (gen_adddi3 (scratch_reg, scratch_reg,
11394                                  stack_pointer_rtx));
11395         }
11396       current = scratch_reg;
11397     }
11398
11399   ix86_expand_branch (GEU, current, limit, label);
11400   jump_insn = get_last_insn ();
11401   JUMP_LABEL (jump_insn) = label;
11402
11403   /* Mark the jump as very likely to be taken.  */
11404   add_reg_note (jump_insn, REG_BR_PROB,
11405                 GEN_INT (REG_BR_PROB_BASE - REG_BR_PROB_BASE / 100));
11406
11407   if (split_stack_fn == NULL_RTX)
11408     split_stack_fn = gen_rtx_SYMBOL_REF (Pmode, "__morestack");
11409   fn = split_stack_fn;
11410
11411   /* Get more stack space.  We pass in the desired stack space and the
11412      size of the arguments to copy to the new stack.  In 32-bit mode
11413      we push the parameters; __morestack will return on a new stack
11414      anyhow.  In 64-bit mode we pass the parameters in r10 and
11415      r11.  */
11416   allocate_rtx = GEN_INT (allocate);
11417   args_size = crtl->args.size >= 0 ? crtl->args.size : 0;
11418   call_fusage = NULL_RTX;
11419   if (TARGET_64BIT)
11420     {
11421       rtx reg10, reg11;
11422
11423       reg10 = gen_rtx_REG (Pmode, R10_REG);
11424       reg11 = gen_rtx_REG (Pmode, R11_REG);
11425
11426       /* If this function uses a static chain, it will be in %r10.
11427          Preserve it across the call to __morestack.  */
11428       if (DECL_STATIC_CHAIN (cfun->decl))
11429         {
11430           rtx rax;
11431
11432           rax = gen_rtx_REG (Pmode, AX_REG);
11433           emit_move_insn (rax, reg10);
11434           use_reg (&call_fusage, rax);
11435         }
11436
11437       if (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
11438         {
11439           HOST_WIDE_INT argval;
11440
11441           /* When using the large model we need to load the address
11442              into a register, and we've run out of registers.  So we
11443              switch to a different calling convention, and we call a
11444              different function: __morestack_large.  We pass the
11445              argument size in the upper 32 bits of r10 and pass the
11446              frame size in the lower 32 bits.  */
11447           gcc_assert ((allocate & (HOST_WIDE_INT) 0xffffffff) == allocate);
11448           gcc_assert ((args_size & 0xffffffff) == args_size);
11449
11450           if (split_stack_fn_large == NULL_RTX)
11451             split_stack_fn_large =
11452               gen_rtx_SYMBOL_REF (Pmode, "__morestack_large_model");
11453
11454           if (ix86_cmodel == CM_LARGE_PIC)
11455             {
11456               rtx label, x;
11457
11458               label = gen_label_rtx ();
11459               emit_label (label);
11460               LABEL_PRESERVE_P (label) = 1;
11461               emit_insn (gen_set_rip_rex64 (reg10, label));
11462               emit_insn (gen_set_got_offset_rex64 (reg11, label));
11463               emit_insn (gen_adddi3 (reg10, reg10, reg11));
11464               x = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, split_stack_fn_large),
11465                                   UNSPEC_GOT);
11466               x = gen_rtx_CONST (Pmode, x);
11467               emit_move_insn (reg11, x);
11468               x = gen_rtx_PLUS (Pmode, reg10, reg11);
11469               x = gen_const_mem (Pmode, x);
11470               emit_move_insn (reg11, x);
11471             }
11472           else
11473             emit_move_insn (reg11, split_stack_fn_large);
11474
11475           fn = reg11;
11476
11477           argval = ((args_size << 16) << 16) + allocate;
11478           emit_move_insn (reg10, GEN_INT (argval));
11479         }
11480       else
11481         {
11482           emit_move_insn (reg10, allocate_rtx);
11483           emit_move_insn (reg11, GEN_INT (args_size));
11484           use_reg (&call_fusage, reg11);
11485         }
11486
11487       use_reg (&call_fusage, reg10);
11488     }
11489   else
11490     {
11491       emit_insn (gen_push (GEN_INT (args_size)));
11492       emit_insn (gen_push (allocate_rtx));
11493     }
11494   call_insn = ix86_expand_call (NULL_RTX, gen_rtx_MEM (QImode, fn),
11495                                 GEN_INT (UNITS_PER_WORD), constm1_rtx,
11496                                 NULL_RTX, 0);
11497   add_function_usage_to (call_insn, call_fusage);
11498
11499   /* In order to make call/return prediction work right, we now need
11500      to execute a return instruction.  See
11501      libgcc/config/i386/morestack.S for the details on how this works.
11502
11503      For flow purposes gcc must not see this as a return
11504      instruction--we need control flow to continue at the subsequent
11505      label.  Therefore, we use an unspec.  */
11506   gcc_assert (crtl->args.pops_args < 65536);
11507   emit_insn (gen_split_stack_return (GEN_INT (crtl->args.pops_args)));
11508
11509   /* If we are in 64-bit mode and this function uses a static chain,
11510      we saved %r10 in %rax before calling _morestack.  */
11511   if (TARGET_64BIT && DECL_STATIC_CHAIN (cfun->decl))
11512     emit_move_insn (gen_rtx_REG (Pmode, R10_REG),
11513                     gen_rtx_REG (Pmode, AX_REG));
11514
11515   /* If this function calls va_start, we need to store a pointer to
11516      the arguments on the old stack, because they may not have been
11517      all copied to the new stack.  At this point the old stack can be
11518      found at the frame pointer value used by __morestack, because
11519      __morestack has set that up before calling back to us.  Here we
11520      store that pointer in a scratch register, and in
11521      ix86_expand_prologue we store the scratch register in a stack
11522      slot.  */
11523   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11524     {
11525       unsigned int scratch_regno;
11526       rtx frame_reg;
11527       int words;
11528
11529       scratch_regno = split_stack_prologue_scratch_regno ();
11530       scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
11531       frame_reg = gen_rtx_REG (Pmode, BP_REG);
11532
11533       /* 64-bit:
11534          fp -> old fp value
11535                return address within this function
11536                return address of caller of this function
11537                stack arguments
11538          So we add three words to get to the stack arguments.
11539
11540          32-bit:
11541          fp -> old fp value
11542                return address within this function
11543                first argument to __morestack
11544                second argument to __morestack
11545                return address of caller of this function
11546                stack arguments
11547          So we add five words to get to the stack arguments.
11548       */
11549       words = TARGET_64BIT ? 3 : 5;
11550       emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11551                               gen_rtx_PLUS (Pmode, frame_reg,
11552                                             GEN_INT (words * UNITS_PER_WORD))));
11553
11554       varargs_label = gen_label_rtx ();
11555       emit_jump_insn (gen_jump (varargs_label));
11556       JUMP_LABEL (get_last_insn ()) = varargs_label;
11557
11558       emit_barrier ();
11559     }
11560
11561   emit_label (label);
11562   LABEL_NUSES (label) = 1;
11563
11564   /* If this function calls va_start, we now have to set the scratch
11565      register for the case where we do not call __morestack.  In this
11566      case we need to set it based on the stack pointer.  */
11567   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11568     {
11569       emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11570                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11571                                             GEN_INT (UNITS_PER_WORD))));
11572
11573       emit_label (varargs_label);
11574       LABEL_NUSES (varargs_label) = 1;
11575     }
11576 }
11577
11578 /* We may have to tell the dataflow pass that the split stack prologue
11579    is initializing a scratch register.  */
11580
11581 static void
11582 ix86_live_on_entry (bitmap regs)
11583 {
11584   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11585     {
11586       gcc_assert (flag_split_stack);
11587       bitmap_set_bit (regs, split_stack_prologue_scratch_regno ());
11588     }
11589 }
11590 \f
11591 /* Extract the parts of an RTL expression that is a valid memory address
11592    for an instruction.  Return 0 if the structure of the address is
11593    grossly off.  Return -1 if the address contains ASHIFT, so it is not
11594    strictly valid, but still used for computing length of lea instruction.  */
11595
11596 int
11597 ix86_decompose_address (rtx addr, struct ix86_address *out)
11598 {
11599   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
11600   rtx base_reg, index_reg;
11601   HOST_WIDE_INT scale = 1;
11602   rtx scale_rtx = NULL_RTX;
11603   rtx tmp;
11604   int retval = 1;
11605   enum ix86_address_seg seg = SEG_DEFAULT;
11606
11607   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
11608     base = addr;
11609   else if (GET_CODE (addr) == PLUS)
11610     {
11611       rtx addends[4], op;
11612       int n = 0, i;
11613
11614       op = addr;
11615       do
11616         {
11617           if (n >= 4)
11618             return 0;
11619           addends[n++] = XEXP (op, 1);
11620           op = XEXP (op, 0);
11621         }
11622       while (GET_CODE (op) == PLUS);
11623       if (n >= 4)
11624         return 0;
11625       addends[n] = op;
11626
11627       for (i = n; i >= 0; --i)
11628         {
11629           op = addends[i];
11630           switch (GET_CODE (op))
11631             {
11632             case MULT:
11633               if (index)
11634                 return 0;
11635               index = XEXP (op, 0);
11636               scale_rtx = XEXP (op, 1);
11637               break;
11638
11639             case ASHIFT:
11640               if (index)
11641                 return 0;
11642               index = XEXP (op, 0);
11643               tmp = XEXP (op, 1);
11644               if (!CONST_INT_P (tmp))
11645                 return 0;
11646               scale = INTVAL (tmp);
11647               if ((unsigned HOST_WIDE_INT) scale > 3)
11648                 return 0;
11649               scale = 1 << scale;
11650               break;
11651
11652             case UNSPEC:
11653               if (XINT (op, 1) == UNSPEC_TP
11654                   && TARGET_TLS_DIRECT_SEG_REFS
11655                   && seg == SEG_DEFAULT)
11656                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
11657               else
11658                 return 0;
11659               break;
11660
11661             case REG:
11662             case SUBREG:
11663               if (!base)
11664                 base = op;
11665               else if (!index)
11666                 index = op;
11667               else
11668                 return 0;
11669               break;
11670
11671             case CONST:
11672             case CONST_INT:
11673             case SYMBOL_REF:
11674             case LABEL_REF:
11675               if (disp)
11676                 return 0;
11677               disp = op;
11678               break;
11679
11680             default:
11681               return 0;
11682             }
11683         }
11684     }
11685   else if (GET_CODE (addr) == MULT)
11686     {
11687       index = XEXP (addr, 0);           /* index*scale */
11688       scale_rtx = XEXP (addr, 1);
11689     }
11690   else if (GET_CODE (addr) == ASHIFT)
11691     {
11692       /* We're called for lea too, which implements ashift on occasion.  */
11693       index = XEXP (addr, 0);
11694       tmp = XEXP (addr, 1);
11695       if (!CONST_INT_P (tmp))
11696         return 0;
11697       scale = INTVAL (tmp);
11698       if ((unsigned HOST_WIDE_INT) scale > 3)
11699         return 0;
11700       scale = 1 << scale;
11701       retval = -1;
11702     }
11703   else
11704     disp = addr;                        /* displacement */
11705
11706   /* Extract the integral value of scale.  */
11707   if (scale_rtx)
11708     {
11709       if (!CONST_INT_P (scale_rtx))
11710         return 0;
11711       scale = INTVAL (scale_rtx);
11712     }
11713
11714   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
11715   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
11716
11717   /* Avoid useless 0 displacement.  */
11718   if (disp == const0_rtx && (base || index))
11719     disp = NULL_RTX;
11720
11721   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
11722   if (base_reg && index_reg && scale == 1
11723       && (index_reg == arg_pointer_rtx
11724           || index_reg == frame_pointer_rtx
11725           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
11726     {
11727       rtx tmp;
11728       tmp = base, base = index, index = tmp;
11729       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
11730     }
11731
11732   /* Special case: %ebp cannot be encoded as a base without a displacement.
11733      Similarly %r13.  */
11734   if (!disp
11735       && base_reg
11736       && (base_reg == hard_frame_pointer_rtx
11737           || base_reg == frame_pointer_rtx
11738           || base_reg == arg_pointer_rtx
11739           || (REG_P (base_reg)
11740               && (REGNO (base_reg) == HARD_FRAME_POINTER_REGNUM
11741                   || REGNO (base_reg) == R13_REG))))
11742     disp = const0_rtx;
11743
11744   /* Special case: on K6, [%esi] makes the instruction vector decoded.
11745      Avoid this by transforming to [%esi+0].
11746      Reload calls address legitimization without cfun defined, so we need
11747      to test cfun for being non-NULL. */
11748   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
11749       && base_reg && !index_reg && !disp
11750       && REG_P (base_reg) && REGNO (base_reg) == SI_REG)
11751     disp = const0_rtx;
11752
11753   /* Special case: encode reg+reg instead of reg*2.  */
11754   if (!base && index && scale == 2)
11755     base = index, base_reg = index_reg, scale = 1;
11756
11757   /* Special case: scaling cannot be encoded without base or displacement.  */
11758   if (!base && !disp && index && scale != 1)
11759     disp = const0_rtx;
11760
11761   out->base = base;
11762   out->index = index;
11763   out->disp = disp;
11764   out->scale = scale;
11765   out->seg = seg;
11766
11767   return retval;
11768 }
11769 \f
11770 /* Return cost of the memory address x.
11771    For i386, it is better to use a complex address than let gcc copy
11772    the address into a reg and make a new pseudo.  But not if the address
11773    requires to two regs - that would mean more pseudos with longer
11774    lifetimes.  */
11775 static int
11776 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
11777 {
11778   struct ix86_address parts;
11779   int cost = 1;
11780   int ok = ix86_decompose_address (x, &parts);
11781
11782   gcc_assert (ok);
11783
11784   if (parts.base && GET_CODE (parts.base) == SUBREG)
11785     parts.base = SUBREG_REG (parts.base);
11786   if (parts.index && GET_CODE (parts.index) == SUBREG)
11787     parts.index = SUBREG_REG (parts.index);
11788
11789   /* Attempt to minimize number of registers in the address.  */
11790   if ((parts.base
11791        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
11792       || (parts.index
11793           && (!REG_P (parts.index)
11794               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
11795     cost++;
11796
11797   if (parts.base
11798       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
11799       && parts.index
11800       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
11801       && parts.base != parts.index)
11802     cost++;
11803
11804   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
11805      since it's predecode logic can't detect the length of instructions
11806      and it degenerates to vector decoded.  Increase cost of such
11807      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
11808      to split such addresses or even refuse such addresses at all.
11809
11810      Following addressing modes are affected:
11811       [base+scale*index]
11812       [scale*index+disp]
11813       [base+index]
11814
11815      The first and last case  may be avoidable by explicitly coding the zero in
11816      memory address, but I don't have AMD-K6 machine handy to check this
11817      theory.  */
11818
11819   if (TARGET_K6
11820       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
11821           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
11822           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
11823     cost += 10;
11824
11825   return cost;
11826 }
11827 \f
11828 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
11829    this is used for to form addresses to local data when -fPIC is in
11830    use.  */
11831
11832 static bool
11833 darwin_local_data_pic (rtx disp)
11834 {
11835   return (GET_CODE (disp) == UNSPEC
11836           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
11837 }
11838
11839 /* Determine if a given RTX is a valid constant.  We already know this
11840    satisfies CONSTANT_P.  */
11841
11842 static bool
11843 ix86_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
11844 {
11845   switch (GET_CODE (x))
11846     {
11847     case CONST:
11848       x = XEXP (x, 0);
11849
11850       if (GET_CODE (x) == PLUS)
11851         {
11852           if (!CONST_INT_P (XEXP (x, 1)))
11853             return false;
11854           x = XEXP (x, 0);
11855         }
11856
11857       if (TARGET_MACHO && darwin_local_data_pic (x))
11858         return true;
11859
11860       /* Only some unspecs are valid as "constants".  */
11861       if (GET_CODE (x) == UNSPEC)
11862         switch (XINT (x, 1))
11863           {
11864           case UNSPEC_GOT:
11865           case UNSPEC_GOTOFF:
11866           case UNSPEC_PLTOFF:
11867             return TARGET_64BIT;
11868           case UNSPEC_TPOFF:
11869           case UNSPEC_NTPOFF:
11870             x = XVECEXP (x, 0, 0);
11871             return (GET_CODE (x) == SYMBOL_REF
11872                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
11873           case UNSPEC_DTPOFF:
11874             x = XVECEXP (x, 0, 0);
11875             return (GET_CODE (x) == SYMBOL_REF
11876                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
11877           default:
11878             return false;
11879           }
11880
11881       /* We must have drilled down to a symbol.  */
11882       if (GET_CODE (x) == LABEL_REF)
11883         return true;
11884       if (GET_CODE (x) != SYMBOL_REF)
11885         return false;
11886       /* FALLTHRU */
11887
11888     case SYMBOL_REF:
11889       /* TLS symbols are never valid.  */
11890       if (SYMBOL_REF_TLS_MODEL (x))
11891         return false;
11892
11893       /* DLLIMPORT symbols are never valid.  */
11894       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
11895           && SYMBOL_REF_DLLIMPORT_P (x))
11896         return false;
11897
11898 #if TARGET_MACHO
11899       /* mdynamic-no-pic */
11900       if (MACHO_DYNAMIC_NO_PIC_P)
11901         return machopic_symbol_defined_p (x);
11902 #endif
11903       break;
11904
11905     case CONST_DOUBLE:
11906       if (GET_MODE (x) == TImode
11907           && x != CONST0_RTX (TImode)
11908           && !TARGET_64BIT)
11909         return false;
11910       break;
11911
11912     case CONST_VECTOR:
11913       if (!standard_sse_constant_p (x))
11914         return false;
11915
11916     default:
11917       break;
11918     }
11919
11920   /* Otherwise we handle everything else in the move patterns.  */
11921   return true;
11922 }
11923
11924 /* Determine if it's legal to put X into the constant pool.  This
11925    is not possible for the address of thread-local symbols, which
11926    is checked above.  */
11927
11928 static bool
11929 ix86_cannot_force_const_mem (enum machine_mode mode, rtx x)
11930 {
11931   /* We can always put integral constants and vectors in memory.  */
11932   switch (GET_CODE (x))
11933     {
11934     case CONST_INT:
11935     case CONST_DOUBLE:
11936     case CONST_VECTOR:
11937       return false;
11938
11939     default:
11940       break;
11941     }
11942   return !ix86_legitimate_constant_p (mode, x);
11943 }
11944
11945
11946 /* Nonzero if the constant value X is a legitimate general operand
11947    when generating PIC code.  It is given that flag_pic is on and
11948    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
11949
11950 bool
11951 legitimate_pic_operand_p (rtx x)
11952 {
11953   rtx inner;
11954
11955   switch (GET_CODE (x))
11956     {
11957     case CONST:
11958       inner = XEXP (x, 0);
11959       if (GET_CODE (inner) == PLUS
11960           && CONST_INT_P (XEXP (inner, 1)))
11961         inner = XEXP (inner, 0);
11962
11963       /* Only some unspecs are valid as "constants".  */
11964       if (GET_CODE (inner) == UNSPEC)
11965         switch (XINT (inner, 1))
11966           {
11967           case UNSPEC_GOT:
11968           case UNSPEC_GOTOFF:
11969           case UNSPEC_PLTOFF:
11970             return TARGET_64BIT;
11971           case UNSPEC_TPOFF:
11972             x = XVECEXP (inner, 0, 0);
11973             return (GET_CODE (x) == SYMBOL_REF
11974                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
11975           case UNSPEC_MACHOPIC_OFFSET:
11976             return legitimate_pic_address_disp_p (x);
11977           default:
11978             return false;
11979           }
11980       /* FALLTHRU */
11981
11982     case SYMBOL_REF:
11983     case LABEL_REF:
11984       return legitimate_pic_address_disp_p (x);
11985
11986     default:
11987       return true;
11988     }
11989 }
11990
11991 /* Determine if a given CONST RTX is a valid memory displacement
11992    in PIC mode.  */
11993
11994 bool
11995 legitimate_pic_address_disp_p (rtx disp)
11996 {
11997   bool saw_plus;
11998
11999   /* In 64bit mode we can allow direct addresses of symbols and labels
12000      when they are not dynamic symbols.  */
12001   if (TARGET_64BIT)
12002     {
12003       rtx op0 = disp, op1;
12004
12005       switch (GET_CODE (disp))
12006         {
12007         case LABEL_REF:
12008           return true;
12009
12010         case CONST:
12011           if (GET_CODE (XEXP (disp, 0)) != PLUS)
12012             break;
12013           op0 = XEXP (XEXP (disp, 0), 0);
12014           op1 = XEXP (XEXP (disp, 0), 1);
12015           if (!CONST_INT_P (op1)
12016               || INTVAL (op1) >= 16*1024*1024
12017               || INTVAL (op1) < -16*1024*1024)
12018             break;
12019           if (GET_CODE (op0) == LABEL_REF)
12020             return true;
12021           if (GET_CODE (op0) != SYMBOL_REF)
12022             break;
12023           /* FALLTHRU */
12024
12025         case SYMBOL_REF:
12026           /* TLS references should always be enclosed in UNSPEC.  */
12027           if (SYMBOL_REF_TLS_MODEL (op0))
12028             return false;
12029           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
12030               && ix86_cmodel != CM_LARGE_PIC)
12031             return true;
12032           break;
12033
12034         default:
12035           break;
12036         }
12037     }
12038   if (GET_CODE (disp) != CONST)
12039     return false;
12040   disp = XEXP (disp, 0);
12041
12042   if (TARGET_64BIT)
12043     {
12044       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
12045          of GOT tables.  We should not need these anyway.  */
12046       if (GET_CODE (disp) != UNSPEC
12047           || (XINT (disp, 1) != UNSPEC_GOTPCREL
12048               && XINT (disp, 1) != UNSPEC_GOTOFF
12049               && XINT (disp, 1) != UNSPEC_PCREL
12050               && XINT (disp, 1) != UNSPEC_PLTOFF))
12051         return false;
12052
12053       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
12054           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
12055         return false;
12056       return true;
12057     }
12058
12059   saw_plus = false;
12060   if (GET_CODE (disp) == PLUS)
12061     {
12062       if (!CONST_INT_P (XEXP (disp, 1)))
12063         return false;
12064       disp = XEXP (disp, 0);
12065       saw_plus = true;
12066     }
12067
12068   if (TARGET_MACHO && darwin_local_data_pic (disp))
12069     return true;
12070
12071   if (GET_CODE (disp) != UNSPEC)
12072     return false;
12073
12074   switch (XINT (disp, 1))
12075     {
12076     case UNSPEC_GOT:
12077       if (saw_plus)
12078         return false;
12079       /* We need to check for both symbols and labels because VxWorks loads
12080          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
12081          details.  */
12082       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
12083               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
12084     case UNSPEC_GOTOFF:
12085       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
12086          While ABI specify also 32bit relocation but we don't produce it in
12087          small PIC model at all.  */
12088       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
12089            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
12090           && !TARGET_64BIT)
12091         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
12092       return false;
12093     case UNSPEC_GOTTPOFF:
12094     case UNSPEC_GOTNTPOFF:
12095     case UNSPEC_INDNTPOFF:
12096       if (saw_plus)
12097         return false;
12098       disp = XVECEXP (disp, 0, 0);
12099       return (GET_CODE (disp) == SYMBOL_REF
12100               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
12101     case UNSPEC_NTPOFF:
12102       disp = XVECEXP (disp, 0, 0);
12103       return (GET_CODE (disp) == SYMBOL_REF
12104               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
12105     case UNSPEC_DTPOFF:
12106       disp = XVECEXP (disp, 0, 0);
12107       return (GET_CODE (disp) == SYMBOL_REF
12108               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
12109     }
12110
12111   return false;
12112 }
12113
12114 /* Recognizes RTL expressions that are valid memory addresses for an
12115    instruction.  The MODE argument is the machine mode for the MEM
12116    expression that wants to use this address.
12117
12118    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
12119    convert common non-canonical forms to canonical form so that they will
12120    be recognized.  */
12121
12122 static bool
12123 ix86_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
12124                            rtx addr, bool strict)
12125 {
12126   struct ix86_address parts;
12127   rtx base, index, disp;
12128   HOST_WIDE_INT scale;
12129
12130   if (ix86_decompose_address (addr, &parts) <= 0)
12131     /* Decomposition failed.  */
12132     return false;
12133
12134   base = parts.base;
12135   index = parts.index;
12136   disp = parts.disp;
12137   scale = parts.scale;
12138
12139   /* Validate base register.
12140
12141      Don't allow SUBREG's that span more than a word here.  It can lead to spill
12142      failures when the base is one word out of a two word structure, which is
12143      represented internally as a DImode int.  */
12144
12145   if (base)
12146     {
12147       rtx reg;
12148
12149       if (REG_P (base))
12150         reg = base;
12151       else if (GET_CODE (base) == SUBREG
12152                && REG_P (SUBREG_REG (base))
12153                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
12154                   <= UNITS_PER_WORD)
12155         reg = SUBREG_REG (base);
12156       else
12157         /* Base is not a register.  */
12158         return false;
12159
12160       if (GET_MODE (base) != Pmode)
12161         /* Base is not in Pmode.  */
12162         return false;
12163
12164       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
12165           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
12166         /* Base is not valid.  */
12167         return false;
12168     }
12169
12170   /* Validate index register.
12171
12172      Don't allow SUBREG's that span more than a word here -- same as above.  */
12173
12174   if (index)
12175     {
12176       rtx reg;
12177
12178       if (REG_P (index))
12179         reg = index;
12180       else if (GET_CODE (index) == SUBREG
12181                && REG_P (SUBREG_REG (index))
12182                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
12183                   <= UNITS_PER_WORD)
12184         reg = SUBREG_REG (index);
12185       else
12186         /* Index is not a register.  */
12187         return false;
12188
12189       if (GET_MODE (index) != Pmode)
12190         /* Index is not in Pmode.  */
12191         return false;
12192
12193       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
12194           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
12195         /* Index is not valid.  */
12196         return false;
12197     }
12198
12199   /* Validate scale factor.  */
12200   if (scale != 1)
12201     {
12202       if (!index)
12203         /* Scale without index.  */
12204         return false;
12205
12206       if (scale != 2 && scale != 4 && scale != 8)
12207         /* Scale is not a valid multiplier.  */
12208         return false;
12209     }
12210
12211   /* Validate displacement.  */
12212   if (disp)
12213     {
12214       if (GET_CODE (disp) == CONST
12215           && GET_CODE (XEXP (disp, 0)) == UNSPEC
12216           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
12217         switch (XINT (XEXP (disp, 0), 1))
12218           {
12219           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
12220              used.  While ABI specify also 32bit relocations, we don't produce
12221              them at all and use IP relative instead.  */
12222           case UNSPEC_GOT:
12223           case UNSPEC_GOTOFF:
12224             gcc_assert (flag_pic);
12225             if (!TARGET_64BIT)
12226               goto is_legitimate_pic;
12227
12228             /* 64bit address unspec.  */
12229             return false;
12230
12231           case UNSPEC_GOTPCREL:
12232           case UNSPEC_PCREL:
12233             gcc_assert (flag_pic);
12234             goto is_legitimate_pic;
12235
12236           case UNSPEC_GOTTPOFF:
12237           case UNSPEC_GOTNTPOFF:
12238           case UNSPEC_INDNTPOFF:
12239           case UNSPEC_NTPOFF:
12240           case UNSPEC_DTPOFF:
12241             break;
12242
12243           case UNSPEC_STACK_CHECK:
12244             gcc_assert (flag_split_stack);
12245             break;
12246
12247           default:
12248             /* Invalid address unspec.  */
12249             return false;
12250           }
12251
12252       else if (SYMBOLIC_CONST (disp)
12253                && (flag_pic
12254                    || (TARGET_MACHO
12255 #if TARGET_MACHO
12256                        && MACHOPIC_INDIRECT
12257                        && !machopic_operand_p (disp)
12258 #endif
12259                )))
12260         {
12261
12262         is_legitimate_pic:
12263           if (TARGET_64BIT && (index || base))
12264             {
12265               /* foo@dtpoff(%rX) is ok.  */
12266               if (GET_CODE (disp) != CONST
12267                   || GET_CODE (XEXP (disp, 0)) != PLUS
12268                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
12269                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
12270                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
12271                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
12272                 /* Non-constant pic memory reference.  */
12273                 return false;
12274             }
12275           else if ((!TARGET_MACHO || flag_pic)
12276                     && ! legitimate_pic_address_disp_p (disp))
12277             /* Displacement is an invalid pic construct.  */
12278             return false;
12279 #if TARGET_MACHO
12280           else if (MACHO_DYNAMIC_NO_PIC_P
12281                    && !ix86_legitimate_constant_p (Pmode, disp))
12282             /* displacment must be referenced via non_lazy_pointer */
12283             return false;
12284 #endif
12285
12286           /* This code used to verify that a symbolic pic displacement
12287              includes the pic_offset_table_rtx register.
12288
12289              While this is good idea, unfortunately these constructs may
12290              be created by "adds using lea" optimization for incorrect
12291              code like:
12292
12293              int a;
12294              int foo(int i)
12295                {
12296                  return *(&a+i);
12297                }
12298
12299              This code is nonsensical, but results in addressing
12300              GOT table with pic_offset_table_rtx base.  We can't
12301              just refuse it easily, since it gets matched by
12302              "addsi3" pattern, that later gets split to lea in the
12303              case output register differs from input.  While this
12304              can be handled by separate addsi pattern for this case
12305              that never results in lea, this seems to be easier and
12306              correct fix for crash to disable this test.  */
12307         }
12308       else if (GET_CODE (disp) != LABEL_REF
12309                && !CONST_INT_P (disp)
12310                && (GET_CODE (disp) != CONST
12311                    || !ix86_legitimate_constant_p (Pmode, disp))
12312                && (GET_CODE (disp) != SYMBOL_REF
12313                    || !ix86_legitimate_constant_p (Pmode, disp)))
12314         /* Displacement is not constant.  */
12315         return false;
12316       else if (TARGET_64BIT
12317                && !x86_64_immediate_operand (disp, VOIDmode))
12318         /* Displacement is out of range.  */
12319         return false;
12320     }
12321
12322   /* Everything looks valid.  */
12323   return true;
12324 }
12325
12326 /* Determine if a given RTX is a valid constant address.  */
12327
12328 bool
12329 constant_address_p (rtx x)
12330 {
12331   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
12332 }
12333 \f
12334 /* Return a unique alias set for the GOT.  */
12335
12336 static alias_set_type
12337 ix86_GOT_alias_set (void)
12338 {
12339   static alias_set_type set = -1;
12340   if (set == -1)
12341     set = new_alias_set ();
12342   return set;
12343 }
12344
12345 /* Return a legitimate reference for ORIG (an address) using the
12346    register REG.  If REG is 0, a new pseudo is generated.
12347
12348    There are two types of references that must be handled:
12349
12350    1. Global data references must load the address from the GOT, via
12351       the PIC reg.  An insn is emitted to do this load, and the reg is
12352       returned.
12353
12354    2. Static data references, constant pool addresses, and code labels
12355       compute the address as an offset from the GOT, whose base is in
12356       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
12357       differentiate them from global data objects.  The returned
12358       address is the PIC reg + an unspec constant.
12359
12360    TARGET_LEGITIMATE_ADDRESS_P rejects symbolic references unless the PIC
12361    reg also appears in the address.  */
12362
12363 static rtx
12364 legitimize_pic_address (rtx orig, rtx reg)
12365 {
12366   rtx addr = orig;
12367   rtx new_rtx = orig;
12368   rtx base;
12369
12370 #if TARGET_MACHO
12371   if (TARGET_MACHO && !TARGET_64BIT)
12372     {
12373       if (reg == 0)
12374         reg = gen_reg_rtx (Pmode);
12375       /* Use the generic Mach-O PIC machinery.  */
12376       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
12377     }
12378 #endif
12379
12380   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
12381     new_rtx = addr;
12382   else if (TARGET_64BIT
12383            && ix86_cmodel != CM_SMALL_PIC
12384            && gotoff_operand (addr, Pmode))
12385     {
12386       rtx tmpreg;
12387       /* This symbol may be referenced via a displacement from the PIC
12388          base address (@GOTOFF).  */
12389
12390       if (reload_in_progress)
12391         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12392       if (GET_CODE (addr) == CONST)
12393         addr = XEXP (addr, 0);
12394       if (GET_CODE (addr) == PLUS)
12395           {
12396             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
12397                                       UNSPEC_GOTOFF);
12398             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
12399           }
12400         else
12401           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
12402       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12403       if (!reg)
12404         tmpreg = gen_reg_rtx (Pmode);
12405       else
12406         tmpreg = reg;
12407       emit_move_insn (tmpreg, new_rtx);
12408
12409       if (reg != 0)
12410         {
12411           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
12412                                          tmpreg, 1, OPTAB_DIRECT);
12413           new_rtx = reg;
12414         }
12415       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
12416     }
12417   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
12418     {
12419       /* This symbol may be referenced via a displacement from the PIC
12420          base address (@GOTOFF).  */
12421
12422       if (reload_in_progress)
12423         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12424       if (GET_CODE (addr) == CONST)
12425         addr = XEXP (addr, 0);
12426       if (GET_CODE (addr) == PLUS)
12427           {
12428             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
12429                                       UNSPEC_GOTOFF);
12430             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
12431           }
12432         else
12433           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
12434       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12435       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12436
12437       if (reg != 0)
12438         {
12439           emit_move_insn (reg, new_rtx);
12440           new_rtx = reg;
12441         }
12442     }
12443   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
12444            /* We can't use @GOTOFF for text labels on VxWorks;
12445               see gotoff_operand.  */
12446            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
12447     {
12448       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
12449         {
12450           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
12451             return legitimize_dllimport_symbol (addr, true);
12452           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
12453               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
12454               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
12455             {
12456               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
12457               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
12458             }
12459         }
12460
12461       /* For x64 PE-COFF there is no GOT table.  So we use address
12462          directly.  */
12463       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
12464       {
12465           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_PCREL);
12466           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12467
12468           if (reg == 0)
12469             reg = gen_reg_rtx (Pmode);
12470           emit_move_insn (reg, new_rtx);
12471           new_rtx = reg;
12472       }
12473       else if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
12474         {
12475           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
12476           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12477           new_rtx = gen_const_mem (Pmode, new_rtx);
12478           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
12479
12480           if (reg == 0)
12481             reg = gen_reg_rtx (Pmode);
12482           /* Use directly gen_movsi, otherwise the address is loaded
12483              into register for CSE.  We don't want to CSE this addresses,
12484              instead we CSE addresses from the GOT table, so skip this.  */
12485           emit_insn (gen_movsi (reg, new_rtx));
12486           new_rtx = reg;
12487         }
12488       else
12489         {
12490           /* This symbol must be referenced via a load from the
12491              Global Offset Table (@GOT).  */
12492
12493           if (reload_in_progress)
12494             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12495           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
12496           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12497           if (TARGET_64BIT)
12498             new_rtx = force_reg (Pmode, new_rtx);
12499           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12500           new_rtx = gen_const_mem (Pmode, new_rtx);
12501           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
12502
12503           if (reg == 0)
12504             reg = gen_reg_rtx (Pmode);
12505           emit_move_insn (reg, new_rtx);
12506           new_rtx = reg;
12507         }
12508     }
12509   else
12510     {
12511       if (CONST_INT_P (addr)
12512           && !x86_64_immediate_operand (addr, VOIDmode))
12513         {
12514           if (reg)
12515             {
12516               emit_move_insn (reg, addr);
12517               new_rtx = reg;
12518             }
12519           else
12520             new_rtx = force_reg (Pmode, addr);
12521         }
12522       else if (GET_CODE (addr) == CONST)
12523         {
12524           addr = XEXP (addr, 0);
12525
12526           /* We must match stuff we generate before.  Assume the only
12527              unspecs that can get here are ours.  Not that we could do
12528              anything with them anyway....  */
12529           if (GET_CODE (addr) == UNSPEC
12530               || (GET_CODE (addr) == PLUS
12531                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
12532             return orig;
12533           gcc_assert (GET_CODE (addr) == PLUS);
12534         }
12535       if (GET_CODE (addr) == PLUS)
12536         {
12537           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
12538
12539           /* Check first to see if this is a constant offset from a @GOTOFF
12540              symbol reference.  */
12541           if (gotoff_operand (op0, Pmode)
12542               && CONST_INT_P (op1))
12543             {
12544               if (!TARGET_64BIT)
12545                 {
12546                   if (reload_in_progress)
12547                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12548                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
12549                                             UNSPEC_GOTOFF);
12550                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
12551                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12552                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12553
12554                   if (reg != 0)
12555                     {
12556                       emit_move_insn (reg, new_rtx);
12557                       new_rtx = reg;
12558                     }
12559                 }
12560               else
12561                 {
12562                   if (INTVAL (op1) < -16*1024*1024
12563                       || INTVAL (op1) >= 16*1024*1024)
12564                     {
12565                       if (!x86_64_immediate_operand (op1, Pmode))
12566                         op1 = force_reg (Pmode, op1);
12567                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
12568                     }
12569                 }
12570             }
12571           else
12572             {
12573               base = legitimize_pic_address (XEXP (addr, 0), reg);
12574               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
12575                                                  base == reg ? NULL_RTX : reg);
12576
12577               if (CONST_INT_P (new_rtx))
12578                 new_rtx = plus_constant (base, INTVAL (new_rtx));
12579               else
12580                 {
12581                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
12582                     {
12583                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
12584                       new_rtx = XEXP (new_rtx, 1);
12585                     }
12586                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
12587                 }
12588             }
12589         }
12590     }
12591   return new_rtx;
12592 }
12593 \f
12594 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
12595
12596 static rtx
12597 get_thread_pointer (bool to_reg)
12598 {
12599   rtx tp, reg, insn;
12600
12601   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
12602   if (!to_reg)
12603     return tp;
12604
12605   reg = gen_reg_rtx (Pmode);
12606   insn = gen_rtx_SET (VOIDmode, reg, tp);
12607   insn = emit_insn (insn);
12608
12609   return reg;
12610 }
12611
12612 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
12613
12614 static GTY(()) rtx ix86_tls_symbol;
12615
12616 static rtx
12617 ix86_tls_get_addr (void)
12618 {
12619   if (!ix86_tls_symbol)
12620     {
12621       const char *sym
12622         = ((TARGET_ANY_GNU_TLS && !TARGET_64BIT)
12623            ? "___tls_get_addr" : "__tls_get_addr");
12624
12625       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, sym);
12626     }
12627
12628   return ix86_tls_symbol;
12629 }
12630
12631 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
12632
12633 static GTY(()) rtx ix86_tls_module_base_symbol;
12634
12635 rtx
12636 ix86_tls_module_base (void)
12637 {
12638   if (!ix86_tls_module_base_symbol)
12639     {
12640       ix86_tls_module_base_symbol
12641         = gen_rtx_SYMBOL_REF (Pmode, "_TLS_MODULE_BASE_");
12642
12643       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
12644         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
12645     }
12646
12647   return ix86_tls_module_base_symbol;
12648 }
12649
12650 /* A subroutine of ix86_legitimize_address and ix86_expand_move.  FOR_MOV is
12651    false if we expect this to be used for a memory address and true if
12652    we expect to load the address into a register.  */
12653
12654 static rtx
12655 legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
12656 {
12657   rtx dest, base, off;
12658   rtx pic = NULL_RTX, tp = NULL_RTX;
12659   int type;
12660
12661   switch (model)
12662     {
12663     case TLS_MODEL_GLOBAL_DYNAMIC:
12664       dest = gen_reg_rtx (Pmode);
12665
12666       if (!TARGET_64BIT)
12667         {
12668           if (flag_pic)
12669             pic = pic_offset_table_rtx;
12670           else
12671             {
12672               pic = gen_reg_rtx (Pmode);
12673               emit_insn (gen_set_got (pic));
12674             }
12675         }
12676
12677       if (TARGET_GNU2_TLS)
12678         {
12679           if (TARGET_64BIT)
12680             emit_insn (gen_tls_dynamic_gnu2_64 (dest, x));
12681           else
12682             emit_insn (gen_tls_dynamic_gnu2_32 (dest, x, pic));
12683
12684           tp = get_thread_pointer (true);
12685           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
12686
12687           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
12688         }
12689       else
12690         {
12691           rtx caddr = ix86_tls_get_addr ();
12692
12693           if (TARGET_64BIT)
12694             {
12695               rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
12696
12697               start_sequence ();
12698               emit_call_insn (gen_tls_global_dynamic_64 (rax, x, caddr));
12699               insns = get_insns ();
12700               end_sequence ();
12701
12702               RTL_CONST_CALL_P (insns) = 1;
12703               emit_libcall_block (insns, dest, rax, x);
12704             }
12705           else
12706             emit_insn (gen_tls_global_dynamic_32 (dest, x, pic, caddr));
12707         }
12708       break;
12709
12710     case TLS_MODEL_LOCAL_DYNAMIC:
12711       base = gen_reg_rtx (Pmode);
12712
12713       if (!TARGET_64BIT)
12714         {
12715           if (flag_pic)
12716             pic = pic_offset_table_rtx;
12717           else
12718             {
12719               pic = gen_reg_rtx (Pmode);
12720               emit_insn (gen_set_got (pic));
12721             }
12722         }
12723
12724       if (TARGET_GNU2_TLS)
12725         {
12726           rtx tmp = ix86_tls_module_base ();
12727
12728           if (TARGET_64BIT)
12729             emit_insn (gen_tls_dynamic_gnu2_64 (base, tmp));
12730           else
12731             emit_insn (gen_tls_dynamic_gnu2_32 (base, tmp, pic));
12732
12733           tp = get_thread_pointer (true);
12734           set_unique_reg_note (get_last_insn (), REG_EQUIV,
12735                                gen_rtx_MINUS (Pmode, tmp, tp));
12736         }
12737       else
12738         {
12739           rtx caddr = ix86_tls_get_addr ();
12740
12741           if (TARGET_64BIT)
12742             {
12743               rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, eqv;
12744
12745               start_sequence ();
12746               emit_call_insn (gen_tls_local_dynamic_base_64 (rax, caddr));
12747               insns = get_insns ();
12748               end_sequence ();
12749
12750               /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
12751                  share the LD_BASE result with other LD model accesses.  */
12752               eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
12753                                     UNSPEC_TLS_LD_BASE);
12754
12755               RTL_CONST_CALL_P (insns) = 1;
12756               emit_libcall_block (insns, base, rax, eqv);
12757             }
12758           else
12759             emit_insn (gen_tls_local_dynamic_base_32 (base, pic, caddr));
12760         }
12761
12762       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
12763       off = gen_rtx_CONST (Pmode, off);
12764
12765       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
12766
12767       if (TARGET_GNU2_TLS)
12768         {
12769           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
12770
12771           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
12772         }
12773       break;
12774
12775     case TLS_MODEL_INITIAL_EXEC:
12776       if (TARGET_64BIT)
12777         {
12778           if (TARGET_SUN_TLS)
12779             {
12780               /* The Sun linker took the AMD64 TLS spec literally
12781                  and can only handle %rax as destination of the
12782                  initial executable code sequence.  */
12783
12784               dest = gen_reg_rtx (Pmode);
12785               emit_insn (gen_tls_initial_exec_64_sun (dest, x));
12786               return dest;
12787             }
12788
12789           pic = NULL;
12790           type = UNSPEC_GOTNTPOFF;
12791         }
12792       else if (flag_pic)
12793         {
12794           if (reload_in_progress)
12795             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12796           pic = pic_offset_table_rtx;
12797           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
12798         }
12799       else if (!TARGET_ANY_GNU_TLS)
12800         {
12801           pic = gen_reg_rtx (Pmode);
12802           emit_insn (gen_set_got (pic));
12803           type = UNSPEC_GOTTPOFF;
12804         }
12805       else
12806         {
12807           pic = NULL;
12808           type = UNSPEC_INDNTPOFF;
12809         }
12810
12811       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
12812       off = gen_rtx_CONST (Pmode, off);
12813       if (pic)
12814         off = gen_rtx_PLUS (Pmode, pic, off);
12815       off = gen_const_mem (Pmode, off);
12816       set_mem_alias_set (off, ix86_GOT_alias_set ());
12817
12818       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12819         {
12820           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
12821           off = force_reg (Pmode, off);
12822           return gen_rtx_PLUS (Pmode, base, off);
12823         }
12824       else
12825         {
12826           base = get_thread_pointer (true);
12827           dest = gen_reg_rtx (Pmode);
12828           emit_insn (gen_subsi3 (dest, base, off));
12829         }
12830       break;
12831
12832     case TLS_MODEL_LOCAL_EXEC:
12833       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
12834                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12835                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
12836       off = gen_rtx_CONST (Pmode, off);
12837
12838       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12839         {
12840           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
12841           return gen_rtx_PLUS (Pmode, base, off);
12842         }
12843       else
12844         {
12845           base = get_thread_pointer (true);
12846           dest = gen_reg_rtx (Pmode);
12847           emit_insn (gen_subsi3 (dest, base, off));
12848         }
12849       break;
12850
12851     default:
12852       gcc_unreachable ();
12853     }
12854
12855   return dest;
12856 }
12857
12858 /* Create or return the unique __imp_DECL dllimport symbol corresponding
12859    to symbol DECL.  */
12860
12861 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
12862   htab_t dllimport_map;
12863
12864 static tree
12865 get_dllimport_decl (tree decl)
12866 {
12867   struct tree_map *h, in;
12868   void **loc;
12869   const char *name;
12870   const char *prefix;
12871   size_t namelen, prefixlen;
12872   char *imp_name;
12873   tree to;
12874   rtx rtl;
12875
12876   if (!dllimport_map)
12877     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
12878
12879   in.hash = htab_hash_pointer (decl);
12880   in.base.from = decl;
12881   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
12882   h = (struct tree_map *) *loc;
12883   if (h)
12884     return h->to;
12885
12886   *loc = h = ggc_alloc_tree_map ();
12887   h->hash = in.hash;
12888   h->base.from = decl;
12889   h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
12890                            VAR_DECL, NULL, ptr_type_node);
12891   DECL_ARTIFICIAL (to) = 1;
12892   DECL_IGNORED_P (to) = 1;
12893   DECL_EXTERNAL (to) = 1;
12894   TREE_READONLY (to) = 1;
12895
12896   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
12897   name = targetm.strip_name_encoding (name);
12898   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
12899     ? "*__imp_" : "*__imp__";
12900   namelen = strlen (name);
12901   prefixlen = strlen (prefix);
12902   imp_name = (char *) alloca (namelen + prefixlen + 1);
12903   memcpy (imp_name, prefix, prefixlen);
12904   memcpy (imp_name + prefixlen, name, namelen + 1);
12905
12906   name = ggc_alloc_string (imp_name, namelen + prefixlen);
12907   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
12908   SET_SYMBOL_REF_DECL (rtl, to);
12909   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
12910
12911   rtl = gen_const_mem (Pmode, rtl);
12912   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
12913
12914   SET_DECL_RTL (to, rtl);
12915   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
12916
12917   return to;
12918 }
12919
12920 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
12921    true if we require the result be a register.  */
12922
12923 static rtx
12924 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
12925 {
12926   tree imp_decl;
12927   rtx x;
12928
12929   gcc_assert (SYMBOL_REF_DECL (symbol));
12930   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
12931
12932   x = DECL_RTL (imp_decl);
12933   if (want_reg)
12934     x = force_reg (Pmode, x);
12935   return x;
12936 }
12937
12938 /* Try machine-dependent ways of modifying an illegitimate address
12939    to be legitimate.  If we find one, return the new, valid address.
12940    This macro is used in only one place: `memory_address' in explow.c.
12941
12942    OLDX is the address as it was before break_out_memory_refs was called.
12943    In some cases it is useful to look at this to decide what needs to be done.
12944
12945    It is always safe for this macro to do nothing.  It exists to recognize
12946    opportunities to optimize the output.
12947
12948    For the 80386, we handle X+REG by loading X into a register R and
12949    using R+REG.  R will go in a general reg and indexing will be used.
12950    However, if REG is a broken-out memory address or multiplication,
12951    nothing needs to be done because REG can certainly go in a general reg.
12952
12953    When -fpic is used, special handling is needed for symbolic references.
12954    See comments by legitimize_pic_address in i386.c for details.  */
12955
12956 static rtx
12957 ix86_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
12958                          enum machine_mode mode)
12959 {
12960   int changed = 0;
12961   unsigned log;
12962
12963   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
12964   if (log)
12965     return legitimize_tls_address (x, (enum tls_model) log, false);
12966   if (GET_CODE (x) == CONST
12967       && GET_CODE (XEXP (x, 0)) == PLUS
12968       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
12969       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
12970     {
12971       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
12972                                       (enum tls_model) log, false);
12973       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
12974     }
12975
12976   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
12977     {
12978       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
12979         return legitimize_dllimport_symbol (x, true);
12980       if (GET_CODE (x) == CONST
12981           && GET_CODE (XEXP (x, 0)) == PLUS
12982           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
12983           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
12984         {
12985           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
12986           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
12987         }
12988     }
12989
12990   if (flag_pic && SYMBOLIC_CONST (x))
12991     return legitimize_pic_address (x, 0);
12992
12993 #if TARGET_MACHO
12994   if (MACHO_DYNAMIC_NO_PIC_P && SYMBOLIC_CONST (x))
12995     return machopic_indirect_data_reference (x, 0);
12996 #endif
12997
12998   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
12999   if (GET_CODE (x) == ASHIFT
13000       && CONST_INT_P (XEXP (x, 1))
13001       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
13002     {
13003       changed = 1;
13004       log = INTVAL (XEXP (x, 1));
13005       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
13006                         GEN_INT (1 << log));
13007     }
13008
13009   if (GET_CODE (x) == PLUS)
13010     {
13011       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
13012
13013       if (GET_CODE (XEXP (x, 0)) == ASHIFT
13014           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
13015           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
13016         {
13017           changed = 1;
13018           log = INTVAL (XEXP (XEXP (x, 0), 1));
13019           XEXP (x, 0) = gen_rtx_MULT (Pmode,
13020                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
13021                                       GEN_INT (1 << log));
13022         }
13023
13024       if (GET_CODE (XEXP (x, 1)) == ASHIFT
13025           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
13026           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
13027         {
13028           changed = 1;
13029           log = INTVAL (XEXP (XEXP (x, 1), 1));
13030           XEXP (x, 1) = gen_rtx_MULT (Pmode,
13031                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
13032                                       GEN_INT (1 << log));
13033         }
13034
13035       /* Put multiply first if it isn't already.  */
13036       if (GET_CODE (XEXP (x, 1)) == MULT)
13037         {
13038           rtx tmp = XEXP (x, 0);
13039           XEXP (x, 0) = XEXP (x, 1);
13040           XEXP (x, 1) = tmp;
13041           changed = 1;
13042         }
13043
13044       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
13045          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
13046          created by virtual register instantiation, register elimination, and
13047          similar optimizations.  */
13048       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
13049         {
13050           changed = 1;
13051           x = gen_rtx_PLUS (Pmode,
13052                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
13053                                           XEXP (XEXP (x, 1), 0)),
13054                             XEXP (XEXP (x, 1), 1));
13055         }
13056
13057       /* Canonicalize
13058          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
13059          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
13060       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
13061                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
13062                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
13063                && CONSTANT_P (XEXP (x, 1)))
13064         {
13065           rtx constant;
13066           rtx other = NULL_RTX;
13067
13068           if (CONST_INT_P (XEXP (x, 1)))
13069             {
13070               constant = XEXP (x, 1);
13071               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
13072             }
13073           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
13074             {
13075               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
13076               other = XEXP (x, 1);
13077             }
13078           else
13079             constant = 0;
13080
13081           if (constant)
13082             {
13083               changed = 1;
13084               x = gen_rtx_PLUS (Pmode,
13085                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
13086                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
13087                                 plus_constant (other, INTVAL (constant)));
13088             }
13089         }
13090
13091       if (changed && ix86_legitimate_address_p (mode, x, false))
13092         return x;
13093
13094       if (GET_CODE (XEXP (x, 0)) == MULT)
13095         {
13096           changed = 1;
13097           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
13098         }
13099
13100       if (GET_CODE (XEXP (x, 1)) == MULT)
13101         {
13102           changed = 1;
13103           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
13104         }
13105
13106       if (changed
13107           && REG_P (XEXP (x, 1))
13108           && REG_P (XEXP (x, 0)))
13109         return x;
13110
13111       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
13112         {
13113           changed = 1;
13114           x = legitimize_pic_address (x, 0);
13115         }
13116
13117       if (changed && ix86_legitimate_address_p (mode, x, false))
13118         return x;
13119
13120       if (REG_P (XEXP (x, 0)))
13121         {
13122           rtx temp = gen_reg_rtx (Pmode);
13123           rtx val  = force_operand (XEXP (x, 1), temp);
13124           if (val != temp)
13125             emit_move_insn (temp, val);
13126
13127           XEXP (x, 1) = temp;
13128           return x;
13129         }
13130
13131       else if (REG_P (XEXP (x, 1)))
13132         {
13133           rtx temp = gen_reg_rtx (Pmode);
13134           rtx val  = force_operand (XEXP (x, 0), temp);
13135           if (val != temp)
13136             emit_move_insn (temp, val);
13137
13138           XEXP (x, 0) = temp;
13139           return x;
13140         }
13141     }
13142
13143   return x;
13144 }
13145 \f
13146 /* Print an integer constant expression in assembler syntax.  Addition
13147    and subtraction are the only arithmetic that may appear in these
13148    expressions.  FILE is the stdio stream to write to, X is the rtx, and
13149    CODE is the operand print code from the output string.  */
13150
13151 static void
13152 output_pic_addr_const (FILE *file, rtx x, int code)
13153 {
13154   char buf[256];
13155
13156   switch (GET_CODE (x))
13157     {
13158     case PC:
13159       gcc_assert (flag_pic);
13160       putc ('.', file);
13161       break;
13162
13163     case SYMBOL_REF:
13164       if (TARGET_64BIT || ! TARGET_MACHO_BRANCH_ISLANDS)
13165         output_addr_const (file, x);
13166       else
13167         {
13168           const char *name = XSTR (x, 0);
13169
13170           /* Mark the decl as referenced so that cgraph will
13171              output the function.  */
13172           if (SYMBOL_REF_DECL (x))
13173             mark_decl_referenced (SYMBOL_REF_DECL (x));
13174
13175 #if TARGET_MACHO
13176           if (MACHOPIC_INDIRECT
13177               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
13178             name = machopic_indirection_name (x, /*stub_p=*/true);
13179 #endif
13180           assemble_name (file, name);
13181         }
13182       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
13183           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
13184         fputs ("@PLT", file);
13185       break;
13186
13187     case LABEL_REF:
13188       x = XEXP (x, 0);
13189       /* FALLTHRU */
13190     case CODE_LABEL:
13191       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
13192       assemble_name (asm_out_file, buf);
13193       break;
13194
13195     case CONST_INT:
13196       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
13197       break;
13198
13199     case CONST:
13200       /* This used to output parentheses around the expression,
13201          but that does not work on the 386 (either ATT or BSD assembler).  */
13202       output_pic_addr_const (file, XEXP (x, 0), code);
13203       break;
13204
13205     case CONST_DOUBLE:
13206       if (GET_MODE (x) == VOIDmode)
13207         {
13208           /* We can use %d if the number is <32 bits and positive.  */
13209           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
13210             fprintf (file, "0x%lx%08lx",
13211                      (unsigned long) CONST_DOUBLE_HIGH (x),
13212                      (unsigned long) CONST_DOUBLE_LOW (x));
13213           else
13214             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
13215         }
13216       else
13217         /* We can't handle floating point constants;
13218            TARGET_PRINT_OPERAND must handle them.  */
13219         output_operand_lossage ("floating constant misused");
13220       break;
13221
13222     case PLUS:
13223       /* Some assemblers need integer constants to appear first.  */
13224       if (CONST_INT_P (XEXP (x, 0)))
13225         {
13226           output_pic_addr_const (file, XEXP (x, 0), code);
13227           putc ('+', file);
13228           output_pic_addr_const (file, XEXP (x, 1), code);
13229         }
13230       else
13231         {
13232           gcc_assert (CONST_INT_P (XEXP (x, 1)));
13233           output_pic_addr_const (file, XEXP (x, 1), code);
13234           putc ('+', file);
13235           output_pic_addr_const (file, XEXP (x, 0), code);
13236         }
13237       break;
13238
13239     case MINUS:
13240       if (!TARGET_MACHO)
13241         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
13242       output_pic_addr_const (file, XEXP (x, 0), code);
13243       putc ('-', file);
13244       output_pic_addr_const (file, XEXP (x, 1), code);
13245       if (!TARGET_MACHO)
13246         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
13247       break;
13248
13249      case UNSPEC:
13250        if (XINT (x, 1) == UNSPEC_STACK_CHECK)
13251          {
13252            bool f = i386_asm_output_addr_const_extra (file, x);
13253            gcc_assert (f);
13254            break;
13255          }
13256
13257        gcc_assert (XVECLEN (x, 0) == 1);
13258        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
13259        switch (XINT (x, 1))
13260         {
13261         case UNSPEC_GOT:
13262           fputs ("@GOT", file);
13263           break;
13264         case UNSPEC_GOTOFF:
13265           fputs ("@GOTOFF", file);
13266           break;
13267         case UNSPEC_PLTOFF:
13268           fputs ("@PLTOFF", file);
13269           break;
13270         case UNSPEC_PCREL:
13271           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13272                  "(%rip)" : "[rip]", file);
13273           break;
13274         case UNSPEC_GOTPCREL:
13275           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13276                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
13277           break;
13278         case UNSPEC_GOTTPOFF:
13279           /* FIXME: This might be @TPOFF in Sun ld too.  */
13280           fputs ("@gottpoff", file);
13281           break;
13282         case UNSPEC_TPOFF:
13283           fputs ("@tpoff", file);
13284           break;
13285         case UNSPEC_NTPOFF:
13286           if (TARGET_64BIT)
13287             fputs ("@tpoff", file);
13288           else
13289             fputs ("@ntpoff", file);
13290           break;
13291         case UNSPEC_DTPOFF:
13292           fputs ("@dtpoff", file);
13293           break;
13294         case UNSPEC_GOTNTPOFF:
13295           if (TARGET_64BIT)
13296             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13297                    "@gottpoff(%rip)": "@gottpoff[rip]", file);
13298           else
13299             fputs ("@gotntpoff", file);
13300           break;
13301         case UNSPEC_INDNTPOFF:
13302           fputs ("@indntpoff", file);
13303           break;
13304 #if TARGET_MACHO
13305         case UNSPEC_MACHOPIC_OFFSET:
13306           putc ('-', file);
13307           machopic_output_function_base_name (file);
13308           break;
13309 #endif
13310         default:
13311           output_operand_lossage ("invalid UNSPEC as operand");
13312           break;
13313         }
13314        break;
13315
13316     default:
13317       output_operand_lossage ("invalid expression as operand");
13318     }
13319 }
13320
13321 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
13322    We need to emit DTP-relative relocations.  */
13323
13324 static void ATTRIBUTE_UNUSED
13325 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
13326 {
13327   fputs (ASM_LONG, file);
13328   output_addr_const (file, x);
13329   fputs ("@dtpoff", file);
13330   switch (size)
13331     {
13332     case 4:
13333       break;
13334     case 8:
13335       fputs (", 0", file);
13336       break;
13337     default:
13338       gcc_unreachable ();
13339    }
13340 }
13341
13342 /* Return true if X is a representation of the PIC register.  This copes
13343    with calls from ix86_find_base_term, where the register might have
13344    been replaced by a cselib value.  */
13345
13346 static bool
13347 ix86_pic_register_p (rtx x)
13348 {
13349   if (GET_CODE (x) == VALUE && CSELIB_VAL_PTR (x))
13350     return (pic_offset_table_rtx
13351             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
13352   else
13353     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
13354 }
13355
13356 /* Helper function for ix86_delegitimize_address.
13357    Attempt to delegitimize TLS local-exec accesses.  */
13358
13359 static rtx
13360 ix86_delegitimize_tls_address (rtx orig_x)
13361 {
13362   rtx x = orig_x, unspec;
13363   struct ix86_address addr;
13364
13365   if (!TARGET_TLS_DIRECT_SEG_REFS)
13366     return orig_x;
13367   if (MEM_P (x))
13368     x = XEXP (x, 0);
13369   if (GET_CODE (x) != PLUS || GET_MODE (x) != Pmode)
13370     return orig_x;
13371   if (ix86_decompose_address (x, &addr) == 0
13372       || addr.seg != (TARGET_64BIT ? SEG_FS : SEG_GS)
13373       || addr.disp == NULL_RTX
13374       || GET_CODE (addr.disp) != CONST)
13375     return orig_x;
13376   unspec = XEXP (addr.disp, 0);
13377   if (GET_CODE (unspec) == PLUS && CONST_INT_P (XEXP (unspec, 1)))
13378     unspec = XEXP (unspec, 0);
13379   if (GET_CODE (unspec) != UNSPEC || XINT (unspec, 1) != UNSPEC_NTPOFF)
13380     return orig_x;
13381   x = XVECEXP (unspec, 0, 0);
13382   gcc_assert (GET_CODE (x) == SYMBOL_REF);
13383   if (unspec != XEXP (addr.disp, 0))
13384     x = gen_rtx_PLUS (Pmode, x, XEXP (XEXP (addr.disp, 0), 1));
13385   if (addr.index)
13386     {
13387       rtx idx = addr.index;
13388       if (addr.scale != 1)
13389         idx = gen_rtx_MULT (Pmode, idx, GEN_INT (addr.scale));
13390       x = gen_rtx_PLUS (Pmode, idx, x);
13391     }
13392   if (addr.base)
13393     x = gen_rtx_PLUS (Pmode, addr.base, x);
13394   if (MEM_P (orig_x))
13395     x = replace_equiv_address_nv (orig_x, x);
13396   return x;
13397 }
13398
13399 /* In the name of slightly smaller debug output, and to cater to
13400    general assembler lossage, recognize PIC+GOTOFF and turn it back
13401    into a direct symbol reference.
13402
13403    On Darwin, this is necessary to avoid a crash, because Darwin
13404    has a different PIC label for each routine but the DWARF debugging
13405    information is not associated with any particular routine, so it's
13406    necessary to remove references to the PIC label from RTL stored by
13407    the DWARF output code.  */
13408
13409 static rtx
13410 ix86_delegitimize_address (rtx x)
13411 {
13412   rtx orig_x = delegitimize_mem_from_attrs (x);
13413   /* addend is NULL or some rtx if x is something+GOTOFF where
13414      something doesn't include the PIC register.  */
13415   rtx addend = NULL_RTX;
13416   /* reg_addend is NULL or a multiple of some register.  */
13417   rtx reg_addend = NULL_RTX;
13418   /* const_addend is NULL or a const_int.  */
13419   rtx const_addend = NULL_RTX;
13420   /* This is the result, or NULL.  */
13421   rtx result = NULL_RTX;
13422
13423   x = orig_x;
13424
13425   if (MEM_P (x))
13426     x = XEXP (x, 0);
13427
13428   if (TARGET_64BIT)
13429     {
13430       if (GET_CODE (x) != CONST
13431           || GET_CODE (XEXP (x, 0)) != UNSPEC
13432           || (XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
13433               && XINT (XEXP (x, 0), 1) != UNSPEC_PCREL)
13434           || !MEM_P (orig_x))
13435         return ix86_delegitimize_tls_address (orig_x);
13436       x = XVECEXP (XEXP (x, 0), 0, 0);
13437       if (GET_MODE (orig_x) != Pmode)
13438         {
13439           x = simplify_gen_subreg (GET_MODE (orig_x), x, Pmode, 0);
13440           if (x == NULL_RTX)
13441             return orig_x;
13442         }
13443       return x;
13444     }
13445
13446   if (GET_CODE (x) != PLUS
13447       || GET_CODE (XEXP (x, 1)) != CONST)
13448     return ix86_delegitimize_tls_address (orig_x);
13449
13450   if (ix86_pic_register_p (XEXP (x, 0)))
13451     /* %ebx + GOT/GOTOFF */
13452     ;
13453   else if (GET_CODE (XEXP (x, 0)) == PLUS)
13454     {
13455       /* %ebx + %reg * scale + GOT/GOTOFF */
13456       reg_addend = XEXP (x, 0);
13457       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
13458         reg_addend = XEXP (reg_addend, 1);
13459       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
13460         reg_addend = XEXP (reg_addend, 0);
13461       else
13462         {
13463           reg_addend = NULL_RTX;
13464           addend = XEXP (x, 0);
13465         }
13466     }
13467   else
13468     addend = XEXP (x, 0);
13469
13470   x = XEXP (XEXP (x, 1), 0);
13471   if (GET_CODE (x) == PLUS
13472       && CONST_INT_P (XEXP (x, 1)))
13473     {
13474       const_addend = XEXP (x, 1);
13475       x = XEXP (x, 0);
13476     }
13477
13478   if (GET_CODE (x) == UNSPEC
13479       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x) && !addend)
13480           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
13481     result = XVECEXP (x, 0, 0);
13482
13483   if (TARGET_MACHO && darwin_local_data_pic (x)
13484       && !MEM_P (orig_x))
13485     result = XVECEXP (x, 0, 0);
13486
13487   if (! result)
13488     return ix86_delegitimize_tls_address (orig_x);
13489
13490   if (const_addend)
13491     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
13492   if (reg_addend)
13493     result = gen_rtx_PLUS (Pmode, reg_addend, result);
13494   if (addend)
13495     {
13496       /* If the rest of original X doesn't involve the PIC register, add
13497          addend and subtract pic_offset_table_rtx.  This can happen e.g.
13498          for code like:
13499          leal (%ebx, %ecx, 4), %ecx
13500          ...
13501          movl foo@GOTOFF(%ecx), %edx
13502          in which case we return (%ecx - %ebx) + foo.  */
13503       if (pic_offset_table_rtx)
13504         result = gen_rtx_PLUS (Pmode, gen_rtx_MINUS (Pmode, copy_rtx (addend),
13505                                                      pic_offset_table_rtx),
13506                                result);
13507       else
13508         return orig_x;
13509     }
13510   if (GET_MODE (orig_x) != Pmode && MEM_P (orig_x))
13511     {
13512       result = simplify_gen_subreg (GET_MODE (orig_x), result, Pmode, 0);
13513       if (result == NULL_RTX)
13514         return orig_x;
13515     }
13516   return result;
13517 }
13518
13519 /* If X is a machine specific address (i.e. a symbol or label being
13520    referenced as a displacement from the GOT implemented using an
13521    UNSPEC), then return the base term.  Otherwise return X.  */
13522
13523 rtx
13524 ix86_find_base_term (rtx x)
13525 {
13526   rtx term;
13527
13528   if (TARGET_64BIT)
13529     {
13530       if (GET_CODE (x) != CONST)
13531         return x;
13532       term = XEXP (x, 0);
13533       if (GET_CODE (term) == PLUS
13534           && (CONST_INT_P (XEXP (term, 1))
13535               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
13536         term = XEXP (term, 0);
13537       if (GET_CODE (term) != UNSPEC
13538           || (XINT (term, 1) != UNSPEC_GOTPCREL
13539               && XINT (term, 1) != UNSPEC_PCREL))
13540         return x;
13541
13542       return XVECEXP (term, 0, 0);
13543     }
13544
13545   return ix86_delegitimize_address (x);
13546 }
13547 \f
13548 static void
13549 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
13550                     int fp, FILE *file)
13551 {
13552   const char *suffix;
13553
13554   if (mode == CCFPmode || mode == CCFPUmode)
13555     {
13556       code = ix86_fp_compare_code_to_integer (code);
13557       mode = CCmode;
13558     }
13559   if (reverse)
13560     code = reverse_condition (code);
13561
13562   switch (code)
13563     {
13564     case EQ:
13565       switch (mode)
13566         {
13567         case CCAmode:
13568           suffix = "a";
13569           break;
13570
13571         case CCCmode:
13572           suffix = "c";
13573           break;
13574
13575         case CCOmode:
13576           suffix = "o";
13577           break;
13578
13579         case CCSmode:
13580           suffix = "s";
13581           break;
13582
13583         default:
13584           suffix = "e";
13585         }
13586       break;
13587     case NE:
13588       switch (mode)
13589         {
13590         case CCAmode:
13591           suffix = "na";
13592           break;
13593
13594         case CCCmode:
13595           suffix = "nc";
13596           break;
13597
13598         case CCOmode:
13599           suffix = "no";
13600           break;
13601
13602         case CCSmode:
13603           suffix = "ns";
13604           break;
13605
13606         default:
13607           suffix = "ne";
13608         }
13609       break;
13610     case GT:
13611       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
13612       suffix = "g";
13613       break;
13614     case GTU:
13615       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
13616          Those same assemblers have the same but opposite lossage on cmov.  */
13617       if (mode == CCmode)
13618         suffix = fp ? "nbe" : "a";
13619       else if (mode == CCCmode)
13620         suffix = "b";
13621       else
13622         gcc_unreachable ();
13623       break;
13624     case LT:
13625       switch (mode)
13626         {
13627         case CCNOmode:
13628         case CCGOCmode:
13629           suffix = "s";
13630           break;
13631
13632         case CCmode:
13633         case CCGCmode:
13634           suffix = "l";
13635           break;
13636
13637         default:
13638           gcc_unreachable ();
13639         }
13640       break;
13641     case LTU:
13642       gcc_assert (mode == CCmode || mode == CCCmode);
13643       suffix = "b";
13644       break;
13645     case GE:
13646       switch (mode)
13647         {
13648         case CCNOmode:
13649         case CCGOCmode:
13650           suffix = "ns";
13651           break;
13652
13653         case CCmode:
13654         case CCGCmode:
13655           suffix = "ge";
13656           break;
13657
13658         default:
13659           gcc_unreachable ();
13660         }
13661       break;
13662     case GEU:
13663       /* ??? As above.  */
13664       gcc_assert (mode == CCmode || mode == CCCmode);
13665       suffix = fp ? "nb" : "ae";
13666       break;
13667     case LE:
13668       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
13669       suffix = "le";
13670       break;
13671     case LEU:
13672       /* ??? As above.  */
13673       if (mode == CCmode)
13674         suffix = "be";
13675       else if (mode == CCCmode)
13676         suffix = fp ? "nb" : "ae";
13677       else
13678         gcc_unreachable ();
13679       break;
13680     case UNORDERED:
13681       suffix = fp ? "u" : "p";
13682       break;
13683     case ORDERED:
13684       suffix = fp ? "nu" : "np";
13685       break;
13686     default:
13687       gcc_unreachable ();
13688     }
13689   fputs (suffix, file);
13690 }
13691
13692 /* Print the name of register X to FILE based on its machine mode and number.
13693    If CODE is 'w', pretend the mode is HImode.
13694    If CODE is 'b', pretend the mode is QImode.
13695    If CODE is 'k', pretend the mode is SImode.
13696    If CODE is 'q', pretend the mode is DImode.
13697    If CODE is 'x', pretend the mode is V4SFmode.
13698    If CODE is 't', pretend the mode is V8SFmode.
13699    If CODE is 'h', pretend the reg is the 'high' byte register.
13700    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
13701    If CODE is 'd', duplicate the operand for AVX instruction.
13702  */
13703
13704 void
13705 print_reg (rtx x, int code, FILE *file)
13706 {
13707   const char *reg;
13708   bool duplicated = code == 'd' && TARGET_AVX;
13709
13710   gcc_assert (x == pc_rtx
13711               || (REGNO (x) != ARG_POINTER_REGNUM
13712                   && REGNO (x) != FRAME_POINTER_REGNUM
13713                   && REGNO (x) != FLAGS_REG
13714                   && REGNO (x) != FPSR_REG
13715                   && REGNO (x) != FPCR_REG));
13716
13717   if (ASSEMBLER_DIALECT == ASM_ATT)
13718     putc ('%', file);
13719
13720   if (x == pc_rtx)
13721     {
13722       gcc_assert (TARGET_64BIT);
13723       fputs ("rip", file);
13724       return;
13725     }
13726
13727   if (code == 'w' || MMX_REG_P (x))
13728     code = 2;
13729   else if (code == 'b')
13730     code = 1;
13731   else if (code == 'k')
13732     code = 4;
13733   else if (code == 'q')
13734     code = 8;
13735   else if (code == 'y')
13736     code = 3;
13737   else if (code == 'h')
13738     code = 0;
13739   else if (code == 'x')
13740     code = 16;
13741   else if (code == 't')
13742     code = 32;
13743   else
13744     code = GET_MODE_SIZE (GET_MODE (x));
13745
13746   /* Irritatingly, AMD extended registers use different naming convention
13747      from the normal registers.  */
13748   if (REX_INT_REG_P (x))
13749     {
13750       gcc_assert (TARGET_64BIT);
13751       switch (code)
13752         {
13753           case 0:
13754             error ("extended registers have no high halves");
13755             break;
13756           case 1:
13757             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
13758             break;
13759           case 2:
13760             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
13761             break;
13762           case 4:
13763             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
13764             break;
13765           case 8:
13766             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
13767             break;
13768           default:
13769             error ("unsupported operand size for extended register");
13770             break;
13771         }
13772       return;
13773     }
13774
13775   reg = NULL;
13776   switch (code)
13777     {
13778     case 3:
13779       if (STACK_TOP_P (x))
13780         {
13781           reg = "st(0)";
13782           break;
13783         }
13784       /* FALLTHRU */
13785     case 8:
13786     case 4:
13787     case 12:
13788       if (! ANY_FP_REG_P (x))
13789         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
13790       /* FALLTHRU */
13791     case 16:
13792     case 2:
13793     normal:
13794       reg = hi_reg_name[REGNO (x)];
13795       break;
13796     case 1:
13797       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
13798         goto normal;
13799       reg = qi_reg_name[REGNO (x)];
13800       break;
13801     case 0:
13802       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
13803         goto normal;
13804       reg = qi_high_reg_name[REGNO (x)];
13805       break;
13806     case 32:
13807       if (SSE_REG_P (x))
13808         {
13809           gcc_assert (!duplicated);
13810           putc ('y', file);
13811           fputs (hi_reg_name[REGNO (x)] + 1, file);
13812           return;
13813         }
13814       break;
13815     default:
13816       gcc_unreachable ();
13817     }
13818
13819   fputs (reg, file);
13820   if (duplicated)
13821     {
13822       if (ASSEMBLER_DIALECT == ASM_ATT)
13823         fprintf (file, ", %%%s", reg);
13824       else
13825         fprintf (file, ", %s", reg);
13826     }
13827 }
13828
13829 /* Locate some local-dynamic symbol still in use by this function
13830    so that we can print its name in some tls_local_dynamic_base
13831    pattern.  */
13832
13833 static int
13834 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
13835 {
13836   rtx x = *px;
13837
13838   if (GET_CODE (x) == SYMBOL_REF
13839       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
13840     {
13841       cfun->machine->some_ld_name = XSTR (x, 0);
13842       return 1;
13843     }
13844
13845   return 0;
13846 }
13847
13848 static const char *
13849 get_some_local_dynamic_name (void)
13850 {
13851   rtx insn;
13852
13853   if (cfun->machine->some_ld_name)
13854     return cfun->machine->some_ld_name;
13855
13856   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
13857     if (NONDEBUG_INSN_P (insn)
13858         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
13859       return cfun->machine->some_ld_name;
13860
13861   return NULL;
13862 }
13863
13864 /* Meaning of CODE:
13865    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
13866    C -- print opcode suffix for set/cmov insn.
13867    c -- like C, but print reversed condition
13868    F,f -- likewise, but for floating-point.
13869    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
13870         otherwise nothing
13871    R -- print the prefix for register names.
13872    z -- print the opcode suffix for the size of the current operand.
13873    Z -- likewise, with special suffixes for x87 instructions.
13874    * -- print a star (in certain assembler syntax)
13875    A -- print an absolute memory reference.
13876    w -- print the operand as if it's a "word" (HImode) even if it isn't.
13877    s -- print a shift double count, followed by the assemblers argument
13878         delimiter.
13879    b -- print the QImode name of the register for the indicated operand.
13880         %b0 would print %al if operands[0] is reg 0.
13881    w --  likewise, print the HImode name of the register.
13882    k --  likewise, print the SImode name of the register.
13883    q --  likewise, print the DImode name of the register.
13884    x --  likewise, print the V4SFmode name of the register.
13885    t --  likewise, print the V8SFmode name of the register.
13886    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
13887    y -- print "st(0)" instead of "st" as a register.
13888    d -- print duplicated register operand for AVX instruction.
13889    D -- print condition for SSE cmp instruction.
13890    P -- if PIC, print an @PLT suffix.
13891    X -- don't print any sort of PIC '@' suffix for a symbol.
13892    & -- print some in-use local-dynamic symbol name.
13893    H -- print a memory address offset by 8; used for sse high-parts
13894    Y -- print condition for XOP pcom* instruction.
13895    + -- print a branch hint as 'cs' or 'ds' prefix
13896    ; -- print a semicolon (after prefixes due to bug in older gas).
13897    @ -- print a segment register of thread base pointer load
13898  */
13899
13900 void
13901 ix86_print_operand (FILE *file, rtx x, int code)
13902 {
13903   if (code)
13904     {
13905       switch (code)
13906         {
13907         case '*':
13908           if (ASSEMBLER_DIALECT == ASM_ATT)
13909             putc ('*', file);
13910           return;
13911
13912         case '&':
13913           {
13914             const char *name = get_some_local_dynamic_name ();
13915             if (name == NULL)
13916               output_operand_lossage ("'%%&' used without any "
13917                                       "local dynamic TLS references");
13918             else
13919               assemble_name (file, name);
13920             return;
13921           }
13922
13923         case 'A':
13924           switch (ASSEMBLER_DIALECT)
13925             {
13926             case ASM_ATT:
13927               putc ('*', file);
13928               break;
13929
13930             case ASM_INTEL:
13931               /* Intel syntax. For absolute addresses, registers should not
13932                  be surrounded by braces.  */
13933               if (!REG_P (x))
13934                 {
13935                   putc ('[', file);
13936                   ix86_print_operand (file, x, 0);
13937                   putc (']', file);
13938                   return;
13939                 }
13940               break;
13941
13942             default:
13943               gcc_unreachable ();
13944             }
13945
13946           ix86_print_operand (file, x, 0);
13947           return;
13948
13949
13950         case 'L':
13951           if (ASSEMBLER_DIALECT == ASM_ATT)
13952             putc ('l', file);
13953           return;
13954
13955         case 'W':
13956           if (ASSEMBLER_DIALECT == ASM_ATT)
13957             putc ('w', file);
13958           return;
13959
13960         case 'B':
13961           if (ASSEMBLER_DIALECT == ASM_ATT)
13962             putc ('b', file);
13963           return;
13964
13965         case 'Q':
13966           if (ASSEMBLER_DIALECT == ASM_ATT)
13967             putc ('l', file);
13968           return;
13969
13970         case 'S':
13971           if (ASSEMBLER_DIALECT == ASM_ATT)
13972             putc ('s', file);
13973           return;
13974
13975         case 'T':
13976           if (ASSEMBLER_DIALECT == ASM_ATT)
13977             putc ('t', file);
13978           return;
13979
13980         case 'z':
13981           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
13982             {
13983               /* Opcodes don't get size suffixes if using Intel opcodes.  */
13984               if (ASSEMBLER_DIALECT == ASM_INTEL)
13985                 return;
13986
13987               switch (GET_MODE_SIZE (GET_MODE (x)))
13988                 {
13989                 case 1:
13990                   putc ('b', file);
13991                   return;
13992
13993                 case 2:
13994                   putc ('w', file);
13995                   return;
13996
13997                 case 4:
13998                   putc ('l', file);
13999                   return;
14000
14001                 case 8:
14002                   putc ('q', file);
14003                   return;
14004
14005                 default:
14006                   output_operand_lossage
14007                     ("invalid operand size for operand code '%c'", code);
14008                   return;
14009                 }
14010             }
14011
14012           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
14013             warning
14014               (0, "non-integer operand used with operand code '%c'", code);
14015           /* FALLTHRU */
14016
14017         case 'Z':
14018           /* 387 opcodes don't get size suffixes if using Intel opcodes.  */
14019           if (ASSEMBLER_DIALECT == ASM_INTEL)
14020             return;
14021
14022           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
14023             {
14024               switch (GET_MODE_SIZE (GET_MODE (x)))
14025                 {
14026                 case 2:
14027 #ifdef HAVE_AS_IX86_FILDS
14028                   putc ('s', file);
14029 #endif
14030                   return;
14031
14032                 case 4:
14033                   putc ('l', file);
14034                   return;
14035
14036                 case 8:
14037 #ifdef HAVE_AS_IX86_FILDQ
14038                   putc ('q', file);
14039 #else
14040                   fputs ("ll", file);
14041 #endif
14042                   return;
14043
14044                 default:
14045                   break;
14046                 }
14047             }
14048           else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
14049             {
14050               /* 387 opcodes don't get size suffixes
14051                  if the operands are registers.  */
14052               if (STACK_REG_P (x))
14053                 return;
14054
14055               switch (GET_MODE_SIZE (GET_MODE (x)))
14056                 {
14057                 case 4:
14058                   putc ('s', file);
14059                   return;
14060
14061                 case 8:
14062                   putc ('l', file);
14063                   return;
14064
14065                 case 12:
14066                 case 16:
14067                   putc ('t', file);
14068                   return;
14069
14070                 default:
14071                   break;
14072                 }
14073             }
14074           else
14075             {
14076               output_operand_lossage
14077                 ("invalid operand type used with operand code '%c'", code);
14078               return;
14079             }
14080
14081           output_operand_lossage
14082             ("invalid operand size for operand code '%c'", code);
14083           return;
14084
14085         case 'd':
14086         case 'b':
14087         case 'w':
14088         case 'k':
14089         case 'q':
14090         case 'h':
14091         case 't':
14092         case 'y':
14093         case 'x':
14094         case 'X':
14095         case 'P':
14096           break;
14097
14098         case 's':
14099           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
14100             {
14101               ix86_print_operand (file, x, 0);
14102               fputs (", ", file);
14103             }
14104           return;
14105
14106         case 'D':
14107           /* Little bit of braindamage here.  The SSE compare instructions
14108              does use completely different names for the comparisons that the
14109              fp conditional moves.  */
14110           if (TARGET_AVX)
14111             {
14112               switch (GET_CODE (x))
14113                 {
14114                 case EQ:
14115                   fputs ("eq", file);
14116                   break;
14117                 case UNEQ:
14118                   fputs ("eq_us", file);
14119                   break;
14120                 case LT:
14121                   fputs ("lt", file);
14122                   break;
14123                 case UNLT:
14124                   fputs ("nge", file);
14125                   break;
14126                 case LE:
14127                   fputs ("le", file);
14128                   break;
14129                 case UNLE:
14130                   fputs ("ngt", file);
14131                   break;
14132                 case UNORDERED:
14133                   fputs ("unord", file);
14134                   break;
14135                 case NE:
14136                   fputs ("neq", file);
14137                   break;
14138                 case LTGT:
14139                   fputs ("neq_oq", file);
14140                   break;
14141                 case GE:
14142                   fputs ("ge", file);
14143                   break;
14144                 case UNGE:
14145                   fputs ("nlt", file);
14146                   break;
14147                 case GT:
14148                   fputs ("gt", file);
14149                   break;
14150                 case UNGT:
14151                   fputs ("nle", file);
14152                   break;
14153                 case ORDERED:
14154                   fputs ("ord", file);
14155                   break;
14156                 default:
14157                   output_operand_lossage ("operand is not a condition code, "
14158                                           "invalid operand code 'D'");
14159                   return;
14160                 }
14161             }
14162           else
14163             {
14164               switch (GET_CODE (x))
14165                 {
14166                 case EQ:
14167                 case UNEQ:
14168                   fputs ("eq", file);
14169                   break;
14170                 case LT:
14171                 case UNLT:
14172                   fputs ("lt", file);
14173                   break;
14174                 case LE:
14175                 case UNLE:
14176                   fputs ("le", file);
14177                   break;
14178                 case UNORDERED:
14179                   fputs ("unord", file);
14180                   break;
14181                 case NE:
14182                 case LTGT:
14183                   fputs ("neq", file);
14184                   break;
14185                 case UNGE:
14186                 case GE:
14187                   fputs ("nlt", file);
14188                   break;
14189                 case UNGT:
14190                 case GT:
14191                   fputs ("nle", file);
14192                   break;
14193                 case ORDERED:
14194                   fputs ("ord", file);
14195                   break;
14196                 default:
14197                   output_operand_lossage ("operand is not a condition code, "
14198                                           "invalid operand code 'D'");
14199                   return;
14200                 }
14201             }
14202           return;
14203         case 'O':
14204 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14205           if (ASSEMBLER_DIALECT == ASM_ATT)
14206             {
14207               switch (GET_MODE (x))
14208                 {
14209                 case HImode: putc ('w', file); break;
14210                 case SImode:
14211                 case SFmode: putc ('l', file); break;
14212                 case DImode:
14213                 case DFmode: putc ('q', file); break;
14214                 default: gcc_unreachable ();
14215                 }
14216               putc ('.', file);
14217             }
14218 #endif
14219           return;
14220         case 'C':
14221           if (!COMPARISON_P (x))
14222             {
14223               output_operand_lossage ("operand is neither a constant nor a "
14224                                       "condition code, invalid operand code "
14225                                       "'C'");
14226               return;
14227             }
14228           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
14229           return;
14230         case 'F':
14231           if (!COMPARISON_P (x))
14232             {
14233               output_operand_lossage ("operand is neither a constant nor a "
14234                                       "condition code, invalid operand code "
14235                                       "'F'");
14236               return;
14237             }
14238 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14239           if (ASSEMBLER_DIALECT == ASM_ATT)
14240             putc ('.', file);
14241 #endif
14242           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
14243           return;
14244
14245           /* Like above, but reverse condition */
14246         case 'c':
14247           /* Check to see if argument to %c is really a constant
14248              and not a condition code which needs to be reversed.  */
14249           if (!COMPARISON_P (x))
14250             {
14251               output_operand_lossage ("operand is neither a constant nor a "
14252                                       "condition code, invalid operand "
14253                                       "code 'c'");
14254               return;
14255             }
14256           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
14257           return;
14258         case 'f':
14259           if (!COMPARISON_P (x))
14260             {
14261               output_operand_lossage ("operand is neither a constant nor a "
14262                                       "condition code, invalid operand "
14263                                       "code 'f'");
14264               return;
14265             }
14266 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14267           if (ASSEMBLER_DIALECT == ASM_ATT)
14268             putc ('.', file);
14269 #endif
14270           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
14271           return;
14272
14273         case 'H':
14274           /* It doesn't actually matter what mode we use here, as we're
14275              only going to use this for printing.  */
14276           x = adjust_address_nv (x, DImode, 8);
14277           break;
14278
14279         case '+':
14280           {
14281             rtx x;
14282
14283             if (!optimize
14284                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
14285               return;
14286
14287             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
14288             if (x)
14289               {
14290                 int pred_val = INTVAL (XEXP (x, 0));
14291
14292                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
14293                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
14294                   {
14295                     int taken = pred_val > REG_BR_PROB_BASE / 2;
14296                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
14297
14298                     /* Emit hints only in the case default branch prediction
14299                        heuristics would fail.  */
14300                     if (taken != cputaken)
14301                       {
14302                         /* We use 3e (DS) prefix for taken branches and
14303                            2e (CS) prefix for not taken branches.  */
14304                         if (taken)
14305                           fputs ("ds ; ", file);
14306                         else
14307                           fputs ("cs ; ", file);
14308                       }
14309                   }
14310               }
14311             return;
14312           }
14313
14314         case 'Y':
14315           switch (GET_CODE (x))
14316             {
14317             case NE:
14318               fputs ("neq", file);
14319               break;
14320             case EQ:
14321               fputs ("eq", file);
14322               break;
14323             case GE:
14324             case GEU:
14325               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
14326               break;
14327             case GT:
14328             case GTU:
14329               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
14330               break;
14331             case LE:
14332             case LEU:
14333               fputs ("le", file);
14334               break;
14335             case LT:
14336             case LTU:
14337               fputs ("lt", file);
14338               break;
14339             case UNORDERED:
14340               fputs ("unord", file);
14341               break;
14342             case ORDERED:
14343               fputs ("ord", file);
14344               break;
14345             case UNEQ:
14346               fputs ("ueq", file);
14347               break;
14348             case UNGE:
14349               fputs ("nlt", file);
14350               break;
14351             case UNGT:
14352               fputs ("nle", file);
14353               break;
14354             case UNLE:
14355               fputs ("ule", file);
14356               break;
14357             case UNLT:
14358               fputs ("ult", file);
14359               break;
14360             case LTGT:
14361               fputs ("une", file);
14362               break;
14363             default:
14364               output_operand_lossage ("operand is not a condition code, "
14365                                       "invalid operand code 'Y'");
14366               return;
14367             }
14368           return;
14369
14370         case ';':
14371 #ifndef HAVE_AS_IX86_REP_LOCK_PREFIX
14372           putc (';', file);
14373 #endif
14374           return;
14375
14376         case '@':
14377           if (ASSEMBLER_DIALECT == ASM_ATT)
14378             putc ('%', file);
14379
14380           /* The kernel uses a different segment register for performance
14381              reasons; a system call would not have to trash the userspace
14382              segment register, which would be expensive.  */
14383           if (TARGET_64BIT && ix86_cmodel != CM_KERNEL)
14384             fputs ("fs", file);
14385           else
14386             fputs ("gs", file);
14387           return;
14388
14389         default:
14390             output_operand_lossage ("invalid operand code '%c'", code);
14391         }
14392     }
14393
14394   if (REG_P (x))
14395     print_reg (x, code, file);
14396
14397   else if (MEM_P (x))
14398     {
14399       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
14400       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
14401           && GET_MODE (x) != BLKmode)
14402         {
14403           const char * size;
14404           switch (GET_MODE_SIZE (GET_MODE (x)))
14405             {
14406             case 1: size = "BYTE"; break;
14407             case 2: size = "WORD"; break;
14408             case 4: size = "DWORD"; break;
14409             case 8: size = "QWORD"; break;
14410             case 12: size = "TBYTE"; break;
14411             case 16:
14412               if (GET_MODE (x) == XFmode)
14413                 size = "TBYTE";
14414               else
14415                 size = "XMMWORD";
14416               break;
14417             case 32: size = "YMMWORD"; break;
14418             default:
14419               gcc_unreachable ();
14420             }
14421
14422           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
14423           if (code == 'b')
14424             size = "BYTE";
14425           else if (code == 'w')
14426             size = "WORD";
14427           else if (code == 'k')
14428             size = "DWORD";
14429
14430           fputs (size, file);
14431           fputs (" PTR ", file);
14432         }
14433
14434       x = XEXP (x, 0);
14435       /* Avoid (%rip) for call operands.  */
14436       if (CONSTANT_ADDRESS_P (x) && code == 'P'
14437           && !CONST_INT_P (x))
14438         output_addr_const (file, x);
14439       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
14440         output_operand_lossage ("invalid constraints for operand");
14441       else
14442         output_address (x);
14443     }
14444
14445   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
14446     {
14447       REAL_VALUE_TYPE r;
14448       long l;
14449
14450       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
14451       REAL_VALUE_TO_TARGET_SINGLE (r, l);
14452
14453       if (ASSEMBLER_DIALECT == ASM_ATT)
14454         putc ('$', file);
14455       /* Sign extend 32bit SFmode immediate to 8 bytes.  */
14456       if (code == 'q')
14457         fprintf (file, "0x%08llx", (unsigned long long) (int) l);
14458       else
14459         fprintf (file, "0x%08x", (unsigned int) l);
14460     }
14461
14462   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
14463     {
14464       REAL_VALUE_TYPE r;
14465       long l[2];
14466
14467       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
14468       REAL_VALUE_TO_TARGET_DOUBLE (r, l);
14469
14470       if (ASSEMBLER_DIALECT == ASM_ATT)
14471         putc ('$', file);
14472       fprintf (file, "0x%lx%08lx", l[1] & 0xffffffff, l[0] & 0xffffffff);
14473     }
14474
14475   /* These float cases don't actually occur as immediate operands.  */
14476   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == XFmode)
14477     {
14478       char dstr[30];
14479
14480       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
14481       fputs (dstr, file);
14482     }
14483
14484   else
14485     {
14486       /* We have patterns that allow zero sets of memory, for instance.
14487          In 64-bit mode, we should probably support all 8-byte vectors,
14488          since we can in fact encode that into an immediate.  */
14489       if (GET_CODE (x) == CONST_VECTOR)
14490         {
14491           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
14492           x = const0_rtx;
14493         }
14494
14495       if (code != 'P')
14496         {
14497           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
14498             {
14499               if (ASSEMBLER_DIALECT == ASM_ATT)
14500                 putc ('$', file);
14501             }
14502           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
14503                    || GET_CODE (x) == LABEL_REF)
14504             {
14505               if (ASSEMBLER_DIALECT == ASM_ATT)
14506                 putc ('$', file);
14507               else
14508                 fputs ("OFFSET FLAT:", file);
14509             }
14510         }
14511       if (CONST_INT_P (x))
14512         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
14513       else if (flag_pic || MACHOPIC_INDIRECT)
14514         output_pic_addr_const (file, x, code);
14515       else
14516         output_addr_const (file, x);
14517     }
14518 }
14519
14520 static bool
14521 ix86_print_operand_punct_valid_p (unsigned char code)
14522 {
14523   return (code == '@' || code == '*' || code == '+'
14524           || code == '&' || code == ';');
14525 }
14526 \f
14527 /* Print a memory operand whose address is ADDR.  */
14528
14529 static void
14530 ix86_print_operand_address (FILE *file, rtx addr)
14531 {
14532   struct ix86_address parts;
14533   rtx base, index, disp;
14534   int scale;
14535   int ok = ix86_decompose_address (addr, &parts);
14536
14537   gcc_assert (ok);
14538
14539   base = parts.base;
14540   index = parts.index;
14541   disp = parts.disp;
14542   scale = parts.scale;
14543
14544   switch (parts.seg)
14545     {
14546     case SEG_DEFAULT:
14547       break;
14548     case SEG_FS:
14549     case SEG_GS:
14550       if (ASSEMBLER_DIALECT == ASM_ATT)
14551         putc ('%', file);
14552       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
14553       break;
14554     default:
14555       gcc_unreachable ();
14556     }
14557
14558   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
14559   if (TARGET_64BIT && !base && !index)
14560     {
14561       rtx symbol = disp;
14562
14563       if (GET_CODE (disp) == CONST
14564           && GET_CODE (XEXP (disp, 0)) == PLUS
14565           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
14566         symbol = XEXP (XEXP (disp, 0), 0);
14567
14568       if (GET_CODE (symbol) == LABEL_REF
14569           || (GET_CODE (symbol) == SYMBOL_REF
14570               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
14571         base = pc_rtx;
14572     }
14573   if (!base && !index)
14574     {
14575       /* Displacement only requires special attention.  */
14576
14577       if (CONST_INT_P (disp))
14578         {
14579           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
14580             fputs ("ds:", file);
14581           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
14582         }
14583       else if (flag_pic)
14584         output_pic_addr_const (file, disp, 0);
14585       else
14586         output_addr_const (file, disp);
14587     }
14588   else
14589     {
14590       if (ASSEMBLER_DIALECT == ASM_ATT)
14591         {
14592           if (disp)
14593             {
14594               if (flag_pic)
14595                 output_pic_addr_const (file, disp, 0);
14596               else if (GET_CODE (disp) == LABEL_REF)
14597                 output_asm_label (disp);
14598               else
14599                 output_addr_const (file, disp);
14600             }
14601
14602           putc ('(', file);
14603           if (base)
14604             print_reg (base, 0, file);
14605           if (index)
14606             {
14607               putc (',', file);
14608               print_reg (index, 0, file);
14609               if (scale != 1)
14610                 fprintf (file, ",%d", scale);
14611             }
14612           putc (')', file);
14613         }
14614       else
14615         {
14616           rtx offset = NULL_RTX;
14617
14618           if (disp)
14619             {
14620               /* Pull out the offset of a symbol; print any symbol itself.  */
14621               if (GET_CODE (disp) == CONST
14622                   && GET_CODE (XEXP (disp, 0)) == PLUS
14623                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
14624                 {
14625                   offset = XEXP (XEXP (disp, 0), 1);
14626                   disp = gen_rtx_CONST (VOIDmode,
14627                                         XEXP (XEXP (disp, 0), 0));
14628                 }
14629
14630               if (flag_pic)
14631                 output_pic_addr_const (file, disp, 0);
14632               else if (GET_CODE (disp) == LABEL_REF)
14633                 output_asm_label (disp);
14634               else if (CONST_INT_P (disp))
14635                 offset = disp;
14636               else
14637                 output_addr_const (file, disp);
14638             }
14639
14640           putc ('[', file);
14641           if (base)
14642             {
14643               print_reg (base, 0, file);
14644               if (offset)
14645                 {
14646                   if (INTVAL (offset) >= 0)
14647                     putc ('+', file);
14648                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
14649                 }
14650             }
14651           else if (offset)
14652             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
14653           else
14654             putc ('0', file);
14655
14656           if (index)
14657             {
14658               putc ('+', file);
14659               print_reg (index, 0, file);
14660               if (scale != 1)
14661                 fprintf (file, "*%d", scale);
14662             }
14663           putc (']', file);
14664         }
14665     }
14666 }
14667
14668 /* Implementation of TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
14669
14670 static bool
14671 i386_asm_output_addr_const_extra (FILE *file, rtx x)
14672 {
14673   rtx op;
14674
14675   if (GET_CODE (x) != UNSPEC)
14676     return false;
14677
14678   op = XVECEXP (x, 0, 0);
14679   switch (XINT (x, 1))
14680     {
14681     case UNSPEC_GOTTPOFF:
14682       output_addr_const (file, op);
14683       /* FIXME: This might be @TPOFF in Sun ld.  */
14684       fputs ("@gottpoff", file);
14685       break;
14686     case UNSPEC_TPOFF:
14687       output_addr_const (file, op);
14688       fputs ("@tpoff", file);
14689       break;
14690     case UNSPEC_NTPOFF:
14691       output_addr_const (file, op);
14692       if (TARGET_64BIT)
14693         fputs ("@tpoff", file);
14694       else
14695         fputs ("@ntpoff", file);
14696       break;
14697     case UNSPEC_DTPOFF:
14698       output_addr_const (file, op);
14699       fputs ("@dtpoff", file);
14700       break;
14701     case UNSPEC_GOTNTPOFF:
14702       output_addr_const (file, op);
14703       if (TARGET_64BIT)
14704         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
14705                "@gottpoff(%rip)" : "@gottpoff[rip]", file);
14706       else
14707         fputs ("@gotntpoff", file);
14708       break;
14709     case UNSPEC_INDNTPOFF:
14710       output_addr_const (file, op);
14711       fputs ("@indntpoff", file);
14712       break;
14713 #if TARGET_MACHO
14714     case UNSPEC_MACHOPIC_OFFSET:
14715       output_addr_const (file, op);
14716       putc ('-', file);
14717       machopic_output_function_base_name (file);
14718       break;
14719 #endif
14720
14721     case UNSPEC_STACK_CHECK:
14722       {
14723         int offset;
14724
14725         gcc_assert (flag_split_stack);
14726
14727 #ifdef TARGET_THREAD_SPLIT_STACK_OFFSET
14728         offset = TARGET_THREAD_SPLIT_STACK_OFFSET;
14729 #else
14730         gcc_unreachable ();
14731 #endif
14732
14733         fprintf (file, "%s:%d", TARGET_64BIT ? "%fs" : "%gs", offset);
14734       }
14735       break;
14736
14737     default:
14738       return false;
14739     }
14740
14741   return true;
14742 }
14743 \f
14744 /* Split one or more double-mode RTL references into pairs of half-mode
14745    references.  The RTL can be REG, offsettable MEM, integer constant, or
14746    CONST_DOUBLE.  "operands" is a pointer to an array of double-mode RTLs to
14747    split and "num" is its length.  lo_half and hi_half are output arrays
14748    that parallel "operands".  */
14749
14750 void
14751 split_double_mode (enum machine_mode mode, rtx operands[],
14752                    int num, rtx lo_half[], rtx hi_half[])
14753 {
14754   enum machine_mode half_mode;
14755   unsigned int byte;
14756
14757   switch (mode)
14758     {
14759     case TImode:
14760       half_mode = DImode;
14761       break;
14762     case DImode:
14763       half_mode = SImode;
14764       break;
14765     default:
14766       gcc_unreachable ();
14767     }
14768
14769   byte = GET_MODE_SIZE (half_mode);
14770
14771   while (num--)
14772     {
14773       rtx op = operands[num];
14774
14775       /* simplify_subreg refuse to split volatile memory addresses,
14776          but we still have to handle it.  */
14777       if (MEM_P (op))
14778         {
14779           lo_half[num] = adjust_address (op, half_mode, 0);
14780           hi_half[num] = adjust_address (op, half_mode, byte);
14781         }
14782       else
14783         {
14784           lo_half[num] = simplify_gen_subreg (half_mode, op,
14785                                               GET_MODE (op) == VOIDmode
14786                                               ? mode : GET_MODE (op), 0);
14787           hi_half[num] = simplify_gen_subreg (half_mode, op,
14788                                               GET_MODE (op) == VOIDmode
14789                                               ? mode : GET_MODE (op), byte);
14790         }
14791     }
14792 }
14793 \f
14794 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
14795    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
14796    is the expression of the binary operation.  The output may either be
14797    emitted here, or returned to the caller, like all output_* functions.
14798
14799    There is no guarantee that the operands are the same mode, as they
14800    might be within FLOAT or FLOAT_EXTEND expressions.  */
14801
14802 #ifndef SYSV386_COMPAT
14803 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
14804    wants to fix the assemblers because that causes incompatibility
14805    with gcc.  No-one wants to fix gcc because that causes
14806    incompatibility with assemblers...  You can use the option of
14807    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
14808 #define SYSV386_COMPAT 1
14809 #endif
14810
14811 const char *
14812 output_387_binary_op (rtx insn, rtx *operands)
14813 {
14814   static char buf[40];
14815   const char *p;
14816   const char *ssep;
14817   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
14818
14819 #ifdef ENABLE_CHECKING
14820   /* Even if we do not want to check the inputs, this documents input
14821      constraints.  Which helps in understanding the following code.  */
14822   if (STACK_REG_P (operands[0])
14823       && ((REG_P (operands[1])
14824            && REGNO (operands[0]) == REGNO (operands[1])
14825            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
14826           || (REG_P (operands[2])
14827               && REGNO (operands[0]) == REGNO (operands[2])
14828               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
14829       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
14830     ; /* ok */
14831   else
14832     gcc_assert (is_sse);
14833 #endif
14834
14835   switch (GET_CODE (operands[3]))
14836     {
14837     case PLUS:
14838       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14839           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14840         p = "fiadd";
14841       else
14842         p = "fadd";
14843       ssep = "vadd";
14844       break;
14845
14846     case MINUS:
14847       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14848           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14849         p = "fisub";
14850       else
14851         p = "fsub";
14852       ssep = "vsub";
14853       break;
14854
14855     case MULT:
14856       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14857           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14858         p = "fimul";
14859       else
14860         p = "fmul";
14861       ssep = "vmul";
14862       break;
14863
14864     case DIV:
14865       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14866           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14867         p = "fidiv";
14868       else
14869         p = "fdiv";
14870       ssep = "vdiv";
14871       break;
14872
14873     default:
14874       gcc_unreachable ();
14875     }
14876
14877   if (is_sse)
14878    {
14879      if (TARGET_AVX)
14880        {
14881          strcpy (buf, ssep);
14882          if (GET_MODE (operands[0]) == SFmode)
14883            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
14884          else
14885            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
14886        }
14887      else
14888        {
14889          strcpy (buf, ssep + 1);
14890          if (GET_MODE (operands[0]) == SFmode)
14891            strcat (buf, "ss\t{%2, %0|%0, %2}");
14892          else
14893            strcat (buf, "sd\t{%2, %0|%0, %2}");
14894        }
14895       return buf;
14896    }
14897   strcpy (buf, p);
14898
14899   switch (GET_CODE (operands[3]))
14900     {
14901     case MULT:
14902     case PLUS:
14903       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
14904         {
14905           rtx temp = operands[2];
14906           operands[2] = operands[1];
14907           operands[1] = temp;
14908         }
14909
14910       /* know operands[0] == operands[1].  */
14911
14912       if (MEM_P (operands[2]))
14913         {
14914           p = "%Z2\t%2";
14915           break;
14916         }
14917
14918       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
14919         {
14920           if (STACK_TOP_P (operands[0]))
14921             /* How is it that we are storing to a dead operand[2]?
14922                Well, presumably operands[1] is dead too.  We can't
14923                store the result to st(0) as st(0) gets popped on this
14924                instruction.  Instead store to operands[2] (which I
14925                think has to be st(1)).  st(1) will be popped later.
14926                gcc <= 2.8.1 didn't have this check and generated
14927                assembly code that the Unixware assembler rejected.  */
14928             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
14929           else
14930             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
14931           break;
14932         }
14933
14934       if (STACK_TOP_P (operands[0]))
14935         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
14936       else
14937         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
14938       break;
14939
14940     case MINUS:
14941     case DIV:
14942       if (MEM_P (operands[1]))
14943         {
14944           p = "r%Z1\t%1";
14945           break;
14946         }
14947
14948       if (MEM_P (operands[2]))
14949         {
14950           p = "%Z2\t%2";
14951           break;
14952         }
14953
14954       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
14955         {
14956 #if SYSV386_COMPAT
14957           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
14958              derived assemblers, confusingly reverse the direction of
14959              the operation for fsub{r} and fdiv{r} when the
14960              destination register is not st(0).  The Intel assembler
14961              doesn't have this brain damage.  Read !SYSV386_COMPAT to
14962              figure out what the hardware really does.  */
14963           if (STACK_TOP_P (operands[0]))
14964             p = "{p\t%0, %2|rp\t%2, %0}";
14965           else
14966             p = "{rp\t%2, %0|p\t%0, %2}";
14967 #else
14968           if (STACK_TOP_P (operands[0]))
14969             /* As above for fmul/fadd, we can't store to st(0).  */
14970             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
14971           else
14972             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
14973 #endif
14974           break;
14975         }
14976
14977       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
14978         {
14979 #if SYSV386_COMPAT
14980           if (STACK_TOP_P (operands[0]))
14981             p = "{rp\t%0, %1|p\t%1, %0}";
14982           else
14983             p = "{p\t%1, %0|rp\t%0, %1}";
14984 #else
14985           if (STACK_TOP_P (operands[0]))
14986             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
14987           else
14988             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
14989 #endif
14990           break;
14991         }
14992
14993       if (STACK_TOP_P (operands[0]))
14994         {
14995           if (STACK_TOP_P (operands[1]))
14996             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
14997           else
14998             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
14999           break;
15000         }
15001       else if (STACK_TOP_P (operands[1]))
15002         {
15003 #if SYSV386_COMPAT
15004           p = "{\t%1, %0|r\t%0, %1}";
15005 #else
15006           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
15007 #endif
15008         }
15009       else
15010         {
15011 #if SYSV386_COMPAT
15012           p = "{r\t%2, %0|\t%0, %2}";
15013 #else
15014           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
15015 #endif
15016         }
15017       break;
15018
15019     default:
15020       gcc_unreachable ();
15021     }
15022
15023   strcat (buf, p);
15024   return buf;
15025 }
15026
15027 /* Return needed mode for entity in optimize_mode_switching pass.  */
15028
15029 int
15030 ix86_mode_needed (int entity, rtx insn)
15031 {
15032   enum attr_i387_cw mode;
15033
15034   /* The mode UNINITIALIZED is used to store control word after a
15035      function call or ASM pattern.  The mode ANY specify that function
15036      has no requirements on the control word and make no changes in the
15037      bits we are interested in.  */
15038
15039   if (CALL_P (insn)
15040       || (NONJUMP_INSN_P (insn)
15041           && (asm_noperands (PATTERN (insn)) >= 0
15042               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
15043     return I387_CW_UNINITIALIZED;
15044
15045   if (recog_memoized (insn) < 0)
15046     return I387_CW_ANY;
15047
15048   mode = get_attr_i387_cw (insn);
15049
15050   switch (entity)
15051     {
15052     case I387_TRUNC:
15053       if (mode == I387_CW_TRUNC)
15054         return mode;
15055       break;
15056
15057     case I387_FLOOR:
15058       if (mode == I387_CW_FLOOR)
15059         return mode;
15060       break;
15061
15062     case I387_CEIL:
15063       if (mode == I387_CW_CEIL)
15064         return mode;
15065       break;
15066
15067     case I387_MASK_PM:
15068       if (mode == I387_CW_MASK_PM)
15069         return mode;
15070       break;
15071
15072     default:
15073       gcc_unreachable ();
15074     }
15075
15076   return I387_CW_ANY;
15077 }
15078
15079 /* Output code to initialize control word copies used by trunc?f?i and
15080    rounding patterns.  CURRENT_MODE is set to current control word,
15081    while NEW_MODE is set to new control word.  */
15082
15083 void
15084 emit_i387_cw_initialization (int mode)
15085 {
15086   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
15087   rtx new_mode;
15088
15089   enum ix86_stack_slot slot;
15090
15091   rtx reg = gen_reg_rtx (HImode);
15092
15093   emit_insn (gen_x86_fnstcw_1 (stored_mode));
15094   emit_move_insn (reg, copy_rtx (stored_mode));
15095
15096   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
15097       || optimize_function_for_size_p (cfun))
15098     {
15099       switch (mode)
15100         {
15101         case I387_CW_TRUNC:
15102           /* round toward zero (truncate) */
15103           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
15104           slot = SLOT_CW_TRUNC;
15105           break;
15106
15107         case I387_CW_FLOOR:
15108           /* round down toward -oo */
15109           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
15110           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
15111           slot = SLOT_CW_FLOOR;
15112           break;
15113
15114         case I387_CW_CEIL:
15115           /* round up toward +oo */
15116           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
15117           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
15118           slot = SLOT_CW_CEIL;
15119           break;
15120
15121         case I387_CW_MASK_PM:
15122           /* mask precision exception for nearbyint() */
15123           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
15124           slot = SLOT_CW_MASK_PM;
15125           break;
15126
15127         default:
15128           gcc_unreachable ();
15129         }
15130     }
15131   else
15132     {
15133       switch (mode)
15134         {
15135         case I387_CW_TRUNC:
15136           /* round toward zero (truncate) */
15137           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
15138           slot = SLOT_CW_TRUNC;
15139           break;
15140
15141         case I387_CW_FLOOR:
15142           /* round down toward -oo */
15143           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
15144           slot = SLOT_CW_FLOOR;
15145           break;
15146
15147         case I387_CW_CEIL:
15148           /* round up toward +oo */
15149           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
15150           slot = SLOT_CW_CEIL;
15151           break;
15152
15153         case I387_CW_MASK_PM:
15154           /* mask precision exception for nearbyint() */
15155           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
15156           slot = SLOT_CW_MASK_PM;
15157           break;
15158
15159         default:
15160           gcc_unreachable ();
15161         }
15162     }
15163
15164   gcc_assert (slot < MAX_386_STACK_LOCALS);
15165
15166   new_mode = assign_386_stack_local (HImode, slot);
15167   emit_move_insn (new_mode, reg);
15168 }
15169
15170 /* Output code for INSN to convert a float to a signed int.  OPERANDS
15171    are the insn operands.  The output may be [HSD]Imode and the input
15172    operand may be [SDX]Fmode.  */
15173
15174 const char *
15175 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
15176 {
15177   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
15178   int dimode_p = GET_MODE (operands[0]) == DImode;
15179   int round_mode = get_attr_i387_cw (insn);
15180
15181   /* Jump through a hoop or two for DImode, since the hardware has no
15182      non-popping instruction.  We used to do this a different way, but
15183      that was somewhat fragile and broke with post-reload splitters.  */
15184   if ((dimode_p || fisttp) && !stack_top_dies)
15185     output_asm_insn ("fld\t%y1", operands);
15186
15187   gcc_assert (STACK_TOP_P (operands[1]));
15188   gcc_assert (MEM_P (operands[0]));
15189   gcc_assert (GET_MODE (operands[1]) != TFmode);
15190
15191   if (fisttp)
15192       output_asm_insn ("fisttp%Z0\t%0", operands);
15193   else
15194     {
15195       if (round_mode != I387_CW_ANY)
15196         output_asm_insn ("fldcw\t%3", operands);
15197       if (stack_top_dies || dimode_p)
15198         output_asm_insn ("fistp%Z0\t%0", operands);
15199       else
15200         output_asm_insn ("fist%Z0\t%0", operands);
15201       if (round_mode != I387_CW_ANY)
15202         output_asm_insn ("fldcw\t%2", operands);
15203     }
15204
15205   return "";
15206 }
15207
15208 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
15209    have the values zero or one, indicates the ffreep insn's operand
15210    from the OPERANDS array.  */
15211
15212 static const char *
15213 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
15214 {
15215   if (TARGET_USE_FFREEP)
15216 #ifdef HAVE_AS_IX86_FFREEP
15217     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
15218 #else
15219     {
15220       static char retval[32];
15221       int regno = REGNO (operands[opno]);
15222
15223       gcc_assert (FP_REGNO_P (regno));
15224
15225       regno -= FIRST_STACK_REG;
15226
15227       snprintf (retval, sizeof (retval), ASM_SHORT "0xc%ddf", regno);
15228       return retval;
15229     }
15230 #endif
15231
15232   return opno ? "fstp\t%y1" : "fstp\t%y0";
15233 }
15234
15235
15236 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
15237    should be used.  UNORDERED_P is true when fucom should be used.  */
15238
15239 const char *
15240 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
15241 {
15242   int stack_top_dies;
15243   rtx cmp_op0, cmp_op1;
15244   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
15245
15246   if (eflags_p)
15247     {
15248       cmp_op0 = operands[0];
15249       cmp_op1 = operands[1];
15250     }
15251   else
15252     {
15253       cmp_op0 = operands[1];
15254       cmp_op1 = operands[2];
15255     }
15256
15257   if (is_sse)
15258     {
15259       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
15260       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
15261       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
15262       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
15263
15264       if (GET_MODE (operands[0]) == SFmode)
15265         if (unordered_p)
15266           return &ucomiss[TARGET_AVX ? 0 : 1];
15267         else
15268           return &comiss[TARGET_AVX ? 0 : 1];
15269       else
15270         if (unordered_p)
15271           return &ucomisd[TARGET_AVX ? 0 : 1];
15272         else
15273           return &comisd[TARGET_AVX ? 0 : 1];
15274     }
15275
15276   gcc_assert (STACK_TOP_P (cmp_op0));
15277
15278   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
15279
15280   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
15281     {
15282       if (stack_top_dies)
15283         {
15284           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
15285           return output_387_ffreep (operands, 1);
15286         }
15287       else
15288         return "ftst\n\tfnstsw\t%0";
15289     }
15290
15291   if (STACK_REG_P (cmp_op1)
15292       && stack_top_dies
15293       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
15294       && REGNO (cmp_op1) != FIRST_STACK_REG)
15295     {
15296       /* If both the top of the 387 stack dies, and the other operand
15297          is also a stack register that dies, then this must be a
15298          `fcompp' float compare */
15299
15300       if (eflags_p)
15301         {
15302           /* There is no double popping fcomi variant.  Fortunately,
15303              eflags is immune from the fstp's cc clobbering.  */
15304           if (unordered_p)
15305             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
15306           else
15307             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
15308           return output_387_ffreep (operands, 0);
15309         }
15310       else
15311         {
15312           if (unordered_p)
15313             return "fucompp\n\tfnstsw\t%0";
15314           else
15315             return "fcompp\n\tfnstsw\t%0";
15316         }
15317     }
15318   else
15319     {
15320       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
15321
15322       static const char * const alt[16] =
15323       {
15324         "fcom%Z2\t%y2\n\tfnstsw\t%0",
15325         "fcomp%Z2\t%y2\n\tfnstsw\t%0",
15326         "fucom%Z2\t%y2\n\tfnstsw\t%0",
15327         "fucomp%Z2\t%y2\n\tfnstsw\t%0",
15328
15329         "ficom%Z2\t%y2\n\tfnstsw\t%0",
15330         "ficomp%Z2\t%y2\n\tfnstsw\t%0",
15331         NULL,
15332         NULL,
15333
15334         "fcomi\t{%y1, %0|%0, %y1}",
15335         "fcomip\t{%y1, %0|%0, %y1}",
15336         "fucomi\t{%y1, %0|%0, %y1}",
15337         "fucomip\t{%y1, %0|%0, %y1}",
15338
15339         NULL,
15340         NULL,
15341         NULL,
15342         NULL
15343       };
15344
15345       int mask;
15346       const char *ret;
15347
15348       mask  = eflags_p << 3;
15349       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
15350       mask |= unordered_p << 1;
15351       mask |= stack_top_dies;
15352
15353       gcc_assert (mask < 16);
15354       ret = alt[mask];
15355       gcc_assert (ret);
15356
15357       return ret;
15358     }
15359 }
15360
15361 void
15362 ix86_output_addr_vec_elt (FILE *file, int value)
15363 {
15364   const char *directive = ASM_LONG;
15365
15366 #ifdef ASM_QUAD
15367   if (TARGET_64BIT)
15368     directive = ASM_QUAD;
15369 #else
15370   gcc_assert (!TARGET_64BIT);
15371 #endif
15372
15373   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
15374 }
15375
15376 void
15377 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
15378 {
15379   const char *directive = ASM_LONG;
15380
15381 #ifdef ASM_QUAD
15382   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
15383     directive = ASM_QUAD;
15384 #else
15385   gcc_assert (!TARGET_64BIT);
15386 #endif
15387   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
15388   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
15389     fprintf (file, "%s%s%d-%s%d\n",
15390              directive, LPREFIX, value, LPREFIX, rel);
15391   else if (HAVE_AS_GOTOFF_IN_DATA)
15392     fprintf (file, ASM_LONG "%s%d@GOTOFF\n", LPREFIX, value);
15393 #if TARGET_MACHO
15394   else if (TARGET_MACHO)
15395     {
15396       fprintf (file, ASM_LONG "%s%d-", LPREFIX, value);
15397       machopic_output_function_base_name (file);
15398       putc ('\n', file);
15399     }
15400 #endif
15401   else
15402     asm_fprintf (file, ASM_LONG "%U%s+[.-%s%d]\n",
15403                  GOT_SYMBOL_NAME, LPREFIX, value);
15404 }
15405 \f
15406 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
15407    for the target.  */
15408
15409 void
15410 ix86_expand_clear (rtx dest)
15411 {
15412   rtx tmp;
15413
15414   /* We play register width games, which are only valid after reload.  */
15415   gcc_assert (reload_completed);
15416
15417   /* Avoid HImode and its attendant prefix byte.  */
15418   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
15419     dest = gen_rtx_REG (SImode, REGNO (dest));
15420   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
15421
15422   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
15423   if (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ())
15424     {
15425       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
15426       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
15427     }
15428
15429   emit_insn (tmp);
15430 }
15431
15432 /* X is an unchanging MEM.  If it is a constant pool reference, return
15433    the constant pool rtx, else NULL.  */
15434
15435 rtx
15436 maybe_get_pool_constant (rtx x)
15437 {
15438   x = ix86_delegitimize_address (XEXP (x, 0));
15439
15440   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
15441     return get_pool_constant (x);
15442
15443   return NULL_RTX;
15444 }
15445
15446 void
15447 ix86_expand_move (enum machine_mode mode, rtx operands[])
15448 {
15449   rtx op0, op1;
15450   enum tls_model model;
15451
15452   op0 = operands[0];
15453   op1 = operands[1];
15454
15455   if (GET_CODE (op1) == SYMBOL_REF)
15456     {
15457       model = SYMBOL_REF_TLS_MODEL (op1);
15458       if (model)
15459         {
15460           op1 = legitimize_tls_address (op1, model, true);
15461           op1 = force_operand (op1, op0);
15462           if (op1 == op0)
15463             return;
15464         }
15465       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
15466                && SYMBOL_REF_DLLIMPORT_P (op1))
15467         op1 = legitimize_dllimport_symbol (op1, false);
15468     }
15469   else if (GET_CODE (op1) == CONST
15470            && GET_CODE (XEXP (op1, 0)) == PLUS
15471            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
15472     {
15473       rtx addend = XEXP (XEXP (op1, 0), 1);
15474       rtx symbol = XEXP (XEXP (op1, 0), 0);
15475       rtx tmp = NULL;
15476
15477       model = SYMBOL_REF_TLS_MODEL (symbol);
15478       if (model)
15479         tmp = legitimize_tls_address (symbol, model, true);
15480       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
15481                && SYMBOL_REF_DLLIMPORT_P (symbol))
15482         tmp = legitimize_dllimport_symbol (symbol, true);
15483
15484       if (tmp)
15485         {
15486           tmp = force_operand (tmp, NULL);
15487           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
15488                                      op0, 1, OPTAB_DIRECT);
15489           if (tmp == op0)
15490             return;
15491         }
15492     }
15493
15494   if ((flag_pic || MACHOPIC_INDIRECT) 
15495        && mode == Pmode && symbolic_operand (op1, Pmode))
15496     {
15497       if (TARGET_MACHO && !TARGET_64BIT)
15498         {
15499 #if TARGET_MACHO
15500           /* dynamic-no-pic */
15501           if (MACHOPIC_INDIRECT)
15502             {
15503               rtx temp = ((reload_in_progress
15504                            || ((op0 && REG_P (op0))
15505                                && mode == Pmode))
15506                           ? op0 : gen_reg_rtx (Pmode));
15507               op1 = machopic_indirect_data_reference (op1, temp);
15508               if (MACHOPIC_PURE)
15509                 op1 = machopic_legitimize_pic_address (op1, mode,
15510                                                        temp == op1 ? 0 : temp);
15511             }
15512           if (op0 != op1 && GET_CODE (op0) != MEM)
15513             {
15514               rtx insn = gen_rtx_SET (VOIDmode, op0, op1);
15515               emit_insn (insn);
15516               return;
15517             }
15518           if (GET_CODE (op0) == MEM)
15519             op1 = force_reg (Pmode, op1);
15520           else
15521             {
15522               rtx temp = op0;
15523               if (GET_CODE (temp) != REG)
15524                 temp = gen_reg_rtx (Pmode);
15525               temp = legitimize_pic_address (op1, temp);
15526               if (temp == op0)
15527             return;
15528               op1 = temp;
15529             }
15530       /* dynamic-no-pic */
15531 #endif
15532         }
15533       else
15534         {
15535           if (MEM_P (op0))
15536             op1 = force_reg (Pmode, op1);
15537           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
15538             {
15539               rtx reg = can_create_pseudo_p () ? NULL_RTX : op0;
15540               op1 = legitimize_pic_address (op1, reg);
15541               if (op0 == op1)
15542                 return;
15543             }
15544         }
15545     }
15546   else
15547     {
15548       if (MEM_P (op0)
15549           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
15550               || !push_operand (op0, mode))
15551           && MEM_P (op1))
15552         op1 = force_reg (mode, op1);
15553
15554       if (push_operand (op0, mode)
15555           && ! general_no_elim_operand (op1, mode))
15556         op1 = copy_to_mode_reg (mode, op1);
15557
15558       /* Force large constants in 64bit compilation into register
15559          to get them CSEed.  */
15560       if (can_create_pseudo_p ()
15561           && (mode == DImode) && TARGET_64BIT
15562           && immediate_operand (op1, mode)
15563           && !x86_64_zext_immediate_operand (op1, VOIDmode)
15564           && !register_operand (op0, mode)
15565           && optimize)
15566         op1 = copy_to_mode_reg (mode, op1);
15567
15568       if (can_create_pseudo_p ()
15569           && FLOAT_MODE_P (mode)
15570           && GET_CODE (op1) == CONST_DOUBLE)
15571         {
15572           /* If we are loading a floating point constant to a register,
15573              force the value to memory now, since we'll get better code
15574              out the back end.  */
15575
15576           op1 = validize_mem (force_const_mem (mode, op1));
15577           if (!register_operand (op0, mode))
15578             {
15579               rtx temp = gen_reg_rtx (mode);
15580               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
15581               emit_move_insn (op0, temp);
15582               return;
15583             }
15584         }
15585     }
15586
15587   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
15588 }
15589
15590 void
15591 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
15592 {
15593   rtx op0 = operands[0], op1 = operands[1];
15594   unsigned int align = GET_MODE_ALIGNMENT (mode);
15595
15596   /* Force constants other than zero into memory.  We do not know how
15597      the instructions used to build constants modify the upper 64 bits
15598      of the register, once we have that information we may be able
15599      to handle some of them more efficiently.  */
15600   if (can_create_pseudo_p ()
15601       && register_operand (op0, mode)
15602       && (CONSTANT_P (op1)
15603           || (GET_CODE (op1) == SUBREG
15604               && CONSTANT_P (SUBREG_REG (op1))))
15605       && !standard_sse_constant_p (op1))
15606     op1 = validize_mem (force_const_mem (mode, op1));
15607
15608   /* We need to check memory alignment for SSE mode since attribute
15609      can make operands unaligned.  */
15610   if (can_create_pseudo_p ()
15611       && SSE_REG_MODE_P (mode)
15612       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
15613           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
15614     {
15615       rtx tmp[2];
15616
15617       /* ix86_expand_vector_move_misalign() does not like constants ... */
15618       if (CONSTANT_P (op1)
15619           || (GET_CODE (op1) == SUBREG
15620               && CONSTANT_P (SUBREG_REG (op1))))
15621         op1 = validize_mem (force_const_mem (mode, op1));
15622
15623       /* ... nor both arguments in memory.  */
15624       if (!register_operand (op0, mode)
15625           && !register_operand (op1, mode))
15626         op1 = force_reg (mode, op1);
15627
15628       tmp[0] = op0; tmp[1] = op1;
15629       ix86_expand_vector_move_misalign (mode, tmp);
15630       return;
15631     }
15632
15633   /* Make operand1 a register if it isn't already.  */
15634   if (can_create_pseudo_p ()
15635       && !register_operand (op0, mode)
15636       && !register_operand (op1, mode))
15637     {
15638       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
15639       return;
15640     }
15641
15642   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
15643 }
15644
15645 /* Split 32-byte AVX unaligned load and store if needed.  */
15646
15647 static void
15648 ix86_avx256_split_vector_move_misalign (rtx op0, rtx op1)
15649 {
15650   rtx m;
15651   rtx (*extract) (rtx, rtx, rtx);
15652   rtx (*move_unaligned) (rtx, rtx);
15653   enum machine_mode mode;
15654
15655   switch (GET_MODE (op0))
15656     {
15657     default:
15658       gcc_unreachable ();
15659     case V32QImode:
15660       extract = gen_avx_vextractf128v32qi;
15661       move_unaligned = gen_avx_movdqu256;
15662       mode = V16QImode;
15663       break;
15664     case V8SFmode:
15665       extract = gen_avx_vextractf128v8sf;
15666       move_unaligned = gen_avx_movups256;
15667       mode = V4SFmode;
15668       break;
15669     case V4DFmode:
15670       extract = gen_avx_vextractf128v4df;
15671       move_unaligned = gen_avx_movupd256;
15672       mode = V2DFmode;
15673       break;
15674     }
15675
15676   if (MEM_P (op1) && TARGET_AVX256_SPLIT_UNALIGNED_LOAD)
15677     {
15678       rtx r = gen_reg_rtx (mode);
15679       m = adjust_address (op1, mode, 0);
15680       emit_move_insn (r, m);
15681       m = adjust_address (op1, mode, 16);
15682       r = gen_rtx_VEC_CONCAT (GET_MODE (op0), r, m);
15683       emit_move_insn (op0, r);
15684     }
15685   else if (MEM_P (op0) && TARGET_AVX256_SPLIT_UNALIGNED_STORE)
15686     {
15687       m = adjust_address (op0, mode, 0);
15688       emit_insn (extract (m, op1, const0_rtx));
15689       m = adjust_address (op0, mode, 16);
15690       emit_insn (extract (m, op1, const1_rtx));
15691     }
15692   else
15693     emit_insn (move_unaligned (op0, op1));
15694 }
15695
15696 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
15697    straight to ix86_expand_vector_move.  */
15698 /* Code generation for scalar reg-reg moves of single and double precision data:
15699      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
15700        movaps reg, reg
15701      else
15702        movss reg, reg
15703      if (x86_sse_partial_reg_dependency == true)
15704        movapd reg, reg
15705      else
15706        movsd reg, reg
15707
15708    Code generation for scalar loads of double precision data:
15709      if (x86_sse_split_regs == true)
15710        movlpd mem, reg      (gas syntax)
15711      else
15712        movsd mem, reg
15713
15714    Code generation for unaligned packed loads of single precision data
15715    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
15716      if (x86_sse_unaligned_move_optimal)
15717        movups mem, reg
15718
15719      if (x86_sse_partial_reg_dependency == true)
15720        {
15721          xorps  reg, reg
15722          movlps mem, reg
15723          movhps mem+8, reg
15724        }
15725      else
15726        {
15727          movlps mem, reg
15728          movhps mem+8, reg
15729        }
15730
15731    Code generation for unaligned packed loads of double precision data
15732    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
15733      if (x86_sse_unaligned_move_optimal)
15734        movupd mem, reg
15735
15736      if (x86_sse_split_regs == true)
15737        {
15738          movlpd mem, reg
15739          movhpd mem+8, reg
15740        }
15741      else
15742        {
15743          movsd  mem, reg
15744          movhpd mem+8, reg
15745        }
15746  */
15747
15748 void
15749 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
15750 {
15751   rtx op0, op1, m;
15752
15753   op0 = operands[0];
15754   op1 = operands[1];
15755
15756   if (TARGET_AVX)
15757     {
15758       switch (GET_MODE_CLASS (mode))
15759         {
15760         case MODE_VECTOR_INT:
15761         case MODE_INT:
15762           switch (GET_MODE_SIZE (mode))
15763             {
15764             case 16:
15765               /*  If we're optimizing for size, movups is the smallest.  */
15766               if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15767                 {
15768                   op0 = gen_lowpart (V4SFmode, op0);
15769                   op1 = gen_lowpart (V4SFmode, op1);
15770                   emit_insn (gen_sse_movups (op0, op1));
15771                   return;
15772                 }
15773               op0 = gen_lowpart (V16QImode, op0);
15774               op1 = gen_lowpart (V16QImode, op1);
15775               emit_insn (gen_sse2_movdqu (op0, op1));
15776               break;
15777             case 32:
15778               op0 = gen_lowpart (V32QImode, op0);
15779               op1 = gen_lowpart (V32QImode, op1);
15780               ix86_avx256_split_vector_move_misalign (op0, op1);
15781               break;
15782             default:
15783               gcc_unreachable ();
15784             }
15785           break;
15786         case MODE_VECTOR_FLOAT:
15787           op0 = gen_lowpart (mode, op0);
15788           op1 = gen_lowpart (mode, op1);
15789
15790           switch (mode)
15791             {
15792             case V4SFmode:
15793               emit_insn (gen_sse_movups (op0, op1));
15794               break;
15795             case V8SFmode:
15796               ix86_avx256_split_vector_move_misalign (op0, op1);
15797               break;
15798             case V2DFmode:
15799               if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15800                 {
15801                   op0 = gen_lowpart (V4SFmode, op0);
15802                   op1 = gen_lowpart (V4SFmode, op1);
15803                   emit_insn (gen_sse_movups (op0, op1));
15804                   return;
15805                 }
15806               emit_insn (gen_sse2_movupd (op0, op1));
15807               break;
15808             case V4DFmode:
15809               ix86_avx256_split_vector_move_misalign (op0, op1);
15810               break;
15811             default:
15812               gcc_unreachable ();
15813             }
15814           break;
15815
15816         default:
15817           gcc_unreachable ();
15818         }
15819
15820       return;
15821     }
15822
15823   if (MEM_P (op1))
15824     {
15825       /* If we're optimizing for size, movups is the smallest.  */
15826       if (optimize_insn_for_size_p ()
15827           || TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15828         {
15829           op0 = gen_lowpart (V4SFmode, op0);
15830           op1 = gen_lowpart (V4SFmode, op1);
15831           emit_insn (gen_sse_movups (op0, op1));
15832           return;
15833         }
15834
15835       /* ??? If we have typed data, then it would appear that using
15836          movdqu is the only way to get unaligned data loaded with
15837          integer type.  */
15838       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
15839         {
15840           op0 = gen_lowpart (V16QImode, op0);
15841           op1 = gen_lowpart (V16QImode, op1);
15842           emit_insn (gen_sse2_movdqu (op0, op1));
15843           return;
15844         }
15845
15846       if (TARGET_SSE2 && mode == V2DFmode)
15847         {
15848           rtx zero;
15849
15850           if (TARGET_SSE_UNALIGNED_LOAD_OPTIMAL)
15851             {
15852               op0 = gen_lowpart (V2DFmode, op0);
15853               op1 = gen_lowpart (V2DFmode, op1);
15854               emit_insn (gen_sse2_movupd (op0, op1));
15855               return;
15856             }
15857
15858           /* When SSE registers are split into halves, we can avoid
15859              writing to the top half twice.  */
15860           if (TARGET_SSE_SPLIT_REGS)
15861             {
15862               emit_clobber (op0);
15863               zero = op0;
15864             }
15865           else
15866             {
15867               /* ??? Not sure about the best option for the Intel chips.
15868                  The following would seem to satisfy; the register is
15869                  entirely cleared, breaking the dependency chain.  We
15870                  then store to the upper half, with a dependency depth
15871                  of one.  A rumor has it that Intel recommends two movsd
15872                  followed by an unpacklpd, but this is unconfirmed.  And
15873                  given that the dependency depth of the unpacklpd would
15874                  still be one, I'm not sure why this would be better.  */
15875               zero = CONST0_RTX (V2DFmode);
15876             }
15877
15878           m = adjust_address (op1, DFmode, 0);
15879           emit_insn (gen_sse2_loadlpd (op0, zero, m));
15880           m = adjust_address (op1, DFmode, 8);
15881           emit_insn (gen_sse2_loadhpd (op0, op0, m));
15882         }
15883       else
15884         {
15885           if (TARGET_SSE_UNALIGNED_LOAD_OPTIMAL)
15886             {
15887               op0 = gen_lowpart (V4SFmode, op0);
15888               op1 = gen_lowpart (V4SFmode, op1);
15889               emit_insn (gen_sse_movups (op0, op1));
15890               return;
15891             }
15892
15893           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
15894             emit_move_insn (op0, CONST0_RTX (mode));
15895           else
15896             emit_clobber (op0);
15897
15898           if (mode != V4SFmode)
15899             op0 = gen_lowpart (V4SFmode, op0);
15900           m = adjust_address (op1, V2SFmode, 0);
15901           emit_insn (gen_sse_loadlps (op0, op0, m));
15902           m = adjust_address (op1, V2SFmode, 8);
15903           emit_insn (gen_sse_loadhps (op0, op0, m));
15904         }
15905     }
15906   else if (MEM_P (op0))
15907     {
15908       /* If we're optimizing for size, movups is the smallest.  */
15909       if (optimize_insn_for_size_p ()
15910           || TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15911         {
15912           op0 = gen_lowpart (V4SFmode, op0);
15913           op1 = gen_lowpart (V4SFmode, op1);
15914           emit_insn (gen_sse_movups (op0, op1));
15915           return;
15916         }
15917
15918       /* ??? Similar to above, only less clear because of quote
15919          typeless stores unquote.  */
15920       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
15921           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
15922         {
15923           op0 = gen_lowpart (V16QImode, op0);
15924           op1 = gen_lowpart (V16QImode, op1);
15925           emit_insn (gen_sse2_movdqu (op0, op1));
15926           return;
15927         }
15928
15929       if (TARGET_SSE2 && mode == V2DFmode)
15930         {
15931           if (TARGET_SSE_UNALIGNED_STORE_OPTIMAL)
15932             {
15933               op0 = gen_lowpart (V2DFmode, op0);
15934               op1 = gen_lowpart (V2DFmode, op1);
15935               emit_insn (gen_sse2_movupd (op0, op1));
15936             }
15937           else
15938             {
15939               m = adjust_address (op0, DFmode, 0);
15940               emit_insn (gen_sse2_storelpd (m, op1));
15941               m = adjust_address (op0, DFmode, 8);
15942               emit_insn (gen_sse2_storehpd (m, op1));
15943             }
15944         }
15945       else
15946         {
15947           if (mode != V4SFmode)
15948             op1 = gen_lowpart (V4SFmode, op1);
15949
15950           if (TARGET_SSE_UNALIGNED_STORE_OPTIMAL)
15951             {
15952               op0 = gen_lowpart (V4SFmode, op0);
15953               emit_insn (gen_sse_movups (op0, op1));
15954             }
15955           else
15956             {
15957               m = adjust_address (op0, V2SFmode, 0);
15958               emit_insn (gen_sse_storelps (m, op1));
15959               m = adjust_address (op0, V2SFmode, 8);
15960               emit_insn (gen_sse_storehps (m, op1));
15961             }
15962         }
15963     }
15964   else
15965     gcc_unreachable ();
15966 }
15967
15968 /* Expand a push in MODE.  This is some mode for which we do not support
15969    proper push instructions, at least from the registers that we expect
15970    the value to live in.  */
15971
15972 void
15973 ix86_expand_push (enum machine_mode mode, rtx x)
15974 {
15975   rtx tmp;
15976
15977   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
15978                              GEN_INT (-GET_MODE_SIZE (mode)),
15979                              stack_pointer_rtx, 1, OPTAB_DIRECT);
15980   if (tmp != stack_pointer_rtx)
15981     emit_move_insn (stack_pointer_rtx, tmp);
15982
15983   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
15984
15985   /* When we push an operand onto stack, it has to be aligned at least
15986      at the function argument boundary.  However since we don't have
15987      the argument type, we can't determine the actual argument
15988      boundary.  */
15989   emit_move_insn (tmp, x);
15990 }
15991
15992 /* Helper function of ix86_fixup_binary_operands to canonicalize
15993    operand order.  Returns true if the operands should be swapped.  */
15994
15995 static bool
15996 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
15997                              rtx operands[])
15998 {
15999   rtx dst = operands[0];
16000   rtx src1 = operands[1];
16001   rtx src2 = operands[2];
16002
16003   /* If the operation is not commutative, we can't do anything.  */
16004   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
16005     return false;
16006
16007   /* Highest priority is that src1 should match dst.  */
16008   if (rtx_equal_p (dst, src1))
16009     return false;
16010   if (rtx_equal_p (dst, src2))
16011     return true;
16012
16013   /* Next highest priority is that immediate constants come second.  */
16014   if (immediate_operand (src2, mode))
16015     return false;
16016   if (immediate_operand (src1, mode))
16017     return true;
16018
16019   /* Lowest priority is that memory references should come second.  */
16020   if (MEM_P (src2))
16021     return false;
16022   if (MEM_P (src1))
16023     return true;
16024
16025   return false;
16026 }
16027
16028
16029 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
16030    destination to use for the operation.  If different from the true
16031    destination in operands[0], a copy operation will be required.  */
16032
16033 rtx
16034 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
16035                             rtx operands[])
16036 {
16037   rtx dst = operands[0];
16038   rtx src1 = operands[1];
16039   rtx src2 = operands[2];
16040
16041   /* Canonicalize operand order.  */
16042   if (ix86_swap_binary_operands_p (code, mode, operands))
16043     {
16044       rtx temp;
16045
16046       /* It is invalid to swap operands of different modes.  */
16047       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
16048
16049       temp = src1;
16050       src1 = src2;
16051       src2 = temp;
16052     }
16053
16054   /* Both source operands cannot be in memory.  */
16055   if (MEM_P (src1) && MEM_P (src2))
16056     {
16057       /* Optimization: Only read from memory once.  */
16058       if (rtx_equal_p (src1, src2))
16059         {
16060           src2 = force_reg (mode, src2);
16061           src1 = src2;
16062         }
16063       else
16064         src2 = force_reg (mode, src2);
16065     }
16066
16067   /* If the destination is memory, and we do not have matching source
16068      operands, do things in registers.  */
16069   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
16070     dst = gen_reg_rtx (mode);
16071
16072   /* Source 1 cannot be a constant.  */
16073   if (CONSTANT_P (src1))
16074     src1 = force_reg (mode, src1);
16075
16076   /* Source 1 cannot be a non-matching memory.  */
16077   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
16078     src1 = force_reg (mode, src1);
16079
16080   operands[1] = src1;
16081   operands[2] = src2;
16082   return dst;
16083 }
16084
16085 /* Similarly, but assume that the destination has already been
16086    set up properly.  */
16087
16088 void
16089 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
16090                                     enum machine_mode mode, rtx operands[])
16091 {
16092   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
16093   gcc_assert (dst == operands[0]);
16094 }
16095
16096 /* Attempt to expand a binary operator.  Make the expansion closer to the
16097    actual machine, then just general_operand, which will allow 3 separate
16098    memory references (one output, two input) in a single insn.  */
16099
16100 void
16101 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
16102                              rtx operands[])
16103 {
16104   rtx src1, src2, dst, op, clob;
16105
16106   dst = ix86_fixup_binary_operands (code, mode, operands);
16107   src1 = operands[1];
16108   src2 = operands[2];
16109
16110  /* Emit the instruction.  */
16111
16112   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
16113   if (reload_in_progress)
16114     {
16115       /* Reload doesn't know about the flags register, and doesn't know that
16116          it doesn't want to clobber it.  We can only do this with PLUS.  */
16117       gcc_assert (code == PLUS);
16118       emit_insn (op);
16119     }
16120   else if (reload_completed
16121            && code == PLUS
16122            && !rtx_equal_p (dst, src1))
16123     {
16124       /* This is going to be an LEA; avoid splitting it later.  */
16125       emit_insn (op);
16126     }
16127   else
16128     {
16129       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
16130       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
16131     }
16132
16133   /* Fix up the destination if needed.  */
16134   if (dst != operands[0])
16135     emit_move_insn (operands[0], dst);
16136 }
16137
16138 /* Return TRUE or FALSE depending on whether the binary operator meets the
16139    appropriate constraints.  */
16140
16141 bool
16142 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
16143                          rtx operands[3])
16144 {
16145   rtx dst = operands[0];
16146   rtx src1 = operands[1];
16147   rtx src2 = operands[2];
16148
16149   /* Both source operands cannot be in memory.  */
16150   if (MEM_P (src1) && MEM_P (src2))
16151     return false;
16152
16153   /* Canonicalize operand order for commutative operators.  */
16154   if (ix86_swap_binary_operands_p (code, mode, operands))
16155     {
16156       rtx temp = src1;
16157       src1 = src2;
16158       src2 = temp;
16159     }
16160
16161   /* If the destination is memory, we must have a matching source operand.  */
16162   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
16163       return false;
16164
16165   /* Source 1 cannot be a constant.  */
16166   if (CONSTANT_P (src1))
16167     return false;
16168
16169   /* Source 1 cannot be a non-matching memory.  */
16170   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
16171     {
16172       /* Support "andhi/andsi/anddi" as a zero-extending move.  */
16173       return (code == AND
16174               && (mode == HImode
16175                   || mode == SImode
16176                   || (TARGET_64BIT && mode == DImode))
16177               && CONST_INT_P (src2)
16178               && (INTVAL (src2) == 0xff
16179                   || INTVAL (src2) == 0xffff));
16180     }
16181
16182   return true;
16183 }
16184
16185 /* Attempt to expand a unary operator.  Make the expansion closer to the
16186    actual machine, then just general_operand, which will allow 2 separate
16187    memory references (one output, one input) in a single insn.  */
16188
16189 void
16190 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
16191                             rtx operands[])
16192 {
16193   int matching_memory;
16194   rtx src, dst, op, clob;
16195
16196   dst = operands[0];
16197   src = operands[1];
16198
16199   /* If the destination is memory, and we do not have matching source
16200      operands, do things in registers.  */
16201   matching_memory = 0;
16202   if (MEM_P (dst))
16203     {
16204       if (rtx_equal_p (dst, src))
16205         matching_memory = 1;
16206       else
16207         dst = gen_reg_rtx (mode);
16208     }
16209
16210   /* When source operand is memory, destination must match.  */
16211   if (MEM_P (src) && !matching_memory)
16212     src = force_reg (mode, src);
16213
16214   /* Emit the instruction.  */
16215
16216   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
16217   if (reload_in_progress || code == NOT)
16218     {
16219       /* Reload doesn't know about the flags register, and doesn't know that
16220          it doesn't want to clobber it.  */
16221       gcc_assert (code == NOT);
16222       emit_insn (op);
16223     }
16224   else
16225     {
16226       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
16227       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
16228     }
16229
16230   /* Fix up the destination if needed.  */
16231   if (dst != operands[0])
16232     emit_move_insn (operands[0], dst);
16233 }
16234
16235 /* Split 32bit/64bit divmod with 8bit unsigned divmod if dividend and
16236    divisor are within the range [0-255].  */
16237
16238 void
16239 ix86_split_idivmod (enum machine_mode mode, rtx operands[],
16240                     bool signed_p)
16241 {
16242   rtx end_label, qimode_label;
16243   rtx insn, div, mod;
16244   rtx scratch, tmp0, tmp1, tmp2;
16245   rtx (*gen_divmod4_1) (rtx, rtx, rtx, rtx);
16246   rtx (*gen_zero_extend) (rtx, rtx);
16247   rtx (*gen_test_ccno_1) (rtx, rtx);
16248
16249   switch (mode)
16250     {
16251     case SImode:
16252       gen_divmod4_1 = signed_p ? gen_divmodsi4_1 : gen_udivmodsi4_1;
16253       gen_test_ccno_1 = gen_testsi_ccno_1;
16254       gen_zero_extend = gen_zero_extendqisi2;
16255       break;
16256     case DImode:
16257       gen_divmod4_1 = signed_p ? gen_divmoddi4_1 : gen_udivmoddi4_1;
16258       gen_test_ccno_1 = gen_testdi_ccno_1;
16259       gen_zero_extend = gen_zero_extendqidi2;
16260       break;
16261     default:
16262       gcc_unreachable ();
16263     }
16264
16265   end_label = gen_label_rtx ();
16266   qimode_label = gen_label_rtx ();
16267
16268   scratch = gen_reg_rtx (mode);
16269
16270   /* Use 8bit unsigned divimod if dividend and divisor are within
16271      the range [0-255].  */
16272   emit_move_insn (scratch, operands[2]);
16273   scratch = expand_simple_binop (mode, IOR, scratch, operands[3],
16274                                  scratch, 1, OPTAB_DIRECT);
16275   emit_insn (gen_test_ccno_1 (scratch, GEN_INT (-0x100)));
16276   tmp0 = gen_rtx_REG (CCNOmode, FLAGS_REG);
16277   tmp0 = gen_rtx_EQ (VOIDmode, tmp0, const0_rtx);
16278   tmp0 = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp0,
16279                                gen_rtx_LABEL_REF (VOIDmode, qimode_label),
16280                                pc_rtx);
16281   insn = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp0));
16282   predict_jump (REG_BR_PROB_BASE * 50 / 100);
16283   JUMP_LABEL (insn) = qimode_label;
16284
16285   /* Generate original signed/unsigned divimod.  */
16286   div = gen_divmod4_1 (operands[0], operands[1],
16287                        operands[2], operands[3]);
16288   emit_insn (div);
16289
16290   /* Branch to the end.  */
16291   emit_jump_insn (gen_jump (end_label));
16292   emit_barrier ();
16293
16294   /* Generate 8bit unsigned divide.  */
16295   emit_label (qimode_label);
16296   /* Don't use operands[0] for result of 8bit divide since not all
16297      registers support QImode ZERO_EXTRACT.  */
16298   tmp0 = simplify_gen_subreg (HImode, scratch, mode, 0);
16299   tmp1 = simplify_gen_subreg (HImode, operands[2], mode, 0);
16300   tmp2 = simplify_gen_subreg (QImode, operands[3], mode, 0);
16301   emit_insn (gen_udivmodhiqi3 (tmp0, tmp1, tmp2));
16302
16303   if (signed_p)
16304     {
16305       div = gen_rtx_DIV (SImode, operands[2], operands[3]);
16306       mod = gen_rtx_MOD (SImode, operands[2], operands[3]);
16307     }
16308   else
16309     {
16310       div = gen_rtx_UDIV (SImode, operands[2], operands[3]);
16311       mod = gen_rtx_UMOD (SImode, operands[2], operands[3]);
16312     }
16313
16314   /* Extract remainder from AH.  */
16315   tmp1 = gen_rtx_ZERO_EXTRACT (mode, tmp0, GEN_INT (8), GEN_INT (8));
16316   if (REG_P (operands[1]))
16317     insn = emit_move_insn (operands[1], tmp1);
16318   else
16319     {
16320       /* Need a new scratch register since the old one has result 
16321          of 8bit divide.  */
16322       scratch = gen_reg_rtx (mode);
16323       emit_move_insn (scratch, tmp1);
16324       insn = emit_move_insn (operands[1], scratch);
16325     }
16326   set_unique_reg_note (insn, REG_EQUAL, mod);
16327
16328   /* Zero extend quotient from AL.  */
16329   tmp1 = gen_lowpart (QImode, tmp0);
16330   insn = emit_insn (gen_zero_extend (operands[0], tmp1));
16331   set_unique_reg_note (insn, REG_EQUAL, div);
16332
16333   emit_label (end_label);
16334 }
16335
16336 #define LEA_SEARCH_THRESHOLD 12
16337
16338 /* Search backward for non-agu definition of register number REGNO1
16339    or register number REGNO2 in INSN's basic block until
16340    1. Pass LEA_SEARCH_THRESHOLD instructions, or
16341    2. Reach BB boundary, or
16342    3. Reach agu definition.
16343    Returns the distance between the non-agu definition point and INSN.
16344    If no definition point, returns -1.  */
16345
16346 static int
16347 distance_non_agu_define (unsigned int regno1, unsigned int regno2,
16348                          rtx insn)
16349 {
16350   basic_block bb = BLOCK_FOR_INSN (insn);
16351   int distance = 0;
16352   df_ref *def_rec;
16353   enum attr_type insn_type;
16354
16355   if (insn != BB_HEAD (bb))
16356     {
16357       rtx prev = PREV_INSN (insn);
16358       while (prev && distance < LEA_SEARCH_THRESHOLD)
16359         {
16360           if (NONDEBUG_INSN_P (prev))
16361             {
16362               distance++;
16363               for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
16364                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16365                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
16366                     && (regno1 == DF_REF_REGNO (*def_rec)
16367                         || regno2 == DF_REF_REGNO (*def_rec)))
16368                   {
16369                     insn_type = get_attr_type (prev);
16370                     if (insn_type != TYPE_LEA)
16371                       goto done;
16372                   }
16373             }
16374           if (prev == BB_HEAD (bb))
16375             break;
16376           prev = PREV_INSN (prev);
16377         }
16378     }
16379
16380   if (distance < LEA_SEARCH_THRESHOLD)
16381     {
16382       edge e;
16383       edge_iterator ei;
16384       bool simple_loop = false;
16385
16386       FOR_EACH_EDGE (e, ei, bb->preds)
16387         if (e->src == bb)
16388           {
16389             simple_loop = true;
16390             break;
16391           }
16392
16393       if (simple_loop)
16394         {
16395           rtx prev = BB_END (bb);
16396           while (prev
16397                  && prev != insn
16398                  && distance < LEA_SEARCH_THRESHOLD)
16399             {
16400               if (NONDEBUG_INSN_P (prev))
16401                 {
16402                   distance++;
16403                   for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
16404                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16405                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
16406                         && (regno1 == DF_REF_REGNO (*def_rec)
16407                             || regno2 == DF_REF_REGNO (*def_rec)))
16408                       {
16409                         insn_type = get_attr_type (prev);
16410                         if (insn_type != TYPE_LEA)
16411                           goto done;
16412                       }
16413                 }
16414               prev = PREV_INSN (prev);
16415             }
16416         }
16417     }
16418
16419   distance = -1;
16420
16421 done:
16422   /* get_attr_type may modify recog data.  We want to make sure
16423      that recog data is valid for instruction INSN, on which
16424      distance_non_agu_define is called.  INSN is unchanged here.  */
16425   extract_insn_cached (insn);
16426   return distance;
16427 }
16428
16429 /* Return the distance between INSN and the next insn that uses
16430    register number REGNO0 in memory address.  Return -1 if no such
16431    a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set.  */
16432
16433 static int
16434 distance_agu_use (unsigned int regno0, rtx insn)
16435 {
16436   basic_block bb = BLOCK_FOR_INSN (insn);
16437   int distance = 0;
16438   df_ref *def_rec;
16439   df_ref *use_rec;
16440
16441   if (insn != BB_END (bb))
16442     {
16443       rtx next = NEXT_INSN (insn);
16444       while (next && distance < LEA_SEARCH_THRESHOLD)
16445         {
16446           if (NONDEBUG_INSN_P (next))
16447             {
16448               distance++;
16449
16450               for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
16451                 if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
16452                      || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
16453                     && regno0 == DF_REF_REGNO (*use_rec))
16454                   {
16455                     /* Return DISTANCE if OP0 is used in memory
16456                        address in NEXT.  */
16457                     return distance;
16458                   }
16459
16460               for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
16461                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16462                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
16463                     && regno0 == DF_REF_REGNO (*def_rec))
16464                   {
16465                     /* Return -1 if OP0 is set in NEXT.  */
16466                     return -1;
16467                   }
16468             }
16469           if (next == BB_END (bb))
16470             break;
16471           next = NEXT_INSN (next);
16472         }
16473     }
16474
16475   if (distance < LEA_SEARCH_THRESHOLD)
16476     {
16477       edge e;
16478       edge_iterator ei;
16479       bool simple_loop = false;
16480
16481       FOR_EACH_EDGE (e, ei, bb->succs)
16482         if (e->dest == bb)
16483           {
16484             simple_loop = true;
16485             break;
16486           }
16487
16488       if (simple_loop)
16489         {
16490           rtx next = BB_HEAD (bb);
16491           while (next
16492                  && next != insn
16493                  && distance < LEA_SEARCH_THRESHOLD)
16494             {
16495               if (NONDEBUG_INSN_P (next))
16496                 {
16497                   distance++;
16498
16499                   for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
16500                     if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
16501                          || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
16502                         && regno0 == DF_REF_REGNO (*use_rec))
16503                       {
16504                         /* Return DISTANCE if OP0 is used in memory
16505                            address in NEXT.  */
16506                         return distance;
16507                       }
16508
16509                   for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
16510                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16511                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
16512                         && regno0 == DF_REF_REGNO (*def_rec))
16513                       {
16514                         /* Return -1 if OP0 is set in NEXT.  */
16515                         return -1;
16516                       }
16517
16518                 }
16519               next = NEXT_INSN (next);
16520             }
16521         }
16522     }
16523
16524   return -1;
16525 }
16526
16527 /* Define this macro to tune LEA priority vs ADD, it take effect when
16528    there is a dilemma of choicing LEA or ADD
16529    Negative value: ADD is more preferred than LEA
16530    Zero: Netrual
16531    Positive value: LEA is more preferred than ADD*/
16532 #define IX86_LEA_PRIORITY 2
16533
16534 /* Return true if it is ok to optimize an ADD operation to LEA
16535    operation to avoid flag register consumation.  For most processors,
16536    ADD is faster than LEA.  For the processors like ATOM, if the
16537    destination register of LEA holds an actual address which will be
16538    used soon, LEA is better and otherwise ADD is better.  */
16539
16540 bool
16541 ix86_lea_for_add_ok (rtx insn, rtx operands[])
16542 {
16543   unsigned int regno0 = true_regnum (operands[0]);
16544   unsigned int regno1 = true_regnum (operands[1]);
16545   unsigned int regno2 = true_regnum (operands[2]);
16546
16547   /* If a = b + c, (a!=b && a!=c), must use lea form. */
16548   if (regno0 != regno1 && regno0 != regno2)
16549     return true;
16550
16551   if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
16552     return false;
16553   else
16554     {
16555       int dist_define, dist_use;
16556
16557       /* Return false if REGNO0 isn't used in memory address. */
16558       dist_use = distance_agu_use (regno0, insn);
16559       if (dist_use <= 0)
16560         return false;
16561
16562       dist_define = distance_non_agu_define (regno1, regno2, insn);
16563       if (dist_define <= 0)
16564         return true;
16565
16566       /* If this insn has both backward non-agu dependence and forward
16567          agu dependence, the one with short distance take effect. */
16568       if ((dist_define + IX86_LEA_PRIORITY) < dist_use)
16569         return false;
16570
16571       return true;
16572     }
16573 }
16574
16575 /* Return true if destination reg of SET_BODY is shift count of
16576    USE_BODY.  */
16577
16578 static bool
16579 ix86_dep_by_shift_count_body (const_rtx set_body, const_rtx use_body)
16580 {
16581   rtx set_dest;
16582   rtx shift_rtx;
16583   int i;
16584
16585   /* Retrieve destination of SET_BODY.  */
16586   switch (GET_CODE (set_body))
16587     {
16588     case SET:
16589       set_dest = SET_DEST (set_body);
16590       if (!set_dest || !REG_P (set_dest))
16591         return false;
16592       break;
16593     case PARALLEL:
16594       for (i = XVECLEN (set_body, 0) - 1; i >= 0; i--)
16595         if (ix86_dep_by_shift_count_body (XVECEXP (set_body, 0, i),
16596                                           use_body))
16597           return true;
16598     default:
16599       return false;
16600       break;
16601     }
16602
16603   /* Retrieve shift count of USE_BODY.  */
16604   switch (GET_CODE (use_body))
16605     {
16606     case SET:
16607       shift_rtx = XEXP (use_body, 1);
16608       break;
16609     case PARALLEL:
16610       for (i = XVECLEN (use_body, 0) - 1; i >= 0; i--)
16611         if (ix86_dep_by_shift_count_body (set_body,
16612                                           XVECEXP (use_body, 0, i)))
16613           return true;
16614     default:
16615       return false;
16616       break;
16617     }
16618
16619   if (shift_rtx
16620       && (GET_CODE (shift_rtx) == ASHIFT
16621           || GET_CODE (shift_rtx) == LSHIFTRT
16622           || GET_CODE (shift_rtx) == ASHIFTRT
16623           || GET_CODE (shift_rtx) == ROTATE
16624           || GET_CODE (shift_rtx) == ROTATERT))
16625     {
16626       rtx shift_count = XEXP (shift_rtx, 1);
16627
16628       /* Return true if shift count is dest of SET_BODY.  */
16629       if (REG_P (shift_count)
16630           && true_regnum (set_dest) == true_regnum (shift_count))
16631         return true;
16632     }
16633
16634   return false;
16635 }
16636
16637 /* Return true if destination reg of SET_INSN is shift count of
16638    USE_INSN.  */
16639
16640 bool
16641 ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn)
16642 {
16643   return ix86_dep_by_shift_count_body (PATTERN (set_insn),
16644                                        PATTERN (use_insn));
16645 }
16646
16647 /* Return TRUE or FALSE depending on whether the unary operator meets the
16648    appropriate constraints.  */
16649
16650 bool
16651 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
16652                         enum machine_mode mode ATTRIBUTE_UNUSED,
16653                         rtx operands[2] ATTRIBUTE_UNUSED)
16654 {
16655   /* If one of operands is memory, source and destination must match.  */
16656   if ((MEM_P (operands[0])
16657        || MEM_P (operands[1]))
16658       && ! rtx_equal_p (operands[0], operands[1]))
16659     return false;
16660   return true;
16661 }
16662
16663 /* Return TRUE if the operands to a vec_interleave_{high,low}v2df
16664    are ok, keeping in mind the possible movddup alternative.  */
16665
16666 bool
16667 ix86_vec_interleave_v2df_operator_ok (rtx operands[3], bool high)
16668 {
16669   if (MEM_P (operands[0]))
16670     return rtx_equal_p (operands[0], operands[1 + high]);
16671   if (MEM_P (operands[1]) && MEM_P (operands[2]))
16672     return TARGET_SSE3 && rtx_equal_p (operands[1], operands[2]);
16673   return true;
16674 }
16675
16676 /* Post-reload splitter for converting an SF or DFmode value in an
16677    SSE register into an unsigned SImode.  */
16678
16679 void
16680 ix86_split_convert_uns_si_sse (rtx operands[])
16681 {
16682   enum machine_mode vecmode;
16683   rtx value, large, zero_or_two31, input, two31, x;
16684
16685   large = operands[1];
16686   zero_or_two31 = operands[2];
16687   input = operands[3];
16688   two31 = operands[4];
16689   vecmode = GET_MODE (large);
16690   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
16691
16692   /* Load up the value into the low element.  We must ensure that the other
16693      elements are valid floats -- zero is the easiest such value.  */
16694   if (MEM_P (input))
16695     {
16696       if (vecmode == V4SFmode)
16697         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
16698       else
16699         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
16700     }
16701   else
16702     {
16703       input = gen_rtx_REG (vecmode, REGNO (input));
16704       emit_move_insn (value, CONST0_RTX (vecmode));
16705       if (vecmode == V4SFmode)
16706         emit_insn (gen_sse_movss (value, value, input));
16707       else
16708         emit_insn (gen_sse2_movsd (value, value, input));
16709     }
16710
16711   emit_move_insn (large, two31);
16712   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
16713
16714   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
16715   emit_insn (gen_rtx_SET (VOIDmode, large, x));
16716
16717   x = gen_rtx_AND (vecmode, zero_or_two31, large);
16718   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
16719
16720   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
16721   emit_insn (gen_rtx_SET (VOIDmode, value, x));
16722
16723   large = gen_rtx_REG (V4SImode, REGNO (large));
16724   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
16725
16726   x = gen_rtx_REG (V4SImode, REGNO (value));
16727   if (vecmode == V4SFmode)
16728     emit_insn (gen_sse2_cvttps2dq (x, value));
16729   else
16730     emit_insn (gen_sse2_cvttpd2dq (x, value));
16731   value = x;
16732
16733   emit_insn (gen_xorv4si3 (value, value, large));
16734 }
16735
16736 /* Convert an unsigned DImode value into a DFmode, using only SSE.
16737    Expects the 64-bit DImode to be supplied in a pair of integral
16738    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
16739    -mfpmath=sse, !optimize_size only.  */
16740
16741 void
16742 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
16743 {
16744   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
16745   rtx int_xmm, fp_xmm;
16746   rtx biases, exponents;
16747   rtx x;
16748
16749   int_xmm = gen_reg_rtx (V4SImode);
16750   if (TARGET_INTER_UNIT_MOVES)
16751     emit_insn (gen_movdi_to_sse (int_xmm, input));
16752   else if (TARGET_SSE_SPLIT_REGS)
16753     {
16754       emit_clobber (int_xmm);
16755       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
16756     }
16757   else
16758     {
16759       x = gen_reg_rtx (V2DImode);
16760       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
16761       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
16762     }
16763
16764   x = gen_rtx_CONST_VECTOR (V4SImode,
16765                             gen_rtvec (4, GEN_INT (0x43300000UL),
16766                                        GEN_INT (0x45300000UL),
16767                                        const0_rtx, const0_rtx));
16768   exponents = validize_mem (force_const_mem (V4SImode, x));
16769
16770   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
16771   emit_insn (gen_vec_interleave_lowv4si (int_xmm, int_xmm, exponents));
16772
16773   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
16774      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
16775      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
16776      (0x1.0p84 + double(fp_value_hi_xmm)).
16777      Note these exponents differ by 32.  */
16778
16779   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
16780
16781   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
16782      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
16783   real_ldexp (&bias_lo_rvt, &dconst1, 52);
16784   real_ldexp (&bias_hi_rvt, &dconst1, 84);
16785   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
16786   x = const_double_from_real_value (bias_hi_rvt, DFmode);
16787   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
16788   biases = validize_mem (force_const_mem (V2DFmode, biases));
16789   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
16790
16791   /* Add the upper and lower DFmode values together.  */
16792   if (TARGET_SSE3)
16793     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
16794   else
16795     {
16796       x = copy_to_mode_reg (V2DFmode, fp_xmm);
16797       emit_insn (gen_vec_interleave_highv2df (fp_xmm, fp_xmm, fp_xmm));
16798       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
16799     }
16800
16801   ix86_expand_vector_extract (false, target, fp_xmm, 0);
16802 }
16803
16804 /* Not used, but eases macroization of patterns.  */
16805 void
16806 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
16807                                   rtx input ATTRIBUTE_UNUSED)
16808 {
16809   gcc_unreachable ();
16810 }
16811
16812 /* Convert an unsigned SImode value into a DFmode.  Only currently used
16813    for SSE, but applicable anywhere.  */
16814
16815 void
16816 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
16817 {
16818   REAL_VALUE_TYPE TWO31r;
16819   rtx x, fp;
16820
16821   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
16822                            NULL, 1, OPTAB_DIRECT);
16823
16824   fp = gen_reg_rtx (DFmode);
16825   emit_insn (gen_floatsidf2 (fp, x));
16826
16827   real_ldexp (&TWO31r, &dconst1, 31);
16828   x = const_double_from_real_value (TWO31r, DFmode);
16829
16830   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
16831   if (x != target)
16832     emit_move_insn (target, x);
16833 }
16834
16835 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
16836    32-bit mode; otherwise we have a direct convert instruction.  */
16837
16838 void
16839 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
16840 {
16841   REAL_VALUE_TYPE TWO32r;
16842   rtx fp_lo, fp_hi, x;
16843
16844   fp_lo = gen_reg_rtx (DFmode);
16845   fp_hi = gen_reg_rtx (DFmode);
16846
16847   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
16848
16849   real_ldexp (&TWO32r, &dconst1, 32);
16850   x = const_double_from_real_value (TWO32r, DFmode);
16851   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
16852
16853   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
16854
16855   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
16856                            0, OPTAB_DIRECT);
16857   if (x != target)
16858     emit_move_insn (target, x);
16859 }
16860
16861 /* Convert an unsigned SImode value into a SFmode, using only SSE.
16862    For x86_32, -mfpmath=sse, !optimize_size only.  */
16863 void
16864 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
16865 {
16866   REAL_VALUE_TYPE ONE16r;
16867   rtx fp_hi, fp_lo, int_hi, int_lo, x;
16868
16869   real_ldexp (&ONE16r, &dconst1, 16);
16870   x = const_double_from_real_value (ONE16r, SFmode);
16871   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
16872                                       NULL, 0, OPTAB_DIRECT);
16873   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
16874                                       NULL, 0, OPTAB_DIRECT);
16875   fp_hi = gen_reg_rtx (SFmode);
16876   fp_lo = gen_reg_rtx (SFmode);
16877   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
16878   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
16879   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
16880                                0, OPTAB_DIRECT);
16881   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
16882                                0, OPTAB_DIRECT);
16883   if (!rtx_equal_p (target, fp_hi))
16884     emit_move_insn (target, fp_hi);
16885 }
16886
16887 /* A subroutine of ix86_build_signbit_mask.  If VECT is true,
16888    then replicate the value for all elements of the vector
16889    register.  */
16890
16891 rtx
16892 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
16893 {
16894   rtvec v;
16895   switch (mode)
16896     {
16897     case V4SImode:
16898       gcc_assert (vect);
16899       v = gen_rtvec (4, value, value, value, value);
16900       return gen_rtx_CONST_VECTOR (V4SImode, v);
16901
16902     case V2DImode:
16903       gcc_assert (vect);
16904       v = gen_rtvec (2, value, value);
16905       return gen_rtx_CONST_VECTOR (V2DImode, v);
16906
16907     case V8SFmode:
16908       if (vect)
16909         v = gen_rtvec (8, value, value, value, value,
16910                        value, value, value, value);
16911       else
16912         v = gen_rtvec (8, value, CONST0_RTX (SFmode),
16913                        CONST0_RTX (SFmode), CONST0_RTX (SFmode),
16914                        CONST0_RTX (SFmode), CONST0_RTX (SFmode),
16915                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
16916       return gen_rtx_CONST_VECTOR (V8SFmode, v);
16917
16918     case V4SFmode:
16919       if (vect)
16920         v = gen_rtvec (4, value, value, value, value);
16921       else
16922         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
16923                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
16924       return gen_rtx_CONST_VECTOR (V4SFmode, v);
16925
16926     case V4DFmode:
16927       if (vect)
16928         v = gen_rtvec (4, value, value, value, value);
16929       else
16930         v = gen_rtvec (4, value, CONST0_RTX (DFmode),
16931                        CONST0_RTX (DFmode), CONST0_RTX (DFmode));
16932       return gen_rtx_CONST_VECTOR (V4DFmode, v);
16933
16934     case V2DFmode:
16935       if (vect)
16936         v = gen_rtvec (2, value, value);
16937       else
16938         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
16939       return gen_rtx_CONST_VECTOR (V2DFmode, v);
16940
16941     default:
16942       gcc_unreachable ();
16943     }
16944 }
16945
16946 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
16947    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
16948    for an SSE register.  If VECT is true, then replicate the mask for
16949    all elements of the vector register.  If INVERT is true, then create
16950    a mask excluding the sign bit.  */
16951
16952 rtx
16953 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
16954 {
16955   enum machine_mode vec_mode, imode;
16956   HOST_WIDE_INT hi, lo;
16957   int shift = 63;
16958   rtx v;
16959   rtx mask;
16960
16961   /* Find the sign bit, sign extended to 2*HWI.  */
16962   switch (mode)
16963     {
16964     case V4SImode:
16965     case V8SFmode:
16966     case V4SFmode:
16967       vec_mode = mode;
16968       mode = GET_MODE_INNER (mode);
16969       imode = SImode;
16970       lo = 0x80000000, hi = lo < 0;
16971       break;
16972
16973     case V2DImode:
16974     case V4DFmode:
16975     case V2DFmode:
16976       vec_mode = mode;
16977       mode = GET_MODE_INNER (mode);
16978       imode = DImode;
16979       if (HOST_BITS_PER_WIDE_INT >= 64)
16980         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
16981       else
16982         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
16983       break;
16984
16985     case TImode:
16986     case TFmode:
16987       vec_mode = VOIDmode;
16988       if (HOST_BITS_PER_WIDE_INT >= 64)
16989         {
16990           imode = TImode;
16991           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
16992         }
16993       else
16994         {
16995           rtvec vec;
16996
16997           imode = DImode;
16998           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
16999
17000           if (invert)
17001             {
17002               lo = ~lo, hi = ~hi;
17003               v = constm1_rtx;
17004             }
17005           else
17006             v = const0_rtx;
17007
17008           mask = immed_double_const (lo, hi, imode);
17009
17010           vec = gen_rtvec (2, v, mask);
17011           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
17012           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
17013
17014           return v;
17015         }
17016      break;
17017
17018     default:
17019       gcc_unreachable ();
17020     }
17021
17022   if (invert)
17023     lo = ~lo, hi = ~hi;
17024
17025   /* Force this value into the low part of a fp vector constant.  */
17026   mask = immed_double_const (lo, hi, imode);
17027   mask = gen_lowpart (mode, mask);
17028
17029   if (vec_mode == VOIDmode)
17030     return force_reg (mode, mask);
17031
17032   v = ix86_build_const_vector (vec_mode, vect, mask);
17033   return force_reg (vec_mode, v);
17034 }
17035
17036 /* Generate code for floating point ABS or NEG.  */
17037
17038 void
17039 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
17040                                 rtx operands[])
17041 {
17042   rtx mask, set, dst, src;
17043   bool use_sse = false;
17044   bool vector_mode = VECTOR_MODE_P (mode);
17045   enum machine_mode vmode = mode;
17046
17047   if (vector_mode)
17048     use_sse = true;
17049   else if (mode == TFmode)
17050     use_sse = true;
17051   else if (TARGET_SSE_MATH)
17052     {
17053       use_sse = SSE_FLOAT_MODE_P (mode);
17054       if (mode == SFmode)
17055         vmode = V4SFmode;
17056       else if (mode == DFmode)
17057         vmode = V2DFmode;
17058     }
17059
17060   /* NEG and ABS performed with SSE use bitwise mask operations.
17061      Create the appropriate mask now.  */
17062   if (use_sse)
17063     mask = ix86_build_signbit_mask (vmode, vector_mode, code == ABS);
17064   else
17065     mask = NULL_RTX;
17066
17067   dst = operands[0];
17068   src = operands[1];
17069
17070   set = gen_rtx_fmt_e (code, mode, src);
17071   set = gen_rtx_SET (VOIDmode, dst, set);
17072
17073   if (mask)
17074     {
17075       rtx use, clob;
17076       rtvec par;
17077
17078       use = gen_rtx_USE (VOIDmode, mask);
17079       if (vector_mode)
17080         par = gen_rtvec (2, set, use);
17081       else
17082         {
17083           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
17084           par = gen_rtvec (3, set, use, clob);
17085         }
17086       emit_insn (gen_rtx_PARALLEL (VOIDmode, par));
17087     }
17088   else
17089     emit_insn (set);
17090 }
17091
17092 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
17093
17094 void
17095 ix86_expand_copysign (rtx operands[])
17096 {
17097   enum machine_mode mode, vmode;
17098   rtx dest, op0, op1, mask, nmask;
17099
17100   dest = operands[0];
17101   op0 = operands[1];
17102   op1 = operands[2];
17103
17104   mode = GET_MODE (dest);
17105
17106   if (mode == SFmode)
17107     vmode = V4SFmode;
17108   else if (mode == DFmode)
17109     vmode = V2DFmode;
17110   else
17111     vmode = mode;
17112
17113   if (GET_CODE (op0) == CONST_DOUBLE)
17114     {
17115       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
17116
17117       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
17118         op0 = simplify_unary_operation (ABS, mode, op0, mode);
17119
17120       if (mode == SFmode || mode == DFmode)
17121         {
17122           if (op0 == CONST0_RTX (mode))
17123             op0 = CONST0_RTX (vmode);
17124           else
17125             {
17126               rtx v = ix86_build_const_vector (vmode, false, op0);
17127
17128               op0 = force_reg (vmode, v);
17129             }
17130         }
17131       else if (op0 != CONST0_RTX (mode))
17132         op0 = force_reg (mode, op0);
17133
17134       mask = ix86_build_signbit_mask (vmode, 0, 0);
17135
17136       if (mode == SFmode)
17137         copysign_insn = gen_copysignsf3_const;
17138       else if (mode == DFmode)
17139         copysign_insn = gen_copysigndf3_const;
17140       else
17141         copysign_insn = gen_copysigntf3_const;
17142
17143         emit_insn (copysign_insn (dest, op0, op1, mask));
17144     }
17145   else
17146     {
17147       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
17148
17149       nmask = ix86_build_signbit_mask (vmode, 0, 1);
17150       mask = ix86_build_signbit_mask (vmode, 0, 0);
17151
17152       if (mode == SFmode)
17153         copysign_insn = gen_copysignsf3_var;
17154       else if (mode == DFmode)
17155         copysign_insn = gen_copysigndf3_var;
17156       else
17157         copysign_insn = gen_copysigntf3_var;
17158
17159       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
17160     }
17161 }
17162
17163 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
17164    be a constant, and so has already been expanded into a vector constant.  */
17165
17166 void
17167 ix86_split_copysign_const (rtx operands[])
17168 {
17169   enum machine_mode mode, vmode;
17170   rtx dest, op0, mask, x;
17171
17172   dest = operands[0];
17173   op0 = operands[1];
17174   mask = operands[3];
17175
17176   mode = GET_MODE (dest);
17177   vmode = GET_MODE (mask);
17178
17179   dest = simplify_gen_subreg (vmode, dest, mode, 0);
17180   x = gen_rtx_AND (vmode, dest, mask);
17181   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17182
17183   if (op0 != CONST0_RTX (vmode))
17184     {
17185       x = gen_rtx_IOR (vmode, dest, op0);
17186       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17187     }
17188 }
17189
17190 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
17191    so we have to do two masks.  */
17192
17193 void
17194 ix86_split_copysign_var (rtx operands[])
17195 {
17196   enum machine_mode mode, vmode;
17197   rtx dest, scratch, op0, op1, mask, nmask, x;
17198
17199   dest = operands[0];
17200   scratch = operands[1];
17201   op0 = operands[2];
17202   op1 = operands[3];
17203   nmask = operands[4];
17204   mask = operands[5];
17205
17206   mode = GET_MODE (dest);
17207   vmode = GET_MODE (mask);
17208
17209   if (rtx_equal_p (op0, op1))
17210     {
17211       /* Shouldn't happen often (it's useless, obviously), but when it does
17212          we'd generate incorrect code if we continue below.  */
17213       emit_move_insn (dest, op0);
17214       return;
17215     }
17216
17217   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
17218     {
17219       gcc_assert (REGNO (op1) == REGNO (scratch));
17220
17221       x = gen_rtx_AND (vmode, scratch, mask);
17222       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17223
17224       dest = mask;
17225       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
17226       x = gen_rtx_NOT (vmode, dest);
17227       x = gen_rtx_AND (vmode, x, op0);
17228       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17229     }
17230   else
17231     {
17232       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
17233         {
17234           x = gen_rtx_AND (vmode, scratch, mask);
17235         }
17236       else                                              /* alternative 2,4 */
17237         {
17238           gcc_assert (REGNO (mask) == REGNO (scratch));
17239           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
17240           x = gen_rtx_AND (vmode, scratch, op1);
17241         }
17242       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17243
17244       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
17245         {
17246           dest = simplify_gen_subreg (vmode, op0, mode, 0);
17247           x = gen_rtx_AND (vmode, dest, nmask);
17248         }
17249       else                                              /* alternative 3,4 */
17250         {
17251           gcc_assert (REGNO (nmask) == REGNO (dest));
17252           dest = nmask;
17253           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
17254           x = gen_rtx_AND (vmode, dest, op0);
17255         }
17256       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17257     }
17258
17259   x = gen_rtx_IOR (vmode, dest, scratch);
17260   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17261 }
17262
17263 /* Return TRUE or FALSE depending on whether the first SET in INSN
17264    has source and destination with matching CC modes, and that the
17265    CC mode is at least as constrained as REQ_MODE.  */
17266
17267 bool
17268 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
17269 {
17270   rtx set;
17271   enum machine_mode set_mode;
17272
17273   set = PATTERN (insn);
17274   if (GET_CODE (set) == PARALLEL)
17275     set = XVECEXP (set, 0, 0);
17276   gcc_assert (GET_CODE (set) == SET);
17277   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
17278
17279   set_mode = GET_MODE (SET_DEST (set));
17280   switch (set_mode)
17281     {
17282     case CCNOmode:
17283       if (req_mode != CCNOmode
17284           && (req_mode != CCmode
17285               || XEXP (SET_SRC (set), 1) != const0_rtx))
17286         return false;
17287       break;
17288     case CCmode:
17289       if (req_mode == CCGCmode)
17290         return false;
17291       /* FALLTHRU */
17292     case CCGCmode:
17293       if (req_mode == CCGOCmode || req_mode == CCNOmode)
17294         return false;
17295       /* FALLTHRU */
17296     case CCGOCmode:
17297       if (req_mode == CCZmode)
17298         return false;
17299       /* FALLTHRU */
17300     case CCZmode:
17301       break;
17302
17303     case CCAmode:
17304     case CCCmode:
17305     case CCOmode:
17306     case CCSmode:
17307       if (set_mode != req_mode)
17308         return false;
17309       break;
17310
17311     default:
17312       gcc_unreachable ();
17313     }
17314
17315   return GET_MODE (SET_SRC (set)) == set_mode;
17316 }
17317
17318 /* Generate insn patterns to do an integer compare of OPERANDS.  */
17319
17320 static rtx
17321 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
17322 {
17323   enum machine_mode cmpmode;
17324   rtx tmp, flags;
17325
17326   cmpmode = SELECT_CC_MODE (code, op0, op1);
17327   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
17328
17329   /* This is very simple, but making the interface the same as in the
17330      FP case makes the rest of the code easier.  */
17331   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
17332   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
17333
17334   /* Return the test that should be put into the flags user, i.e.
17335      the bcc, scc, or cmov instruction.  */
17336   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
17337 }
17338
17339 /* Figure out whether to use ordered or unordered fp comparisons.
17340    Return the appropriate mode to use.  */
17341
17342 enum machine_mode
17343 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
17344 {
17345   /* ??? In order to make all comparisons reversible, we do all comparisons
17346      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
17347      all forms trapping and nontrapping comparisons, we can make inequality
17348      comparisons trapping again, since it results in better code when using
17349      FCOM based compares.  */
17350   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
17351 }
17352
17353 enum machine_mode
17354 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
17355 {
17356   enum machine_mode mode = GET_MODE (op0);
17357
17358   if (SCALAR_FLOAT_MODE_P (mode))
17359     {
17360       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
17361       return ix86_fp_compare_mode (code);
17362     }
17363
17364   switch (code)
17365     {
17366       /* Only zero flag is needed.  */
17367     case EQ:                    /* ZF=0 */
17368     case NE:                    /* ZF!=0 */
17369       return CCZmode;
17370       /* Codes needing carry flag.  */
17371     case GEU:                   /* CF=0 */
17372     case LTU:                   /* CF=1 */
17373       /* Detect overflow checks.  They need just the carry flag.  */
17374       if (GET_CODE (op0) == PLUS
17375           && rtx_equal_p (op1, XEXP (op0, 0)))
17376         return CCCmode;
17377       else
17378         return CCmode;
17379     case GTU:                   /* CF=0 & ZF=0 */
17380     case LEU:                   /* CF=1 | ZF=1 */
17381       /* Detect overflow checks.  They need just the carry flag.  */
17382       if (GET_CODE (op0) == MINUS
17383           && rtx_equal_p (op1, XEXP (op0, 0)))
17384         return CCCmode;
17385       else
17386         return CCmode;
17387       /* Codes possibly doable only with sign flag when
17388          comparing against zero.  */
17389     case GE:                    /* SF=OF   or   SF=0 */
17390     case LT:                    /* SF<>OF  or   SF=1 */
17391       if (op1 == const0_rtx)
17392         return CCGOCmode;
17393       else
17394         /* For other cases Carry flag is not required.  */
17395         return CCGCmode;
17396       /* Codes doable only with sign flag when comparing
17397          against zero, but we miss jump instruction for it
17398          so we need to use relational tests against overflow
17399          that thus needs to be zero.  */
17400     case GT:                    /* ZF=0 & SF=OF */
17401     case LE:                    /* ZF=1 | SF<>OF */
17402       if (op1 == const0_rtx)
17403         return CCNOmode;
17404       else
17405         return CCGCmode;
17406       /* strcmp pattern do (use flags) and combine may ask us for proper
17407          mode.  */
17408     case USE:
17409       return CCmode;
17410     default:
17411       gcc_unreachable ();
17412     }
17413 }
17414
17415 /* Return the fixed registers used for condition codes.  */
17416
17417 static bool
17418 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
17419 {
17420   *p1 = FLAGS_REG;
17421   *p2 = FPSR_REG;
17422   return true;
17423 }
17424
17425 /* If two condition code modes are compatible, return a condition code
17426    mode which is compatible with both.  Otherwise, return
17427    VOIDmode.  */
17428
17429 static enum machine_mode
17430 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
17431 {
17432   if (m1 == m2)
17433     return m1;
17434
17435   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
17436     return VOIDmode;
17437
17438   if ((m1 == CCGCmode && m2 == CCGOCmode)
17439       || (m1 == CCGOCmode && m2 == CCGCmode))
17440     return CCGCmode;
17441
17442   switch (m1)
17443     {
17444     default:
17445       gcc_unreachable ();
17446
17447     case CCmode:
17448     case CCGCmode:
17449     case CCGOCmode:
17450     case CCNOmode:
17451     case CCAmode:
17452     case CCCmode:
17453     case CCOmode:
17454     case CCSmode:
17455     case CCZmode:
17456       switch (m2)
17457         {
17458         default:
17459           return VOIDmode;
17460
17461         case CCmode:
17462         case CCGCmode:
17463         case CCGOCmode:
17464         case CCNOmode:
17465         case CCAmode:
17466         case CCCmode:
17467         case CCOmode:
17468         case CCSmode:
17469         case CCZmode:
17470           return CCmode;
17471         }
17472
17473     case CCFPmode:
17474     case CCFPUmode:
17475       /* These are only compatible with themselves, which we already
17476          checked above.  */
17477       return VOIDmode;
17478     }
17479 }
17480
17481
17482 /* Return a comparison we can do and that it is equivalent to
17483    swap_condition (code) apart possibly from orderedness.
17484    But, never change orderedness if TARGET_IEEE_FP, returning
17485    UNKNOWN in that case if necessary.  */
17486
17487 static enum rtx_code
17488 ix86_fp_swap_condition (enum rtx_code code)
17489 {
17490   switch (code)
17491     {
17492     case GT:                   /* GTU - CF=0 & ZF=0 */
17493       return TARGET_IEEE_FP ? UNKNOWN : UNLT;
17494     case GE:                   /* GEU - CF=0 */
17495       return TARGET_IEEE_FP ? UNKNOWN : UNLE;
17496     case UNLT:                 /* LTU - CF=1 */
17497       return TARGET_IEEE_FP ? UNKNOWN : GT;
17498     case UNLE:                 /* LEU - CF=1 | ZF=1 */
17499       return TARGET_IEEE_FP ? UNKNOWN : GE;
17500     default:
17501       return swap_condition (code);
17502     }
17503 }
17504
17505 /* Return cost of comparison CODE using the best strategy for performance.
17506    All following functions do use number of instructions as a cost metrics.
17507    In future this should be tweaked to compute bytes for optimize_size and
17508    take into account performance of various instructions on various CPUs.  */
17509
17510 static int
17511 ix86_fp_comparison_cost (enum rtx_code code)
17512 {
17513   int arith_cost;
17514
17515   /* The cost of code using bit-twiddling on %ah.  */
17516   switch (code)
17517     {
17518     case UNLE:
17519     case UNLT:
17520     case LTGT:
17521     case GT:
17522     case GE:
17523     case UNORDERED:
17524     case ORDERED:
17525     case UNEQ:
17526       arith_cost = 4;
17527       break;
17528     case LT:
17529     case NE:
17530     case EQ:
17531     case UNGE:
17532       arith_cost = TARGET_IEEE_FP ? 5 : 4;
17533       break;
17534     case LE:
17535     case UNGT:
17536       arith_cost = TARGET_IEEE_FP ? 6 : 4;
17537       break;
17538     default:
17539       gcc_unreachable ();
17540     }
17541
17542   switch (ix86_fp_comparison_strategy (code))
17543     {
17544     case IX86_FPCMP_COMI:
17545       return arith_cost > 4 ? 3 : 2;
17546     case IX86_FPCMP_SAHF:
17547       return arith_cost > 4 ? 4 : 3;
17548     default:
17549       return arith_cost;
17550     }
17551 }
17552
17553 /* Return strategy to use for floating-point.  We assume that fcomi is always
17554    preferrable where available, since that is also true when looking at size
17555    (2 bytes, vs. 3 for fnstsw+sahf and at least 5 for fnstsw+test).  */
17556
17557 enum ix86_fpcmp_strategy
17558 ix86_fp_comparison_strategy (enum rtx_code code ATTRIBUTE_UNUSED)
17559 {
17560   /* Do fcomi/sahf based test when profitable.  */
17561
17562   if (TARGET_CMOVE)
17563     return IX86_FPCMP_COMI;
17564
17565   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_function_for_size_p (cfun)))
17566     return IX86_FPCMP_SAHF;
17567
17568   return IX86_FPCMP_ARITH;
17569 }
17570
17571 /* Swap, force into registers, or otherwise massage the two operands
17572    to a fp comparison.  The operands are updated in place; the new
17573    comparison code is returned.  */
17574
17575 static enum rtx_code
17576 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
17577 {
17578   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
17579   rtx op0 = *pop0, op1 = *pop1;
17580   enum machine_mode op_mode = GET_MODE (op0);
17581   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
17582
17583   /* All of the unordered compare instructions only work on registers.
17584      The same is true of the fcomi compare instructions.  The XFmode
17585      compare instructions require registers except when comparing
17586      against zero or when converting operand 1 from fixed point to
17587      floating point.  */
17588
17589   if (!is_sse
17590       && (fpcmp_mode == CCFPUmode
17591           || (op_mode == XFmode
17592               && ! (standard_80387_constant_p (op0) == 1
17593                     || standard_80387_constant_p (op1) == 1)
17594               && GET_CODE (op1) != FLOAT)
17595           || ix86_fp_comparison_strategy (code) == IX86_FPCMP_COMI))
17596     {
17597       op0 = force_reg (op_mode, op0);
17598       op1 = force_reg (op_mode, op1);
17599     }
17600   else
17601     {
17602       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
17603          things around if they appear profitable, otherwise force op0
17604          into a register.  */
17605
17606       if (standard_80387_constant_p (op0) == 0
17607           || (MEM_P (op0)
17608               && ! (standard_80387_constant_p (op1) == 0
17609                     || MEM_P (op1))))
17610         {
17611           enum rtx_code new_code = ix86_fp_swap_condition (code);
17612           if (new_code != UNKNOWN)
17613             {
17614               rtx tmp;
17615               tmp = op0, op0 = op1, op1 = tmp;
17616               code = new_code;
17617             }
17618         }
17619
17620       if (!REG_P (op0))
17621         op0 = force_reg (op_mode, op0);
17622
17623       if (CONSTANT_P (op1))
17624         {
17625           int tmp = standard_80387_constant_p (op1);
17626           if (tmp == 0)
17627             op1 = validize_mem (force_const_mem (op_mode, op1));
17628           else if (tmp == 1)
17629             {
17630               if (TARGET_CMOVE)
17631                 op1 = force_reg (op_mode, op1);
17632             }
17633           else
17634             op1 = force_reg (op_mode, op1);
17635         }
17636     }
17637
17638   /* Try to rearrange the comparison to make it cheaper.  */
17639   if (ix86_fp_comparison_cost (code)
17640       > ix86_fp_comparison_cost (swap_condition (code))
17641       && (REG_P (op1) || can_create_pseudo_p ()))
17642     {
17643       rtx tmp;
17644       tmp = op0, op0 = op1, op1 = tmp;
17645       code = swap_condition (code);
17646       if (!REG_P (op0))
17647         op0 = force_reg (op_mode, op0);
17648     }
17649
17650   *pop0 = op0;
17651   *pop1 = op1;
17652   return code;
17653 }
17654
17655 /* Convert comparison codes we use to represent FP comparison to integer
17656    code that will result in proper branch.  Return UNKNOWN if no such code
17657    is available.  */
17658
17659 enum rtx_code
17660 ix86_fp_compare_code_to_integer (enum rtx_code code)
17661 {
17662   switch (code)
17663     {
17664     case GT:
17665       return GTU;
17666     case GE:
17667       return GEU;
17668     case ORDERED:
17669     case UNORDERED:
17670       return code;
17671       break;
17672     case UNEQ:
17673       return EQ;
17674       break;
17675     case UNLT:
17676       return LTU;
17677       break;
17678     case UNLE:
17679       return LEU;
17680       break;
17681     case LTGT:
17682       return NE;
17683       break;
17684     default:
17685       return UNKNOWN;
17686     }
17687 }
17688
17689 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
17690
17691 static rtx
17692 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch)
17693 {
17694   enum machine_mode fpcmp_mode, intcmp_mode;
17695   rtx tmp, tmp2;
17696
17697   fpcmp_mode = ix86_fp_compare_mode (code);
17698   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
17699
17700   /* Do fcomi/sahf based test when profitable.  */
17701   switch (ix86_fp_comparison_strategy (code))
17702     {
17703     case IX86_FPCMP_COMI:
17704       intcmp_mode = fpcmp_mode;
17705       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17706       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
17707                          tmp);
17708       emit_insn (tmp);
17709       break;
17710
17711     case IX86_FPCMP_SAHF:
17712       intcmp_mode = fpcmp_mode;
17713       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17714       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
17715                          tmp);
17716
17717       if (!scratch)
17718         scratch = gen_reg_rtx (HImode);
17719       tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
17720       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
17721       break;
17722
17723     case IX86_FPCMP_ARITH:
17724       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
17725       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17726       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
17727       if (!scratch)
17728         scratch = gen_reg_rtx (HImode);
17729       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
17730
17731       /* In the unordered case, we have to check C2 for NaN's, which
17732          doesn't happen to work out to anything nice combination-wise.
17733          So do some bit twiddling on the value we've got in AH to come
17734          up with an appropriate set of condition codes.  */
17735
17736       intcmp_mode = CCNOmode;
17737       switch (code)
17738         {
17739         case GT:
17740         case UNGT:
17741           if (code == GT || !TARGET_IEEE_FP)
17742             {
17743               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
17744               code = EQ;
17745             }
17746           else
17747             {
17748               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17749               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
17750               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
17751               intcmp_mode = CCmode;
17752               code = GEU;
17753             }
17754           break;
17755         case LT:
17756         case UNLT:
17757           if (code == LT && TARGET_IEEE_FP)
17758             {
17759               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17760               emit_insn (gen_cmpqi_ext_3 (scratch, const1_rtx));
17761               intcmp_mode = CCmode;
17762               code = EQ;
17763             }
17764           else
17765             {
17766               emit_insn (gen_testqi_ext_ccno_0 (scratch, const1_rtx));
17767               code = NE;
17768             }
17769           break;
17770         case GE:
17771         case UNGE:
17772           if (code == GE || !TARGET_IEEE_FP)
17773             {
17774               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
17775               code = EQ;
17776             }
17777           else
17778             {
17779               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17780               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch, const1_rtx));
17781               code = NE;
17782             }
17783           break;
17784         case LE:
17785         case UNLE:
17786           if (code == LE && TARGET_IEEE_FP)
17787             {
17788               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17789               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
17790               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
17791               intcmp_mode = CCmode;
17792               code = LTU;
17793             }
17794           else
17795             {
17796               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
17797               code = NE;
17798             }
17799           break;
17800         case EQ:
17801         case UNEQ:
17802           if (code == EQ && TARGET_IEEE_FP)
17803             {
17804               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17805               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
17806               intcmp_mode = CCmode;
17807               code = EQ;
17808             }
17809           else
17810             {
17811               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
17812               code = NE;
17813             }
17814           break;
17815         case NE:
17816         case LTGT:
17817           if (code == NE && TARGET_IEEE_FP)
17818             {
17819               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17820               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
17821                                              GEN_INT (0x40)));
17822               code = NE;
17823             }
17824           else
17825             {
17826               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
17827               code = EQ;
17828             }
17829           break;
17830
17831         case UNORDERED:
17832           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
17833           code = NE;
17834           break;
17835         case ORDERED:
17836           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
17837           code = EQ;
17838           break;
17839
17840         default:
17841           gcc_unreachable ();
17842         }
17843         break;
17844
17845     default:
17846       gcc_unreachable();
17847     }
17848
17849   /* Return the test that should be put into the flags user, i.e.
17850      the bcc, scc, or cmov instruction.  */
17851   return gen_rtx_fmt_ee (code, VOIDmode,
17852                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
17853                          const0_rtx);
17854 }
17855
17856 static rtx
17857 ix86_expand_compare (enum rtx_code code, rtx op0, rtx op1)
17858 {
17859   rtx ret;
17860
17861   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
17862     ret = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
17863
17864   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
17865     {
17866       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
17867       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
17868     }
17869   else
17870     ret = ix86_expand_int_compare (code, op0, op1);
17871
17872   return ret;
17873 }
17874
17875 void
17876 ix86_expand_branch (enum rtx_code code, rtx op0, rtx op1, rtx label)
17877 {
17878   enum machine_mode mode = GET_MODE (op0);
17879   rtx tmp;
17880
17881   switch (mode)
17882     {
17883     case SFmode:
17884     case DFmode:
17885     case XFmode:
17886     case QImode:
17887     case HImode:
17888     case SImode:
17889       simple:
17890       tmp = ix86_expand_compare (code, op0, op1);
17891       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
17892                                   gen_rtx_LABEL_REF (VOIDmode, label),
17893                                   pc_rtx);
17894       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
17895       return;
17896
17897     case DImode:
17898       if (TARGET_64BIT)
17899         goto simple;
17900     case TImode:
17901       /* Expand DImode branch into multiple compare+branch.  */
17902       {
17903         rtx lo[2], hi[2], label2;
17904         enum rtx_code code1, code2, code3;
17905         enum machine_mode submode;
17906
17907         if (CONSTANT_P (op0) && !CONSTANT_P (op1))
17908           {
17909             tmp = op0, op0 = op1, op1 = tmp;
17910             code = swap_condition (code);
17911           }
17912
17913         split_double_mode (mode, &op0, 1, lo+0, hi+0);
17914         split_double_mode (mode, &op1, 1, lo+1, hi+1);
17915
17916         submode = mode == DImode ? SImode : DImode;
17917
17918         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
17919            avoid two branches.  This costs one extra insn, so disable when
17920            optimizing for size.  */
17921
17922         if ((code == EQ || code == NE)
17923             && (!optimize_insn_for_size_p ()
17924                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
17925           {
17926             rtx xor0, xor1;
17927
17928             xor1 = hi[0];
17929             if (hi[1] != const0_rtx)
17930               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
17931                                    NULL_RTX, 0, OPTAB_WIDEN);
17932
17933             xor0 = lo[0];
17934             if (lo[1] != const0_rtx)
17935               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
17936                                    NULL_RTX, 0, OPTAB_WIDEN);
17937
17938             tmp = expand_binop (submode, ior_optab, xor1, xor0,
17939                                 NULL_RTX, 0, OPTAB_WIDEN);
17940
17941             ix86_expand_branch (code, tmp, const0_rtx, label);
17942             return;
17943           }
17944
17945         /* Otherwise, if we are doing less-than or greater-or-equal-than,
17946            op1 is a constant and the low word is zero, then we can just
17947            examine the high word.  Similarly for low word -1 and
17948            less-or-equal-than or greater-than.  */
17949
17950         if (CONST_INT_P (hi[1]))
17951           switch (code)
17952             {
17953             case LT: case LTU: case GE: case GEU:
17954               if (lo[1] == const0_rtx)
17955                 {
17956                   ix86_expand_branch (code, hi[0], hi[1], label);
17957                   return;
17958                 }
17959               break;
17960             case LE: case LEU: case GT: case GTU:
17961               if (lo[1] == constm1_rtx)
17962                 {
17963                   ix86_expand_branch (code, hi[0], hi[1], label);
17964                   return;
17965                 }
17966               break;
17967             default:
17968               break;
17969             }
17970
17971         /* Otherwise, we need two or three jumps.  */
17972
17973         label2 = gen_label_rtx ();
17974
17975         code1 = code;
17976         code2 = swap_condition (code);
17977         code3 = unsigned_condition (code);
17978
17979         switch (code)
17980           {
17981           case LT: case GT: case LTU: case GTU:
17982             break;
17983
17984           case LE:   code1 = LT;  code2 = GT;  break;
17985           case GE:   code1 = GT;  code2 = LT;  break;
17986           case LEU:  code1 = LTU; code2 = GTU; break;
17987           case GEU:  code1 = GTU; code2 = LTU; break;
17988
17989           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
17990           case NE:   code2 = UNKNOWN; break;
17991
17992           default:
17993             gcc_unreachable ();
17994           }
17995
17996         /*
17997          * a < b =>
17998          *    if (hi(a) < hi(b)) goto true;
17999          *    if (hi(a) > hi(b)) goto false;
18000          *    if (lo(a) < lo(b)) goto true;
18001          *  false:
18002          */
18003
18004         if (code1 != UNKNOWN)
18005           ix86_expand_branch (code1, hi[0], hi[1], label);
18006         if (code2 != UNKNOWN)
18007           ix86_expand_branch (code2, hi[0], hi[1], label2);
18008
18009         ix86_expand_branch (code3, lo[0], lo[1], label);
18010
18011         if (code2 != UNKNOWN)
18012           emit_label (label2);
18013         return;
18014       }
18015
18016     default:
18017       gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC);
18018       goto simple;
18019     }
18020 }
18021
18022 /* Split branch based on floating point condition.  */
18023 void
18024 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
18025                       rtx target1, rtx target2, rtx tmp, rtx pushed)
18026 {
18027   rtx condition;
18028   rtx i;
18029
18030   if (target2 != pc_rtx)
18031     {
18032       rtx tmp = target2;
18033       code = reverse_condition_maybe_unordered (code);
18034       target2 = target1;
18035       target1 = tmp;
18036     }
18037
18038   condition = ix86_expand_fp_compare (code, op1, op2,
18039                                       tmp);
18040
18041   /* Remove pushed operand from stack.  */
18042   if (pushed)
18043     ix86_free_from_memory (GET_MODE (pushed));
18044
18045   i = emit_jump_insn (gen_rtx_SET
18046                       (VOIDmode, pc_rtx,
18047                        gen_rtx_IF_THEN_ELSE (VOIDmode,
18048                                              condition, target1, target2)));
18049   if (split_branch_probability >= 0)
18050     add_reg_note (i, REG_BR_PROB, GEN_INT (split_branch_probability));
18051 }
18052
18053 void
18054 ix86_expand_setcc (rtx dest, enum rtx_code code, rtx op0, rtx op1)
18055 {
18056   rtx ret;
18057
18058   gcc_assert (GET_MODE (dest) == QImode);
18059
18060   ret = ix86_expand_compare (code, op0, op1);
18061   PUT_MODE (ret, QImode);
18062   emit_insn (gen_rtx_SET (VOIDmode, dest, ret));
18063 }
18064
18065 /* Expand comparison setting or clearing carry flag.  Return true when
18066    successful and set pop for the operation.  */
18067 static bool
18068 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
18069 {
18070   enum machine_mode mode =
18071     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
18072
18073   /* Do not handle double-mode compares that go through special path.  */
18074   if (mode == (TARGET_64BIT ? TImode : DImode))
18075     return false;
18076
18077   if (SCALAR_FLOAT_MODE_P (mode))
18078     {
18079       rtx compare_op, compare_seq;
18080
18081       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
18082
18083       /* Shortcut:  following common codes never translate
18084          into carry flag compares.  */
18085       if (code == EQ || code == NE || code == UNEQ || code == LTGT
18086           || code == ORDERED || code == UNORDERED)
18087         return false;
18088
18089       /* These comparisons require zero flag; swap operands so they won't.  */
18090       if ((code == GT || code == UNLE || code == LE || code == UNGT)
18091           && !TARGET_IEEE_FP)
18092         {
18093           rtx tmp = op0;
18094           op0 = op1;
18095           op1 = tmp;
18096           code = swap_condition (code);
18097         }
18098
18099       /* Try to expand the comparison and verify that we end up with
18100          carry flag based comparison.  This fails to be true only when
18101          we decide to expand comparison using arithmetic that is not
18102          too common scenario.  */
18103       start_sequence ();
18104       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
18105       compare_seq = get_insns ();
18106       end_sequence ();
18107
18108       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
18109           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
18110         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
18111       else
18112         code = GET_CODE (compare_op);
18113
18114       if (code != LTU && code != GEU)
18115         return false;
18116
18117       emit_insn (compare_seq);
18118       *pop = compare_op;
18119       return true;
18120     }
18121
18122   if (!INTEGRAL_MODE_P (mode))
18123     return false;
18124
18125   switch (code)
18126     {
18127     case LTU:
18128     case GEU:
18129       break;
18130
18131     /* Convert a==0 into (unsigned)a<1.  */
18132     case EQ:
18133     case NE:
18134       if (op1 != const0_rtx)
18135         return false;
18136       op1 = const1_rtx;
18137       code = (code == EQ ? LTU : GEU);
18138       break;
18139
18140     /* Convert a>b into b<a or a>=b-1.  */
18141     case GTU:
18142     case LEU:
18143       if (CONST_INT_P (op1))
18144         {
18145           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
18146           /* Bail out on overflow.  We still can swap operands but that
18147              would force loading of the constant into register.  */
18148           if (op1 == const0_rtx
18149               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
18150             return false;
18151           code = (code == GTU ? GEU : LTU);
18152         }
18153       else
18154         {
18155           rtx tmp = op1;
18156           op1 = op0;
18157           op0 = tmp;
18158           code = (code == GTU ? LTU : GEU);
18159         }
18160       break;
18161
18162     /* Convert a>=0 into (unsigned)a<0x80000000.  */
18163     case LT:
18164     case GE:
18165       if (mode == DImode || op1 != const0_rtx)
18166         return false;
18167       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
18168       code = (code == LT ? GEU : LTU);
18169       break;
18170     case LE:
18171     case GT:
18172       if (mode == DImode || op1 != constm1_rtx)
18173         return false;
18174       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
18175       code = (code == LE ? GEU : LTU);
18176       break;
18177
18178     default:
18179       return false;
18180     }
18181   /* Swapping operands may cause constant to appear as first operand.  */
18182   if (!nonimmediate_operand (op0, VOIDmode))
18183     {
18184       if (!can_create_pseudo_p ())
18185         return false;
18186       op0 = force_reg (mode, op0);
18187     }
18188   *pop = ix86_expand_compare (code, op0, op1);
18189   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
18190   return true;
18191 }
18192
18193 bool
18194 ix86_expand_int_movcc (rtx operands[])
18195 {
18196   enum rtx_code code = GET_CODE (operands[1]), compare_code;
18197   rtx compare_seq, compare_op;
18198   enum machine_mode mode = GET_MODE (operands[0]);
18199   bool sign_bit_compare_p = false;
18200   rtx op0 = XEXP (operands[1], 0);
18201   rtx op1 = XEXP (operands[1], 1);
18202
18203   start_sequence ();
18204   compare_op = ix86_expand_compare (code, op0, op1);
18205   compare_seq = get_insns ();
18206   end_sequence ();
18207
18208   compare_code = GET_CODE (compare_op);
18209
18210   if ((op1 == const0_rtx && (code == GE || code == LT))
18211       || (op1 == constm1_rtx && (code == GT || code == LE)))
18212     sign_bit_compare_p = true;
18213
18214   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
18215      HImode insns, we'd be swallowed in word prefix ops.  */
18216
18217   if ((mode != HImode || TARGET_FAST_PREFIX)
18218       && (mode != (TARGET_64BIT ? TImode : DImode))
18219       && CONST_INT_P (operands[2])
18220       && CONST_INT_P (operands[3]))
18221     {
18222       rtx out = operands[0];
18223       HOST_WIDE_INT ct = INTVAL (operands[2]);
18224       HOST_WIDE_INT cf = INTVAL (operands[3]);
18225       HOST_WIDE_INT diff;
18226
18227       diff = ct - cf;
18228       /*  Sign bit compares are better done using shifts than we do by using
18229           sbb.  */
18230       if (sign_bit_compare_p
18231           || ix86_expand_carry_flag_compare (code, op0, op1, &compare_op))
18232         {
18233           /* Detect overlap between destination and compare sources.  */
18234           rtx tmp = out;
18235
18236           if (!sign_bit_compare_p)
18237             {
18238               rtx flags;
18239               bool fpcmp = false;
18240
18241               compare_code = GET_CODE (compare_op);
18242
18243               flags = XEXP (compare_op, 0);
18244
18245               if (GET_MODE (flags) == CCFPmode
18246                   || GET_MODE (flags) == CCFPUmode)
18247                 {
18248                   fpcmp = true;
18249                   compare_code
18250                     = ix86_fp_compare_code_to_integer (compare_code);
18251                 }
18252
18253               /* To simplify rest of code, restrict to the GEU case.  */
18254               if (compare_code == LTU)
18255                 {
18256                   HOST_WIDE_INT tmp = ct;
18257                   ct = cf;
18258                   cf = tmp;
18259                   compare_code = reverse_condition (compare_code);
18260                   code = reverse_condition (code);
18261                 }
18262               else
18263                 {
18264                   if (fpcmp)
18265                     PUT_CODE (compare_op,
18266                               reverse_condition_maybe_unordered
18267                                 (GET_CODE (compare_op)));
18268                   else
18269                     PUT_CODE (compare_op,
18270                               reverse_condition (GET_CODE (compare_op)));
18271                 }
18272               diff = ct - cf;
18273
18274               if (reg_overlap_mentioned_p (out, op0)
18275                   || reg_overlap_mentioned_p (out, op1))
18276                 tmp = gen_reg_rtx (mode);
18277
18278               if (mode == DImode)
18279                 emit_insn (gen_x86_movdicc_0_m1 (tmp, flags, compare_op));
18280               else
18281                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp),
18282                                                  flags, compare_op));
18283             }
18284           else
18285             {
18286               if (code == GT || code == GE)
18287                 code = reverse_condition (code);
18288               else
18289                 {
18290                   HOST_WIDE_INT tmp = ct;
18291                   ct = cf;
18292                   cf = tmp;
18293                   diff = ct - cf;
18294                 }
18295               tmp = emit_store_flag (tmp, code, op0, op1, VOIDmode, 0, -1);
18296             }
18297
18298           if (diff == 1)
18299             {
18300               /*
18301                * cmpl op0,op1
18302                * sbbl dest,dest
18303                * [addl dest, ct]
18304                *
18305                * Size 5 - 8.
18306                */
18307               if (ct)
18308                 tmp = expand_simple_binop (mode, PLUS,
18309                                            tmp, GEN_INT (ct),
18310                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18311             }
18312           else if (cf == -1)
18313             {
18314               /*
18315                * cmpl op0,op1
18316                * sbbl dest,dest
18317                * orl $ct, dest
18318                *
18319                * Size 8.
18320                */
18321               tmp = expand_simple_binop (mode, IOR,
18322                                          tmp, GEN_INT (ct),
18323                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
18324             }
18325           else if (diff == -1 && ct)
18326             {
18327               /*
18328                * cmpl op0,op1
18329                * sbbl dest,dest
18330                * notl dest
18331                * [addl dest, cf]
18332                *
18333                * Size 8 - 11.
18334                */
18335               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
18336               if (cf)
18337                 tmp = expand_simple_binop (mode, PLUS,
18338                                            copy_rtx (tmp), GEN_INT (cf),
18339                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18340             }
18341           else
18342             {
18343               /*
18344                * cmpl op0,op1
18345                * sbbl dest,dest
18346                * [notl dest]
18347                * andl cf - ct, dest
18348                * [addl dest, ct]
18349                *
18350                * Size 8 - 11.
18351                */
18352
18353               if (cf == 0)
18354                 {
18355                   cf = ct;
18356                   ct = 0;
18357                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
18358                 }
18359
18360               tmp = expand_simple_binop (mode, AND,
18361                                          copy_rtx (tmp),
18362                                          gen_int_mode (cf - ct, mode),
18363                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
18364               if (ct)
18365                 tmp = expand_simple_binop (mode, PLUS,
18366                                            copy_rtx (tmp), GEN_INT (ct),
18367                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18368             }
18369
18370           if (!rtx_equal_p (tmp, out))
18371             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
18372
18373           return true;
18374         }
18375
18376       if (diff < 0)
18377         {
18378           enum machine_mode cmp_mode = GET_MODE (op0);
18379
18380           HOST_WIDE_INT tmp;
18381           tmp = ct, ct = cf, cf = tmp;
18382           diff = -diff;
18383
18384           if (SCALAR_FLOAT_MODE_P (cmp_mode))
18385             {
18386               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
18387
18388               /* We may be reversing unordered compare to normal compare, that
18389                  is not valid in general (we may convert non-trapping condition
18390                  to trapping one), however on i386 we currently emit all
18391                  comparisons unordered.  */
18392               compare_code = reverse_condition_maybe_unordered (compare_code);
18393               code = reverse_condition_maybe_unordered (code);
18394             }
18395           else
18396             {
18397               compare_code = reverse_condition (compare_code);
18398               code = reverse_condition (code);
18399             }
18400         }
18401
18402       compare_code = UNKNOWN;
18403       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
18404           && CONST_INT_P (op1))
18405         {
18406           if (op1 == const0_rtx
18407               && (code == LT || code == GE))
18408             compare_code = code;
18409           else if (op1 == constm1_rtx)
18410             {
18411               if (code == LE)
18412                 compare_code = LT;
18413               else if (code == GT)
18414                 compare_code = GE;
18415             }
18416         }
18417
18418       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
18419       if (compare_code != UNKNOWN
18420           && GET_MODE (op0) == GET_MODE (out)
18421           && (cf == -1 || ct == -1))
18422         {
18423           /* If lea code below could be used, only optimize
18424              if it results in a 2 insn sequence.  */
18425
18426           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
18427                  || diff == 3 || diff == 5 || diff == 9)
18428               || (compare_code == LT && ct == -1)
18429               || (compare_code == GE && cf == -1))
18430             {
18431               /*
18432                * notl op1       (if necessary)
18433                * sarl $31, op1
18434                * orl cf, op1
18435                */
18436               if (ct != -1)
18437                 {
18438                   cf = ct;
18439                   ct = -1;
18440                   code = reverse_condition (code);
18441                 }
18442
18443               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, -1);
18444
18445               out = expand_simple_binop (mode, IOR,
18446                                          out, GEN_INT (cf),
18447                                          out, 1, OPTAB_DIRECT);
18448               if (out != operands[0])
18449                 emit_move_insn (operands[0], out);
18450
18451               return true;
18452             }
18453         }
18454
18455
18456       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
18457            || diff == 3 || diff == 5 || diff == 9)
18458           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
18459           && (mode != DImode
18460               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
18461         {
18462           /*
18463            * xorl dest,dest
18464            * cmpl op1,op2
18465            * setcc dest
18466            * lea cf(dest*(ct-cf)),dest
18467            *
18468            * Size 14.
18469            *
18470            * This also catches the degenerate setcc-only case.
18471            */
18472
18473           rtx tmp;
18474           int nops;
18475
18476           out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, 1);
18477
18478           nops = 0;
18479           /* On x86_64 the lea instruction operates on Pmode, so we need
18480              to get arithmetics done in proper mode to match.  */
18481           if (diff == 1)
18482             tmp = copy_rtx (out);
18483           else
18484             {
18485               rtx out1;
18486               out1 = copy_rtx (out);
18487               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
18488               nops++;
18489               if (diff & 1)
18490                 {
18491                   tmp = gen_rtx_PLUS (mode, tmp, out1);
18492                   nops++;
18493                 }
18494             }
18495           if (cf != 0)
18496             {
18497               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
18498               nops++;
18499             }
18500           if (!rtx_equal_p (tmp, out))
18501             {
18502               if (nops == 1)
18503                 out = force_operand (tmp, copy_rtx (out));
18504               else
18505                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
18506             }
18507           if (!rtx_equal_p (out, operands[0]))
18508             emit_move_insn (operands[0], copy_rtx (out));
18509
18510           return true;
18511         }
18512
18513       /*
18514        * General case:                  Jumpful:
18515        *   xorl dest,dest               cmpl op1, op2
18516        *   cmpl op1, op2                movl ct, dest
18517        *   setcc dest                   jcc 1f
18518        *   decl dest                    movl cf, dest
18519        *   andl (cf-ct),dest            1:
18520        *   addl ct,dest
18521        *
18522        * Size 20.                       Size 14.
18523        *
18524        * This is reasonably steep, but branch mispredict costs are
18525        * high on modern cpus, so consider failing only if optimizing
18526        * for space.
18527        */
18528
18529       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
18530           && BRANCH_COST (optimize_insn_for_speed_p (),
18531                           false) >= 2)
18532         {
18533           if (cf == 0)
18534             {
18535               enum machine_mode cmp_mode = GET_MODE (op0);
18536
18537               cf = ct;
18538               ct = 0;
18539
18540               if (SCALAR_FLOAT_MODE_P (cmp_mode))
18541                 {
18542                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
18543
18544                   /* We may be reversing unordered compare to normal compare,
18545                      that is not valid in general (we may convert non-trapping
18546                      condition to trapping one), however on i386 we currently
18547                      emit all comparisons unordered.  */
18548                   code = reverse_condition_maybe_unordered (code);
18549                 }
18550               else
18551                 {
18552                   code = reverse_condition (code);
18553                   if (compare_code != UNKNOWN)
18554                     compare_code = reverse_condition (compare_code);
18555                 }
18556             }
18557
18558           if (compare_code != UNKNOWN)
18559             {
18560               /* notl op1       (if needed)
18561                  sarl $31, op1
18562                  andl (cf-ct), op1
18563                  addl ct, op1
18564
18565                  For x < 0 (resp. x <= -1) there will be no notl,
18566                  so if possible swap the constants to get rid of the
18567                  complement.
18568                  True/false will be -1/0 while code below (store flag
18569                  followed by decrement) is 0/-1, so the constants need
18570                  to be exchanged once more.  */
18571
18572               if (compare_code == GE || !cf)
18573                 {
18574                   code = reverse_condition (code);
18575                   compare_code = LT;
18576                 }
18577               else
18578                 {
18579                   HOST_WIDE_INT tmp = cf;
18580                   cf = ct;
18581                   ct = tmp;
18582                 }
18583
18584               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, -1);
18585             }
18586           else
18587             {
18588               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, 1);
18589
18590               out = expand_simple_binop (mode, PLUS, copy_rtx (out),
18591                                          constm1_rtx,
18592                                          copy_rtx (out), 1, OPTAB_DIRECT);
18593             }
18594
18595           out = expand_simple_binop (mode, AND, copy_rtx (out),
18596                                      gen_int_mode (cf - ct, mode),
18597                                      copy_rtx (out), 1, OPTAB_DIRECT);
18598           if (ct)
18599             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
18600                                        copy_rtx (out), 1, OPTAB_DIRECT);
18601           if (!rtx_equal_p (out, operands[0]))
18602             emit_move_insn (operands[0], copy_rtx (out));
18603
18604           return true;
18605         }
18606     }
18607
18608   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
18609     {
18610       /* Try a few things more with specific constants and a variable.  */
18611
18612       optab op;
18613       rtx var, orig_out, out, tmp;
18614
18615       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
18616         return false;
18617
18618       /* If one of the two operands is an interesting constant, load a
18619          constant with the above and mask it in with a logical operation.  */
18620
18621       if (CONST_INT_P (operands[2]))
18622         {
18623           var = operands[3];
18624           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
18625             operands[3] = constm1_rtx, op = and_optab;
18626           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
18627             operands[3] = const0_rtx, op = ior_optab;
18628           else
18629             return false;
18630         }
18631       else if (CONST_INT_P (operands[3]))
18632         {
18633           var = operands[2];
18634           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
18635             operands[2] = constm1_rtx, op = and_optab;
18636           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
18637             operands[2] = const0_rtx, op = ior_optab;
18638           else
18639             return false;
18640         }
18641       else
18642         return false;
18643
18644       orig_out = operands[0];
18645       tmp = gen_reg_rtx (mode);
18646       operands[0] = tmp;
18647
18648       /* Recurse to get the constant loaded.  */
18649       if (ix86_expand_int_movcc (operands) == 0)
18650         return false;
18651
18652       /* Mask in the interesting variable.  */
18653       out = expand_binop (mode, op, var, tmp, orig_out, 0,
18654                           OPTAB_WIDEN);
18655       if (!rtx_equal_p (out, orig_out))
18656         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
18657
18658       return true;
18659     }
18660
18661   /*
18662    * For comparison with above,
18663    *
18664    * movl cf,dest
18665    * movl ct,tmp
18666    * cmpl op1,op2
18667    * cmovcc tmp,dest
18668    *
18669    * Size 15.
18670    */
18671
18672   if (! nonimmediate_operand (operands[2], mode))
18673     operands[2] = force_reg (mode, operands[2]);
18674   if (! nonimmediate_operand (operands[3], mode))
18675     operands[3] = force_reg (mode, operands[3]);
18676
18677   if (! register_operand (operands[2], VOIDmode)
18678       && (mode == QImode
18679           || ! register_operand (operands[3], VOIDmode)))
18680     operands[2] = force_reg (mode, operands[2]);
18681
18682   if (mode == QImode
18683       && ! register_operand (operands[3], VOIDmode))
18684     operands[3] = force_reg (mode, operands[3]);
18685
18686   emit_insn (compare_seq);
18687   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
18688                           gen_rtx_IF_THEN_ELSE (mode,
18689                                                 compare_op, operands[2],
18690                                                 operands[3])));
18691   return true;
18692 }
18693
18694 /* Swap, force into registers, or otherwise massage the two operands
18695    to an sse comparison with a mask result.  Thus we differ a bit from
18696    ix86_prepare_fp_compare_args which expects to produce a flags result.
18697
18698    The DEST operand exists to help determine whether to commute commutative
18699    operators.  The POP0/POP1 operands are updated in place.  The new
18700    comparison code is returned, or UNKNOWN if not implementable.  */
18701
18702 static enum rtx_code
18703 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
18704                                   rtx *pop0, rtx *pop1)
18705 {
18706   rtx tmp;
18707
18708   switch (code)
18709     {
18710     case LTGT:
18711     case UNEQ:
18712       /* We have no LTGT as an operator.  We could implement it with
18713          NE & ORDERED, but this requires an extra temporary.  It's
18714          not clear that it's worth it.  */
18715       return UNKNOWN;
18716
18717     case LT:
18718     case LE:
18719     case UNGT:
18720     case UNGE:
18721       /* These are supported directly.  */
18722       break;
18723
18724     case EQ:
18725     case NE:
18726     case UNORDERED:
18727     case ORDERED:
18728       /* For commutative operators, try to canonicalize the destination
18729          operand to be first in the comparison - this helps reload to
18730          avoid extra moves.  */
18731       if (!dest || !rtx_equal_p (dest, *pop1))
18732         break;
18733       /* FALLTHRU */
18734
18735     case GE:
18736     case GT:
18737     case UNLE:
18738     case UNLT:
18739       /* These are not supported directly.  Swap the comparison operands
18740          to transform into something that is supported.  */
18741       tmp = *pop0;
18742       *pop0 = *pop1;
18743       *pop1 = tmp;
18744       code = swap_condition (code);
18745       break;
18746
18747     default:
18748       gcc_unreachable ();
18749     }
18750
18751   return code;
18752 }
18753
18754 /* Detect conditional moves that exactly match min/max operational
18755    semantics.  Note that this is IEEE safe, as long as we don't
18756    interchange the operands.
18757
18758    Returns FALSE if this conditional move doesn't match a MIN/MAX,
18759    and TRUE if the operation is successful and instructions are emitted.  */
18760
18761 static bool
18762 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
18763                            rtx cmp_op1, rtx if_true, rtx if_false)
18764 {
18765   enum machine_mode mode;
18766   bool is_min;
18767   rtx tmp;
18768
18769   if (code == LT)
18770     ;
18771   else if (code == UNGE)
18772     {
18773       tmp = if_true;
18774       if_true = if_false;
18775       if_false = tmp;
18776     }
18777   else
18778     return false;
18779
18780   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
18781     is_min = true;
18782   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
18783     is_min = false;
18784   else
18785     return false;
18786
18787   mode = GET_MODE (dest);
18788
18789   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
18790      but MODE may be a vector mode and thus not appropriate.  */
18791   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
18792     {
18793       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
18794       rtvec v;
18795
18796       if_true = force_reg (mode, if_true);
18797       v = gen_rtvec (2, if_true, if_false);
18798       tmp = gen_rtx_UNSPEC (mode, v, u);
18799     }
18800   else
18801     {
18802       code = is_min ? SMIN : SMAX;
18803       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
18804     }
18805
18806   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
18807   return true;
18808 }
18809
18810 /* Expand an sse vector comparison.  Return the register with the result.  */
18811
18812 static rtx
18813 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
18814                      rtx op_true, rtx op_false)
18815 {
18816   enum machine_mode mode = GET_MODE (dest);
18817   rtx x;
18818
18819   cmp_op0 = force_reg (mode, cmp_op0);
18820   if (!nonimmediate_operand (cmp_op1, mode))
18821     cmp_op1 = force_reg (mode, cmp_op1);
18822
18823   if (optimize
18824       || reg_overlap_mentioned_p (dest, op_true)
18825       || reg_overlap_mentioned_p (dest, op_false))
18826     dest = gen_reg_rtx (mode);
18827
18828   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
18829   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18830
18831   return dest;
18832 }
18833
18834 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
18835    operations.  This is used for both scalar and vector conditional moves.  */
18836
18837 static void
18838 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
18839 {
18840   enum machine_mode mode = GET_MODE (dest);
18841   rtx t2, t3, x;
18842
18843   if (op_false == CONST0_RTX (mode))
18844     {
18845       op_true = force_reg (mode, op_true);
18846       x = gen_rtx_AND (mode, cmp, op_true);
18847       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18848     }
18849   else if (op_true == CONST0_RTX (mode))
18850     {
18851       op_false = force_reg (mode, op_false);
18852       x = gen_rtx_NOT (mode, cmp);
18853       x = gen_rtx_AND (mode, x, op_false);
18854       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18855     }
18856   else if (TARGET_XOP)
18857     {
18858       rtx pcmov = gen_rtx_SET (mode, dest,
18859                                gen_rtx_IF_THEN_ELSE (mode, cmp,
18860                                                      op_true,
18861                                                      op_false));
18862       emit_insn (pcmov);
18863     }
18864   else
18865     {
18866       op_true = force_reg (mode, op_true);
18867       op_false = force_reg (mode, op_false);
18868
18869       t2 = gen_reg_rtx (mode);
18870       if (optimize)
18871         t3 = gen_reg_rtx (mode);
18872       else
18873         t3 = dest;
18874
18875       x = gen_rtx_AND (mode, op_true, cmp);
18876       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
18877
18878       x = gen_rtx_NOT (mode, cmp);
18879       x = gen_rtx_AND (mode, x, op_false);
18880       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
18881
18882       x = gen_rtx_IOR (mode, t3, t2);
18883       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18884     }
18885 }
18886
18887 /* Expand a floating-point conditional move.  Return true if successful.  */
18888
18889 bool
18890 ix86_expand_fp_movcc (rtx operands[])
18891 {
18892   enum machine_mode mode = GET_MODE (operands[0]);
18893   enum rtx_code code = GET_CODE (operands[1]);
18894   rtx tmp, compare_op;
18895   rtx op0 = XEXP (operands[1], 0);
18896   rtx op1 = XEXP (operands[1], 1);
18897
18898   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
18899     {
18900       enum machine_mode cmode;
18901
18902       /* Since we've no cmove for sse registers, don't force bad register
18903          allocation just to gain access to it.  Deny movcc when the
18904          comparison mode doesn't match the move mode.  */
18905       cmode = GET_MODE (op0);
18906       if (cmode == VOIDmode)
18907         cmode = GET_MODE (op1);
18908       if (cmode != mode)
18909         return false;
18910
18911       code = ix86_prepare_sse_fp_compare_args (operands[0], code, &op0, &op1);
18912       if (code == UNKNOWN)
18913         return false;
18914
18915       if (ix86_expand_sse_fp_minmax (operands[0], code, op0, op1,
18916                                      operands[2], operands[3]))
18917         return true;
18918
18919       tmp = ix86_expand_sse_cmp (operands[0], code, op0, op1,
18920                                  operands[2], operands[3]);
18921       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
18922       return true;
18923     }
18924
18925   /* The floating point conditional move instructions don't directly
18926      support conditions resulting from a signed integer comparison.  */
18927
18928   compare_op = ix86_expand_compare (code, op0, op1);
18929   if (!fcmov_comparison_operator (compare_op, VOIDmode))
18930     {
18931       tmp = gen_reg_rtx (QImode);
18932       ix86_expand_setcc (tmp, code, op0, op1);
18933
18934       compare_op = ix86_expand_compare (NE, tmp, const0_rtx);
18935     }
18936
18937   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
18938                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
18939                                                 operands[2], operands[3])));
18940
18941   return true;
18942 }
18943
18944 /* Expand a floating-point vector conditional move; a vcond operation
18945    rather than a movcc operation.  */
18946
18947 bool
18948 ix86_expand_fp_vcond (rtx operands[])
18949 {
18950   enum rtx_code code = GET_CODE (operands[3]);
18951   rtx cmp;
18952
18953   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
18954                                            &operands[4], &operands[5]);
18955   if (code == UNKNOWN)
18956     return false;
18957
18958   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
18959                                  operands[5], operands[1], operands[2]))
18960     return true;
18961
18962   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
18963                              operands[1], operands[2]);
18964   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
18965   return true;
18966 }
18967
18968 /* Expand a signed/unsigned integral vector conditional move.  */
18969
18970 bool
18971 ix86_expand_int_vcond (rtx operands[])
18972 {
18973   enum machine_mode mode = GET_MODE (operands[0]);
18974   enum rtx_code code = GET_CODE (operands[3]);
18975   bool negate = false;
18976   rtx x, cop0, cop1;
18977
18978   cop0 = operands[4];
18979   cop1 = operands[5];
18980
18981   /* XOP supports all of the comparisons on all vector int types.  */
18982   if (!TARGET_XOP)
18983     {
18984       /* Canonicalize the comparison to EQ, GT, GTU.  */
18985       switch (code)
18986         {
18987         case EQ:
18988         case GT:
18989         case GTU:
18990           break;
18991
18992         case NE:
18993         case LE:
18994         case LEU:
18995           code = reverse_condition (code);
18996           negate = true;
18997           break;
18998
18999         case GE:
19000         case GEU:
19001           code = reverse_condition (code);
19002           negate = true;
19003           /* FALLTHRU */
19004
19005         case LT:
19006         case LTU:
19007           code = swap_condition (code);
19008           x = cop0, cop0 = cop1, cop1 = x;
19009           break;
19010
19011         default:
19012           gcc_unreachable ();
19013         }
19014
19015       /* Only SSE4.1/SSE4.2 supports V2DImode.  */
19016       if (mode == V2DImode)
19017         {
19018           switch (code)
19019             {
19020             case EQ:
19021               /* SSE4.1 supports EQ.  */
19022               if (!TARGET_SSE4_1)
19023                 return false;
19024               break;
19025
19026             case GT:
19027             case GTU:
19028               /* SSE4.2 supports GT/GTU.  */
19029               if (!TARGET_SSE4_2)
19030                 return false;
19031               break;
19032
19033             default:
19034               gcc_unreachable ();
19035             }
19036         }
19037
19038       /* Unsigned parallel compare is not supported by the hardware.
19039          Play some tricks to turn this into a signed comparison
19040          against 0.  */
19041       if (code == GTU)
19042         {
19043           cop0 = force_reg (mode, cop0);
19044
19045           switch (mode)
19046             {
19047             case V4SImode:
19048             case V2DImode:
19049                 {
19050                   rtx t1, t2, mask;
19051                   rtx (*gen_sub3) (rtx, rtx, rtx);
19052
19053                   /* Subtract (-(INT MAX) - 1) from both operands to make
19054                      them signed.  */
19055                   mask = ix86_build_signbit_mask (mode, true, false);
19056                   gen_sub3 = (mode == V4SImode
19057                               ? gen_subv4si3 : gen_subv2di3);
19058                   t1 = gen_reg_rtx (mode);
19059                   emit_insn (gen_sub3 (t1, cop0, mask));
19060
19061                   t2 = gen_reg_rtx (mode);
19062                   emit_insn (gen_sub3 (t2, cop1, mask));
19063
19064                   cop0 = t1;
19065                   cop1 = t2;
19066                   code = GT;
19067                 }
19068               break;
19069
19070             case V16QImode:
19071             case V8HImode:
19072               /* Perform a parallel unsigned saturating subtraction.  */
19073               x = gen_reg_rtx (mode);
19074               emit_insn (gen_rtx_SET (VOIDmode, x,
19075                                       gen_rtx_US_MINUS (mode, cop0, cop1)));
19076
19077               cop0 = x;
19078               cop1 = CONST0_RTX (mode);
19079               code = EQ;
19080               negate = !negate;
19081               break;
19082
19083             default:
19084               gcc_unreachable ();
19085             }
19086         }
19087     }
19088
19089   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
19090                            operands[1+negate], operands[2-negate]);
19091
19092   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
19093                          operands[2-negate]);
19094   return true;
19095 }
19096
19097 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
19098    true if we should do zero extension, else sign extension.  HIGH_P is
19099    true if we want the N/2 high elements, else the low elements.  */
19100
19101 void
19102 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
19103 {
19104   enum machine_mode imode = GET_MODE (operands[1]);
19105   rtx tmp, dest;
19106
19107   if (TARGET_SSE4_1)
19108     {
19109       rtx (*unpack)(rtx, rtx);
19110
19111       switch (imode)
19112         {
19113         case V16QImode:
19114           if (unsigned_p)
19115             unpack = gen_sse4_1_zero_extendv8qiv8hi2;
19116           else
19117             unpack = gen_sse4_1_sign_extendv8qiv8hi2;
19118           break;
19119         case V8HImode:
19120           if (unsigned_p)
19121             unpack = gen_sse4_1_zero_extendv4hiv4si2;
19122           else
19123             unpack = gen_sse4_1_sign_extendv4hiv4si2;
19124           break;
19125         case V4SImode:
19126           if (unsigned_p)
19127             unpack = gen_sse4_1_zero_extendv2siv2di2;
19128           else
19129             unpack = gen_sse4_1_sign_extendv2siv2di2;
19130           break;
19131         default:
19132           gcc_unreachable ();
19133         }
19134
19135       if (high_p)
19136         {
19137           /* Shift higher 8 bytes to lower 8 bytes.  */
19138           tmp = gen_reg_rtx (imode);
19139           emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, tmp),
19140                                          gen_lowpart (V1TImode, operands[1]),
19141                                          GEN_INT (64)));
19142         }
19143       else
19144         tmp = operands[1];
19145
19146       emit_insn (unpack (operands[0], tmp));
19147     }
19148   else
19149     {
19150       rtx (*unpack)(rtx, rtx, rtx);
19151
19152       switch (imode)
19153         {
19154         case V16QImode:
19155           if (high_p)
19156             unpack = gen_vec_interleave_highv16qi;
19157           else
19158             unpack = gen_vec_interleave_lowv16qi;
19159           break;
19160         case V8HImode:
19161           if (high_p)
19162             unpack = gen_vec_interleave_highv8hi;
19163           else
19164             unpack = gen_vec_interleave_lowv8hi;
19165           break;
19166         case V4SImode:
19167           if (high_p)
19168             unpack = gen_vec_interleave_highv4si;
19169           else
19170             unpack = gen_vec_interleave_lowv4si;
19171           break;
19172         default:
19173           gcc_unreachable ();
19174         }
19175
19176       dest = gen_lowpart (imode, operands[0]);
19177
19178       if (unsigned_p)
19179         tmp = force_reg (imode, CONST0_RTX (imode));
19180       else
19181         tmp = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
19182                                    operands[1], pc_rtx, pc_rtx);
19183
19184       emit_insn (unpack (dest, operands[1], tmp));
19185     }
19186 }
19187
19188 /* Expand conditional increment or decrement using adb/sbb instructions.
19189    The default case using setcc followed by the conditional move can be
19190    done by generic code.  */
19191 bool
19192 ix86_expand_int_addcc (rtx operands[])
19193 {
19194   enum rtx_code code = GET_CODE (operands[1]);
19195   rtx flags;
19196   rtx (*insn)(rtx, rtx, rtx, rtx, rtx);
19197   rtx compare_op;
19198   rtx val = const0_rtx;
19199   bool fpcmp = false;
19200   enum machine_mode mode;
19201   rtx op0 = XEXP (operands[1], 0);
19202   rtx op1 = XEXP (operands[1], 1);
19203
19204   if (operands[3] != const1_rtx
19205       && operands[3] != constm1_rtx)
19206     return false;
19207   if (!ix86_expand_carry_flag_compare (code, op0, op1, &compare_op))
19208      return false;
19209   code = GET_CODE (compare_op);
19210
19211   flags = XEXP (compare_op, 0);
19212
19213   if (GET_MODE (flags) == CCFPmode
19214       || GET_MODE (flags) == CCFPUmode)
19215     {
19216       fpcmp = true;
19217       code = ix86_fp_compare_code_to_integer (code);
19218     }
19219
19220   if (code != LTU)
19221     {
19222       val = constm1_rtx;
19223       if (fpcmp)
19224         PUT_CODE (compare_op,
19225                   reverse_condition_maybe_unordered
19226                     (GET_CODE (compare_op)));
19227       else
19228         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
19229     }
19230
19231   mode = GET_MODE (operands[0]);
19232
19233   /* Construct either adc or sbb insn.  */
19234   if ((code == LTU) == (operands[3] == constm1_rtx))
19235     {
19236       switch (mode)
19237         {
19238           case QImode:
19239             insn = gen_subqi3_carry;
19240             break;
19241           case HImode:
19242             insn = gen_subhi3_carry;
19243             break;
19244           case SImode:
19245             insn = gen_subsi3_carry;
19246             break;
19247           case DImode:
19248             insn = gen_subdi3_carry;
19249             break;
19250           default:
19251             gcc_unreachable ();
19252         }
19253     }
19254   else
19255     {
19256       switch (mode)
19257         {
19258           case QImode:
19259             insn = gen_addqi3_carry;
19260             break;
19261           case HImode:
19262             insn = gen_addhi3_carry;
19263             break;
19264           case SImode:
19265             insn = gen_addsi3_carry;
19266             break;
19267           case DImode:
19268             insn = gen_adddi3_carry;
19269             break;
19270           default:
19271             gcc_unreachable ();
19272         }
19273     }
19274   emit_insn (insn (operands[0], operands[2], val, flags, compare_op));
19275
19276   return true;
19277 }
19278
19279
19280 /* Split operands 0 and 1 into half-mode parts.  Similar to split_double_mode,
19281    but works for floating pointer parameters and nonoffsetable memories.
19282    For pushes, it returns just stack offsets; the values will be saved
19283    in the right order.  Maximally three parts are generated.  */
19284
19285 static int
19286 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
19287 {
19288   int size;
19289
19290   if (!TARGET_64BIT)
19291     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
19292   else
19293     size = (GET_MODE_SIZE (mode) + 4) / 8;
19294
19295   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
19296   gcc_assert (size >= 2 && size <= 4);
19297
19298   /* Optimize constant pool reference to immediates.  This is used by fp
19299      moves, that force all constants to memory to allow combining.  */
19300   if (MEM_P (operand) && MEM_READONLY_P (operand))
19301     {
19302       rtx tmp = maybe_get_pool_constant (operand);
19303       if (tmp)
19304         operand = tmp;
19305     }
19306
19307   if (MEM_P (operand) && !offsettable_memref_p (operand))
19308     {
19309       /* The only non-offsetable memories we handle are pushes.  */
19310       int ok = push_operand (operand, VOIDmode);
19311
19312       gcc_assert (ok);
19313
19314       operand = copy_rtx (operand);
19315       PUT_MODE (operand, Pmode);
19316       parts[0] = parts[1] = parts[2] = parts[3] = operand;
19317       return size;
19318     }
19319
19320   if (GET_CODE (operand) == CONST_VECTOR)
19321     {
19322       enum machine_mode imode = int_mode_for_mode (mode);
19323       /* Caution: if we looked through a constant pool memory above,
19324          the operand may actually have a different mode now.  That's
19325          ok, since we want to pun this all the way back to an integer.  */
19326       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
19327       gcc_assert (operand != NULL);
19328       mode = imode;
19329     }
19330
19331   if (!TARGET_64BIT)
19332     {
19333       if (mode == DImode)
19334         split_double_mode (mode, &operand, 1, &parts[0], &parts[1]);
19335       else
19336         {
19337           int i;
19338
19339           if (REG_P (operand))
19340             {
19341               gcc_assert (reload_completed);
19342               for (i = 0; i < size; i++)
19343                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
19344             }
19345           else if (offsettable_memref_p (operand))
19346             {
19347               operand = adjust_address (operand, SImode, 0);
19348               parts[0] = operand;
19349               for (i = 1; i < size; i++)
19350                 parts[i] = adjust_address (operand, SImode, 4 * i);
19351             }
19352           else if (GET_CODE (operand) == CONST_DOUBLE)
19353             {
19354               REAL_VALUE_TYPE r;
19355               long l[4];
19356
19357               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
19358               switch (mode)
19359                 {
19360                 case TFmode:
19361                   real_to_target (l, &r, mode);
19362                   parts[3] = gen_int_mode (l[3], SImode);
19363                   parts[2] = gen_int_mode (l[2], SImode);
19364                   break;
19365                 case XFmode:
19366                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
19367                   parts[2] = gen_int_mode (l[2], SImode);
19368                   break;
19369                 case DFmode:
19370                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
19371                   break;
19372                 default:
19373                   gcc_unreachable ();
19374                 }
19375               parts[1] = gen_int_mode (l[1], SImode);
19376               parts[0] = gen_int_mode (l[0], SImode);
19377             }
19378           else
19379             gcc_unreachable ();
19380         }
19381     }
19382   else
19383     {
19384       if (mode == TImode)
19385         split_double_mode (mode, &operand, 1, &parts[0], &parts[1]);
19386       if (mode == XFmode || mode == TFmode)
19387         {
19388           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
19389           if (REG_P (operand))
19390             {
19391               gcc_assert (reload_completed);
19392               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
19393               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
19394             }
19395           else if (offsettable_memref_p (operand))
19396             {
19397               operand = adjust_address (operand, DImode, 0);
19398               parts[0] = operand;
19399               parts[1] = adjust_address (operand, upper_mode, 8);
19400             }
19401           else if (GET_CODE (operand) == CONST_DOUBLE)
19402             {
19403               REAL_VALUE_TYPE r;
19404               long l[4];
19405
19406               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
19407               real_to_target (l, &r, mode);
19408
19409               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
19410               if (HOST_BITS_PER_WIDE_INT >= 64)
19411                 parts[0]
19412                   = gen_int_mode
19413                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
19414                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
19415                        DImode);
19416               else
19417                 parts[0] = immed_double_const (l[0], l[1], DImode);
19418
19419               if (upper_mode == SImode)
19420                 parts[1] = gen_int_mode (l[2], SImode);
19421               else if (HOST_BITS_PER_WIDE_INT >= 64)
19422                 parts[1]
19423                   = gen_int_mode
19424                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
19425                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
19426                        DImode);
19427               else
19428                 parts[1] = immed_double_const (l[2], l[3], DImode);
19429             }
19430           else
19431             gcc_unreachable ();
19432         }
19433     }
19434
19435   return size;
19436 }
19437
19438 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
19439    Return false when normal moves are needed; true when all required
19440    insns have been emitted.  Operands 2-4 contain the input values
19441    int the correct order; operands 5-7 contain the output values.  */
19442
19443 void
19444 ix86_split_long_move (rtx operands[])
19445 {
19446   rtx part[2][4];
19447   int nparts, i, j;
19448   int push = 0;
19449   int collisions = 0;
19450   enum machine_mode mode = GET_MODE (operands[0]);
19451   bool collisionparts[4];
19452
19453   /* The DFmode expanders may ask us to move double.
19454      For 64bit target this is single move.  By hiding the fact
19455      here we simplify i386.md splitters.  */
19456   if (TARGET_64BIT && GET_MODE_SIZE (GET_MODE (operands[0])) == 8)
19457     {
19458       /* Optimize constant pool reference to immediates.  This is used by
19459          fp moves, that force all constants to memory to allow combining.  */
19460
19461       if (MEM_P (operands[1])
19462           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
19463           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
19464         operands[1] = get_pool_constant (XEXP (operands[1], 0));
19465       if (push_operand (operands[0], VOIDmode))
19466         {
19467           operands[0] = copy_rtx (operands[0]);
19468           PUT_MODE (operands[0], Pmode);
19469         }
19470       else
19471         operands[0] = gen_lowpart (DImode, operands[0]);
19472       operands[1] = gen_lowpart (DImode, operands[1]);
19473       emit_move_insn (operands[0], operands[1]);
19474       return;
19475     }
19476
19477   /* The only non-offsettable memory we handle is push.  */
19478   if (push_operand (operands[0], VOIDmode))
19479     push = 1;
19480   else
19481     gcc_assert (!MEM_P (operands[0])
19482                 || offsettable_memref_p (operands[0]));
19483
19484   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
19485   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
19486
19487   /* When emitting push, take care for source operands on the stack.  */
19488   if (push && MEM_P (operands[1])
19489       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
19490     {
19491       rtx src_base = XEXP (part[1][nparts - 1], 0);
19492
19493       /* Compensate for the stack decrement by 4.  */
19494       if (!TARGET_64BIT && nparts == 3
19495           && mode == XFmode && TARGET_128BIT_LONG_DOUBLE)
19496         src_base = plus_constant (src_base, 4);
19497
19498       /* src_base refers to the stack pointer and is
19499          automatically decreased by emitted push.  */
19500       for (i = 0; i < nparts; i++)
19501         part[1][i] = change_address (part[1][i],
19502                                      GET_MODE (part[1][i]), src_base);
19503     }
19504
19505   /* We need to do copy in the right order in case an address register
19506      of the source overlaps the destination.  */
19507   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
19508     {
19509       rtx tmp;
19510
19511       for (i = 0; i < nparts; i++)
19512         {
19513           collisionparts[i]
19514             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
19515           if (collisionparts[i])
19516             collisions++;
19517         }
19518
19519       /* Collision in the middle part can be handled by reordering.  */
19520       if (collisions == 1 && nparts == 3 && collisionparts [1])
19521         {
19522           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
19523           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
19524         }
19525       else if (collisions == 1
19526                && nparts == 4
19527                && (collisionparts [1] || collisionparts [2]))
19528         {
19529           if (collisionparts [1])
19530             {
19531               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
19532               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
19533             }
19534           else
19535             {
19536               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
19537               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
19538             }
19539         }
19540
19541       /* If there are more collisions, we can't handle it by reordering.
19542          Do an lea to the last part and use only one colliding move.  */
19543       else if (collisions > 1)
19544         {
19545           rtx base;
19546
19547           collisions = 1;
19548
19549           base = part[0][nparts - 1];
19550
19551           /* Handle the case when the last part isn't valid for lea.
19552              Happens in 64-bit mode storing the 12-byte XFmode.  */
19553           if (GET_MODE (base) != Pmode)
19554             base = gen_rtx_REG (Pmode, REGNO (base));
19555
19556           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
19557           part[1][0] = replace_equiv_address (part[1][0], base);
19558           for (i = 1; i < nparts; i++)
19559             {
19560               tmp = plus_constant (base, UNITS_PER_WORD * i);
19561               part[1][i] = replace_equiv_address (part[1][i], tmp);
19562             }
19563         }
19564     }
19565
19566   if (push)
19567     {
19568       if (!TARGET_64BIT)
19569         {
19570           if (nparts == 3)
19571             {
19572               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
19573                 emit_insn (gen_addsi3 (stack_pointer_rtx,
19574                                        stack_pointer_rtx, GEN_INT (-4)));
19575               emit_move_insn (part[0][2], part[1][2]);
19576             }
19577           else if (nparts == 4)
19578             {
19579               emit_move_insn (part[0][3], part[1][3]);
19580               emit_move_insn (part[0][2], part[1][2]);
19581             }
19582         }
19583       else
19584         {
19585           /* In 64bit mode we don't have 32bit push available.  In case this is
19586              register, it is OK - we will just use larger counterpart.  We also
19587              retype memory - these comes from attempt to avoid REX prefix on
19588              moving of second half of TFmode value.  */
19589           if (GET_MODE (part[1][1]) == SImode)
19590             {
19591               switch (GET_CODE (part[1][1]))
19592                 {
19593                 case MEM:
19594                   part[1][1] = adjust_address (part[1][1], DImode, 0);
19595                   break;
19596
19597                 case REG:
19598                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
19599                   break;
19600
19601                 default:
19602                   gcc_unreachable ();
19603                 }
19604
19605               if (GET_MODE (part[1][0]) == SImode)
19606                 part[1][0] = part[1][1];
19607             }
19608         }
19609       emit_move_insn (part[0][1], part[1][1]);
19610       emit_move_insn (part[0][0], part[1][0]);
19611       return;
19612     }
19613
19614   /* Choose correct order to not overwrite the source before it is copied.  */
19615   if ((REG_P (part[0][0])
19616        && REG_P (part[1][1])
19617        && (REGNO (part[0][0]) == REGNO (part[1][1])
19618            || (nparts == 3
19619                && REGNO (part[0][0]) == REGNO (part[1][2]))
19620            || (nparts == 4
19621                && REGNO (part[0][0]) == REGNO (part[1][3]))))
19622       || (collisions > 0
19623           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
19624     {
19625       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
19626         {
19627           operands[2 + i] = part[0][j];
19628           operands[6 + i] = part[1][j];
19629         }
19630     }
19631   else
19632     {
19633       for (i = 0; i < nparts; i++)
19634         {
19635           operands[2 + i] = part[0][i];
19636           operands[6 + i] = part[1][i];
19637         }
19638     }
19639
19640   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
19641   if (optimize_insn_for_size_p ())
19642     {
19643       for (j = 0; j < nparts - 1; j++)
19644         if (CONST_INT_P (operands[6 + j])
19645             && operands[6 + j] != const0_rtx
19646             && REG_P (operands[2 + j]))
19647           for (i = j; i < nparts - 1; i++)
19648             if (CONST_INT_P (operands[7 + i])
19649                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
19650               operands[7 + i] = operands[2 + j];
19651     }
19652
19653   for (i = 0; i < nparts; i++)
19654     emit_move_insn (operands[2 + i], operands[6 + i]);
19655
19656   return;
19657 }
19658
19659 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
19660    left shift by a constant, either using a single shift or
19661    a sequence of add instructions.  */
19662
19663 static void
19664 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
19665 {
19666   rtx (*insn)(rtx, rtx, rtx);
19667
19668   if (count == 1
19669       || (count * ix86_cost->add <= ix86_cost->shift_const
19670           && !optimize_insn_for_size_p ()))
19671     {
19672       insn = mode == DImode ? gen_addsi3 : gen_adddi3;
19673       while (count-- > 0)
19674         emit_insn (insn (operand, operand, operand));
19675     }
19676   else
19677     {
19678       insn = mode == DImode ? gen_ashlsi3 : gen_ashldi3;
19679       emit_insn (insn (operand, operand, GEN_INT (count)));
19680     }
19681 }
19682
19683 void
19684 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
19685 {
19686   rtx (*gen_ashl3)(rtx, rtx, rtx);
19687   rtx (*gen_shld)(rtx, rtx, rtx);
19688   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19689
19690   rtx low[2], high[2];
19691   int count;
19692
19693   if (CONST_INT_P (operands[2]))
19694     {
19695       split_double_mode (mode, operands, 2, low, high);
19696       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19697
19698       if (count >= half_width)
19699         {
19700           emit_move_insn (high[0], low[1]);
19701           emit_move_insn (low[0], const0_rtx);
19702
19703           if (count > half_width)
19704             ix86_expand_ashl_const (high[0], count - half_width, mode);
19705         }
19706       else
19707         {
19708           gen_shld = mode == DImode ? gen_x86_shld : gen_x86_64_shld;
19709
19710           if (!rtx_equal_p (operands[0], operands[1]))
19711             emit_move_insn (operands[0], operands[1]);
19712
19713           emit_insn (gen_shld (high[0], low[0], GEN_INT (count)));
19714           ix86_expand_ashl_const (low[0], count, mode);
19715         }
19716       return;
19717     }
19718
19719   split_double_mode (mode, operands, 1, low, high);
19720
19721   gen_ashl3 = mode == DImode ? gen_ashlsi3 : gen_ashldi3;
19722
19723   if (operands[1] == const1_rtx)
19724     {
19725       /* Assuming we've chosen a QImode capable registers, then 1 << N
19726          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
19727       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
19728         {
19729           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
19730
19731           ix86_expand_clear (low[0]);
19732           ix86_expand_clear (high[0]);
19733           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (half_width)));
19734
19735           d = gen_lowpart (QImode, low[0]);
19736           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
19737           s = gen_rtx_EQ (QImode, flags, const0_rtx);
19738           emit_insn (gen_rtx_SET (VOIDmode, d, s));
19739
19740           d = gen_lowpart (QImode, high[0]);
19741           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
19742           s = gen_rtx_NE (QImode, flags, const0_rtx);
19743           emit_insn (gen_rtx_SET (VOIDmode, d, s));
19744         }
19745
19746       /* Otherwise, we can get the same results by manually performing
19747          a bit extract operation on bit 5/6, and then performing the two
19748          shifts.  The two methods of getting 0/1 into low/high are exactly
19749          the same size.  Avoiding the shift in the bit extract case helps
19750          pentium4 a bit; no one else seems to care much either way.  */
19751       else
19752         {
19753           enum machine_mode half_mode;
19754           rtx (*gen_lshr3)(rtx, rtx, rtx);
19755           rtx (*gen_and3)(rtx, rtx, rtx);
19756           rtx (*gen_xor3)(rtx, rtx, rtx);
19757           HOST_WIDE_INT bits;
19758           rtx x;
19759
19760           if (mode == DImode)
19761             {
19762               half_mode = SImode;
19763               gen_lshr3 = gen_lshrsi3;
19764               gen_and3 = gen_andsi3;
19765               gen_xor3 = gen_xorsi3;
19766               bits = 5;
19767             }
19768           else
19769             {
19770               half_mode = DImode;
19771               gen_lshr3 = gen_lshrdi3;
19772               gen_and3 = gen_anddi3;
19773               gen_xor3 = gen_xordi3;
19774               bits = 6;
19775             }
19776
19777           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
19778             x = gen_rtx_ZERO_EXTEND (half_mode, operands[2]);
19779           else
19780             x = gen_lowpart (half_mode, operands[2]);
19781           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
19782
19783           emit_insn (gen_lshr3 (high[0], high[0], GEN_INT (bits)));
19784           emit_insn (gen_and3 (high[0], high[0], const1_rtx));
19785           emit_move_insn (low[0], high[0]);
19786           emit_insn (gen_xor3 (low[0], low[0], const1_rtx));
19787         }
19788
19789       emit_insn (gen_ashl3 (low[0], low[0], operands[2]));
19790       emit_insn (gen_ashl3 (high[0], high[0], operands[2]));
19791       return;
19792     }
19793
19794   if (operands[1] == constm1_rtx)
19795     {
19796       /* For -1 << N, we can avoid the shld instruction, because we
19797          know that we're shifting 0...31/63 ones into a -1.  */
19798       emit_move_insn (low[0], constm1_rtx);
19799       if (optimize_insn_for_size_p ())
19800         emit_move_insn (high[0], low[0]);
19801       else
19802         emit_move_insn (high[0], constm1_rtx);
19803     }
19804   else
19805     {
19806       gen_shld = mode == DImode ? gen_x86_shld : gen_x86_64_shld;
19807
19808       if (!rtx_equal_p (operands[0], operands[1]))
19809         emit_move_insn (operands[0], operands[1]);
19810
19811       split_double_mode (mode, operands, 1, low, high);
19812       emit_insn (gen_shld (high[0], low[0], operands[2]));
19813     }
19814
19815   emit_insn (gen_ashl3 (low[0], low[0], operands[2]));
19816
19817   if (TARGET_CMOVE && scratch)
19818     {
19819       rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19820         = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19821
19822       ix86_expand_clear (scratch);
19823       emit_insn (gen_x86_shift_adj_1 (high[0], low[0], operands[2], scratch));
19824     }
19825   else
19826     {
19827       rtx (*gen_x86_shift_adj_2)(rtx, rtx, rtx)
19828         = mode == DImode ? gen_x86_shiftsi_adj_2 : gen_x86_shiftdi_adj_2;
19829
19830       emit_insn (gen_x86_shift_adj_2 (high[0], low[0], operands[2]));
19831     }
19832 }
19833
19834 void
19835 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
19836 {
19837   rtx (*gen_ashr3)(rtx, rtx, rtx)
19838     = mode == DImode ? gen_ashrsi3 : gen_ashrdi3;
19839   rtx (*gen_shrd)(rtx, rtx, rtx);
19840   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19841
19842   rtx low[2], high[2];
19843   int count;
19844
19845   if (CONST_INT_P (operands[2]))
19846     {
19847       split_double_mode (mode, operands, 2, low, high);
19848       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19849
19850       if (count == GET_MODE_BITSIZE (mode) - 1)
19851         {
19852           emit_move_insn (high[0], high[1]);
19853           emit_insn (gen_ashr3 (high[0], high[0],
19854                                 GEN_INT (half_width - 1)));
19855           emit_move_insn (low[0], high[0]);
19856
19857         }
19858       else if (count >= half_width)
19859         {
19860           emit_move_insn (low[0], high[1]);
19861           emit_move_insn (high[0], low[0]);
19862           emit_insn (gen_ashr3 (high[0], high[0],
19863                                 GEN_INT (half_width - 1)));
19864
19865           if (count > half_width)
19866             emit_insn (gen_ashr3 (low[0], low[0],
19867                                   GEN_INT (count - half_width)));
19868         }
19869       else
19870         {
19871           gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19872
19873           if (!rtx_equal_p (operands[0], operands[1]))
19874             emit_move_insn (operands[0], operands[1]);
19875
19876           emit_insn (gen_shrd (low[0], high[0], GEN_INT (count)));
19877           emit_insn (gen_ashr3 (high[0], high[0], GEN_INT (count)));
19878         }
19879     }
19880   else
19881     {
19882       gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19883
19884      if (!rtx_equal_p (operands[0], operands[1]))
19885         emit_move_insn (operands[0], operands[1]);
19886
19887       split_double_mode (mode, operands, 1, low, high);
19888
19889       emit_insn (gen_shrd (low[0], high[0], operands[2]));
19890       emit_insn (gen_ashr3 (high[0], high[0], operands[2]));
19891
19892       if (TARGET_CMOVE && scratch)
19893         {
19894           rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19895             = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19896
19897           emit_move_insn (scratch, high[0]);
19898           emit_insn (gen_ashr3 (scratch, scratch,
19899                                 GEN_INT (half_width - 1)));
19900           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
19901                                           scratch));
19902         }
19903       else
19904         {
19905           rtx (*gen_x86_shift_adj_3)(rtx, rtx, rtx)
19906             = mode == DImode ? gen_x86_shiftsi_adj_3 : gen_x86_shiftdi_adj_3;
19907
19908           emit_insn (gen_x86_shift_adj_3 (low[0], high[0], operands[2]));
19909         }
19910     }
19911 }
19912
19913 void
19914 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
19915 {
19916   rtx (*gen_lshr3)(rtx, rtx, rtx)
19917     = mode == DImode ? gen_lshrsi3 : gen_lshrdi3;
19918   rtx (*gen_shrd)(rtx, rtx, rtx);
19919   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19920
19921   rtx low[2], high[2];
19922   int count;
19923
19924   if (CONST_INT_P (operands[2]))
19925     {
19926       split_double_mode (mode, operands, 2, low, high);
19927       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19928
19929       if (count >= half_width)
19930         {
19931           emit_move_insn (low[0], high[1]);
19932           ix86_expand_clear (high[0]);
19933
19934           if (count > half_width)
19935             emit_insn (gen_lshr3 (low[0], low[0],
19936                                   GEN_INT (count - half_width)));
19937         }
19938       else
19939         {
19940           gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19941
19942           if (!rtx_equal_p (operands[0], operands[1]))
19943             emit_move_insn (operands[0], operands[1]);
19944
19945           emit_insn (gen_shrd (low[0], high[0], GEN_INT (count)));
19946           emit_insn (gen_lshr3 (high[0], high[0], GEN_INT (count)));
19947         }
19948     }
19949   else
19950     {
19951       gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19952
19953       if (!rtx_equal_p (operands[0], operands[1]))
19954         emit_move_insn (operands[0], operands[1]);
19955
19956       split_double_mode (mode, operands, 1, low, high);
19957
19958       emit_insn (gen_shrd (low[0], high[0], operands[2]));
19959       emit_insn (gen_lshr3 (high[0], high[0], operands[2]));
19960
19961       if (TARGET_CMOVE && scratch)
19962         {
19963           rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19964             = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19965
19966           ix86_expand_clear (scratch);
19967           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
19968                                           scratch));
19969         }
19970       else
19971         {
19972           rtx (*gen_x86_shift_adj_2)(rtx, rtx, rtx)
19973             = mode == DImode ? gen_x86_shiftsi_adj_2 : gen_x86_shiftdi_adj_2;
19974
19975           emit_insn (gen_x86_shift_adj_2 (low[0], high[0], operands[2]));
19976         }
19977     }
19978 }
19979
19980 /* Predict just emitted jump instruction to be taken with probability PROB.  */
19981 static void
19982 predict_jump (int prob)
19983 {
19984   rtx insn = get_last_insn ();
19985   gcc_assert (JUMP_P (insn));
19986   add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
19987 }
19988
19989 /* Helper function for the string operations below.  Dest VARIABLE whether
19990    it is aligned to VALUE bytes.  If true, jump to the label.  */
19991 static rtx
19992 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
19993 {
19994   rtx label = gen_label_rtx ();
19995   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
19996   if (GET_MODE (variable) == DImode)
19997     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
19998   else
19999     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
20000   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
20001                            1, label);
20002   if (epilogue)
20003     predict_jump (REG_BR_PROB_BASE * 50 / 100);
20004   else
20005     predict_jump (REG_BR_PROB_BASE * 90 / 100);
20006   return label;
20007 }
20008
20009 /* Adjust COUNTER by the VALUE.  */
20010 static void
20011 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
20012 {
20013   rtx (*gen_add)(rtx, rtx, rtx)
20014     = GET_MODE (countreg) == DImode ? gen_adddi3 : gen_addsi3;
20015
20016   emit_insn (gen_add (countreg, countreg, GEN_INT (-value)));
20017 }
20018
20019 /* Zero extend possibly SImode EXP to Pmode register.  */
20020 rtx
20021 ix86_zero_extend_to_Pmode (rtx exp)
20022 {
20023   rtx r;
20024   if (GET_MODE (exp) == VOIDmode)
20025     return force_reg (Pmode, exp);
20026   if (GET_MODE (exp) == Pmode)
20027     return copy_to_mode_reg (Pmode, exp);
20028   r = gen_reg_rtx (Pmode);
20029   emit_insn (gen_zero_extendsidi2 (r, exp));
20030   return r;
20031 }
20032
20033 /* Divide COUNTREG by SCALE.  */
20034 static rtx
20035 scale_counter (rtx countreg, int scale)
20036 {
20037   rtx sc;
20038
20039   if (scale == 1)
20040     return countreg;
20041   if (CONST_INT_P (countreg))
20042     return GEN_INT (INTVAL (countreg) / scale);
20043   gcc_assert (REG_P (countreg));
20044
20045   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
20046                             GEN_INT (exact_log2 (scale)),
20047                             NULL, 1, OPTAB_DIRECT);
20048   return sc;
20049 }
20050
20051 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
20052    DImode for constant loop counts.  */
20053
20054 static enum machine_mode
20055 counter_mode (rtx count_exp)
20056 {
20057   if (GET_MODE (count_exp) != VOIDmode)
20058     return GET_MODE (count_exp);
20059   if (!CONST_INT_P (count_exp))
20060     return Pmode;
20061   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
20062     return DImode;
20063   return SImode;
20064 }
20065
20066 /* When SRCPTR is non-NULL, output simple loop to move memory
20067    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
20068    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
20069    equivalent loop to set memory by VALUE (supposed to be in MODE).
20070
20071    The size is rounded down to whole number of chunk size moved at once.
20072    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
20073
20074
20075 static void
20076 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
20077                                rtx destptr, rtx srcptr, rtx value,
20078                                rtx count, enum machine_mode mode, int unroll,
20079                                int expected_size)
20080 {
20081   rtx out_label, top_label, iter, tmp;
20082   enum machine_mode iter_mode = counter_mode (count);
20083   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
20084   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
20085   rtx size;
20086   rtx x_addr;
20087   rtx y_addr;
20088   int i;
20089
20090   top_label = gen_label_rtx ();
20091   out_label = gen_label_rtx ();
20092   iter = gen_reg_rtx (iter_mode);
20093
20094   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
20095                               NULL, 1, OPTAB_DIRECT);
20096   /* Those two should combine.  */
20097   if (piece_size == const1_rtx)
20098     {
20099       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
20100                                true, out_label);
20101       predict_jump (REG_BR_PROB_BASE * 10 / 100);
20102     }
20103   emit_move_insn (iter, const0_rtx);
20104
20105   emit_label (top_label);
20106
20107   tmp = convert_modes (Pmode, iter_mode, iter, true);
20108   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
20109   destmem = change_address (destmem, mode, x_addr);
20110
20111   if (srcmem)
20112     {
20113       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
20114       srcmem = change_address (srcmem, mode, y_addr);
20115
20116       /* When unrolling for chips that reorder memory reads and writes,
20117          we can save registers by using single temporary.
20118          Also using 4 temporaries is overkill in 32bit mode.  */
20119       if (!TARGET_64BIT && 0)
20120         {
20121           for (i = 0; i < unroll; i++)
20122             {
20123               if (i)
20124                 {
20125                   destmem =
20126                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20127                   srcmem =
20128                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
20129                 }
20130               emit_move_insn (destmem, srcmem);
20131             }
20132         }
20133       else
20134         {
20135           rtx tmpreg[4];
20136           gcc_assert (unroll <= 4);
20137           for (i = 0; i < unroll; i++)
20138             {
20139               tmpreg[i] = gen_reg_rtx (mode);
20140               if (i)
20141                 {
20142                   srcmem =
20143                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
20144                 }
20145               emit_move_insn (tmpreg[i], srcmem);
20146             }
20147           for (i = 0; i < unroll; i++)
20148             {
20149               if (i)
20150                 {
20151                   destmem =
20152                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20153                 }
20154               emit_move_insn (destmem, tmpreg[i]);
20155             }
20156         }
20157     }
20158   else
20159     for (i = 0; i < unroll; i++)
20160       {
20161         if (i)
20162           destmem =
20163             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20164         emit_move_insn (destmem, value);
20165       }
20166
20167   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
20168                              true, OPTAB_LIB_WIDEN);
20169   if (tmp != iter)
20170     emit_move_insn (iter, tmp);
20171
20172   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
20173                            true, top_label);
20174   if (expected_size != -1)
20175     {
20176       expected_size /= GET_MODE_SIZE (mode) * unroll;
20177       if (expected_size == 0)
20178         predict_jump (0);
20179       else if (expected_size > REG_BR_PROB_BASE)
20180         predict_jump (REG_BR_PROB_BASE - 1);
20181       else
20182         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
20183     }
20184   else
20185     predict_jump (REG_BR_PROB_BASE * 80 / 100);
20186   iter = ix86_zero_extend_to_Pmode (iter);
20187   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
20188                              true, OPTAB_LIB_WIDEN);
20189   if (tmp != destptr)
20190     emit_move_insn (destptr, tmp);
20191   if (srcptr)
20192     {
20193       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
20194                                  true, OPTAB_LIB_WIDEN);
20195       if (tmp != srcptr)
20196         emit_move_insn (srcptr, tmp);
20197     }
20198   emit_label (out_label);
20199 }
20200
20201 /* Output "rep; mov" instruction.
20202    Arguments have same meaning as for previous function */
20203 static void
20204 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
20205                            rtx destptr, rtx srcptr,
20206                            rtx count,
20207                            enum machine_mode mode)
20208 {
20209   rtx destexp;
20210   rtx srcexp;
20211   rtx countreg;
20212
20213   /* If the size is known, it is shorter to use rep movs.  */
20214   if (mode == QImode && CONST_INT_P (count)
20215       && !(INTVAL (count) & 3))
20216     mode = SImode;
20217
20218   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
20219     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
20220   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
20221     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
20222   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
20223   if (mode != QImode)
20224     {
20225       destexp = gen_rtx_ASHIFT (Pmode, countreg,
20226                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20227       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
20228       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
20229                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20230       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
20231     }
20232   else
20233     {
20234       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
20235       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
20236     }
20237   if (CONST_INT_P (count))
20238     {
20239       count = GEN_INT (INTVAL (count)
20240                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
20241       destmem = shallow_copy_rtx (destmem);
20242       srcmem = shallow_copy_rtx (srcmem);
20243       set_mem_size (destmem, count);
20244       set_mem_size (srcmem, count);
20245     }
20246   else
20247     {
20248       if (MEM_SIZE (destmem))
20249         set_mem_size (destmem, NULL_RTX);
20250       if (MEM_SIZE (srcmem))
20251         set_mem_size (srcmem, NULL_RTX);
20252     }
20253   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
20254                           destexp, srcexp));
20255 }
20256
20257 /* Output "rep; stos" instruction.
20258    Arguments have same meaning as for previous function */
20259 static void
20260 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
20261                             rtx count, enum machine_mode mode,
20262                             rtx orig_value)
20263 {
20264   rtx destexp;
20265   rtx countreg;
20266
20267   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
20268     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
20269   value = force_reg (mode, gen_lowpart (mode, value));
20270   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
20271   if (mode != QImode)
20272     {
20273       destexp = gen_rtx_ASHIFT (Pmode, countreg,
20274                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20275       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
20276     }
20277   else
20278     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
20279   if (orig_value == const0_rtx && CONST_INT_P (count))
20280     {
20281       count = GEN_INT (INTVAL (count)
20282                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
20283       destmem = shallow_copy_rtx (destmem);
20284       set_mem_size (destmem, count);
20285     }
20286   else if (MEM_SIZE (destmem))
20287     set_mem_size (destmem, NULL_RTX);
20288   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
20289 }
20290
20291 static void
20292 emit_strmov (rtx destmem, rtx srcmem,
20293              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
20294 {
20295   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
20296   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
20297   emit_insn (gen_strmov (destptr, dest, srcptr, src));
20298 }
20299
20300 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
20301 static void
20302 expand_movmem_epilogue (rtx destmem, rtx srcmem,
20303                         rtx destptr, rtx srcptr, rtx count, int max_size)
20304 {
20305   rtx src, dest;
20306   if (CONST_INT_P (count))
20307     {
20308       HOST_WIDE_INT countval = INTVAL (count);
20309       int offset = 0;
20310
20311       if ((countval & 0x10) && max_size > 16)
20312         {
20313           if (TARGET_64BIT)
20314             {
20315               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
20316               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
20317             }
20318           else
20319             gcc_unreachable ();
20320           offset += 16;
20321         }
20322       if ((countval & 0x08) && max_size > 8)
20323         {
20324           if (TARGET_64BIT)
20325             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
20326           else
20327             {
20328               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
20329               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
20330             }
20331           offset += 8;
20332         }
20333       if ((countval & 0x04) && max_size > 4)
20334         {
20335           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
20336           offset += 4;
20337         }
20338       if ((countval & 0x02) && max_size > 2)
20339         {
20340           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
20341           offset += 2;
20342         }
20343       if ((countval & 0x01) && max_size > 1)
20344         {
20345           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
20346           offset += 1;
20347         }
20348       return;
20349     }
20350   if (max_size > 8)
20351     {
20352       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
20353                                     count, 1, OPTAB_DIRECT);
20354       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
20355                                      count, QImode, 1, 4);
20356       return;
20357     }
20358
20359   /* When there are stringops, we can cheaply increase dest and src pointers.
20360      Otherwise we save code size by maintaining offset (zero is readily
20361      available from preceding rep operation) and using x86 addressing modes.
20362    */
20363   if (TARGET_SINGLE_STRINGOP)
20364     {
20365       if (max_size > 4)
20366         {
20367           rtx label = ix86_expand_aligntest (count, 4, true);
20368           src = change_address (srcmem, SImode, srcptr);
20369           dest = change_address (destmem, SImode, destptr);
20370           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20371           emit_label (label);
20372           LABEL_NUSES (label) = 1;
20373         }
20374       if (max_size > 2)
20375         {
20376           rtx label = ix86_expand_aligntest (count, 2, true);
20377           src = change_address (srcmem, HImode, srcptr);
20378           dest = change_address (destmem, HImode, destptr);
20379           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20380           emit_label (label);
20381           LABEL_NUSES (label) = 1;
20382         }
20383       if (max_size > 1)
20384         {
20385           rtx label = ix86_expand_aligntest (count, 1, true);
20386           src = change_address (srcmem, QImode, srcptr);
20387           dest = change_address (destmem, QImode, destptr);
20388           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20389           emit_label (label);
20390           LABEL_NUSES (label) = 1;
20391         }
20392     }
20393   else
20394     {
20395       rtx offset = force_reg (Pmode, const0_rtx);
20396       rtx tmp;
20397
20398       if (max_size > 4)
20399         {
20400           rtx label = ix86_expand_aligntest (count, 4, true);
20401           src = change_address (srcmem, SImode, srcptr);
20402           dest = change_address (destmem, SImode, destptr);
20403           emit_move_insn (dest, src);
20404           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
20405                                      true, OPTAB_LIB_WIDEN);
20406           if (tmp != offset)
20407             emit_move_insn (offset, tmp);
20408           emit_label (label);
20409           LABEL_NUSES (label) = 1;
20410         }
20411       if (max_size > 2)
20412         {
20413           rtx label = ix86_expand_aligntest (count, 2, true);
20414           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
20415           src = change_address (srcmem, HImode, tmp);
20416           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
20417           dest = change_address (destmem, HImode, tmp);
20418           emit_move_insn (dest, src);
20419           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
20420                                      true, OPTAB_LIB_WIDEN);
20421           if (tmp != offset)
20422             emit_move_insn (offset, tmp);
20423           emit_label (label);
20424           LABEL_NUSES (label) = 1;
20425         }
20426       if (max_size > 1)
20427         {
20428           rtx label = ix86_expand_aligntest (count, 1, true);
20429           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
20430           src = change_address (srcmem, QImode, tmp);
20431           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
20432           dest = change_address (destmem, QImode, tmp);
20433           emit_move_insn (dest, src);
20434           emit_label (label);
20435           LABEL_NUSES (label) = 1;
20436         }
20437     }
20438 }
20439
20440 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
20441 static void
20442 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
20443                                  rtx count, int max_size)
20444 {
20445   count =
20446     expand_simple_binop (counter_mode (count), AND, count,
20447                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
20448   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
20449                                  gen_lowpart (QImode, value), count, QImode,
20450                                  1, max_size / 2);
20451 }
20452
20453 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
20454 static void
20455 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
20456 {
20457   rtx dest;
20458
20459   if (CONST_INT_P (count))
20460     {
20461       HOST_WIDE_INT countval = INTVAL (count);
20462       int offset = 0;
20463
20464       if ((countval & 0x10) && max_size > 16)
20465         {
20466           if (TARGET_64BIT)
20467             {
20468               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
20469               emit_insn (gen_strset (destptr, dest, value));
20470               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
20471               emit_insn (gen_strset (destptr, dest, value));
20472             }
20473           else
20474             gcc_unreachable ();
20475           offset += 16;
20476         }
20477       if ((countval & 0x08) && max_size > 8)
20478         {
20479           if (TARGET_64BIT)
20480             {
20481               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
20482               emit_insn (gen_strset (destptr, dest, value));
20483             }
20484           else
20485             {
20486               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
20487               emit_insn (gen_strset (destptr, dest, value));
20488               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
20489               emit_insn (gen_strset (destptr, dest, value));
20490             }
20491           offset += 8;
20492         }
20493       if ((countval & 0x04) && max_size > 4)
20494         {
20495           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
20496           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
20497           offset += 4;
20498         }
20499       if ((countval & 0x02) && max_size > 2)
20500         {
20501           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
20502           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
20503           offset += 2;
20504         }
20505       if ((countval & 0x01) && max_size > 1)
20506         {
20507           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
20508           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
20509           offset += 1;
20510         }
20511       return;
20512     }
20513   if (max_size > 32)
20514     {
20515       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
20516       return;
20517     }
20518   if (max_size > 16)
20519     {
20520       rtx label = ix86_expand_aligntest (count, 16, true);
20521       if (TARGET_64BIT)
20522         {
20523           dest = change_address (destmem, DImode, destptr);
20524           emit_insn (gen_strset (destptr, dest, value));
20525           emit_insn (gen_strset (destptr, dest, value));
20526         }
20527       else
20528         {
20529           dest = change_address (destmem, SImode, destptr);
20530           emit_insn (gen_strset (destptr, dest, value));
20531           emit_insn (gen_strset (destptr, dest, value));
20532           emit_insn (gen_strset (destptr, dest, value));
20533           emit_insn (gen_strset (destptr, dest, value));
20534         }
20535       emit_label (label);
20536       LABEL_NUSES (label) = 1;
20537     }
20538   if (max_size > 8)
20539     {
20540       rtx label = ix86_expand_aligntest (count, 8, true);
20541       if (TARGET_64BIT)
20542         {
20543           dest = change_address (destmem, DImode, destptr);
20544           emit_insn (gen_strset (destptr, dest, value));
20545         }
20546       else
20547         {
20548           dest = change_address (destmem, SImode, destptr);
20549           emit_insn (gen_strset (destptr, dest, value));
20550           emit_insn (gen_strset (destptr, dest, value));
20551         }
20552       emit_label (label);
20553       LABEL_NUSES (label) = 1;
20554     }
20555   if (max_size > 4)
20556     {
20557       rtx label = ix86_expand_aligntest (count, 4, true);
20558       dest = change_address (destmem, SImode, destptr);
20559       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
20560       emit_label (label);
20561       LABEL_NUSES (label) = 1;
20562     }
20563   if (max_size > 2)
20564     {
20565       rtx label = ix86_expand_aligntest (count, 2, true);
20566       dest = change_address (destmem, HImode, destptr);
20567       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
20568       emit_label (label);
20569       LABEL_NUSES (label) = 1;
20570     }
20571   if (max_size > 1)
20572     {
20573       rtx label = ix86_expand_aligntest (count, 1, true);
20574       dest = change_address (destmem, QImode, destptr);
20575       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
20576       emit_label (label);
20577       LABEL_NUSES (label) = 1;
20578     }
20579 }
20580
20581 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
20582    DESIRED_ALIGNMENT.  */
20583 static void
20584 expand_movmem_prologue (rtx destmem, rtx srcmem,
20585                         rtx destptr, rtx srcptr, rtx count,
20586                         int align, int desired_alignment)
20587 {
20588   if (align <= 1 && desired_alignment > 1)
20589     {
20590       rtx label = ix86_expand_aligntest (destptr, 1, false);
20591       srcmem = change_address (srcmem, QImode, srcptr);
20592       destmem = change_address (destmem, QImode, destptr);
20593       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20594       ix86_adjust_counter (count, 1);
20595       emit_label (label);
20596       LABEL_NUSES (label) = 1;
20597     }
20598   if (align <= 2 && desired_alignment > 2)
20599     {
20600       rtx label = ix86_expand_aligntest (destptr, 2, false);
20601       srcmem = change_address (srcmem, HImode, srcptr);
20602       destmem = change_address (destmem, HImode, destptr);
20603       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20604       ix86_adjust_counter (count, 2);
20605       emit_label (label);
20606       LABEL_NUSES (label) = 1;
20607     }
20608   if (align <= 4 && desired_alignment > 4)
20609     {
20610       rtx label = ix86_expand_aligntest (destptr, 4, false);
20611       srcmem = change_address (srcmem, SImode, srcptr);
20612       destmem = change_address (destmem, SImode, destptr);
20613       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20614       ix86_adjust_counter (count, 4);
20615       emit_label (label);
20616       LABEL_NUSES (label) = 1;
20617     }
20618   gcc_assert (desired_alignment <= 8);
20619 }
20620
20621 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
20622    ALIGN_BYTES is how many bytes need to be copied.  */
20623 static rtx
20624 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
20625                                  int desired_align, int align_bytes)
20626 {
20627   rtx src = *srcp;
20628   rtx src_size, dst_size;
20629   int off = 0;
20630   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
20631   if (src_align_bytes >= 0)
20632     src_align_bytes = desired_align - src_align_bytes;
20633   src_size = MEM_SIZE (src);
20634   dst_size = MEM_SIZE (dst);
20635   if (align_bytes & 1)
20636     {
20637       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
20638       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
20639       off = 1;
20640       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20641     }
20642   if (align_bytes & 2)
20643     {
20644       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
20645       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
20646       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
20647         set_mem_align (dst, 2 * BITS_PER_UNIT);
20648       if (src_align_bytes >= 0
20649           && (src_align_bytes & 1) == (align_bytes & 1)
20650           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
20651         set_mem_align (src, 2 * BITS_PER_UNIT);
20652       off = 2;
20653       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20654     }
20655   if (align_bytes & 4)
20656     {
20657       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
20658       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
20659       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
20660         set_mem_align (dst, 4 * BITS_PER_UNIT);
20661       if (src_align_bytes >= 0)
20662         {
20663           unsigned int src_align = 0;
20664           if ((src_align_bytes & 3) == (align_bytes & 3))
20665             src_align = 4;
20666           else if ((src_align_bytes & 1) == (align_bytes & 1))
20667             src_align = 2;
20668           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
20669             set_mem_align (src, src_align * BITS_PER_UNIT);
20670         }
20671       off = 4;
20672       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20673     }
20674   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
20675   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
20676   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
20677     set_mem_align (dst, desired_align * BITS_PER_UNIT);
20678   if (src_align_bytes >= 0)
20679     {
20680       unsigned int src_align = 0;
20681       if ((src_align_bytes & 7) == (align_bytes & 7))
20682         src_align = 8;
20683       else if ((src_align_bytes & 3) == (align_bytes & 3))
20684         src_align = 4;
20685       else if ((src_align_bytes & 1) == (align_bytes & 1))
20686         src_align = 2;
20687       if (src_align > (unsigned int) desired_align)
20688         src_align = desired_align;
20689       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
20690         set_mem_align (src, src_align * BITS_PER_UNIT);
20691     }
20692   if (dst_size)
20693     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
20694   if (src_size)
20695     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
20696   *srcp = src;
20697   return dst;
20698 }
20699
20700 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
20701    DESIRED_ALIGNMENT.  */
20702 static void
20703 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
20704                         int align, int desired_alignment)
20705 {
20706   if (align <= 1 && desired_alignment > 1)
20707     {
20708       rtx label = ix86_expand_aligntest (destptr, 1, false);
20709       destmem = change_address (destmem, QImode, destptr);
20710       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
20711       ix86_adjust_counter (count, 1);
20712       emit_label (label);
20713       LABEL_NUSES (label) = 1;
20714     }
20715   if (align <= 2 && desired_alignment > 2)
20716     {
20717       rtx label = ix86_expand_aligntest (destptr, 2, false);
20718       destmem = change_address (destmem, HImode, destptr);
20719       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
20720       ix86_adjust_counter (count, 2);
20721       emit_label (label);
20722       LABEL_NUSES (label) = 1;
20723     }
20724   if (align <= 4 && desired_alignment > 4)
20725     {
20726       rtx label = ix86_expand_aligntest (destptr, 4, false);
20727       destmem = change_address (destmem, SImode, destptr);
20728       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
20729       ix86_adjust_counter (count, 4);
20730       emit_label (label);
20731       LABEL_NUSES (label) = 1;
20732     }
20733   gcc_assert (desired_alignment <= 8);
20734 }
20735
20736 /* Set enough from DST to align DST known to by aligned by ALIGN to
20737    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
20738 static rtx
20739 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
20740                                  int desired_align, int align_bytes)
20741 {
20742   int off = 0;
20743   rtx dst_size = MEM_SIZE (dst);
20744   if (align_bytes & 1)
20745     {
20746       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
20747       off = 1;
20748       emit_insn (gen_strset (destreg, dst,
20749                              gen_lowpart (QImode, value)));
20750     }
20751   if (align_bytes & 2)
20752     {
20753       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
20754       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
20755         set_mem_align (dst, 2 * BITS_PER_UNIT);
20756       off = 2;
20757       emit_insn (gen_strset (destreg, dst,
20758                              gen_lowpart (HImode, value)));
20759     }
20760   if (align_bytes & 4)
20761     {
20762       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
20763       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
20764         set_mem_align (dst, 4 * BITS_PER_UNIT);
20765       off = 4;
20766       emit_insn (gen_strset (destreg, dst,
20767                              gen_lowpart (SImode, value)));
20768     }
20769   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
20770   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
20771     set_mem_align (dst, desired_align * BITS_PER_UNIT);
20772   if (dst_size)
20773     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
20774   return dst;
20775 }
20776
20777 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
20778 static enum stringop_alg
20779 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
20780             int *dynamic_check)
20781 {
20782   const struct stringop_algs * algs;
20783   bool optimize_for_speed;
20784   /* Algorithms using the rep prefix want at least edi and ecx;
20785      additionally, memset wants eax and memcpy wants esi.  Don't
20786      consider such algorithms if the user has appropriated those
20787      registers for their own purposes.  */
20788   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
20789                              || (memset
20790                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
20791
20792 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
20793                            || (alg != rep_prefix_1_byte         \
20794                                && alg != rep_prefix_4_byte      \
20795                                && alg != rep_prefix_8_byte))
20796   const struct processor_costs *cost;
20797
20798   /* Even if the string operation call is cold, we still might spend a lot
20799      of time processing large blocks.  */
20800   if (optimize_function_for_size_p (cfun)
20801       || (optimize_insn_for_size_p ()
20802           && expected_size != -1 && expected_size < 256))
20803     optimize_for_speed = false;
20804   else
20805     optimize_for_speed = true;
20806
20807   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
20808
20809   *dynamic_check = -1;
20810   if (memset)
20811     algs = &cost->memset[TARGET_64BIT != 0];
20812   else
20813     algs = &cost->memcpy[TARGET_64BIT != 0];
20814   if (ix86_stringop_alg != no_stringop && ALG_USABLE_P (ix86_stringop_alg))
20815     return ix86_stringop_alg;
20816   /* rep; movq or rep; movl is the smallest variant.  */
20817   else if (!optimize_for_speed)
20818     {
20819       if (!count || (count & 3))
20820         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
20821       else
20822         return rep_prefix_usable ? rep_prefix_4_byte : loop;
20823     }
20824   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
20825    */
20826   else if (expected_size != -1 && expected_size < 4)
20827     return loop_1_byte;
20828   else if (expected_size != -1)
20829     {
20830       unsigned int i;
20831       enum stringop_alg alg = libcall;
20832       for (i = 0; i < MAX_STRINGOP_ALGS; i++)
20833         {
20834           /* We get here if the algorithms that were not libcall-based
20835              were rep-prefix based and we are unable to use rep prefixes
20836              based on global register usage.  Break out of the loop and
20837              use the heuristic below.  */
20838           if (algs->size[i].max == 0)
20839             break;
20840           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
20841             {
20842               enum stringop_alg candidate = algs->size[i].alg;
20843
20844               if (candidate != libcall && ALG_USABLE_P (candidate))
20845                 alg = candidate;
20846               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
20847                  last non-libcall inline algorithm.  */
20848               if (TARGET_INLINE_ALL_STRINGOPS)
20849                 {
20850                   /* When the current size is best to be copied by a libcall,
20851                      but we are still forced to inline, run the heuristic below
20852                      that will pick code for medium sized blocks.  */
20853                   if (alg != libcall)
20854                     return alg;
20855                   break;
20856                 }
20857               else if (ALG_USABLE_P (candidate))
20858                 return candidate;
20859             }
20860         }
20861       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
20862     }
20863   /* When asked to inline the call anyway, try to pick meaningful choice.
20864      We look for maximal size of block that is faster to copy by hand and
20865      take blocks of at most of that size guessing that average size will
20866      be roughly half of the block.
20867
20868      If this turns out to be bad, we might simply specify the preferred
20869      choice in ix86_costs.  */
20870   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20871       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
20872     {
20873       int max = -1;
20874       enum stringop_alg alg;
20875       int i;
20876       bool any_alg_usable_p = true;
20877
20878       for (i = 0; i < MAX_STRINGOP_ALGS; i++)
20879         {
20880           enum stringop_alg candidate = algs->size[i].alg;
20881           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
20882
20883           if (candidate != libcall && candidate
20884               && ALG_USABLE_P (candidate))
20885               max = algs->size[i].max;
20886         }
20887       /* If there aren't any usable algorithms, then recursing on
20888          smaller sizes isn't going to find anything.  Just return the
20889          simple byte-at-a-time copy loop.  */
20890       if (!any_alg_usable_p)
20891         {
20892           /* Pick something reasonable.  */
20893           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20894             *dynamic_check = 128;
20895           return loop_1_byte;
20896         }
20897       if (max == -1)
20898         max = 4096;
20899       alg = decide_alg (count, max / 2, memset, dynamic_check);
20900       gcc_assert (*dynamic_check == -1);
20901       gcc_assert (alg != libcall);
20902       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20903         *dynamic_check = max;
20904       return alg;
20905     }
20906   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
20907 #undef ALG_USABLE_P
20908 }
20909
20910 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
20911    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
20912 static int
20913 decide_alignment (int align,
20914                   enum stringop_alg alg,
20915                   int expected_size)
20916 {
20917   int desired_align = 0;
20918   switch (alg)
20919     {
20920       case no_stringop:
20921         gcc_unreachable ();
20922       case loop:
20923       case unrolled_loop:
20924         desired_align = GET_MODE_SIZE (Pmode);
20925         break;
20926       case rep_prefix_8_byte:
20927         desired_align = 8;
20928         break;
20929       case rep_prefix_4_byte:
20930         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
20931            copying whole cacheline at once.  */
20932         if (TARGET_PENTIUMPRO)
20933           desired_align = 8;
20934         else
20935           desired_align = 4;
20936         break;
20937       case rep_prefix_1_byte:
20938         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
20939            copying whole cacheline at once.  */
20940         if (TARGET_PENTIUMPRO)
20941           desired_align = 8;
20942         else
20943           desired_align = 1;
20944         break;
20945       case loop_1_byte:
20946         desired_align = 1;
20947         break;
20948       case libcall:
20949         return 0;
20950     }
20951
20952   if (optimize_size)
20953     desired_align = 1;
20954   if (desired_align < align)
20955     desired_align = align;
20956   if (expected_size != -1 && expected_size < 4)
20957     desired_align = align;
20958   return desired_align;
20959 }
20960
20961 /* Return the smallest power of 2 greater than VAL.  */
20962 static int
20963 smallest_pow2_greater_than (int val)
20964 {
20965   int ret = 1;
20966   while (ret <= val)
20967     ret <<= 1;
20968   return ret;
20969 }
20970
20971 /* Expand string move (memcpy) operation.  Use i386 string operations
20972    when profitable.  expand_setmem contains similar code.  The code
20973    depends upon architecture, block size and alignment, but always has
20974    the same overall structure:
20975
20976    1) Prologue guard: Conditional that jumps up to epilogues for small
20977       blocks that can be handled by epilogue alone.  This is faster
20978       but also needed for correctness, since prologue assume the block
20979       is larger than the desired alignment.
20980
20981       Optional dynamic check for size and libcall for large
20982       blocks is emitted here too, with -minline-stringops-dynamically.
20983
20984    2) Prologue: copy first few bytes in order to get destination
20985       aligned to DESIRED_ALIGN.  It is emitted only when ALIGN is less
20986       than DESIRED_ALIGN and up to DESIRED_ALIGN - ALIGN bytes can be
20987       copied.  We emit either a jump tree on power of two sized
20988       blocks, or a byte loop.
20989
20990    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
20991       with specified algorithm.
20992
20993    4) Epilogue: code copying tail of the block that is too small to be
20994       handled by main body (or up to size guarded by prologue guard).  */
20995
20996 bool
20997 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
20998                     rtx expected_align_exp, rtx expected_size_exp)
20999 {
21000   rtx destreg;
21001   rtx srcreg;
21002   rtx label = NULL;
21003   rtx tmp;
21004   rtx jump_around_label = NULL;
21005   HOST_WIDE_INT align = 1;
21006   unsigned HOST_WIDE_INT count = 0;
21007   HOST_WIDE_INT expected_size = -1;
21008   int size_needed = 0, epilogue_size_needed;
21009   int desired_align = 0, align_bytes = 0;
21010   enum stringop_alg alg;
21011   int dynamic_check;
21012   bool need_zero_guard = false;
21013
21014   if (CONST_INT_P (align_exp))
21015     align = INTVAL (align_exp);
21016   /* i386 can do misaligned access on reasonably increased cost.  */
21017   if (CONST_INT_P (expected_align_exp)
21018       && INTVAL (expected_align_exp) > align)
21019     align = INTVAL (expected_align_exp);
21020   /* ALIGN is the minimum of destination and source alignment, but we care here
21021      just about destination alignment.  */
21022   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
21023     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
21024
21025   if (CONST_INT_P (count_exp))
21026     count = expected_size = INTVAL (count_exp);
21027   if (CONST_INT_P (expected_size_exp) && count == 0)
21028     expected_size = INTVAL (expected_size_exp);
21029
21030   /* Make sure we don't need to care about overflow later on.  */
21031   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
21032     return false;
21033
21034   /* Step 0: Decide on preferred algorithm, desired alignment and
21035      size of chunks to be copied by main loop.  */
21036
21037   alg = decide_alg (count, expected_size, false, &dynamic_check);
21038   desired_align = decide_alignment (align, alg, expected_size);
21039
21040   if (!TARGET_ALIGN_STRINGOPS)
21041     align = desired_align;
21042
21043   if (alg == libcall)
21044     return false;
21045   gcc_assert (alg != no_stringop);
21046   if (!count)
21047     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
21048   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
21049   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
21050   switch (alg)
21051     {
21052     case libcall:
21053     case no_stringop:
21054       gcc_unreachable ();
21055     case loop:
21056       need_zero_guard = true;
21057       size_needed = GET_MODE_SIZE (Pmode);
21058       break;
21059     case unrolled_loop:
21060       need_zero_guard = true;
21061       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
21062       break;
21063     case rep_prefix_8_byte:
21064       size_needed = 8;
21065       break;
21066     case rep_prefix_4_byte:
21067       size_needed = 4;
21068       break;
21069     case rep_prefix_1_byte:
21070       size_needed = 1;
21071       break;
21072     case loop_1_byte:
21073       need_zero_guard = true;
21074       size_needed = 1;
21075       break;
21076     }
21077
21078   epilogue_size_needed = size_needed;
21079
21080   /* Step 1: Prologue guard.  */
21081
21082   /* Alignment code needs count to be in register.  */
21083   if (CONST_INT_P (count_exp) && desired_align > align)
21084     {
21085       if (INTVAL (count_exp) > desired_align
21086           && INTVAL (count_exp) > size_needed)
21087         {
21088           align_bytes
21089             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
21090           if (align_bytes <= 0)
21091             align_bytes = 0;
21092           else
21093             align_bytes = desired_align - align_bytes;
21094         }
21095       if (align_bytes == 0)
21096         count_exp = force_reg (counter_mode (count_exp), count_exp);
21097     }
21098   gcc_assert (desired_align >= 1 && align >= 1);
21099
21100   /* Ensure that alignment prologue won't copy past end of block.  */
21101   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
21102     {
21103       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
21104       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
21105          Make sure it is power of 2.  */
21106       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
21107
21108       if (count)
21109         {
21110           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
21111             {
21112               /* If main algorithm works on QImode, no epilogue is needed.
21113                  For small sizes just don't align anything.  */
21114               if (size_needed == 1)
21115                 desired_align = align;
21116               else
21117                 goto epilogue;
21118             }
21119         }
21120       else
21121         {
21122           label = gen_label_rtx ();
21123           emit_cmp_and_jump_insns (count_exp,
21124                                    GEN_INT (epilogue_size_needed),
21125                                    LTU, 0, counter_mode (count_exp), 1, label);
21126           if (expected_size == -1 || expected_size < epilogue_size_needed)
21127             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21128           else
21129             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21130         }
21131     }
21132
21133   /* Emit code to decide on runtime whether library call or inline should be
21134      used.  */
21135   if (dynamic_check != -1)
21136     {
21137       if (CONST_INT_P (count_exp))
21138         {
21139           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
21140             {
21141               emit_block_move_via_libcall (dst, src, count_exp, false);
21142               count_exp = const0_rtx;
21143               goto epilogue;
21144             }
21145         }
21146       else
21147         {
21148           rtx hot_label = gen_label_rtx ();
21149           jump_around_label = gen_label_rtx ();
21150           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
21151                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
21152           predict_jump (REG_BR_PROB_BASE * 90 / 100);
21153           emit_block_move_via_libcall (dst, src, count_exp, false);
21154           emit_jump (jump_around_label);
21155           emit_label (hot_label);
21156         }
21157     }
21158
21159   /* Step 2: Alignment prologue.  */
21160
21161   if (desired_align > align)
21162     {
21163       if (align_bytes == 0)
21164         {
21165           /* Except for the first move in epilogue, we no longer know
21166              constant offset in aliasing info.  It don't seems to worth
21167              the pain to maintain it for the first move, so throw away
21168              the info early.  */
21169           src = change_address (src, BLKmode, srcreg);
21170           dst = change_address (dst, BLKmode, destreg);
21171           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
21172                                   desired_align);
21173         }
21174       else
21175         {
21176           /* If we know how many bytes need to be stored before dst is
21177              sufficiently aligned, maintain aliasing info accurately.  */
21178           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
21179                                                  desired_align, align_bytes);
21180           count_exp = plus_constant (count_exp, -align_bytes);
21181           count -= align_bytes;
21182         }
21183       if (need_zero_guard
21184           && (count < (unsigned HOST_WIDE_INT) size_needed
21185               || (align_bytes == 0
21186                   && count < ((unsigned HOST_WIDE_INT) size_needed
21187                               + desired_align - align))))
21188         {
21189           /* It is possible that we copied enough so the main loop will not
21190              execute.  */
21191           gcc_assert (size_needed > 1);
21192           if (label == NULL_RTX)
21193             label = gen_label_rtx ();
21194           emit_cmp_and_jump_insns (count_exp,
21195                                    GEN_INT (size_needed),
21196                                    LTU, 0, counter_mode (count_exp), 1, label);
21197           if (expected_size == -1
21198               || expected_size < (desired_align - align) / 2 + size_needed)
21199             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21200           else
21201             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21202         }
21203     }
21204   if (label && size_needed == 1)
21205     {
21206       emit_label (label);
21207       LABEL_NUSES (label) = 1;
21208       label = NULL;
21209       epilogue_size_needed = 1;
21210     }
21211   else if (label == NULL_RTX)
21212     epilogue_size_needed = size_needed;
21213
21214   /* Step 3: Main loop.  */
21215
21216   switch (alg)
21217     {
21218     case libcall:
21219     case no_stringop:
21220       gcc_unreachable ();
21221     case loop_1_byte:
21222       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21223                                      count_exp, QImode, 1, expected_size);
21224       break;
21225     case loop:
21226       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21227                                      count_exp, Pmode, 1, expected_size);
21228       break;
21229     case unrolled_loop:
21230       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
21231          registers for 4 temporaries anyway.  */
21232       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21233                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
21234                                      expected_size);
21235       break;
21236     case rep_prefix_8_byte:
21237       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21238                                  DImode);
21239       break;
21240     case rep_prefix_4_byte:
21241       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21242                                  SImode);
21243       break;
21244     case rep_prefix_1_byte:
21245       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21246                                  QImode);
21247       break;
21248     }
21249   /* Adjust properly the offset of src and dest memory for aliasing.  */
21250   if (CONST_INT_P (count_exp))
21251     {
21252       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
21253                                           (count / size_needed) * size_needed);
21254       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
21255                                           (count / size_needed) * size_needed);
21256     }
21257   else
21258     {
21259       src = change_address (src, BLKmode, srcreg);
21260       dst = change_address (dst, BLKmode, destreg);
21261     }
21262
21263   /* Step 4: Epilogue to copy the remaining bytes.  */
21264  epilogue:
21265   if (label)
21266     {
21267       /* When the main loop is done, COUNT_EXP might hold original count,
21268          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
21269          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
21270          bytes. Compensate if needed.  */
21271
21272       if (size_needed < epilogue_size_needed)
21273         {
21274           tmp =
21275             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
21276                                  GEN_INT (size_needed - 1), count_exp, 1,
21277                                  OPTAB_DIRECT);
21278           if (tmp != count_exp)
21279             emit_move_insn (count_exp, tmp);
21280         }
21281       emit_label (label);
21282       LABEL_NUSES (label) = 1;
21283     }
21284
21285   if (count_exp != const0_rtx && epilogue_size_needed > 1)
21286     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
21287                             epilogue_size_needed);
21288   if (jump_around_label)
21289     emit_label (jump_around_label);
21290   return true;
21291 }
21292
21293 /* Helper function for memcpy.  For QImode value 0xXY produce
21294    0xXYXYXYXY of wide specified by MODE.  This is essentially
21295    a * 0x10101010, but we can do slightly better than
21296    synth_mult by unwinding the sequence by hand on CPUs with
21297    slow multiply.  */
21298 static rtx
21299 promote_duplicated_reg (enum machine_mode mode, rtx val)
21300 {
21301   enum machine_mode valmode = GET_MODE (val);
21302   rtx tmp;
21303   int nops = mode == DImode ? 3 : 2;
21304
21305   gcc_assert (mode == SImode || mode == DImode);
21306   if (val == const0_rtx)
21307     return copy_to_mode_reg (mode, const0_rtx);
21308   if (CONST_INT_P (val))
21309     {
21310       HOST_WIDE_INT v = INTVAL (val) & 255;
21311
21312       v |= v << 8;
21313       v |= v << 16;
21314       if (mode == DImode)
21315         v |= (v << 16) << 16;
21316       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
21317     }
21318
21319   if (valmode == VOIDmode)
21320     valmode = QImode;
21321   if (valmode != QImode)
21322     val = gen_lowpart (QImode, val);
21323   if (mode == QImode)
21324     return val;
21325   if (!TARGET_PARTIAL_REG_STALL)
21326     nops--;
21327   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
21328       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
21329       <= (ix86_cost->shift_const + ix86_cost->add) * nops
21330           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
21331     {
21332       rtx reg = convert_modes (mode, QImode, val, true);
21333       tmp = promote_duplicated_reg (mode, const1_rtx);
21334       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
21335                                   OPTAB_DIRECT);
21336     }
21337   else
21338     {
21339       rtx reg = convert_modes (mode, QImode, val, true);
21340
21341       if (!TARGET_PARTIAL_REG_STALL)
21342         if (mode == SImode)
21343           emit_insn (gen_movsi_insv_1 (reg, reg));
21344         else
21345           emit_insn (gen_movdi_insv_1 (reg, reg));
21346       else
21347         {
21348           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
21349                                      NULL, 1, OPTAB_DIRECT);
21350           reg =
21351             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21352         }
21353       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
21354                                  NULL, 1, OPTAB_DIRECT);
21355       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21356       if (mode == SImode)
21357         return reg;
21358       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
21359                                  NULL, 1, OPTAB_DIRECT);
21360       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21361       return reg;
21362     }
21363 }
21364
21365 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
21366    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
21367    alignment from ALIGN to DESIRED_ALIGN.  */
21368 static rtx
21369 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
21370 {
21371   rtx promoted_val;
21372
21373   if (TARGET_64BIT
21374       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
21375     promoted_val = promote_duplicated_reg (DImode, val);
21376   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
21377     promoted_val = promote_duplicated_reg (SImode, val);
21378   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
21379     promoted_val = promote_duplicated_reg (HImode, val);
21380   else
21381     promoted_val = val;
21382
21383   return promoted_val;
21384 }
21385
21386 /* Expand string clear operation (bzero).  Use i386 string operations when
21387    profitable.  See expand_movmem comment for explanation of individual
21388    steps performed.  */
21389 bool
21390 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
21391                     rtx expected_align_exp, rtx expected_size_exp)
21392 {
21393   rtx destreg;
21394   rtx label = NULL;
21395   rtx tmp;
21396   rtx jump_around_label = NULL;
21397   HOST_WIDE_INT align = 1;
21398   unsigned HOST_WIDE_INT count = 0;
21399   HOST_WIDE_INT expected_size = -1;
21400   int size_needed = 0, epilogue_size_needed;
21401   int desired_align = 0, align_bytes = 0;
21402   enum stringop_alg alg;
21403   rtx promoted_val = NULL;
21404   bool force_loopy_epilogue = false;
21405   int dynamic_check;
21406   bool need_zero_guard = false;
21407
21408   if (CONST_INT_P (align_exp))
21409     align = INTVAL (align_exp);
21410   /* i386 can do misaligned access on reasonably increased cost.  */
21411   if (CONST_INT_P (expected_align_exp)
21412       && INTVAL (expected_align_exp) > align)
21413     align = INTVAL (expected_align_exp);
21414   if (CONST_INT_P (count_exp))
21415     count = expected_size = INTVAL (count_exp);
21416   if (CONST_INT_P (expected_size_exp) && count == 0)
21417     expected_size = INTVAL (expected_size_exp);
21418
21419   /* Make sure we don't need to care about overflow later on.  */
21420   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
21421     return false;
21422
21423   /* Step 0: Decide on preferred algorithm, desired alignment and
21424      size of chunks to be copied by main loop.  */
21425
21426   alg = decide_alg (count, expected_size, true, &dynamic_check);
21427   desired_align = decide_alignment (align, alg, expected_size);
21428
21429   if (!TARGET_ALIGN_STRINGOPS)
21430     align = desired_align;
21431
21432   if (alg == libcall)
21433     return false;
21434   gcc_assert (alg != no_stringop);
21435   if (!count)
21436     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
21437   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
21438   switch (alg)
21439     {
21440     case libcall:
21441     case no_stringop:
21442       gcc_unreachable ();
21443     case loop:
21444       need_zero_guard = true;
21445       size_needed = GET_MODE_SIZE (Pmode);
21446       break;
21447     case unrolled_loop:
21448       need_zero_guard = true;
21449       size_needed = GET_MODE_SIZE (Pmode) * 4;
21450       break;
21451     case rep_prefix_8_byte:
21452       size_needed = 8;
21453       break;
21454     case rep_prefix_4_byte:
21455       size_needed = 4;
21456       break;
21457     case rep_prefix_1_byte:
21458       size_needed = 1;
21459       break;
21460     case loop_1_byte:
21461       need_zero_guard = true;
21462       size_needed = 1;
21463       break;
21464     }
21465   epilogue_size_needed = size_needed;
21466
21467   /* Step 1: Prologue guard.  */
21468
21469   /* Alignment code needs count to be in register.  */
21470   if (CONST_INT_P (count_exp) && desired_align > align)
21471     {
21472       if (INTVAL (count_exp) > desired_align
21473           && INTVAL (count_exp) > size_needed)
21474         {
21475           align_bytes
21476             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
21477           if (align_bytes <= 0)
21478             align_bytes = 0;
21479           else
21480             align_bytes = desired_align - align_bytes;
21481         }
21482       if (align_bytes == 0)
21483         {
21484           enum machine_mode mode = SImode;
21485           if (TARGET_64BIT && (count & ~0xffffffff))
21486             mode = DImode;
21487           count_exp = force_reg (mode, count_exp);
21488         }
21489     }
21490   /* Do the cheap promotion to allow better CSE across the
21491      main loop and epilogue (ie one load of the big constant in the
21492      front of all code.  */
21493   if (CONST_INT_P (val_exp))
21494     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
21495                                                    desired_align, align);
21496   /* Ensure that alignment prologue won't copy past end of block.  */
21497   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
21498     {
21499       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
21500       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
21501          Make sure it is power of 2.  */
21502       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
21503
21504       /* To improve performance of small blocks, we jump around the VAL
21505          promoting mode.  This mean that if the promoted VAL is not constant,
21506          we might not use it in the epilogue and have to use byte
21507          loop variant.  */
21508       if (epilogue_size_needed > 2 && !promoted_val)
21509         force_loopy_epilogue = true;
21510       if (count)
21511         {
21512           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
21513             {
21514               /* If main algorithm works on QImode, no epilogue is needed.
21515                  For small sizes just don't align anything.  */
21516               if (size_needed == 1)
21517                 desired_align = align;
21518               else
21519                 goto epilogue;
21520             }
21521         }
21522       else
21523         {
21524           label = gen_label_rtx ();
21525           emit_cmp_and_jump_insns (count_exp,
21526                                    GEN_INT (epilogue_size_needed),
21527                                    LTU, 0, counter_mode (count_exp), 1, label);
21528           if (expected_size == -1 || expected_size <= epilogue_size_needed)
21529             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21530           else
21531             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21532         }
21533     }
21534   if (dynamic_check != -1)
21535     {
21536       rtx hot_label = gen_label_rtx ();
21537       jump_around_label = gen_label_rtx ();
21538       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
21539                                LEU, 0, counter_mode (count_exp), 1, hot_label);
21540       predict_jump (REG_BR_PROB_BASE * 90 / 100);
21541       set_storage_via_libcall (dst, count_exp, val_exp, false);
21542       emit_jump (jump_around_label);
21543       emit_label (hot_label);
21544     }
21545
21546   /* Step 2: Alignment prologue.  */
21547
21548   /* Do the expensive promotion once we branched off the small blocks.  */
21549   if (!promoted_val)
21550     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
21551                                                    desired_align, align);
21552   gcc_assert (desired_align >= 1 && align >= 1);
21553
21554   if (desired_align > align)
21555     {
21556       if (align_bytes == 0)
21557         {
21558           /* Except for the first move in epilogue, we no longer know
21559              constant offset in aliasing info.  It don't seems to worth
21560              the pain to maintain it for the first move, so throw away
21561              the info early.  */
21562           dst = change_address (dst, BLKmode, destreg);
21563           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
21564                                   desired_align);
21565         }
21566       else
21567         {
21568           /* If we know how many bytes need to be stored before dst is
21569              sufficiently aligned, maintain aliasing info accurately.  */
21570           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
21571                                                  desired_align, align_bytes);
21572           count_exp = plus_constant (count_exp, -align_bytes);
21573           count -= align_bytes;
21574         }
21575       if (need_zero_guard
21576           && (count < (unsigned HOST_WIDE_INT) size_needed
21577               || (align_bytes == 0
21578                   && count < ((unsigned HOST_WIDE_INT) size_needed
21579                               + desired_align - align))))
21580         {
21581           /* It is possible that we copied enough so the main loop will not
21582              execute.  */
21583           gcc_assert (size_needed > 1);
21584           if (label == NULL_RTX)
21585             label = gen_label_rtx ();
21586           emit_cmp_and_jump_insns (count_exp,
21587                                    GEN_INT (size_needed),
21588                                    LTU, 0, counter_mode (count_exp), 1, label);
21589           if (expected_size == -1
21590               || expected_size < (desired_align - align) / 2 + size_needed)
21591             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21592           else
21593             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21594         }
21595     }
21596   if (label && size_needed == 1)
21597     {
21598       emit_label (label);
21599       LABEL_NUSES (label) = 1;
21600       label = NULL;
21601       promoted_val = val_exp;
21602       epilogue_size_needed = 1;
21603     }
21604   else if (label == NULL_RTX)
21605     epilogue_size_needed = size_needed;
21606
21607   /* Step 3: Main loop.  */
21608
21609   switch (alg)
21610     {
21611     case libcall:
21612     case no_stringop:
21613       gcc_unreachable ();
21614     case loop_1_byte:
21615       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21616                                      count_exp, QImode, 1, expected_size);
21617       break;
21618     case loop:
21619       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21620                                      count_exp, Pmode, 1, expected_size);
21621       break;
21622     case unrolled_loop:
21623       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21624                                      count_exp, Pmode, 4, expected_size);
21625       break;
21626     case rep_prefix_8_byte:
21627       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21628                                   DImode, val_exp);
21629       break;
21630     case rep_prefix_4_byte:
21631       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21632                                   SImode, val_exp);
21633       break;
21634     case rep_prefix_1_byte:
21635       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21636                                   QImode, val_exp);
21637       break;
21638     }
21639   /* Adjust properly the offset of src and dest memory for aliasing.  */
21640   if (CONST_INT_P (count_exp))
21641     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
21642                                         (count / size_needed) * size_needed);
21643   else
21644     dst = change_address (dst, BLKmode, destreg);
21645
21646   /* Step 4: Epilogue to copy the remaining bytes.  */
21647
21648   if (label)
21649     {
21650       /* When the main loop is done, COUNT_EXP might hold original count,
21651          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
21652          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
21653          bytes. Compensate if needed.  */
21654
21655       if (size_needed < epilogue_size_needed)
21656         {
21657           tmp =
21658             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
21659                                  GEN_INT (size_needed - 1), count_exp, 1,
21660                                  OPTAB_DIRECT);
21661           if (tmp != count_exp)
21662             emit_move_insn (count_exp, tmp);
21663         }
21664       emit_label (label);
21665       LABEL_NUSES (label) = 1;
21666     }
21667  epilogue:
21668   if (count_exp != const0_rtx && epilogue_size_needed > 1)
21669     {
21670       if (force_loopy_epilogue)
21671         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
21672                                          epilogue_size_needed);
21673       else
21674         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
21675                                 epilogue_size_needed);
21676     }
21677   if (jump_around_label)
21678     emit_label (jump_around_label);
21679   return true;
21680 }
21681
21682 /* Expand the appropriate insns for doing strlen if not just doing
21683    repnz; scasb
21684
21685    out = result, initialized with the start address
21686    align_rtx = alignment of the address.
21687    scratch = scratch register, initialized with the startaddress when
21688         not aligned, otherwise undefined
21689
21690    This is just the body. It needs the initializations mentioned above and
21691    some address computing at the end.  These things are done in i386.md.  */
21692
21693 static void
21694 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
21695 {
21696   int align;
21697   rtx tmp;
21698   rtx align_2_label = NULL_RTX;
21699   rtx align_3_label = NULL_RTX;
21700   rtx align_4_label = gen_label_rtx ();
21701   rtx end_0_label = gen_label_rtx ();
21702   rtx mem;
21703   rtx tmpreg = gen_reg_rtx (SImode);
21704   rtx scratch = gen_reg_rtx (SImode);
21705   rtx cmp;
21706
21707   align = 0;
21708   if (CONST_INT_P (align_rtx))
21709     align = INTVAL (align_rtx);
21710
21711   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
21712
21713   /* Is there a known alignment and is it less than 4?  */
21714   if (align < 4)
21715     {
21716       rtx scratch1 = gen_reg_rtx (Pmode);
21717       emit_move_insn (scratch1, out);
21718       /* Is there a known alignment and is it not 2? */
21719       if (align != 2)
21720         {
21721           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
21722           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
21723
21724           /* Leave just the 3 lower bits.  */
21725           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
21726                                     NULL_RTX, 0, OPTAB_WIDEN);
21727
21728           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
21729                                    Pmode, 1, align_4_label);
21730           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
21731                                    Pmode, 1, align_2_label);
21732           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
21733                                    Pmode, 1, align_3_label);
21734         }
21735       else
21736         {
21737           /* Since the alignment is 2, we have to check 2 or 0 bytes;
21738              check if is aligned to 4 - byte.  */
21739
21740           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
21741                                     NULL_RTX, 0, OPTAB_WIDEN);
21742
21743           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
21744                                    Pmode, 1, align_4_label);
21745         }
21746
21747       mem = change_address (src, QImode, out);
21748
21749       /* Now compare the bytes.  */
21750
21751       /* Compare the first n unaligned byte on a byte per byte basis.  */
21752       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
21753                                QImode, 1, end_0_label);
21754
21755       /* Increment the address.  */
21756       emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21757
21758       /* Not needed with an alignment of 2 */
21759       if (align != 2)
21760         {
21761           emit_label (align_2_label);
21762
21763           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
21764                                    end_0_label);
21765
21766           emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21767
21768           emit_label (align_3_label);
21769         }
21770
21771       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
21772                                end_0_label);
21773
21774       emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21775     }
21776
21777   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
21778      align this loop.  It gives only huge programs, but does not help to
21779      speed up.  */
21780   emit_label (align_4_label);
21781
21782   mem = change_address (src, SImode, out);
21783   emit_move_insn (scratch, mem);
21784   emit_insn (ix86_gen_add3 (out, out, GEN_INT (4)));
21785
21786   /* This formula yields a nonzero result iff one of the bytes is zero.
21787      This saves three branches inside loop and many cycles.  */
21788
21789   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
21790   emit_insn (gen_one_cmplsi2 (scratch, scratch));
21791   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
21792   emit_insn (gen_andsi3 (tmpreg, tmpreg,
21793                          gen_int_mode (0x80808080, SImode)));
21794   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
21795                            align_4_label);
21796
21797   if (TARGET_CMOVE)
21798     {
21799        rtx reg = gen_reg_rtx (SImode);
21800        rtx reg2 = gen_reg_rtx (Pmode);
21801        emit_move_insn (reg, tmpreg);
21802        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
21803
21804        /* If zero is not in the first two bytes, move two bytes forward.  */
21805        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
21806        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21807        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
21808        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
21809                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
21810                                                      reg,
21811                                                      tmpreg)));
21812        /* Emit lea manually to avoid clobbering of flags.  */
21813        emit_insn (gen_rtx_SET (SImode, reg2,
21814                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
21815
21816        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21817        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
21818        emit_insn (gen_rtx_SET (VOIDmode, out,
21819                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
21820                                                      reg2,
21821                                                      out)));
21822     }
21823   else
21824     {
21825        rtx end_2_label = gen_label_rtx ();
21826        /* Is zero in the first two bytes? */
21827
21828        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
21829        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21830        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
21831        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
21832                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
21833                             pc_rtx);
21834        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
21835        JUMP_LABEL (tmp) = end_2_label;
21836
21837        /* Not in the first two.  Move two bytes forward.  */
21838        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
21839        emit_insn (ix86_gen_add3 (out, out, const2_rtx));
21840
21841        emit_label (end_2_label);
21842
21843     }
21844
21845   /* Avoid branch in fixing the byte.  */
21846   tmpreg = gen_lowpart (QImode, tmpreg);
21847   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
21848   tmp = gen_rtx_REG (CCmode, FLAGS_REG);
21849   cmp = gen_rtx_LTU (VOIDmode, tmp, const0_rtx);
21850   emit_insn (ix86_gen_sub3_carry (out, out, GEN_INT (3), tmp, cmp));
21851
21852   emit_label (end_0_label);
21853 }
21854
21855 /* Expand strlen.  */
21856
21857 bool
21858 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
21859 {
21860   rtx addr, scratch1, scratch2, scratch3, scratch4;
21861
21862   /* The generic case of strlen expander is long.  Avoid it's
21863      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
21864
21865   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
21866       && !TARGET_INLINE_ALL_STRINGOPS
21867       && !optimize_insn_for_size_p ()
21868       && (!CONST_INT_P (align) || INTVAL (align) < 4))
21869     return false;
21870
21871   addr = force_reg (Pmode, XEXP (src, 0));
21872   scratch1 = gen_reg_rtx (Pmode);
21873
21874   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
21875       && !optimize_insn_for_size_p ())
21876     {
21877       /* Well it seems that some optimizer does not combine a call like
21878          foo(strlen(bar), strlen(bar));
21879          when the move and the subtraction is done here.  It does calculate
21880          the length just once when these instructions are done inside of
21881          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
21882          often used and I use one fewer register for the lifetime of
21883          output_strlen_unroll() this is better.  */
21884
21885       emit_move_insn (out, addr);
21886
21887       ix86_expand_strlensi_unroll_1 (out, src, align);
21888
21889       /* strlensi_unroll_1 returns the address of the zero at the end of
21890          the string, like memchr(), so compute the length by subtracting
21891          the start address.  */
21892       emit_insn (ix86_gen_sub3 (out, out, addr));
21893     }
21894   else
21895     {
21896       rtx unspec;
21897
21898       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
21899       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
21900         return false;
21901
21902       scratch2 = gen_reg_rtx (Pmode);
21903       scratch3 = gen_reg_rtx (Pmode);
21904       scratch4 = force_reg (Pmode, constm1_rtx);
21905
21906       emit_move_insn (scratch3, addr);
21907       eoschar = force_reg (QImode, eoschar);
21908
21909       src = replace_equiv_address_nv (src, scratch3);
21910
21911       /* If .md starts supporting :P, this can be done in .md.  */
21912       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
21913                                                  scratch4), UNSPEC_SCAS);
21914       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
21915       emit_insn (ix86_gen_one_cmpl2 (scratch2, scratch1));
21916       emit_insn (ix86_gen_add3 (out, scratch2, constm1_rtx));
21917     }
21918   return true;
21919 }
21920
21921 /* For given symbol (function) construct code to compute address of it's PLT
21922    entry in large x86-64 PIC model.  */
21923 rtx
21924 construct_plt_address (rtx symbol)
21925 {
21926   rtx tmp = gen_reg_rtx (Pmode);
21927   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
21928
21929   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
21930   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
21931
21932   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
21933   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
21934   return tmp;
21935 }
21936
21937 rtx
21938 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
21939                   rtx callarg2,
21940                   rtx pop, int sibcall)
21941 {
21942   rtx use = NULL, call;
21943
21944   if (pop == const0_rtx)
21945     pop = NULL;
21946   gcc_assert (!TARGET_64BIT || !pop);
21947
21948   if (TARGET_MACHO && !TARGET_64BIT)
21949     {
21950 #if TARGET_MACHO
21951       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
21952         fnaddr = machopic_indirect_call_target (fnaddr);
21953 #endif
21954     }
21955   else
21956     {
21957       /* Static functions and indirect calls don't need the pic register.  */
21958       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
21959           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
21960           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
21961         use_reg (&use, pic_offset_table_rtx);
21962     }
21963
21964   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
21965     {
21966       rtx al = gen_rtx_REG (QImode, AX_REG);
21967       emit_move_insn (al, callarg2);
21968       use_reg (&use, al);
21969     }
21970
21971   if (ix86_cmodel == CM_LARGE_PIC
21972       && MEM_P (fnaddr)
21973       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
21974       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
21975     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
21976   else if (sibcall
21977            ? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
21978            : !call_insn_operand (XEXP (fnaddr, 0), Pmode))
21979     {
21980       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
21981       fnaddr = gen_rtx_MEM (QImode, fnaddr);
21982     }
21983
21984   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
21985   if (retval)
21986     call = gen_rtx_SET (VOIDmode, retval, call);
21987   if (pop)
21988     {
21989       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
21990       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
21991       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
21992     }
21993   if (TARGET_64BIT_MS_ABI
21994       && (!callarg2 || INTVAL (callarg2) != -2))
21995     {
21996       /* We need to represent that SI and DI registers are clobbered
21997          by SYSV calls.  */
21998       static int clobbered_registers[] = {
21999         XMM6_REG, XMM7_REG, XMM8_REG,
22000         XMM9_REG, XMM10_REG, XMM11_REG,
22001         XMM12_REG, XMM13_REG, XMM14_REG,
22002         XMM15_REG, SI_REG, DI_REG
22003       };
22004       unsigned int i;
22005       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
22006       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
22007                                    UNSPEC_MS_TO_SYSV_CALL);
22008
22009       vec[0] = call;
22010       vec[1] = unspec;
22011       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
22012         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
22013                                       ? TImode : DImode,
22014                                       gen_rtx_REG
22015                                         (SSE_REGNO_P (clobbered_registers[i])
22016                                                       ? TImode : DImode,
22017                                          clobbered_registers[i]));
22018
22019       call = gen_rtx_PARALLEL (VOIDmode,
22020                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
22021                                + 2, vec));
22022     }
22023
22024   /* Add UNSPEC_CALL_NEEDS_VZEROUPPER decoration.  */
22025   if (TARGET_VZEROUPPER)
22026     {
22027       rtx unspec;
22028       int avx256;
22029
22030       if (cfun->machine->callee_pass_avx256_p)
22031         {
22032           if (cfun->machine->callee_return_avx256_p)
22033             avx256 = callee_return_pass_avx256;
22034           else
22035             avx256 = callee_pass_avx256;
22036         }
22037       else if (cfun->machine->callee_return_avx256_p)
22038         avx256 = callee_return_avx256;
22039       else
22040         avx256 = call_no_avx256;
22041
22042       if (reload_completed)
22043         emit_insn (gen_avx_vzeroupper (GEN_INT (avx256)));
22044       else
22045         {
22046           unspec = gen_rtx_UNSPEC (VOIDmode,
22047                                    gen_rtvec (1, GEN_INT (avx256)),
22048                                    UNSPEC_CALL_NEEDS_VZEROUPPER);
22049           call = gen_rtx_PARALLEL (VOIDmode,
22050                                    gen_rtvec (2, call, unspec));
22051         }
22052     }
22053
22054   call = emit_call_insn (call);
22055   if (use)
22056     CALL_INSN_FUNCTION_USAGE (call) = use;
22057
22058   return call;
22059 }
22060
22061 void
22062 ix86_split_call_vzeroupper (rtx insn, rtx vzeroupper)
22063 {
22064   rtx call = XVECEXP (PATTERN (insn), 0, 0);
22065   emit_insn (gen_avx_vzeroupper (vzeroupper));
22066   emit_call_insn (call);
22067 }
22068
22069 /* Output the assembly for a call instruction.  */
22070
22071 const char *
22072 ix86_output_call_insn (rtx insn, rtx call_op, int addr_op)
22073 {
22074   bool direct_p = constant_call_address_operand (call_op, Pmode);
22075   bool seh_nop_p = false;
22076
22077   gcc_assert (addr_op == 0 || addr_op == 1);
22078
22079   if (SIBLING_CALL_P (insn))
22080     {
22081       if (direct_p)
22082         return addr_op ? "jmp\t%P1" : "jmp\t%P0";
22083       /* SEH epilogue detection requires the indirect branch case
22084          to include REX.W.  */
22085       else if (TARGET_SEH)
22086         return addr_op ? "rex.W jmp %A1" : "rex.W jmp %A0";
22087       else
22088         return addr_op ? "jmp\t%A1" : "jmp\t%A0";
22089     }
22090
22091   /* SEH unwinding can require an extra nop to be emitted in several
22092      circumstances.  Determine if we have one of those.  */
22093   if (TARGET_SEH)
22094     {
22095       rtx i;
22096
22097       for (i = NEXT_INSN (insn); i ; i = NEXT_INSN (i))
22098         {
22099           /* If we get to another real insn, we don't need the nop.  */
22100           if (INSN_P (i))
22101             break;
22102
22103           /* If we get to the epilogue note, prevent a catch region from
22104              being adjacent to the standard epilogue sequence.  If non-
22105              call-exceptions, we'll have done this during epilogue emission. */
22106           if (NOTE_P (i) && NOTE_KIND (i) == NOTE_INSN_EPILOGUE_BEG
22107               && !flag_non_call_exceptions
22108               && !can_throw_internal (insn))
22109             {
22110               seh_nop_p = true;
22111               break;
22112             }
22113         }
22114
22115       /* If we didn't find a real insn following the call, prevent the
22116          unwinder from looking into the next function.  */
22117       if (i == NULL)
22118         seh_nop_p = true;
22119     }
22120
22121   if (direct_p)
22122     {
22123       if (seh_nop_p)
22124         return addr_op ? "call\t%P1\n\tnop" : "call\t%P0\n\tnop";
22125       else
22126         return addr_op ? "call\t%P1" : "call\t%P0";
22127     }
22128   else
22129     {
22130       if (seh_nop_p)
22131         return addr_op ? "call\t%A1\n\tnop" : "call\t%A0\n\tnop";
22132       else
22133         return addr_op ? "call\t%A1" : "call\t%A0";
22134     }
22135 }
22136 \f
22137 /* Clear stack slot assignments remembered from previous functions.
22138    This is called from INIT_EXPANDERS once before RTL is emitted for each
22139    function.  */
22140
22141 static struct machine_function *
22142 ix86_init_machine_status (void)
22143 {
22144   struct machine_function *f;
22145
22146   f = ggc_alloc_cleared_machine_function ();
22147   f->use_fast_prologue_epilogue_nregs = -1;
22148   f->tls_descriptor_call_expanded_p = 0;
22149   f->call_abi = ix86_abi;
22150
22151   return f;
22152 }
22153
22154 /* Return a MEM corresponding to a stack slot with mode MODE.
22155    Allocate a new slot if necessary.
22156
22157    The RTL for a function can have several slots available: N is
22158    which slot to use.  */
22159
22160 rtx
22161 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
22162 {
22163   struct stack_local_entry *s;
22164
22165   gcc_assert (n < MAX_386_STACK_LOCALS);
22166
22167   /* Virtual slot is valid only before vregs are instantiated.  */
22168   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
22169
22170   for (s = ix86_stack_locals; s; s = s->next)
22171     if (s->mode == mode && s->n == n)
22172       return copy_rtx (s->rtl);
22173
22174   s = ggc_alloc_stack_local_entry ();
22175   s->n = n;
22176   s->mode = mode;
22177   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
22178
22179   s->next = ix86_stack_locals;
22180   ix86_stack_locals = s;
22181   return s->rtl;
22182 }
22183 \f
22184 /* Calculate the length of the memory address in the instruction
22185    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
22186
22187 int
22188 memory_address_length (rtx addr)
22189 {
22190   struct ix86_address parts;
22191   rtx base, index, disp;
22192   int len;
22193   int ok;
22194
22195   if (GET_CODE (addr) == PRE_DEC
22196       || GET_CODE (addr) == POST_INC
22197       || GET_CODE (addr) == PRE_MODIFY
22198       || GET_CODE (addr) == POST_MODIFY)
22199     return 0;
22200
22201   ok = ix86_decompose_address (addr, &parts);
22202   gcc_assert (ok);
22203
22204   if (parts.base && GET_CODE (parts.base) == SUBREG)
22205     parts.base = SUBREG_REG (parts.base);
22206   if (parts.index && GET_CODE (parts.index) == SUBREG)
22207     parts.index = SUBREG_REG (parts.index);
22208
22209   base = parts.base;
22210   index = parts.index;
22211   disp = parts.disp;
22212   len = 0;
22213
22214   /* Rule of thumb:
22215        - esp as the base always wants an index,
22216        - ebp as the base always wants a displacement,
22217        - r12 as the base always wants an index,
22218        - r13 as the base always wants a displacement.  */
22219
22220   /* Register Indirect.  */
22221   if (base && !index && !disp)
22222     {
22223       /* esp (for its index) and ebp (for its displacement) need
22224          the two-byte modrm form.  Similarly for r12 and r13 in 64-bit
22225          code.  */
22226       if (REG_P (addr)
22227           && (addr == arg_pointer_rtx
22228               || addr == frame_pointer_rtx
22229               || REGNO (addr) == SP_REG
22230               || REGNO (addr) == BP_REG
22231               || REGNO (addr) == R12_REG
22232               || REGNO (addr) == R13_REG))
22233         len = 1;
22234     }
22235
22236   /* Direct Addressing.  In 64-bit mode mod 00 r/m 5
22237      is not disp32, but disp32(%rip), so for disp32
22238      SIB byte is needed, unless print_operand_address
22239      optimizes it into disp32(%rip) or (%rip) is implied
22240      by UNSPEC.  */
22241   else if (disp && !base && !index)
22242     {
22243       len = 4;
22244       if (TARGET_64BIT)
22245         {
22246           rtx symbol = disp;
22247
22248           if (GET_CODE (disp) == CONST)
22249             symbol = XEXP (disp, 0);
22250           if (GET_CODE (symbol) == PLUS
22251               && CONST_INT_P (XEXP (symbol, 1)))
22252             symbol = XEXP (symbol, 0);
22253
22254           if (GET_CODE (symbol) != LABEL_REF
22255               && (GET_CODE (symbol) != SYMBOL_REF
22256                   || SYMBOL_REF_TLS_MODEL (symbol) != 0)
22257               && (GET_CODE (symbol) != UNSPEC
22258                   || (XINT (symbol, 1) != UNSPEC_GOTPCREL
22259                       && XINT (symbol, 1) != UNSPEC_PCREL
22260                       && XINT (symbol, 1) != UNSPEC_GOTNTPOFF)))
22261             len += 1;
22262         }
22263     }
22264
22265   else
22266     {
22267       /* Find the length of the displacement constant.  */
22268       if (disp)
22269         {
22270           if (base && satisfies_constraint_K (disp))
22271             len = 1;
22272           else
22273             len = 4;
22274         }
22275       /* ebp always wants a displacement.  Similarly r13.  */
22276       else if (base && REG_P (base)
22277                && (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
22278         len = 1;
22279
22280       /* An index requires the two-byte modrm form....  */
22281       if (index
22282           /* ...like esp (or r12), which always wants an index.  */
22283           || base == arg_pointer_rtx
22284           || base == frame_pointer_rtx
22285           || (base && REG_P (base)
22286               && (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
22287         len += 1;
22288     }
22289
22290   switch (parts.seg)
22291     {
22292     case SEG_FS:
22293     case SEG_GS:
22294       len += 1;
22295       break;
22296     default:
22297       break;
22298     }
22299
22300   return len;
22301 }
22302
22303 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
22304    is set, expect that insn have 8bit immediate alternative.  */
22305 int
22306 ix86_attr_length_immediate_default (rtx insn, int shortform)
22307 {
22308   int len = 0;
22309   int i;
22310   extract_insn_cached (insn);
22311   for (i = recog_data.n_operands - 1; i >= 0; --i)
22312     if (CONSTANT_P (recog_data.operand[i]))
22313       {
22314         enum attr_mode mode = get_attr_mode (insn);
22315
22316         gcc_assert (!len);
22317         if (shortform && CONST_INT_P (recog_data.operand[i]))
22318           {
22319             HOST_WIDE_INT ival = INTVAL (recog_data.operand[i]);
22320             switch (mode)
22321               {
22322               case MODE_QI:
22323                 len = 1;
22324                 continue;
22325               case MODE_HI:
22326                 ival = trunc_int_for_mode (ival, HImode);
22327                 break;
22328               case MODE_SI:
22329                 ival = trunc_int_for_mode (ival, SImode);
22330                 break;
22331               default:
22332                 break;
22333               }
22334             if (IN_RANGE (ival, -128, 127))
22335               {
22336                 len = 1;
22337                 continue;
22338               }
22339           }
22340         switch (mode)
22341           {
22342           case MODE_QI:
22343             len = 1;
22344             break;
22345           case MODE_HI:
22346             len = 2;
22347             break;
22348           case MODE_SI:
22349             len = 4;
22350             break;
22351           /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
22352           case MODE_DI:
22353             len = 4;
22354             break;
22355           default:
22356             fatal_insn ("unknown insn mode", insn);
22357         }
22358       }
22359   return len;
22360 }
22361 /* Compute default value for "length_address" attribute.  */
22362 int
22363 ix86_attr_length_address_default (rtx insn)
22364 {
22365   int i;
22366
22367   if (get_attr_type (insn) == TYPE_LEA)
22368     {
22369       rtx set = PATTERN (insn), addr;
22370
22371       if (GET_CODE (set) == PARALLEL)
22372         set = XVECEXP (set, 0, 0);
22373
22374       gcc_assert (GET_CODE (set) == SET);
22375
22376       addr = SET_SRC (set);
22377       if (TARGET_64BIT && get_attr_mode (insn) == MODE_SI)
22378         {
22379           if (GET_CODE (addr) == ZERO_EXTEND)
22380             addr = XEXP (addr, 0);
22381           if (GET_CODE (addr) == SUBREG)
22382             addr = SUBREG_REG (addr);
22383         }
22384
22385       return memory_address_length (addr);
22386     }
22387
22388   extract_insn_cached (insn);
22389   for (i = recog_data.n_operands - 1; i >= 0; --i)
22390     if (MEM_P (recog_data.operand[i]))
22391       {
22392         constrain_operands_cached (reload_completed);
22393         if (which_alternative != -1)
22394           {
22395             const char *constraints = recog_data.constraints[i];
22396             int alt = which_alternative;
22397
22398             while (*constraints == '=' || *constraints == '+')
22399               constraints++;
22400             while (alt-- > 0)
22401               while (*constraints++ != ',')
22402                 ;
22403             /* Skip ignored operands.  */
22404             if (*constraints == 'X')
22405               continue;
22406           }
22407         return memory_address_length (XEXP (recog_data.operand[i], 0));
22408       }
22409   return 0;
22410 }
22411
22412 /* Compute default value for "length_vex" attribute. It includes
22413    2 or 3 byte VEX prefix and 1 opcode byte.  */
22414
22415 int
22416 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
22417                               int has_vex_w)
22418 {
22419   int i;
22420
22421   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
22422      byte VEX prefix.  */
22423   if (!has_0f_opcode || has_vex_w)
22424     return 3 + 1;
22425
22426  /* We can always use 2 byte VEX prefix in 32bit.  */
22427   if (!TARGET_64BIT)
22428     return 2 + 1;
22429
22430   extract_insn_cached (insn);
22431
22432   for (i = recog_data.n_operands - 1; i >= 0; --i)
22433     if (REG_P (recog_data.operand[i]))
22434       {
22435         /* REX.W bit uses 3 byte VEX prefix.  */
22436         if (GET_MODE (recog_data.operand[i]) == DImode
22437             && GENERAL_REG_P (recog_data.operand[i]))
22438           return 3 + 1;
22439       }
22440     else
22441       {
22442         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
22443         if (MEM_P (recog_data.operand[i])
22444             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
22445           return 3 + 1;
22446       }
22447
22448   return 2 + 1;
22449 }
22450 \f
22451 /* Return the maximum number of instructions a cpu can issue.  */
22452
22453 static int
22454 ix86_issue_rate (void)
22455 {
22456   switch (ix86_tune)
22457     {
22458     case PROCESSOR_PENTIUM:
22459     case PROCESSOR_ATOM:
22460     case PROCESSOR_K6:
22461       return 2;
22462
22463     case PROCESSOR_PENTIUMPRO:
22464     case PROCESSOR_PENTIUM4:
22465     case PROCESSOR_CORE2_32:
22466     case PROCESSOR_CORE2_64:
22467     case PROCESSOR_COREI7_32:
22468     case PROCESSOR_COREI7_64:
22469     case PROCESSOR_ATHLON:
22470     case PROCESSOR_K8:
22471     case PROCESSOR_AMDFAM10:
22472     case PROCESSOR_NOCONA:
22473     case PROCESSOR_GENERIC32:
22474     case PROCESSOR_GENERIC64:
22475     case PROCESSOR_BDVER1:
22476     case PROCESSOR_BTVER1:
22477       return 3;
22478
22479     default:
22480       return 1;
22481     }
22482 }
22483
22484 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
22485    by DEP_INSN and nothing set by DEP_INSN.  */
22486
22487 static int
22488 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
22489 {
22490   rtx set, set2;
22491
22492   /* Simplify the test for uninteresting insns.  */
22493   if (insn_type != TYPE_SETCC
22494       && insn_type != TYPE_ICMOV
22495       && insn_type != TYPE_FCMOV
22496       && insn_type != TYPE_IBR)
22497     return 0;
22498
22499   if ((set = single_set (dep_insn)) != 0)
22500     {
22501       set = SET_DEST (set);
22502       set2 = NULL_RTX;
22503     }
22504   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
22505            && XVECLEN (PATTERN (dep_insn), 0) == 2
22506            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
22507            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
22508     {
22509       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
22510       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
22511     }
22512   else
22513     return 0;
22514
22515   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
22516     return 0;
22517
22518   /* This test is true if the dependent insn reads the flags but
22519      not any other potentially set register.  */
22520   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
22521     return 0;
22522
22523   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
22524     return 0;
22525
22526   return 1;
22527 }
22528
22529 /* Return true iff USE_INSN has a memory address with operands set by
22530    SET_INSN.  */
22531
22532 bool
22533 ix86_agi_dependent (rtx set_insn, rtx use_insn)
22534 {
22535   int i;
22536   extract_insn_cached (use_insn);
22537   for (i = recog_data.n_operands - 1; i >= 0; --i)
22538     if (MEM_P (recog_data.operand[i]))
22539       {
22540         rtx addr = XEXP (recog_data.operand[i], 0);
22541         return modified_in_p (addr, set_insn) != 0;
22542       }
22543   return false;
22544 }
22545
22546 static int
22547 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22548 {
22549   enum attr_type insn_type, dep_insn_type;
22550   enum attr_memory memory;
22551   rtx set, set2;
22552   int dep_insn_code_number;
22553
22554   /* Anti and output dependencies have zero cost on all CPUs.  */
22555   if (REG_NOTE_KIND (link) != 0)
22556     return 0;
22557
22558   dep_insn_code_number = recog_memoized (dep_insn);
22559
22560   /* If we can't recognize the insns, we can't really do anything.  */
22561   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
22562     return cost;
22563
22564   insn_type = get_attr_type (insn);
22565   dep_insn_type = get_attr_type (dep_insn);
22566
22567   switch (ix86_tune)
22568     {
22569     case PROCESSOR_PENTIUM:
22570       /* Address Generation Interlock adds a cycle of latency.  */
22571       if (insn_type == TYPE_LEA)
22572         {
22573           rtx addr = PATTERN (insn);
22574
22575           if (GET_CODE (addr) == PARALLEL)
22576             addr = XVECEXP (addr, 0, 0);
22577
22578           gcc_assert (GET_CODE (addr) == SET);
22579
22580           addr = SET_SRC (addr);
22581           if (modified_in_p (addr, dep_insn))
22582             cost += 1;
22583         }
22584       else if (ix86_agi_dependent (dep_insn, insn))
22585         cost += 1;
22586
22587       /* ??? Compares pair with jump/setcc.  */
22588       if (ix86_flags_dependent (insn, dep_insn, insn_type))
22589         cost = 0;
22590
22591       /* Floating point stores require value to be ready one cycle earlier.  */
22592       if (insn_type == TYPE_FMOV
22593           && get_attr_memory (insn) == MEMORY_STORE
22594           && !ix86_agi_dependent (dep_insn, insn))
22595         cost += 1;
22596       break;
22597
22598     case PROCESSOR_PENTIUMPRO:
22599       memory = get_attr_memory (insn);
22600
22601       /* INT->FP conversion is expensive.  */
22602       if (get_attr_fp_int_src (dep_insn))
22603         cost += 5;
22604
22605       /* There is one cycle extra latency between an FP op and a store.  */
22606       if (insn_type == TYPE_FMOV
22607           && (set = single_set (dep_insn)) != NULL_RTX
22608           && (set2 = single_set (insn)) != NULL_RTX
22609           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
22610           && MEM_P (SET_DEST (set2)))
22611         cost += 1;
22612
22613       /* Show ability of reorder buffer to hide latency of load by executing
22614          in parallel with previous instruction in case
22615          previous instruction is not needed to compute the address.  */
22616       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22617           && !ix86_agi_dependent (dep_insn, insn))
22618         {
22619           /* Claim moves to take one cycle, as core can issue one load
22620              at time and the next load can start cycle later.  */
22621           if (dep_insn_type == TYPE_IMOV
22622               || dep_insn_type == TYPE_FMOV)
22623             cost = 1;
22624           else if (cost > 1)
22625             cost--;
22626         }
22627       break;
22628
22629     case PROCESSOR_K6:
22630       memory = get_attr_memory (insn);
22631
22632       /* The esp dependency is resolved before the instruction is really
22633          finished.  */
22634       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
22635           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
22636         return 1;
22637
22638       /* INT->FP conversion is expensive.  */
22639       if (get_attr_fp_int_src (dep_insn))
22640         cost += 5;
22641
22642       /* Show ability of reorder buffer to hide latency of load by executing
22643          in parallel with previous instruction in case
22644          previous instruction is not needed to compute the address.  */
22645       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22646           && !ix86_agi_dependent (dep_insn, insn))
22647         {
22648           /* Claim moves to take one cycle, as core can issue one load
22649              at time and the next load can start cycle later.  */
22650           if (dep_insn_type == TYPE_IMOV
22651               || dep_insn_type == TYPE_FMOV)
22652             cost = 1;
22653           else if (cost > 2)
22654             cost -= 2;
22655           else
22656             cost = 1;
22657         }
22658       break;
22659
22660     case PROCESSOR_ATHLON:
22661     case PROCESSOR_K8:
22662     case PROCESSOR_AMDFAM10:
22663     case PROCESSOR_BDVER1:
22664     case PROCESSOR_BTVER1:
22665     case PROCESSOR_ATOM:
22666     case PROCESSOR_GENERIC32:
22667     case PROCESSOR_GENERIC64:
22668       memory = get_attr_memory (insn);
22669
22670       /* Show ability of reorder buffer to hide latency of load by executing
22671          in parallel with previous instruction in case
22672          previous instruction is not needed to compute the address.  */
22673       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22674           && !ix86_agi_dependent (dep_insn, insn))
22675         {
22676           enum attr_unit unit = get_attr_unit (insn);
22677           int loadcost = 3;
22678
22679           /* Because of the difference between the length of integer and
22680              floating unit pipeline preparation stages, the memory operands
22681              for floating point are cheaper.
22682
22683              ??? For Athlon it the difference is most probably 2.  */
22684           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
22685             loadcost = 3;
22686           else
22687             loadcost = TARGET_ATHLON ? 2 : 0;
22688
22689           if (cost >= loadcost)
22690             cost -= loadcost;
22691           else
22692             cost = 0;
22693         }
22694
22695     default:
22696       break;
22697     }
22698
22699   return cost;
22700 }
22701
22702 /* How many alternative schedules to try.  This should be as wide as the
22703    scheduling freedom in the DFA, but no wider.  Making this value too
22704    large results extra work for the scheduler.  */
22705
22706 static int
22707 ia32_multipass_dfa_lookahead (void)
22708 {
22709   switch (ix86_tune)
22710     {
22711     case PROCESSOR_PENTIUM:
22712       return 2;
22713
22714     case PROCESSOR_PENTIUMPRO:
22715     case PROCESSOR_K6:
22716       return 1;
22717
22718     case PROCESSOR_CORE2_32:
22719     case PROCESSOR_CORE2_64:
22720     case PROCESSOR_COREI7_32:
22721     case PROCESSOR_COREI7_64:
22722       /* Generally, we want haifa-sched:max_issue() to look ahead as far
22723          as many instructions can be executed on a cycle, i.e.,
22724          issue_rate.  I wonder why tuning for many CPUs does not do this.  */
22725       return ix86_issue_rate ();
22726
22727     default:
22728       return 0;
22729     }
22730 }
22731
22732 \f
22733
22734 /* Model decoder of Core 2/i7.
22735    Below hooks for multipass scheduling (see haifa-sched.c:max_issue)
22736    track the instruction fetch block boundaries and make sure that long
22737    (9+ bytes) instructions are assigned to D0.  */
22738
22739 /* Maximum length of an insn that can be handled by
22740    a secondary decoder unit.  '8' for Core 2/i7.  */
22741 static int core2i7_secondary_decoder_max_insn_size;
22742
22743 /* Ifetch block size, i.e., number of bytes decoder reads per cycle.
22744    '16' for Core 2/i7.  */
22745 static int core2i7_ifetch_block_size;
22746
22747 /* Maximum number of instructions decoder can handle per cycle.
22748    '6' for Core 2/i7.  */
22749 static int core2i7_ifetch_block_max_insns;
22750
22751 typedef struct ix86_first_cycle_multipass_data_ *
22752   ix86_first_cycle_multipass_data_t;
22753 typedef const struct ix86_first_cycle_multipass_data_ *
22754   const_ix86_first_cycle_multipass_data_t;
22755
22756 /* A variable to store target state across calls to max_issue within
22757    one cycle.  */
22758 static struct ix86_first_cycle_multipass_data_ _ix86_first_cycle_multipass_data,
22759   *ix86_first_cycle_multipass_data = &_ix86_first_cycle_multipass_data;
22760
22761 /* Initialize DATA.  */
22762 static void
22763 core2i7_first_cycle_multipass_init (void *_data)
22764 {
22765   ix86_first_cycle_multipass_data_t data
22766     = (ix86_first_cycle_multipass_data_t) _data;
22767
22768   data->ifetch_block_len = 0;
22769   data->ifetch_block_n_insns = 0;
22770   data->ready_try_change = NULL;
22771   data->ready_try_change_size = 0;
22772 }
22773
22774 /* Advancing the cycle; reset ifetch block counts.  */
22775 static void
22776 core2i7_dfa_post_advance_cycle (void)
22777 {
22778   ix86_first_cycle_multipass_data_t data = ix86_first_cycle_multipass_data;
22779
22780   gcc_assert (data->ifetch_block_n_insns <= core2i7_ifetch_block_max_insns);
22781
22782   data->ifetch_block_len = 0;
22783   data->ifetch_block_n_insns = 0;
22784 }
22785
22786 static int min_insn_size (rtx);
22787
22788 /* Filter out insns from ready_try that the core will not be able to issue
22789    on current cycle due to decoder.  */
22790 static void
22791 core2i7_first_cycle_multipass_filter_ready_try
22792 (const_ix86_first_cycle_multipass_data_t data,
22793  char *ready_try, int n_ready, bool first_cycle_insn_p)
22794 {
22795   while (n_ready--)
22796     {
22797       rtx insn;
22798       int insn_size;
22799
22800       if (ready_try[n_ready])
22801         continue;
22802
22803       insn = get_ready_element (n_ready);
22804       insn_size = min_insn_size (insn);
22805
22806       if (/* If this is a too long an insn for a secondary decoder ...  */
22807           (!first_cycle_insn_p
22808            && insn_size > core2i7_secondary_decoder_max_insn_size)
22809           /* ... or it would not fit into the ifetch block ...  */
22810           || data->ifetch_block_len + insn_size > core2i7_ifetch_block_size
22811           /* ... or the decoder is full already ...  */
22812           || data->ifetch_block_n_insns + 1 > core2i7_ifetch_block_max_insns)
22813         /* ... mask the insn out.  */
22814         {
22815           ready_try[n_ready] = 1;
22816
22817           if (data->ready_try_change)
22818             SET_BIT (data->ready_try_change, n_ready);
22819         }
22820     }
22821 }
22822
22823 /* Prepare for a new round of multipass lookahead scheduling.  */
22824 static void
22825 core2i7_first_cycle_multipass_begin (void *_data, char *ready_try, int n_ready,
22826                                      bool first_cycle_insn_p)
22827 {
22828   ix86_first_cycle_multipass_data_t data
22829     = (ix86_first_cycle_multipass_data_t) _data;
22830   const_ix86_first_cycle_multipass_data_t prev_data
22831     = ix86_first_cycle_multipass_data;
22832
22833   /* Restore the state from the end of the previous round.  */
22834   data->ifetch_block_len = prev_data->ifetch_block_len;
22835   data->ifetch_block_n_insns = prev_data->ifetch_block_n_insns;
22836
22837   /* Filter instructions that cannot be issued on current cycle due to
22838      decoder restrictions.  */
22839   core2i7_first_cycle_multipass_filter_ready_try (data, ready_try, n_ready,
22840                                                   first_cycle_insn_p);
22841 }
22842
22843 /* INSN is being issued in current solution.  Account for its impact on
22844    the decoder model.  */
22845 static void
22846 core2i7_first_cycle_multipass_issue (void *_data, char *ready_try, int n_ready,
22847                                      rtx insn, const void *_prev_data)
22848 {
22849   ix86_first_cycle_multipass_data_t data
22850     = (ix86_first_cycle_multipass_data_t) _data;
22851   const_ix86_first_cycle_multipass_data_t prev_data
22852     = (const_ix86_first_cycle_multipass_data_t) _prev_data;
22853
22854   int insn_size = min_insn_size (insn);
22855
22856   data->ifetch_block_len = prev_data->ifetch_block_len + insn_size;
22857   data->ifetch_block_n_insns = prev_data->ifetch_block_n_insns + 1;
22858   gcc_assert (data->ifetch_block_len <= core2i7_ifetch_block_size
22859               && data->ifetch_block_n_insns <= core2i7_ifetch_block_max_insns);
22860
22861   /* Allocate or resize the bitmap for storing INSN's effect on ready_try.  */
22862   if (!data->ready_try_change)
22863     {
22864       data->ready_try_change = sbitmap_alloc (n_ready);
22865       data->ready_try_change_size = n_ready;
22866     }
22867   else if (data->ready_try_change_size < n_ready)
22868     {
22869       data->ready_try_change = sbitmap_resize (data->ready_try_change,
22870                                                n_ready, 0);
22871       data->ready_try_change_size = n_ready;
22872     }
22873   sbitmap_zero (data->ready_try_change);
22874
22875   /* Filter out insns from ready_try that the core will not be able to issue
22876      on current cycle due to decoder.  */
22877   core2i7_first_cycle_multipass_filter_ready_try (data, ready_try, n_ready,
22878                                                   false);
22879 }
22880
22881 /* Revert the effect on ready_try.  */
22882 static void
22883 core2i7_first_cycle_multipass_backtrack (const void *_data,
22884                                          char *ready_try,
22885                                          int n_ready ATTRIBUTE_UNUSED)
22886 {
22887   const_ix86_first_cycle_multipass_data_t data
22888     = (const_ix86_first_cycle_multipass_data_t) _data;
22889   unsigned int i = 0;
22890   sbitmap_iterator sbi;
22891
22892   gcc_assert (sbitmap_last_set_bit (data->ready_try_change) < n_ready);
22893   EXECUTE_IF_SET_IN_SBITMAP (data->ready_try_change, 0, i, sbi)
22894     {
22895       ready_try[i] = 0;
22896     }
22897 }
22898
22899 /* Save the result of multipass lookahead scheduling for the next round.  */
22900 static void
22901 core2i7_first_cycle_multipass_end (const void *_data)
22902 {
22903   const_ix86_first_cycle_multipass_data_t data
22904     = (const_ix86_first_cycle_multipass_data_t) _data;
22905   ix86_first_cycle_multipass_data_t next_data
22906     = ix86_first_cycle_multipass_data;
22907
22908   if (data != NULL)
22909     {
22910       next_data->ifetch_block_len = data->ifetch_block_len;
22911       next_data->ifetch_block_n_insns = data->ifetch_block_n_insns;
22912     }
22913 }
22914
22915 /* Deallocate target data.  */
22916 static void
22917 core2i7_first_cycle_multipass_fini (void *_data)
22918 {
22919   ix86_first_cycle_multipass_data_t data
22920     = (ix86_first_cycle_multipass_data_t) _data;
22921
22922   if (data->ready_try_change)
22923     {
22924       sbitmap_free (data->ready_try_change);
22925       data->ready_try_change = NULL;
22926       data->ready_try_change_size = 0;
22927     }
22928 }
22929
22930 /* Prepare for scheduling pass.  */
22931 static void
22932 ix86_sched_init_global (FILE *dump ATTRIBUTE_UNUSED,
22933                         int verbose ATTRIBUTE_UNUSED,
22934                         int max_uid ATTRIBUTE_UNUSED)
22935 {
22936   /* Install scheduling hooks for current CPU.  Some of these hooks are used
22937      in time-critical parts of the scheduler, so we only set them up when
22938      they are actually used.  */
22939   switch (ix86_tune)
22940     {
22941     case PROCESSOR_CORE2_32:
22942     case PROCESSOR_CORE2_64:
22943     case PROCESSOR_COREI7_32:
22944     case PROCESSOR_COREI7_64:
22945       targetm.sched.dfa_post_advance_cycle
22946         = core2i7_dfa_post_advance_cycle;
22947       targetm.sched.first_cycle_multipass_init
22948         = core2i7_first_cycle_multipass_init;
22949       targetm.sched.first_cycle_multipass_begin
22950         = core2i7_first_cycle_multipass_begin;
22951       targetm.sched.first_cycle_multipass_issue
22952         = core2i7_first_cycle_multipass_issue;
22953       targetm.sched.first_cycle_multipass_backtrack
22954         = core2i7_first_cycle_multipass_backtrack;
22955       targetm.sched.first_cycle_multipass_end
22956         = core2i7_first_cycle_multipass_end;
22957       targetm.sched.first_cycle_multipass_fini
22958         = core2i7_first_cycle_multipass_fini;
22959
22960       /* Set decoder parameters.  */
22961       core2i7_secondary_decoder_max_insn_size = 8;
22962       core2i7_ifetch_block_size = 16;
22963       core2i7_ifetch_block_max_insns = 6;
22964       break;
22965
22966     default:
22967       targetm.sched.dfa_post_advance_cycle = NULL;
22968       targetm.sched.first_cycle_multipass_init = NULL;
22969       targetm.sched.first_cycle_multipass_begin = NULL;
22970       targetm.sched.first_cycle_multipass_issue = NULL;
22971       targetm.sched.first_cycle_multipass_backtrack = NULL;
22972       targetm.sched.first_cycle_multipass_end = NULL;
22973       targetm.sched.first_cycle_multipass_fini = NULL;
22974       break;
22975     }
22976 }
22977
22978 \f
22979 /* Compute the alignment given to a constant that is being placed in memory.
22980    EXP is the constant and ALIGN is the alignment that the object would
22981    ordinarily have.
22982    The value of this function is used instead of that alignment to align
22983    the object.  */
22984
22985 int
22986 ix86_constant_alignment (tree exp, int align)
22987 {
22988   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
22989       || TREE_CODE (exp) == INTEGER_CST)
22990     {
22991       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
22992         return 64;
22993       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
22994         return 128;
22995     }
22996   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
22997            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
22998     return BITS_PER_WORD;
22999
23000   return align;
23001 }
23002
23003 /* Compute the alignment for a static variable.
23004    TYPE is the data type, and ALIGN is the alignment that
23005    the object would ordinarily have.  The value of this function is used
23006    instead of that alignment to align the object.  */
23007
23008 int
23009 ix86_data_alignment (tree type, int align)
23010 {
23011   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
23012
23013   if (AGGREGATE_TYPE_P (type)
23014       && TYPE_SIZE (type)
23015       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23016       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
23017           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
23018       && align < max_align)
23019     align = max_align;
23020
23021   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
23022      to 16byte boundary.  */
23023   if (TARGET_64BIT)
23024     {
23025       if (AGGREGATE_TYPE_P (type)
23026            && TYPE_SIZE (type)
23027            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23028            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
23029                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
23030         return 128;
23031     }
23032
23033   if (TREE_CODE (type) == ARRAY_TYPE)
23034     {
23035       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
23036         return 64;
23037       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
23038         return 128;
23039     }
23040   else if (TREE_CODE (type) == COMPLEX_TYPE)
23041     {
23042
23043       if (TYPE_MODE (type) == DCmode && align < 64)
23044         return 64;
23045       if ((TYPE_MODE (type) == XCmode
23046            || TYPE_MODE (type) == TCmode) && align < 128)
23047         return 128;
23048     }
23049   else if ((TREE_CODE (type) == RECORD_TYPE
23050             || TREE_CODE (type) == UNION_TYPE
23051             || TREE_CODE (type) == QUAL_UNION_TYPE)
23052            && TYPE_FIELDS (type))
23053     {
23054       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
23055         return 64;
23056       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
23057         return 128;
23058     }
23059   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
23060            || TREE_CODE (type) == INTEGER_TYPE)
23061     {
23062       if (TYPE_MODE (type) == DFmode && align < 64)
23063         return 64;
23064       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
23065         return 128;
23066     }
23067
23068   return align;
23069 }
23070
23071 /* Compute the alignment for a local variable or a stack slot.  EXP is
23072    the data type or decl itself, MODE is the widest mode available and
23073    ALIGN is the alignment that the object would ordinarily have.  The
23074    value of this macro is used instead of that alignment to align the
23075    object.  */
23076
23077 unsigned int
23078 ix86_local_alignment (tree exp, enum machine_mode mode,
23079                       unsigned int align)
23080 {
23081   tree type, decl;
23082
23083   if (exp && DECL_P (exp))
23084     {
23085       type = TREE_TYPE (exp);
23086       decl = exp;
23087     }
23088   else
23089     {
23090       type = exp;
23091       decl = NULL;
23092     }
23093
23094   /* Don't do dynamic stack realignment for long long objects with
23095      -mpreferred-stack-boundary=2.  */
23096   if (!TARGET_64BIT
23097       && align == 64
23098       && ix86_preferred_stack_boundary < 64
23099       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
23100       && (!type || !TYPE_USER_ALIGN (type))
23101       && (!decl || !DECL_USER_ALIGN (decl)))
23102     align = 32;
23103
23104   /* If TYPE is NULL, we are allocating a stack slot for caller-save
23105      register in MODE.  We will return the largest alignment of XF
23106      and DF.  */
23107   if (!type)
23108     {
23109       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
23110         align = GET_MODE_ALIGNMENT (DFmode);
23111       return align;
23112     }
23113
23114   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
23115      to 16byte boundary.  Exact wording is:
23116
23117      An array uses the same alignment as its elements, except that a local or
23118      global array variable of length at least 16 bytes or
23119      a C99 variable-length array variable always has alignment of at least 16 bytes.
23120
23121      This was added to allow use of aligned SSE instructions at arrays.  This
23122      rule is meant for static storage (where compiler can not do the analysis
23123      by itself).  We follow it for automatic variables only when convenient.
23124      We fully control everything in the function compiled and functions from
23125      other unit can not rely on the alignment.
23126
23127      Exclude va_list type.  It is the common case of local array where
23128      we can not benefit from the alignment.  */
23129   if (TARGET_64BIT && optimize_function_for_speed_p (cfun)
23130       && TARGET_SSE)
23131     {
23132       if (AGGREGATE_TYPE_P (type)
23133            && (va_list_type_node == NULL_TREE
23134                || (TYPE_MAIN_VARIANT (type)
23135                    != TYPE_MAIN_VARIANT (va_list_type_node)))
23136            && TYPE_SIZE (type)
23137            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23138            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
23139                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
23140         return 128;
23141     }
23142   if (TREE_CODE (type) == ARRAY_TYPE)
23143     {
23144       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
23145         return 64;
23146       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
23147         return 128;
23148     }
23149   else if (TREE_CODE (type) == COMPLEX_TYPE)
23150     {
23151       if (TYPE_MODE (type) == DCmode && align < 64)
23152         return 64;
23153       if ((TYPE_MODE (type) == XCmode
23154            || TYPE_MODE (type) == TCmode) && align < 128)
23155         return 128;
23156     }
23157   else if ((TREE_CODE (type) == RECORD_TYPE
23158             || TREE_CODE (type) == UNION_TYPE
23159             || TREE_CODE (type) == QUAL_UNION_TYPE)
23160            && TYPE_FIELDS (type))
23161     {
23162       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
23163         return 64;
23164       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
23165         return 128;
23166     }
23167   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
23168            || TREE_CODE (type) == INTEGER_TYPE)
23169     {
23170
23171       if (TYPE_MODE (type) == DFmode && align < 64)
23172         return 64;
23173       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
23174         return 128;
23175     }
23176   return align;
23177 }
23178
23179 /* Compute the minimum required alignment for dynamic stack realignment
23180    purposes for a local variable, parameter or a stack slot.  EXP is
23181    the data type or decl itself, MODE is its mode and ALIGN is the
23182    alignment that the object would ordinarily have.  */
23183
23184 unsigned int
23185 ix86_minimum_alignment (tree exp, enum machine_mode mode,
23186                         unsigned int align)
23187 {
23188   tree type, decl;
23189
23190   if (exp && DECL_P (exp))
23191     {
23192       type = TREE_TYPE (exp);
23193       decl = exp;
23194     }
23195   else
23196     {
23197       type = exp;
23198       decl = NULL;
23199     }
23200
23201   if (TARGET_64BIT || align != 64 || ix86_preferred_stack_boundary >= 64)
23202     return align;
23203
23204   /* Don't do dynamic stack realignment for long long objects with
23205      -mpreferred-stack-boundary=2.  */
23206   if ((mode == DImode || (type && TYPE_MODE (type) == DImode))
23207       && (!type || !TYPE_USER_ALIGN (type))
23208       && (!decl || !DECL_USER_ALIGN (decl)))
23209     return 32;
23210
23211   return align;
23212 }
23213 \f
23214 /* Find a location for the static chain incoming to a nested function.
23215    This is a register, unless all free registers are used by arguments.  */
23216
23217 static rtx
23218 ix86_static_chain (const_tree fndecl, bool incoming_p)
23219 {
23220   unsigned regno;
23221
23222   if (!DECL_STATIC_CHAIN (fndecl))
23223     return NULL;
23224
23225   if (TARGET_64BIT)
23226     {
23227       /* We always use R10 in 64-bit mode.  */
23228       regno = R10_REG;
23229     }
23230   else
23231     {
23232       tree fntype;
23233       unsigned int ccvt;
23234
23235       /* By default in 32-bit mode we use ECX to pass the static chain.  */
23236       regno = CX_REG;
23237
23238       fntype = TREE_TYPE (fndecl);
23239       ccvt = ix86_get_callcvt (fntype);
23240       if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) != 0)
23241         {
23242           /* Fastcall functions use ecx/edx for arguments, which leaves
23243              us with EAX for the static chain.
23244              Thiscall functions use ecx for arguments, which also
23245              leaves us with EAX for the static chain.  */
23246           regno = AX_REG;
23247         }
23248       else if (ix86_function_regparm (fntype, fndecl) == 3)
23249         {
23250           /* For regparm 3, we have no free call-clobbered registers in
23251              which to store the static chain.  In order to implement this,
23252              we have the trampoline push the static chain to the stack.
23253              However, we can't push a value below the return address when
23254              we call the nested function directly, so we have to use an
23255              alternate entry point.  For this we use ESI, and have the
23256              alternate entry point push ESI, so that things appear the
23257              same once we're executing the nested function.  */
23258           if (incoming_p)
23259             {
23260               if (fndecl == current_function_decl)
23261                 ix86_static_chain_on_stack = true;
23262               return gen_frame_mem (SImode,
23263                                     plus_constant (arg_pointer_rtx, -8));
23264             }
23265           regno = SI_REG;
23266         }
23267     }
23268
23269   return gen_rtx_REG (Pmode, regno);
23270 }
23271
23272 /* Emit RTL insns to initialize the variable parts of a trampoline.
23273    FNDECL is the decl of the target address; M_TRAMP is a MEM for
23274    the trampoline, and CHAIN_VALUE is an RTX for the static chain
23275    to be passed to the target function.  */
23276
23277 static void
23278 ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
23279 {
23280   rtx mem, fnaddr;
23281
23282   fnaddr = XEXP (DECL_RTL (fndecl), 0);
23283
23284   if (!TARGET_64BIT)
23285     {
23286       rtx disp, chain;
23287       int opcode;
23288
23289       /* Depending on the static chain location, either load a register
23290          with a constant, or push the constant to the stack.  All of the
23291          instructions are the same size.  */
23292       chain = ix86_static_chain (fndecl, true);
23293       if (REG_P (chain))
23294         {
23295           if (REGNO (chain) == CX_REG)
23296             opcode = 0xb9;
23297           else if (REGNO (chain) == AX_REG)
23298             opcode = 0xb8;
23299           else
23300             gcc_unreachable ();
23301         }
23302       else
23303         opcode = 0x68;
23304
23305       mem = adjust_address (m_tramp, QImode, 0);
23306       emit_move_insn (mem, gen_int_mode (opcode, QImode));
23307
23308       mem = adjust_address (m_tramp, SImode, 1);
23309       emit_move_insn (mem, chain_value);
23310
23311       /* Compute offset from the end of the jmp to the target function.
23312          In the case in which the trampoline stores the static chain on
23313          the stack, we need to skip the first insn which pushes the
23314          (call-saved) register static chain; this push is 1 byte.  */
23315       disp = expand_binop (SImode, sub_optab, fnaddr,
23316                            plus_constant (XEXP (m_tramp, 0),
23317                                           MEM_P (chain) ? 9 : 10),
23318                            NULL_RTX, 1, OPTAB_DIRECT);
23319
23320       mem = adjust_address (m_tramp, QImode, 5);
23321       emit_move_insn (mem, gen_int_mode (0xe9, QImode));
23322
23323       mem = adjust_address (m_tramp, SImode, 6);
23324       emit_move_insn (mem, disp);
23325     }
23326   else
23327     {
23328       int offset = 0;
23329
23330       /* Load the function address to r11.  Try to load address using
23331          the shorter movl instead of movabs.  We may want to support
23332          movq for kernel mode, but kernel does not use trampolines at
23333          the moment.  */
23334       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
23335         {
23336           fnaddr = copy_to_mode_reg (DImode, fnaddr);
23337
23338           mem = adjust_address (m_tramp, HImode, offset);
23339           emit_move_insn (mem, gen_int_mode (0xbb41, HImode));
23340
23341           mem = adjust_address (m_tramp, SImode, offset + 2);
23342           emit_move_insn (mem, gen_lowpart (SImode, fnaddr));
23343           offset += 6;
23344         }
23345       else
23346         {
23347           mem = adjust_address (m_tramp, HImode, offset);
23348           emit_move_insn (mem, gen_int_mode (0xbb49, HImode));
23349
23350           mem = adjust_address (m_tramp, DImode, offset + 2);
23351           emit_move_insn (mem, fnaddr);
23352           offset += 10;
23353         }
23354
23355       /* Load static chain using movabs to r10.  */
23356       mem = adjust_address (m_tramp, HImode, offset);
23357       emit_move_insn (mem, gen_int_mode (0xba49, HImode));
23358
23359       mem = adjust_address (m_tramp, DImode, offset + 2);
23360       emit_move_insn (mem, chain_value);
23361       offset += 10;
23362
23363       /* Jump to r11; the last (unused) byte is a nop, only there to
23364          pad the write out to a single 32-bit store.  */
23365       mem = adjust_address (m_tramp, SImode, offset);
23366       emit_move_insn (mem, gen_int_mode (0x90e3ff49, SImode));
23367       offset += 4;
23368
23369       gcc_assert (offset <= TRAMPOLINE_SIZE);
23370     }
23371
23372 #ifdef ENABLE_EXECUTE_STACK
23373 #ifdef CHECK_EXECUTE_STACK_ENABLED
23374   if (CHECK_EXECUTE_STACK_ENABLED)
23375 #endif
23376   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
23377                      LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
23378 #endif
23379 }
23380 \f
23381 /* The following file contains several enumerations and data structures
23382    built from the definitions in i386-builtin-types.def.  */
23383
23384 #include "i386-builtin-types.inc"
23385
23386 /* Table for the ix86 builtin non-function types.  */
23387 static GTY(()) tree ix86_builtin_type_tab[(int) IX86_BT_LAST_CPTR + 1];
23388
23389 /* Retrieve an element from the above table, building some of
23390    the types lazily.  */
23391
23392 static tree
23393 ix86_get_builtin_type (enum ix86_builtin_type tcode)
23394 {
23395   unsigned int index;
23396   tree type, itype;
23397
23398   gcc_assert ((unsigned)tcode < ARRAY_SIZE(ix86_builtin_type_tab));
23399
23400   type = ix86_builtin_type_tab[(int) tcode];
23401   if (type != NULL)
23402     return type;
23403
23404   gcc_assert (tcode > IX86_BT_LAST_PRIM);
23405   if (tcode <= IX86_BT_LAST_VECT)
23406     {
23407       enum machine_mode mode;
23408
23409       index = tcode - IX86_BT_LAST_PRIM - 1;
23410       itype = ix86_get_builtin_type (ix86_builtin_type_vect_base[index]);
23411       mode = ix86_builtin_type_vect_mode[index];
23412
23413       type = build_vector_type_for_mode (itype, mode);
23414     }
23415   else
23416     {
23417       int quals;
23418
23419       index = tcode - IX86_BT_LAST_VECT - 1;
23420       if (tcode <= IX86_BT_LAST_PTR)
23421         quals = TYPE_UNQUALIFIED;
23422       else
23423         quals = TYPE_QUAL_CONST;
23424
23425       itype = ix86_get_builtin_type (ix86_builtin_type_ptr_base[index]);
23426       if (quals != TYPE_UNQUALIFIED)
23427         itype = build_qualified_type (itype, quals);
23428
23429       type = build_pointer_type (itype);
23430     }
23431
23432   ix86_builtin_type_tab[(int) tcode] = type;
23433   return type;
23434 }
23435
23436 /* Table for the ix86 builtin function types.  */
23437 static GTY(()) tree ix86_builtin_func_type_tab[(int) IX86_BT_LAST_ALIAS + 1];
23438
23439 /* Retrieve an element from the above table, building some of
23440    the types lazily.  */
23441
23442 static tree
23443 ix86_get_builtin_func_type (enum ix86_builtin_func_type tcode)
23444 {
23445   tree type;
23446
23447   gcc_assert ((unsigned)tcode < ARRAY_SIZE (ix86_builtin_func_type_tab));
23448
23449   type = ix86_builtin_func_type_tab[(int) tcode];
23450   if (type != NULL)
23451     return type;
23452
23453   if (tcode <= IX86_BT_LAST_FUNC)
23454     {
23455       unsigned start = ix86_builtin_func_start[(int) tcode];
23456       unsigned after = ix86_builtin_func_start[(int) tcode + 1];
23457       tree rtype, atype, args = void_list_node;
23458       unsigned i;
23459
23460       rtype = ix86_get_builtin_type (ix86_builtin_func_args[start]);
23461       for (i = after - 1; i > start; --i)
23462         {
23463           atype = ix86_get_builtin_type (ix86_builtin_func_args[i]);
23464           args = tree_cons (NULL, atype, args);
23465         }
23466
23467       type = build_function_type (rtype, args);
23468     }
23469   else
23470     {
23471       unsigned index = tcode - IX86_BT_LAST_FUNC - 1;
23472       enum ix86_builtin_func_type icode;
23473
23474       icode = ix86_builtin_func_alias_base[index];
23475       type = ix86_get_builtin_func_type (icode);
23476     }
23477
23478   ix86_builtin_func_type_tab[(int) tcode] = type;
23479   return type;
23480 }
23481
23482
23483 /* Codes for all the SSE/MMX builtins.  */
23484 enum ix86_builtins
23485 {
23486   IX86_BUILTIN_ADDPS,
23487   IX86_BUILTIN_ADDSS,
23488   IX86_BUILTIN_DIVPS,
23489   IX86_BUILTIN_DIVSS,
23490   IX86_BUILTIN_MULPS,
23491   IX86_BUILTIN_MULSS,
23492   IX86_BUILTIN_SUBPS,
23493   IX86_BUILTIN_SUBSS,
23494
23495   IX86_BUILTIN_CMPEQPS,
23496   IX86_BUILTIN_CMPLTPS,
23497   IX86_BUILTIN_CMPLEPS,
23498   IX86_BUILTIN_CMPGTPS,
23499   IX86_BUILTIN_CMPGEPS,
23500   IX86_BUILTIN_CMPNEQPS,
23501   IX86_BUILTIN_CMPNLTPS,
23502   IX86_BUILTIN_CMPNLEPS,
23503   IX86_BUILTIN_CMPNGTPS,
23504   IX86_BUILTIN_CMPNGEPS,
23505   IX86_BUILTIN_CMPORDPS,
23506   IX86_BUILTIN_CMPUNORDPS,
23507   IX86_BUILTIN_CMPEQSS,
23508   IX86_BUILTIN_CMPLTSS,
23509   IX86_BUILTIN_CMPLESS,
23510   IX86_BUILTIN_CMPNEQSS,
23511   IX86_BUILTIN_CMPNLTSS,
23512   IX86_BUILTIN_CMPNLESS,
23513   IX86_BUILTIN_CMPNGTSS,
23514   IX86_BUILTIN_CMPNGESS,
23515   IX86_BUILTIN_CMPORDSS,
23516   IX86_BUILTIN_CMPUNORDSS,
23517
23518   IX86_BUILTIN_COMIEQSS,
23519   IX86_BUILTIN_COMILTSS,
23520   IX86_BUILTIN_COMILESS,
23521   IX86_BUILTIN_COMIGTSS,
23522   IX86_BUILTIN_COMIGESS,
23523   IX86_BUILTIN_COMINEQSS,
23524   IX86_BUILTIN_UCOMIEQSS,
23525   IX86_BUILTIN_UCOMILTSS,
23526   IX86_BUILTIN_UCOMILESS,
23527   IX86_BUILTIN_UCOMIGTSS,
23528   IX86_BUILTIN_UCOMIGESS,
23529   IX86_BUILTIN_UCOMINEQSS,
23530
23531   IX86_BUILTIN_CVTPI2PS,
23532   IX86_BUILTIN_CVTPS2PI,
23533   IX86_BUILTIN_CVTSI2SS,
23534   IX86_BUILTIN_CVTSI642SS,
23535   IX86_BUILTIN_CVTSS2SI,
23536   IX86_BUILTIN_CVTSS2SI64,
23537   IX86_BUILTIN_CVTTPS2PI,
23538   IX86_BUILTIN_CVTTSS2SI,
23539   IX86_BUILTIN_CVTTSS2SI64,
23540
23541   IX86_BUILTIN_MAXPS,
23542   IX86_BUILTIN_MAXSS,
23543   IX86_BUILTIN_MINPS,
23544   IX86_BUILTIN_MINSS,
23545
23546   IX86_BUILTIN_LOADUPS,
23547   IX86_BUILTIN_STOREUPS,
23548   IX86_BUILTIN_MOVSS,
23549
23550   IX86_BUILTIN_MOVHLPS,
23551   IX86_BUILTIN_MOVLHPS,
23552   IX86_BUILTIN_LOADHPS,
23553   IX86_BUILTIN_LOADLPS,
23554   IX86_BUILTIN_STOREHPS,
23555   IX86_BUILTIN_STORELPS,
23556
23557   IX86_BUILTIN_MASKMOVQ,
23558   IX86_BUILTIN_MOVMSKPS,
23559   IX86_BUILTIN_PMOVMSKB,
23560
23561   IX86_BUILTIN_MOVNTPS,
23562   IX86_BUILTIN_MOVNTQ,
23563
23564   IX86_BUILTIN_LOADDQU,
23565   IX86_BUILTIN_STOREDQU,
23566
23567   IX86_BUILTIN_PACKSSWB,
23568   IX86_BUILTIN_PACKSSDW,
23569   IX86_BUILTIN_PACKUSWB,
23570
23571   IX86_BUILTIN_PADDB,
23572   IX86_BUILTIN_PADDW,
23573   IX86_BUILTIN_PADDD,
23574   IX86_BUILTIN_PADDQ,
23575   IX86_BUILTIN_PADDSB,
23576   IX86_BUILTIN_PADDSW,
23577   IX86_BUILTIN_PADDUSB,
23578   IX86_BUILTIN_PADDUSW,
23579   IX86_BUILTIN_PSUBB,
23580   IX86_BUILTIN_PSUBW,
23581   IX86_BUILTIN_PSUBD,
23582   IX86_BUILTIN_PSUBQ,
23583   IX86_BUILTIN_PSUBSB,
23584   IX86_BUILTIN_PSUBSW,
23585   IX86_BUILTIN_PSUBUSB,
23586   IX86_BUILTIN_PSUBUSW,
23587
23588   IX86_BUILTIN_PAND,
23589   IX86_BUILTIN_PANDN,
23590   IX86_BUILTIN_POR,
23591   IX86_BUILTIN_PXOR,
23592
23593   IX86_BUILTIN_PAVGB,
23594   IX86_BUILTIN_PAVGW,
23595
23596   IX86_BUILTIN_PCMPEQB,
23597   IX86_BUILTIN_PCMPEQW,
23598   IX86_BUILTIN_PCMPEQD,
23599   IX86_BUILTIN_PCMPGTB,
23600   IX86_BUILTIN_PCMPGTW,
23601   IX86_BUILTIN_PCMPGTD,
23602
23603   IX86_BUILTIN_PMADDWD,
23604
23605   IX86_BUILTIN_PMAXSW,
23606   IX86_BUILTIN_PMAXUB,
23607   IX86_BUILTIN_PMINSW,
23608   IX86_BUILTIN_PMINUB,
23609
23610   IX86_BUILTIN_PMULHUW,
23611   IX86_BUILTIN_PMULHW,
23612   IX86_BUILTIN_PMULLW,
23613
23614   IX86_BUILTIN_PSADBW,
23615   IX86_BUILTIN_PSHUFW,
23616
23617   IX86_BUILTIN_PSLLW,
23618   IX86_BUILTIN_PSLLD,
23619   IX86_BUILTIN_PSLLQ,
23620   IX86_BUILTIN_PSRAW,
23621   IX86_BUILTIN_PSRAD,
23622   IX86_BUILTIN_PSRLW,
23623   IX86_BUILTIN_PSRLD,
23624   IX86_BUILTIN_PSRLQ,
23625   IX86_BUILTIN_PSLLWI,
23626   IX86_BUILTIN_PSLLDI,
23627   IX86_BUILTIN_PSLLQI,
23628   IX86_BUILTIN_PSRAWI,
23629   IX86_BUILTIN_PSRADI,
23630   IX86_BUILTIN_PSRLWI,
23631   IX86_BUILTIN_PSRLDI,
23632   IX86_BUILTIN_PSRLQI,
23633
23634   IX86_BUILTIN_PUNPCKHBW,
23635   IX86_BUILTIN_PUNPCKHWD,
23636   IX86_BUILTIN_PUNPCKHDQ,
23637   IX86_BUILTIN_PUNPCKLBW,
23638   IX86_BUILTIN_PUNPCKLWD,
23639   IX86_BUILTIN_PUNPCKLDQ,
23640
23641   IX86_BUILTIN_SHUFPS,
23642
23643   IX86_BUILTIN_RCPPS,
23644   IX86_BUILTIN_RCPSS,
23645   IX86_BUILTIN_RSQRTPS,
23646   IX86_BUILTIN_RSQRTPS_NR,
23647   IX86_BUILTIN_RSQRTSS,
23648   IX86_BUILTIN_RSQRTF,
23649   IX86_BUILTIN_SQRTPS,
23650   IX86_BUILTIN_SQRTPS_NR,
23651   IX86_BUILTIN_SQRTSS,
23652
23653   IX86_BUILTIN_UNPCKHPS,
23654   IX86_BUILTIN_UNPCKLPS,
23655
23656   IX86_BUILTIN_ANDPS,
23657   IX86_BUILTIN_ANDNPS,
23658   IX86_BUILTIN_ORPS,
23659   IX86_BUILTIN_XORPS,
23660
23661   IX86_BUILTIN_EMMS,
23662   IX86_BUILTIN_LDMXCSR,
23663   IX86_BUILTIN_STMXCSR,
23664   IX86_BUILTIN_SFENCE,
23665
23666   /* 3DNow! Original */
23667   IX86_BUILTIN_FEMMS,
23668   IX86_BUILTIN_PAVGUSB,
23669   IX86_BUILTIN_PF2ID,
23670   IX86_BUILTIN_PFACC,
23671   IX86_BUILTIN_PFADD,
23672   IX86_BUILTIN_PFCMPEQ,
23673   IX86_BUILTIN_PFCMPGE,
23674   IX86_BUILTIN_PFCMPGT,
23675   IX86_BUILTIN_PFMAX,
23676   IX86_BUILTIN_PFMIN,
23677   IX86_BUILTIN_PFMUL,
23678   IX86_BUILTIN_PFRCP,
23679   IX86_BUILTIN_PFRCPIT1,
23680   IX86_BUILTIN_PFRCPIT2,
23681   IX86_BUILTIN_PFRSQIT1,
23682   IX86_BUILTIN_PFRSQRT,
23683   IX86_BUILTIN_PFSUB,
23684   IX86_BUILTIN_PFSUBR,
23685   IX86_BUILTIN_PI2FD,
23686   IX86_BUILTIN_PMULHRW,
23687
23688   /* 3DNow! Athlon Extensions */
23689   IX86_BUILTIN_PF2IW,
23690   IX86_BUILTIN_PFNACC,
23691   IX86_BUILTIN_PFPNACC,
23692   IX86_BUILTIN_PI2FW,
23693   IX86_BUILTIN_PSWAPDSI,
23694   IX86_BUILTIN_PSWAPDSF,
23695
23696   /* SSE2 */
23697   IX86_BUILTIN_ADDPD,
23698   IX86_BUILTIN_ADDSD,
23699   IX86_BUILTIN_DIVPD,
23700   IX86_BUILTIN_DIVSD,
23701   IX86_BUILTIN_MULPD,
23702   IX86_BUILTIN_MULSD,
23703   IX86_BUILTIN_SUBPD,
23704   IX86_BUILTIN_SUBSD,
23705
23706   IX86_BUILTIN_CMPEQPD,
23707   IX86_BUILTIN_CMPLTPD,
23708   IX86_BUILTIN_CMPLEPD,
23709   IX86_BUILTIN_CMPGTPD,
23710   IX86_BUILTIN_CMPGEPD,
23711   IX86_BUILTIN_CMPNEQPD,
23712   IX86_BUILTIN_CMPNLTPD,
23713   IX86_BUILTIN_CMPNLEPD,
23714   IX86_BUILTIN_CMPNGTPD,
23715   IX86_BUILTIN_CMPNGEPD,
23716   IX86_BUILTIN_CMPORDPD,
23717   IX86_BUILTIN_CMPUNORDPD,
23718   IX86_BUILTIN_CMPEQSD,
23719   IX86_BUILTIN_CMPLTSD,
23720   IX86_BUILTIN_CMPLESD,
23721   IX86_BUILTIN_CMPNEQSD,
23722   IX86_BUILTIN_CMPNLTSD,
23723   IX86_BUILTIN_CMPNLESD,
23724   IX86_BUILTIN_CMPORDSD,
23725   IX86_BUILTIN_CMPUNORDSD,
23726
23727   IX86_BUILTIN_COMIEQSD,
23728   IX86_BUILTIN_COMILTSD,
23729   IX86_BUILTIN_COMILESD,
23730   IX86_BUILTIN_COMIGTSD,
23731   IX86_BUILTIN_COMIGESD,
23732   IX86_BUILTIN_COMINEQSD,
23733   IX86_BUILTIN_UCOMIEQSD,
23734   IX86_BUILTIN_UCOMILTSD,
23735   IX86_BUILTIN_UCOMILESD,
23736   IX86_BUILTIN_UCOMIGTSD,
23737   IX86_BUILTIN_UCOMIGESD,
23738   IX86_BUILTIN_UCOMINEQSD,
23739
23740   IX86_BUILTIN_MAXPD,
23741   IX86_BUILTIN_MAXSD,
23742   IX86_BUILTIN_MINPD,
23743   IX86_BUILTIN_MINSD,
23744
23745   IX86_BUILTIN_ANDPD,
23746   IX86_BUILTIN_ANDNPD,
23747   IX86_BUILTIN_ORPD,
23748   IX86_BUILTIN_XORPD,
23749
23750   IX86_BUILTIN_SQRTPD,
23751   IX86_BUILTIN_SQRTSD,
23752
23753   IX86_BUILTIN_UNPCKHPD,
23754   IX86_BUILTIN_UNPCKLPD,
23755
23756   IX86_BUILTIN_SHUFPD,
23757
23758   IX86_BUILTIN_LOADUPD,
23759   IX86_BUILTIN_STOREUPD,
23760   IX86_BUILTIN_MOVSD,
23761
23762   IX86_BUILTIN_LOADHPD,
23763   IX86_BUILTIN_LOADLPD,
23764
23765   IX86_BUILTIN_CVTDQ2PD,
23766   IX86_BUILTIN_CVTDQ2PS,
23767
23768   IX86_BUILTIN_CVTPD2DQ,
23769   IX86_BUILTIN_CVTPD2PI,
23770   IX86_BUILTIN_CVTPD2PS,
23771   IX86_BUILTIN_CVTTPD2DQ,
23772   IX86_BUILTIN_CVTTPD2PI,
23773
23774   IX86_BUILTIN_CVTPI2PD,
23775   IX86_BUILTIN_CVTSI2SD,
23776   IX86_BUILTIN_CVTSI642SD,
23777
23778   IX86_BUILTIN_CVTSD2SI,
23779   IX86_BUILTIN_CVTSD2SI64,
23780   IX86_BUILTIN_CVTSD2SS,
23781   IX86_BUILTIN_CVTSS2SD,
23782   IX86_BUILTIN_CVTTSD2SI,
23783   IX86_BUILTIN_CVTTSD2SI64,
23784
23785   IX86_BUILTIN_CVTPS2DQ,
23786   IX86_BUILTIN_CVTPS2PD,
23787   IX86_BUILTIN_CVTTPS2DQ,
23788
23789   IX86_BUILTIN_MOVNTI,
23790   IX86_BUILTIN_MOVNTPD,
23791   IX86_BUILTIN_MOVNTDQ,
23792
23793   IX86_BUILTIN_MOVQ128,
23794
23795   /* SSE2 MMX */
23796   IX86_BUILTIN_MASKMOVDQU,
23797   IX86_BUILTIN_MOVMSKPD,
23798   IX86_BUILTIN_PMOVMSKB128,
23799
23800   IX86_BUILTIN_PACKSSWB128,
23801   IX86_BUILTIN_PACKSSDW128,
23802   IX86_BUILTIN_PACKUSWB128,
23803
23804   IX86_BUILTIN_PADDB128,
23805   IX86_BUILTIN_PADDW128,
23806   IX86_BUILTIN_PADDD128,
23807   IX86_BUILTIN_PADDQ128,
23808   IX86_BUILTIN_PADDSB128,
23809   IX86_BUILTIN_PADDSW128,
23810   IX86_BUILTIN_PADDUSB128,
23811   IX86_BUILTIN_PADDUSW128,
23812   IX86_BUILTIN_PSUBB128,
23813   IX86_BUILTIN_PSUBW128,
23814   IX86_BUILTIN_PSUBD128,
23815   IX86_BUILTIN_PSUBQ128,
23816   IX86_BUILTIN_PSUBSB128,
23817   IX86_BUILTIN_PSUBSW128,
23818   IX86_BUILTIN_PSUBUSB128,
23819   IX86_BUILTIN_PSUBUSW128,
23820
23821   IX86_BUILTIN_PAND128,
23822   IX86_BUILTIN_PANDN128,
23823   IX86_BUILTIN_POR128,
23824   IX86_BUILTIN_PXOR128,
23825
23826   IX86_BUILTIN_PAVGB128,
23827   IX86_BUILTIN_PAVGW128,
23828
23829   IX86_BUILTIN_PCMPEQB128,
23830   IX86_BUILTIN_PCMPEQW128,
23831   IX86_BUILTIN_PCMPEQD128,
23832   IX86_BUILTIN_PCMPGTB128,
23833   IX86_BUILTIN_PCMPGTW128,
23834   IX86_BUILTIN_PCMPGTD128,
23835
23836   IX86_BUILTIN_PMADDWD128,
23837
23838   IX86_BUILTIN_PMAXSW128,
23839   IX86_BUILTIN_PMAXUB128,
23840   IX86_BUILTIN_PMINSW128,
23841   IX86_BUILTIN_PMINUB128,
23842
23843   IX86_BUILTIN_PMULUDQ,
23844   IX86_BUILTIN_PMULUDQ128,
23845   IX86_BUILTIN_PMULHUW128,
23846   IX86_BUILTIN_PMULHW128,
23847   IX86_BUILTIN_PMULLW128,
23848
23849   IX86_BUILTIN_PSADBW128,
23850   IX86_BUILTIN_PSHUFHW,
23851   IX86_BUILTIN_PSHUFLW,
23852   IX86_BUILTIN_PSHUFD,
23853
23854   IX86_BUILTIN_PSLLDQI128,
23855   IX86_BUILTIN_PSLLWI128,
23856   IX86_BUILTIN_PSLLDI128,
23857   IX86_BUILTIN_PSLLQI128,
23858   IX86_BUILTIN_PSRAWI128,
23859   IX86_BUILTIN_PSRADI128,
23860   IX86_BUILTIN_PSRLDQI128,
23861   IX86_BUILTIN_PSRLWI128,
23862   IX86_BUILTIN_PSRLDI128,
23863   IX86_BUILTIN_PSRLQI128,
23864
23865   IX86_BUILTIN_PSLLDQ128,
23866   IX86_BUILTIN_PSLLW128,
23867   IX86_BUILTIN_PSLLD128,
23868   IX86_BUILTIN_PSLLQ128,
23869   IX86_BUILTIN_PSRAW128,
23870   IX86_BUILTIN_PSRAD128,
23871   IX86_BUILTIN_PSRLW128,
23872   IX86_BUILTIN_PSRLD128,
23873   IX86_BUILTIN_PSRLQ128,
23874
23875   IX86_BUILTIN_PUNPCKHBW128,
23876   IX86_BUILTIN_PUNPCKHWD128,
23877   IX86_BUILTIN_PUNPCKHDQ128,
23878   IX86_BUILTIN_PUNPCKHQDQ128,
23879   IX86_BUILTIN_PUNPCKLBW128,
23880   IX86_BUILTIN_PUNPCKLWD128,
23881   IX86_BUILTIN_PUNPCKLDQ128,
23882   IX86_BUILTIN_PUNPCKLQDQ128,
23883
23884   IX86_BUILTIN_CLFLUSH,
23885   IX86_BUILTIN_MFENCE,
23886   IX86_BUILTIN_LFENCE,
23887
23888   IX86_BUILTIN_BSRSI,
23889   IX86_BUILTIN_BSRDI,
23890   IX86_BUILTIN_RDPMC,
23891   IX86_BUILTIN_RDTSC,
23892   IX86_BUILTIN_RDTSCP,
23893   IX86_BUILTIN_ROLQI,
23894   IX86_BUILTIN_ROLHI,
23895   IX86_BUILTIN_RORQI,
23896   IX86_BUILTIN_RORHI,
23897
23898   /* SSE3.  */
23899   IX86_BUILTIN_ADDSUBPS,
23900   IX86_BUILTIN_HADDPS,
23901   IX86_BUILTIN_HSUBPS,
23902   IX86_BUILTIN_MOVSHDUP,
23903   IX86_BUILTIN_MOVSLDUP,
23904   IX86_BUILTIN_ADDSUBPD,
23905   IX86_BUILTIN_HADDPD,
23906   IX86_BUILTIN_HSUBPD,
23907   IX86_BUILTIN_LDDQU,
23908
23909   IX86_BUILTIN_MONITOR,
23910   IX86_BUILTIN_MWAIT,
23911
23912   /* SSSE3.  */
23913   IX86_BUILTIN_PHADDW,
23914   IX86_BUILTIN_PHADDD,
23915   IX86_BUILTIN_PHADDSW,
23916   IX86_BUILTIN_PHSUBW,
23917   IX86_BUILTIN_PHSUBD,
23918   IX86_BUILTIN_PHSUBSW,
23919   IX86_BUILTIN_PMADDUBSW,
23920   IX86_BUILTIN_PMULHRSW,
23921   IX86_BUILTIN_PSHUFB,
23922   IX86_BUILTIN_PSIGNB,
23923   IX86_BUILTIN_PSIGNW,
23924   IX86_BUILTIN_PSIGND,
23925   IX86_BUILTIN_PALIGNR,
23926   IX86_BUILTIN_PABSB,
23927   IX86_BUILTIN_PABSW,
23928   IX86_BUILTIN_PABSD,
23929
23930   IX86_BUILTIN_PHADDW128,
23931   IX86_BUILTIN_PHADDD128,
23932   IX86_BUILTIN_PHADDSW128,
23933   IX86_BUILTIN_PHSUBW128,
23934   IX86_BUILTIN_PHSUBD128,
23935   IX86_BUILTIN_PHSUBSW128,
23936   IX86_BUILTIN_PMADDUBSW128,
23937   IX86_BUILTIN_PMULHRSW128,
23938   IX86_BUILTIN_PSHUFB128,
23939   IX86_BUILTIN_PSIGNB128,
23940   IX86_BUILTIN_PSIGNW128,
23941   IX86_BUILTIN_PSIGND128,
23942   IX86_BUILTIN_PALIGNR128,
23943   IX86_BUILTIN_PABSB128,
23944   IX86_BUILTIN_PABSW128,
23945   IX86_BUILTIN_PABSD128,
23946
23947   /* AMDFAM10 - SSE4A New Instructions.  */
23948   IX86_BUILTIN_MOVNTSD,
23949   IX86_BUILTIN_MOVNTSS,
23950   IX86_BUILTIN_EXTRQI,
23951   IX86_BUILTIN_EXTRQ,
23952   IX86_BUILTIN_INSERTQI,
23953   IX86_BUILTIN_INSERTQ,
23954
23955   /* SSE4.1.  */
23956   IX86_BUILTIN_BLENDPD,
23957   IX86_BUILTIN_BLENDPS,
23958   IX86_BUILTIN_BLENDVPD,
23959   IX86_BUILTIN_BLENDVPS,
23960   IX86_BUILTIN_PBLENDVB128,
23961   IX86_BUILTIN_PBLENDW128,
23962
23963   IX86_BUILTIN_DPPD,
23964   IX86_BUILTIN_DPPS,
23965
23966   IX86_BUILTIN_INSERTPS128,
23967
23968   IX86_BUILTIN_MOVNTDQA,
23969   IX86_BUILTIN_MPSADBW128,
23970   IX86_BUILTIN_PACKUSDW128,
23971   IX86_BUILTIN_PCMPEQQ,
23972   IX86_BUILTIN_PHMINPOSUW128,
23973
23974   IX86_BUILTIN_PMAXSB128,
23975   IX86_BUILTIN_PMAXSD128,
23976   IX86_BUILTIN_PMAXUD128,
23977   IX86_BUILTIN_PMAXUW128,
23978
23979   IX86_BUILTIN_PMINSB128,
23980   IX86_BUILTIN_PMINSD128,
23981   IX86_BUILTIN_PMINUD128,
23982   IX86_BUILTIN_PMINUW128,
23983
23984   IX86_BUILTIN_PMOVSXBW128,
23985   IX86_BUILTIN_PMOVSXBD128,
23986   IX86_BUILTIN_PMOVSXBQ128,
23987   IX86_BUILTIN_PMOVSXWD128,
23988   IX86_BUILTIN_PMOVSXWQ128,
23989   IX86_BUILTIN_PMOVSXDQ128,
23990
23991   IX86_BUILTIN_PMOVZXBW128,
23992   IX86_BUILTIN_PMOVZXBD128,
23993   IX86_BUILTIN_PMOVZXBQ128,
23994   IX86_BUILTIN_PMOVZXWD128,
23995   IX86_BUILTIN_PMOVZXWQ128,
23996   IX86_BUILTIN_PMOVZXDQ128,
23997
23998   IX86_BUILTIN_PMULDQ128,
23999   IX86_BUILTIN_PMULLD128,
24000
24001   IX86_BUILTIN_ROUNDPD,
24002   IX86_BUILTIN_ROUNDPS,
24003   IX86_BUILTIN_ROUNDSD,
24004   IX86_BUILTIN_ROUNDSS,
24005
24006   IX86_BUILTIN_FLOORPD,
24007   IX86_BUILTIN_CEILPD,
24008   IX86_BUILTIN_TRUNCPD,
24009   IX86_BUILTIN_RINTPD,
24010   IX86_BUILTIN_FLOORPS,
24011   IX86_BUILTIN_CEILPS,
24012   IX86_BUILTIN_TRUNCPS,
24013   IX86_BUILTIN_RINTPS,
24014
24015   IX86_BUILTIN_PTESTZ,
24016   IX86_BUILTIN_PTESTC,
24017   IX86_BUILTIN_PTESTNZC,
24018
24019   IX86_BUILTIN_VEC_INIT_V2SI,
24020   IX86_BUILTIN_VEC_INIT_V4HI,
24021   IX86_BUILTIN_VEC_INIT_V8QI,
24022   IX86_BUILTIN_VEC_EXT_V2DF,
24023   IX86_BUILTIN_VEC_EXT_V2DI,
24024   IX86_BUILTIN_VEC_EXT_V4SF,
24025   IX86_BUILTIN_VEC_EXT_V4SI,
24026   IX86_BUILTIN_VEC_EXT_V8HI,
24027   IX86_BUILTIN_VEC_EXT_V2SI,
24028   IX86_BUILTIN_VEC_EXT_V4HI,
24029   IX86_BUILTIN_VEC_EXT_V16QI,
24030   IX86_BUILTIN_VEC_SET_V2DI,
24031   IX86_BUILTIN_VEC_SET_V4SF,
24032   IX86_BUILTIN_VEC_SET_V4SI,
24033   IX86_BUILTIN_VEC_SET_V8HI,
24034   IX86_BUILTIN_VEC_SET_V4HI,
24035   IX86_BUILTIN_VEC_SET_V16QI,
24036
24037   IX86_BUILTIN_VEC_PACK_SFIX,
24038
24039   /* SSE4.2.  */
24040   IX86_BUILTIN_CRC32QI,
24041   IX86_BUILTIN_CRC32HI,
24042   IX86_BUILTIN_CRC32SI,
24043   IX86_BUILTIN_CRC32DI,
24044
24045   IX86_BUILTIN_PCMPESTRI128,
24046   IX86_BUILTIN_PCMPESTRM128,
24047   IX86_BUILTIN_PCMPESTRA128,
24048   IX86_BUILTIN_PCMPESTRC128,
24049   IX86_BUILTIN_PCMPESTRO128,
24050   IX86_BUILTIN_PCMPESTRS128,
24051   IX86_BUILTIN_PCMPESTRZ128,
24052   IX86_BUILTIN_PCMPISTRI128,
24053   IX86_BUILTIN_PCMPISTRM128,
24054   IX86_BUILTIN_PCMPISTRA128,
24055   IX86_BUILTIN_PCMPISTRC128,
24056   IX86_BUILTIN_PCMPISTRO128,
24057   IX86_BUILTIN_PCMPISTRS128,
24058   IX86_BUILTIN_PCMPISTRZ128,
24059
24060   IX86_BUILTIN_PCMPGTQ,
24061
24062   /* AES instructions */
24063   IX86_BUILTIN_AESENC128,
24064   IX86_BUILTIN_AESENCLAST128,
24065   IX86_BUILTIN_AESDEC128,
24066   IX86_BUILTIN_AESDECLAST128,
24067   IX86_BUILTIN_AESIMC128,
24068   IX86_BUILTIN_AESKEYGENASSIST128,
24069
24070   /* PCLMUL instruction */
24071   IX86_BUILTIN_PCLMULQDQ128,
24072
24073   /* AVX */
24074   IX86_BUILTIN_ADDPD256,
24075   IX86_BUILTIN_ADDPS256,
24076   IX86_BUILTIN_ADDSUBPD256,
24077   IX86_BUILTIN_ADDSUBPS256,
24078   IX86_BUILTIN_ANDPD256,
24079   IX86_BUILTIN_ANDPS256,
24080   IX86_BUILTIN_ANDNPD256,
24081   IX86_BUILTIN_ANDNPS256,
24082   IX86_BUILTIN_BLENDPD256,
24083   IX86_BUILTIN_BLENDPS256,
24084   IX86_BUILTIN_BLENDVPD256,
24085   IX86_BUILTIN_BLENDVPS256,
24086   IX86_BUILTIN_DIVPD256,
24087   IX86_BUILTIN_DIVPS256,
24088   IX86_BUILTIN_DPPS256,
24089   IX86_BUILTIN_HADDPD256,
24090   IX86_BUILTIN_HADDPS256,
24091   IX86_BUILTIN_HSUBPD256,
24092   IX86_BUILTIN_HSUBPS256,
24093   IX86_BUILTIN_MAXPD256,
24094   IX86_BUILTIN_MAXPS256,
24095   IX86_BUILTIN_MINPD256,
24096   IX86_BUILTIN_MINPS256,
24097   IX86_BUILTIN_MULPD256,
24098   IX86_BUILTIN_MULPS256,
24099   IX86_BUILTIN_ORPD256,
24100   IX86_BUILTIN_ORPS256,
24101   IX86_BUILTIN_SHUFPD256,
24102   IX86_BUILTIN_SHUFPS256,
24103   IX86_BUILTIN_SUBPD256,
24104   IX86_BUILTIN_SUBPS256,
24105   IX86_BUILTIN_XORPD256,
24106   IX86_BUILTIN_XORPS256,
24107   IX86_BUILTIN_CMPSD,
24108   IX86_BUILTIN_CMPSS,
24109   IX86_BUILTIN_CMPPD,
24110   IX86_BUILTIN_CMPPS,
24111   IX86_BUILTIN_CMPPD256,
24112   IX86_BUILTIN_CMPPS256,
24113   IX86_BUILTIN_CVTDQ2PD256,
24114   IX86_BUILTIN_CVTDQ2PS256,
24115   IX86_BUILTIN_CVTPD2PS256,
24116   IX86_BUILTIN_CVTPS2DQ256,
24117   IX86_BUILTIN_CVTPS2PD256,
24118   IX86_BUILTIN_CVTTPD2DQ256,
24119   IX86_BUILTIN_CVTPD2DQ256,
24120   IX86_BUILTIN_CVTTPS2DQ256,
24121   IX86_BUILTIN_EXTRACTF128PD256,
24122   IX86_BUILTIN_EXTRACTF128PS256,
24123   IX86_BUILTIN_EXTRACTF128SI256,
24124   IX86_BUILTIN_VZEROALL,
24125   IX86_BUILTIN_VZEROUPPER,
24126   IX86_BUILTIN_VPERMILVARPD,
24127   IX86_BUILTIN_VPERMILVARPS,
24128   IX86_BUILTIN_VPERMILVARPD256,
24129   IX86_BUILTIN_VPERMILVARPS256,
24130   IX86_BUILTIN_VPERMILPD,
24131   IX86_BUILTIN_VPERMILPS,
24132   IX86_BUILTIN_VPERMILPD256,
24133   IX86_BUILTIN_VPERMILPS256,
24134   IX86_BUILTIN_VPERMIL2PD,
24135   IX86_BUILTIN_VPERMIL2PS,
24136   IX86_BUILTIN_VPERMIL2PD256,
24137   IX86_BUILTIN_VPERMIL2PS256,
24138   IX86_BUILTIN_VPERM2F128PD256,
24139   IX86_BUILTIN_VPERM2F128PS256,
24140   IX86_BUILTIN_VPERM2F128SI256,
24141   IX86_BUILTIN_VBROADCASTSS,
24142   IX86_BUILTIN_VBROADCASTSD256,
24143   IX86_BUILTIN_VBROADCASTSS256,
24144   IX86_BUILTIN_VBROADCASTPD256,
24145   IX86_BUILTIN_VBROADCASTPS256,
24146   IX86_BUILTIN_VINSERTF128PD256,
24147   IX86_BUILTIN_VINSERTF128PS256,
24148   IX86_BUILTIN_VINSERTF128SI256,
24149   IX86_BUILTIN_LOADUPD256,
24150   IX86_BUILTIN_LOADUPS256,
24151   IX86_BUILTIN_STOREUPD256,
24152   IX86_BUILTIN_STOREUPS256,
24153   IX86_BUILTIN_LDDQU256,
24154   IX86_BUILTIN_MOVNTDQ256,
24155   IX86_BUILTIN_MOVNTPD256,
24156   IX86_BUILTIN_MOVNTPS256,
24157   IX86_BUILTIN_LOADDQU256,
24158   IX86_BUILTIN_STOREDQU256,
24159   IX86_BUILTIN_MASKLOADPD,
24160   IX86_BUILTIN_MASKLOADPS,
24161   IX86_BUILTIN_MASKSTOREPD,
24162   IX86_BUILTIN_MASKSTOREPS,
24163   IX86_BUILTIN_MASKLOADPD256,
24164   IX86_BUILTIN_MASKLOADPS256,
24165   IX86_BUILTIN_MASKSTOREPD256,
24166   IX86_BUILTIN_MASKSTOREPS256,
24167   IX86_BUILTIN_MOVSHDUP256,
24168   IX86_BUILTIN_MOVSLDUP256,
24169   IX86_BUILTIN_MOVDDUP256,
24170
24171   IX86_BUILTIN_SQRTPD256,
24172   IX86_BUILTIN_SQRTPS256,
24173   IX86_BUILTIN_SQRTPS_NR256,
24174   IX86_BUILTIN_RSQRTPS256,
24175   IX86_BUILTIN_RSQRTPS_NR256,
24176
24177   IX86_BUILTIN_RCPPS256,
24178
24179   IX86_BUILTIN_ROUNDPD256,
24180   IX86_BUILTIN_ROUNDPS256,
24181
24182   IX86_BUILTIN_FLOORPD256,
24183   IX86_BUILTIN_CEILPD256,
24184   IX86_BUILTIN_TRUNCPD256,
24185   IX86_BUILTIN_RINTPD256,
24186   IX86_BUILTIN_FLOORPS256,
24187   IX86_BUILTIN_CEILPS256,
24188   IX86_BUILTIN_TRUNCPS256,
24189   IX86_BUILTIN_RINTPS256,
24190
24191   IX86_BUILTIN_UNPCKHPD256,
24192   IX86_BUILTIN_UNPCKLPD256,
24193   IX86_BUILTIN_UNPCKHPS256,
24194   IX86_BUILTIN_UNPCKLPS256,
24195
24196   IX86_BUILTIN_SI256_SI,
24197   IX86_BUILTIN_PS256_PS,
24198   IX86_BUILTIN_PD256_PD,
24199   IX86_BUILTIN_SI_SI256,
24200   IX86_BUILTIN_PS_PS256,
24201   IX86_BUILTIN_PD_PD256,
24202
24203   IX86_BUILTIN_VTESTZPD,
24204   IX86_BUILTIN_VTESTCPD,
24205   IX86_BUILTIN_VTESTNZCPD,
24206   IX86_BUILTIN_VTESTZPS,
24207   IX86_BUILTIN_VTESTCPS,
24208   IX86_BUILTIN_VTESTNZCPS,
24209   IX86_BUILTIN_VTESTZPD256,
24210   IX86_BUILTIN_VTESTCPD256,
24211   IX86_BUILTIN_VTESTNZCPD256,
24212   IX86_BUILTIN_VTESTZPS256,
24213   IX86_BUILTIN_VTESTCPS256,
24214   IX86_BUILTIN_VTESTNZCPS256,
24215   IX86_BUILTIN_PTESTZ256,
24216   IX86_BUILTIN_PTESTC256,
24217   IX86_BUILTIN_PTESTNZC256,
24218
24219   IX86_BUILTIN_MOVMSKPD256,
24220   IX86_BUILTIN_MOVMSKPS256,
24221
24222   /* TFmode support builtins.  */
24223   IX86_BUILTIN_INFQ,
24224   IX86_BUILTIN_HUGE_VALQ,
24225   IX86_BUILTIN_FABSQ,
24226   IX86_BUILTIN_COPYSIGNQ,
24227
24228   /* Vectorizer support builtins.  */
24229   IX86_BUILTIN_CPYSGNPS,
24230   IX86_BUILTIN_CPYSGNPD,
24231   IX86_BUILTIN_CPYSGNPS256,
24232   IX86_BUILTIN_CPYSGNPD256,
24233
24234   IX86_BUILTIN_CVTUDQ2PS,
24235
24236   IX86_BUILTIN_VEC_PERM_V2DF,
24237   IX86_BUILTIN_VEC_PERM_V4SF,
24238   IX86_BUILTIN_VEC_PERM_V2DI,
24239   IX86_BUILTIN_VEC_PERM_V4SI,
24240   IX86_BUILTIN_VEC_PERM_V8HI,
24241   IX86_BUILTIN_VEC_PERM_V16QI,
24242   IX86_BUILTIN_VEC_PERM_V2DI_U,
24243   IX86_BUILTIN_VEC_PERM_V4SI_U,
24244   IX86_BUILTIN_VEC_PERM_V8HI_U,
24245   IX86_BUILTIN_VEC_PERM_V16QI_U,
24246   IX86_BUILTIN_VEC_PERM_V4DF,
24247   IX86_BUILTIN_VEC_PERM_V8SF,
24248
24249   /* FMA4 and XOP instructions.  */
24250   IX86_BUILTIN_VFMADDSS,
24251   IX86_BUILTIN_VFMADDSD,
24252   IX86_BUILTIN_VFMADDPS,
24253   IX86_BUILTIN_VFMADDPD,
24254   IX86_BUILTIN_VFMADDPS256,
24255   IX86_BUILTIN_VFMADDPD256,
24256   IX86_BUILTIN_VFMADDSUBPS,
24257   IX86_BUILTIN_VFMADDSUBPD,
24258   IX86_BUILTIN_VFMADDSUBPS256,
24259   IX86_BUILTIN_VFMADDSUBPD256,
24260
24261   IX86_BUILTIN_VPCMOV,
24262   IX86_BUILTIN_VPCMOV_V2DI,
24263   IX86_BUILTIN_VPCMOV_V4SI,
24264   IX86_BUILTIN_VPCMOV_V8HI,
24265   IX86_BUILTIN_VPCMOV_V16QI,
24266   IX86_BUILTIN_VPCMOV_V4SF,
24267   IX86_BUILTIN_VPCMOV_V2DF,
24268   IX86_BUILTIN_VPCMOV256,
24269   IX86_BUILTIN_VPCMOV_V4DI256,
24270   IX86_BUILTIN_VPCMOV_V8SI256,
24271   IX86_BUILTIN_VPCMOV_V16HI256,
24272   IX86_BUILTIN_VPCMOV_V32QI256,
24273   IX86_BUILTIN_VPCMOV_V8SF256,
24274   IX86_BUILTIN_VPCMOV_V4DF256,
24275
24276   IX86_BUILTIN_VPPERM,
24277
24278   IX86_BUILTIN_VPMACSSWW,
24279   IX86_BUILTIN_VPMACSWW,
24280   IX86_BUILTIN_VPMACSSWD,
24281   IX86_BUILTIN_VPMACSWD,
24282   IX86_BUILTIN_VPMACSSDD,
24283   IX86_BUILTIN_VPMACSDD,
24284   IX86_BUILTIN_VPMACSSDQL,
24285   IX86_BUILTIN_VPMACSSDQH,
24286   IX86_BUILTIN_VPMACSDQL,
24287   IX86_BUILTIN_VPMACSDQH,
24288   IX86_BUILTIN_VPMADCSSWD,
24289   IX86_BUILTIN_VPMADCSWD,
24290
24291   IX86_BUILTIN_VPHADDBW,
24292   IX86_BUILTIN_VPHADDBD,
24293   IX86_BUILTIN_VPHADDBQ,
24294   IX86_BUILTIN_VPHADDWD,
24295   IX86_BUILTIN_VPHADDWQ,
24296   IX86_BUILTIN_VPHADDDQ,
24297   IX86_BUILTIN_VPHADDUBW,
24298   IX86_BUILTIN_VPHADDUBD,
24299   IX86_BUILTIN_VPHADDUBQ,
24300   IX86_BUILTIN_VPHADDUWD,
24301   IX86_BUILTIN_VPHADDUWQ,
24302   IX86_BUILTIN_VPHADDUDQ,
24303   IX86_BUILTIN_VPHSUBBW,
24304   IX86_BUILTIN_VPHSUBWD,
24305   IX86_BUILTIN_VPHSUBDQ,
24306
24307   IX86_BUILTIN_VPROTB,
24308   IX86_BUILTIN_VPROTW,
24309   IX86_BUILTIN_VPROTD,
24310   IX86_BUILTIN_VPROTQ,
24311   IX86_BUILTIN_VPROTB_IMM,
24312   IX86_BUILTIN_VPROTW_IMM,
24313   IX86_BUILTIN_VPROTD_IMM,
24314   IX86_BUILTIN_VPROTQ_IMM,
24315
24316   IX86_BUILTIN_VPSHLB,
24317   IX86_BUILTIN_VPSHLW,
24318   IX86_BUILTIN_VPSHLD,
24319   IX86_BUILTIN_VPSHLQ,
24320   IX86_BUILTIN_VPSHAB,
24321   IX86_BUILTIN_VPSHAW,
24322   IX86_BUILTIN_VPSHAD,
24323   IX86_BUILTIN_VPSHAQ,
24324
24325   IX86_BUILTIN_VFRCZSS,
24326   IX86_BUILTIN_VFRCZSD,
24327   IX86_BUILTIN_VFRCZPS,
24328   IX86_BUILTIN_VFRCZPD,
24329   IX86_BUILTIN_VFRCZPS256,
24330   IX86_BUILTIN_VFRCZPD256,
24331
24332   IX86_BUILTIN_VPCOMEQUB,
24333   IX86_BUILTIN_VPCOMNEUB,
24334   IX86_BUILTIN_VPCOMLTUB,
24335   IX86_BUILTIN_VPCOMLEUB,
24336   IX86_BUILTIN_VPCOMGTUB,
24337   IX86_BUILTIN_VPCOMGEUB,
24338   IX86_BUILTIN_VPCOMFALSEUB,
24339   IX86_BUILTIN_VPCOMTRUEUB,
24340
24341   IX86_BUILTIN_VPCOMEQUW,
24342   IX86_BUILTIN_VPCOMNEUW,
24343   IX86_BUILTIN_VPCOMLTUW,
24344   IX86_BUILTIN_VPCOMLEUW,
24345   IX86_BUILTIN_VPCOMGTUW,
24346   IX86_BUILTIN_VPCOMGEUW,
24347   IX86_BUILTIN_VPCOMFALSEUW,
24348   IX86_BUILTIN_VPCOMTRUEUW,
24349
24350   IX86_BUILTIN_VPCOMEQUD,
24351   IX86_BUILTIN_VPCOMNEUD,
24352   IX86_BUILTIN_VPCOMLTUD,
24353   IX86_BUILTIN_VPCOMLEUD,
24354   IX86_BUILTIN_VPCOMGTUD,
24355   IX86_BUILTIN_VPCOMGEUD,
24356   IX86_BUILTIN_VPCOMFALSEUD,
24357   IX86_BUILTIN_VPCOMTRUEUD,
24358
24359   IX86_BUILTIN_VPCOMEQUQ,
24360   IX86_BUILTIN_VPCOMNEUQ,
24361   IX86_BUILTIN_VPCOMLTUQ,
24362   IX86_BUILTIN_VPCOMLEUQ,
24363   IX86_BUILTIN_VPCOMGTUQ,
24364   IX86_BUILTIN_VPCOMGEUQ,
24365   IX86_BUILTIN_VPCOMFALSEUQ,
24366   IX86_BUILTIN_VPCOMTRUEUQ,
24367
24368   IX86_BUILTIN_VPCOMEQB,
24369   IX86_BUILTIN_VPCOMNEB,
24370   IX86_BUILTIN_VPCOMLTB,
24371   IX86_BUILTIN_VPCOMLEB,
24372   IX86_BUILTIN_VPCOMGTB,
24373   IX86_BUILTIN_VPCOMGEB,
24374   IX86_BUILTIN_VPCOMFALSEB,
24375   IX86_BUILTIN_VPCOMTRUEB,
24376
24377   IX86_BUILTIN_VPCOMEQW,
24378   IX86_BUILTIN_VPCOMNEW,
24379   IX86_BUILTIN_VPCOMLTW,
24380   IX86_BUILTIN_VPCOMLEW,
24381   IX86_BUILTIN_VPCOMGTW,
24382   IX86_BUILTIN_VPCOMGEW,
24383   IX86_BUILTIN_VPCOMFALSEW,
24384   IX86_BUILTIN_VPCOMTRUEW,
24385
24386   IX86_BUILTIN_VPCOMEQD,
24387   IX86_BUILTIN_VPCOMNED,
24388   IX86_BUILTIN_VPCOMLTD,
24389   IX86_BUILTIN_VPCOMLED,
24390   IX86_BUILTIN_VPCOMGTD,
24391   IX86_BUILTIN_VPCOMGED,
24392   IX86_BUILTIN_VPCOMFALSED,
24393   IX86_BUILTIN_VPCOMTRUED,
24394
24395   IX86_BUILTIN_VPCOMEQQ,
24396   IX86_BUILTIN_VPCOMNEQ,
24397   IX86_BUILTIN_VPCOMLTQ,
24398   IX86_BUILTIN_VPCOMLEQ,
24399   IX86_BUILTIN_VPCOMGTQ,
24400   IX86_BUILTIN_VPCOMGEQ,
24401   IX86_BUILTIN_VPCOMFALSEQ,
24402   IX86_BUILTIN_VPCOMTRUEQ,
24403
24404   /* LWP instructions.  */
24405   IX86_BUILTIN_LLWPCB,
24406   IX86_BUILTIN_SLWPCB,
24407   IX86_BUILTIN_LWPVAL32,
24408   IX86_BUILTIN_LWPVAL64,
24409   IX86_BUILTIN_LWPINS32,
24410   IX86_BUILTIN_LWPINS64,
24411
24412   IX86_BUILTIN_CLZS,
24413
24414   /* BMI instructions.  */
24415   IX86_BUILTIN_BEXTR32,
24416   IX86_BUILTIN_BEXTR64,
24417   IX86_BUILTIN_CTZS,
24418
24419   /* TBM instructions.  */
24420   IX86_BUILTIN_BEXTRI32,
24421   IX86_BUILTIN_BEXTRI64,
24422
24423
24424   /* FSGSBASE instructions.  */
24425   IX86_BUILTIN_RDFSBASE32,
24426   IX86_BUILTIN_RDFSBASE64,
24427   IX86_BUILTIN_RDGSBASE32,
24428   IX86_BUILTIN_RDGSBASE64,
24429   IX86_BUILTIN_WRFSBASE32,
24430   IX86_BUILTIN_WRFSBASE64,
24431   IX86_BUILTIN_WRGSBASE32,
24432   IX86_BUILTIN_WRGSBASE64,
24433
24434   /* RDRND instructions.  */
24435   IX86_BUILTIN_RDRAND16_STEP,
24436   IX86_BUILTIN_RDRAND32_STEP,
24437   IX86_BUILTIN_RDRAND64_STEP,
24438
24439   /* F16C instructions.  */
24440   IX86_BUILTIN_CVTPH2PS,
24441   IX86_BUILTIN_CVTPH2PS256,
24442   IX86_BUILTIN_CVTPS2PH,
24443   IX86_BUILTIN_CVTPS2PH256,
24444
24445   /* CFString built-in for darwin */
24446   IX86_BUILTIN_CFSTRING,
24447
24448   IX86_BUILTIN_MAX
24449 };
24450
24451 /* Table for the ix86 builtin decls.  */
24452 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
24453
24454 /* Table of all of the builtin functions that are possible with different ISA's
24455    but are waiting to be built until a function is declared to use that
24456    ISA.  */
24457 struct builtin_isa {
24458   const char *name;             /* function name */
24459   enum ix86_builtin_func_type tcode; /* type to use in the declaration */
24460   int isa;                      /* isa_flags this builtin is defined for */
24461   bool const_p;                 /* true if the declaration is constant */
24462   bool set_and_not_built_p;
24463 };
24464
24465 static struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
24466
24467
24468 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
24469    of which isa_flags to use in the ix86_builtins_isa array.  Stores the
24470    function decl in the ix86_builtins array.  Returns the function decl or
24471    NULL_TREE, if the builtin was not added.
24472
24473    If the front end has a special hook for builtin functions, delay adding
24474    builtin functions that aren't in the current ISA until the ISA is changed
24475    with function specific optimization.  Doing so, can save about 300K for the
24476    default compiler.  When the builtin is expanded, check at that time whether
24477    it is valid.
24478
24479    If the front end doesn't have a special hook, record all builtins, even if
24480    it isn't an instruction set in the current ISA in case the user uses
24481    function specific options for a different ISA, so that we don't get scope
24482    errors if a builtin is added in the middle of a function scope.  */
24483
24484 static inline tree
24485 def_builtin (int mask, const char *name, enum ix86_builtin_func_type tcode,
24486              enum ix86_builtins code)
24487 {
24488   tree decl = NULL_TREE;
24489
24490   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
24491     {
24492       ix86_builtins_isa[(int) code].isa = mask;
24493
24494       mask &= ~OPTION_MASK_ISA_64BIT;
24495       if (mask == 0
24496           || (mask & ix86_isa_flags) != 0
24497           || (lang_hooks.builtin_function
24498               == lang_hooks.builtin_function_ext_scope))
24499
24500         {
24501           tree type = ix86_get_builtin_func_type (tcode);
24502           decl = add_builtin_function (name, type, code, BUILT_IN_MD,
24503                                        NULL, NULL_TREE);
24504           ix86_builtins[(int) code] = decl;
24505           ix86_builtins_isa[(int) code].set_and_not_built_p = false;
24506         }
24507       else
24508         {
24509           ix86_builtins[(int) code] = NULL_TREE;
24510           ix86_builtins_isa[(int) code].tcode = tcode;
24511           ix86_builtins_isa[(int) code].name = name;
24512           ix86_builtins_isa[(int) code].const_p = false;
24513           ix86_builtins_isa[(int) code].set_and_not_built_p = true;
24514         }
24515     }
24516
24517   return decl;
24518 }
24519
24520 /* Like def_builtin, but also marks the function decl "const".  */
24521
24522 static inline tree
24523 def_builtin_const (int mask, const char *name,
24524                    enum ix86_builtin_func_type tcode, enum ix86_builtins code)
24525 {
24526   tree decl = def_builtin (mask, name, tcode, code);
24527   if (decl)
24528     TREE_READONLY (decl) = 1;
24529   else
24530     ix86_builtins_isa[(int) code].const_p = true;
24531
24532   return decl;
24533 }
24534
24535 /* Add any new builtin functions for a given ISA that may not have been
24536    declared.  This saves a bit of space compared to adding all of the
24537    declarations to the tree, even if we didn't use them.  */
24538
24539 static void
24540 ix86_add_new_builtins (int isa)
24541 {
24542   int i;
24543
24544   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
24545     {
24546       if ((ix86_builtins_isa[i].isa & isa) != 0
24547           && ix86_builtins_isa[i].set_and_not_built_p)
24548         {
24549           tree decl, type;
24550
24551           /* Don't define the builtin again.  */
24552           ix86_builtins_isa[i].set_and_not_built_p = false;
24553
24554           type = ix86_get_builtin_func_type (ix86_builtins_isa[i].tcode);
24555           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
24556                                                  type, i, BUILT_IN_MD, NULL,
24557                                                  NULL_TREE);
24558
24559           ix86_builtins[i] = decl;
24560           if (ix86_builtins_isa[i].const_p)
24561             TREE_READONLY (decl) = 1;
24562         }
24563     }
24564 }
24565
24566 /* Bits for builtin_description.flag.  */
24567
24568 /* Set when we don't support the comparison natively, and should
24569    swap_comparison in order to support it.  */
24570 #define BUILTIN_DESC_SWAP_OPERANDS      1
24571
24572 struct builtin_description
24573 {
24574   const unsigned int mask;
24575   const enum insn_code icode;
24576   const char *const name;
24577   const enum ix86_builtins code;
24578   const enum rtx_code comparison;
24579   const int flag;
24580 };
24581
24582 static const struct builtin_description bdesc_comi[] =
24583 {
24584   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
24585   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
24586   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
24587   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
24588   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
24589   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
24590   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
24591   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
24592   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
24593   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
24594   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
24595   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
24596   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
24597   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
24598   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
24599   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
24600   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
24601   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
24602   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
24603   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
24604   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
24605   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
24606   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
24607   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
24608 };
24609
24610 static const struct builtin_description bdesc_pcmpestr[] =
24611 {
24612   /* SSE4.2 */
24613   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
24614   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
24615   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
24616   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
24617   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
24618   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
24619   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
24620 };
24621
24622 static const struct builtin_description bdesc_pcmpistr[] =
24623 {
24624   /* SSE4.2 */
24625   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
24626   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
24627   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
24628   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
24629   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
24630   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
24631   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
24632 };
24633
24634 /* Special builtins with variable number of arguments.  */
24635 static const struct builtin_description bdesc_special_args[] =
24636 {
24637   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtsc, "__builtin_ia32_rdtsc", IX86_BUILTIN_RDTSC, UNKNOWN, (int) UINT64_FTYPE_VOID },
24638   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtscp, "__builtin_ia32_rdtscp", IX86_BUILTIN_RDTSCP, UNKNOWN, (int) UINT64_FTYPE_PUNSIGNED },
24639
24640   /* MMX */
24641   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
24642
24643   /* 3DNow! */
24644   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
24645
24646   /* SSE */
24647   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24648   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24649   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
24650
24651   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
24652   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
24653   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
24654   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
24655
24656   /* SSE or 3DNow!A  */
24657   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24658   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_movntdi, "__builtin_ia32_movntq", IX86_BUILTIN_MOVNTQ, UNKNOWN, (int) VOID_FTYPE_PULONGLONG_ULONGLONG },
24659
24660   /* SSE2 */
24661   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24662   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24663   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24664   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
24665   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24666   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
24667   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
24668   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
24669   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
24670
24671   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
24672   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
24673
24674   /* SSE3 */
24675   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
24676
24677   /* SSE4.1 */
24678   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
24679
24680   /* SSE4A */
24681   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24682   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24683
24684   /* AVX */
24685   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
24686   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, "__builtin_ia32_vzeroupper", IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
24687
24688   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4sf, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
24689   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4df, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
24690   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv8sf, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
24691   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v4df, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
24692   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v8sf, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
24693
24694   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
24695   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
24696   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
24697   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
24698   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
24699   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
24700   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
24701
24702   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
24703   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
24704   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
24705
24706   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DI },
24707   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SI },
24708   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DI },
24709   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SI },
24710   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DI_V2DF },
24711   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SI_V4SF },
24712   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DI_V4DF },
24713   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SI_V8SF },
24714
24715   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcb, "__builtin_ia32_llwpcb", IX86_BUILTIN_LLWPCB, UNKNOWN, (int) VOID_FTYPE_PVOID },
24716   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcb, "__builtin_ia32_slwpcb", IX86_BUILTIN_SLWPCB, UNKNOWN, (int) PVOID_FTYPE_VOID },
24717   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3, "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL32, UNKNOWN, (int) VOID_FTYPE_UINT_UINT_UINT },
24718   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT },
24719   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS32, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT },
24720   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT },
24721
24722   /* FSGSBASE */
24723   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdfsbasesi, "__builtin_ia32_rdfsbase32", IX86_BUILTIN_RDFSBASE32, UNKNOWN, (int) UNSIGNED_FTYPE_VOID },
24724   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdfsbasedi, "__builtin_ia32_rdfsbase64", IX86_BUILTIN_RDFSBASE64, UNKNOWN, (int) UINT64_FTYPE_VOID },
24725   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdgsbasesi, "__builtin_ia32_rdgsbase32", IX86_BUILTIN_RDGSBASE32, UNKNOWN, (int) UNSIGNED_FTYPE_VOID },
24726   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdgsbasedi, "__builtin_ia32_rdgsbase64", IX86_BUILTIN_RDGSBASE64, UNKNOWN, (int) UINT64_FTYPE_VOID },
24727   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrfsbasesi, "__builtin_ia32_wrfsbase32", IX86_BUILTIN_WRFSBASE32, UNKNOWN, (int) VOID_FTYPE_UNSIGNED },
24728   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrfsbasedi, "__builtin_ia32_wrfsbase64", IX86_BUILTIN_WRFSBASE64, UNKNOWN, (int) VOID_FTYPE_UINT64 },
24729   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrgsbasesi, "__builtin_ia32_wrgsbase32", IX86_BUILTIN_WRGSBASE32, UNKNOWN, (int) VOID_FTYPE_UNSIGNED },
24730   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrgsbasedi, "__builtin_ia32_wrgsbase64", IX86_BUILTIN_WRGSBASE64, UNKNOWN, (int) VOID_FTYPE_UINT64 },
24731 };
24732
24733 /* Builtins with variable number of arguments.  */
24734 static const struct builtin_description bdesc_args[] =
24735 {
24736   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_bsr, "__builtin_ia32_bsrsi", IX86_BUILTIN_BSRSI, UNKNOWN, (int) INT_FTYPE_INT },
24737   { OPTION_MASK_ISA_64BIT, CODE_FOR_bsr_rex64, "__builtin_ia32_bsrdi", IX86_BUILTIN_BSRDI, UNKNOWN, (int) INT64_FTYPE_INT64 },
24738   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdpmc, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT },
24739   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlqi3, "__builtin_ia32_rolqi", IX86_BUILTIN_ROLQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
24740   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlhi3, "__builtin_ia32_rolhi", IX86_BUILTIN_ROLHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
24741   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrqi3, "__builtin_ia32_rorqi", IX86_BUILTIN_RORQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
24742   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrhi3, "__builtin_ia32_rorhi", IX86_BUILTIN_RORHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
24743
24744   /* MMX */
24745   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24746   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24747   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24748   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24749   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24750   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24751
24752   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24753   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24754   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24755   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24756   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24757   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24758   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24759   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24760
24761   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24762   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24763
24764   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24765   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24766   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24767   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24768
24769   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24770   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24771   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24772   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24773   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24774   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24775
24776   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24777   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24778   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24779   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24780   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
24781   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
24782
24783   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
24784   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
24785   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
24786
24787   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
24788
24789   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24790   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24791   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
24792   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24793   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24794   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
24795
24796   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24797   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24798   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
24799   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24800   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24801   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
24802
24803   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24804   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24805   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24806   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24807
24808   /* 3DNow! */
24809   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
24810   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
24811   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24812   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24813
24814   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24815   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24816   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24817   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24818   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24819   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24820   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24821   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24822   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24823   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24824   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24825   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24826   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24827   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24828   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24829
24830   /* 3DNow!A */
24831   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
24832   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
24833   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
24834   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24835   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24836   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24837
24838   /* SSE */
24839   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
24840   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24841   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24842   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24843   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24844   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24845   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
24846   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
24847   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
24848   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
24849   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
24850   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
24851
24852   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
24853
24854   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24855   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24856   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24857   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24858   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24859   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24860   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24861   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24862
24863   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
24864   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
24865   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
24866   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24867   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24868   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24869   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
24870   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
24871   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
24872   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24873   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
24874   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24875   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
24876   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
24877   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
24878   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24879   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
24880   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
24881   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
24882   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24883   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24884   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24885
24886   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24887   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24888   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24889   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24890
24891   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24892   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24893   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24894   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24895
24896   { OPTION_MASK_ISA_SSE, CODE_FOR_copysignv4sf3,  "__builtin_ia32_copysignps", IX86_BUILTIN_CPYSGNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24897
24898   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24899   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24900   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24901   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_highv4sf, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24902   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_lowv4sf, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24903
24904   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
24905   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
24906   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
24907
24908   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
24909
24910   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24911   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24912   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24913
24914   /* SSE MMX or 3Dnow!A */
24915   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgb", IX86_BUILTIN_PAVGB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24916   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_uavgv4hi3, "__builtin_ia32_pavgw", IX86_BUILTIN_PAVGW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24917   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_umulv4hi3_highpart, "__builtin_ia32_pmulhuw", IX86_BUILTIN_PMULHUW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24918
24919   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_umaxv8qi3, "__builtin_ia32_pmaxub", IX86_BUILTIN_PMAXUB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24920   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_smaxv4hi3, "__builtin_ia32_pmaxsw", IX86_BUILTIN_PMAXSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24921   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_uminv8qi3, "__builtin_ia32_pminub", IX86_BUILTIN_PMINUB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24922   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_sminv4hi3, "__builtin_ia32_pminsw", IX86_BUILTIN_PMINSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24923
24924   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_psadbw, "__builtin_ia32_psadbw", IX86_BUILTIN_PSADBW, UNKNOWN, (int) V1DI_FTYPE_V8QI_V8QI },
24925   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
24926
24927   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pshufw, "__builtin_ia32_pshufw", IX86_BUILTIN_PSHUFW, UNKNOWN, (int) V4HI_FTYPE_V4HI_INT },
24928
24929   /* SSE2 */
24930   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
24931
24932   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2df", IX86_BUILTIN_VEC_PERM_V2DF, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DI },
24933   { OPTION_MASK_ISA_SSE, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4sf", IX86_BUILTIN_VEC_PERM_V4SF, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SI },
24934   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2di", IX86_BUILTIN_VEC_PERM_V2DI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_V2DI },
24935   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4si", IX86_BUILTIN_VEC_PERM_V4SI, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_V4SI },
24936   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8hi", IX86_BUILTIN_VEC_PERM_V8HI, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_V8HI },
24937   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v16qi", IX86_BUILTIN_VEC_PERM_V16QI, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
24938   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2di_u", IX86_BUILTIN_VEC_PERM_V2DI_U, UNKNOWN, (int) V2UDI_FTYPE_V2UDI_V2UDI_V2UDI },
24939   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4si_u", IX86_BUILTIN_VEC_PERM_V4SI_U, UNKNOWN, (int) V4USI_FTYPE_V4USI_V4USI_V4USI },
24940   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8hi_u", IX86_BUILTIN_VEC_PERM_V8HI_U, UNKNOWN, (int) V8UHI_FTYPE_V8UHI_V8UHI_V8UHI },
24941   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v16qi_u", IX86_BUILTIN_VEC_PERM_V16QI_U, UNKNOWN, (int) V16UQI_FTYPE_V16UQI_V16UQI_V16UQI },
24942   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4df", IX86_BUILTIN_VEC_PERM_V4DF, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DI },
24943   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8sf", IX86_BUILTIN_VEC_PERM_V8SF, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SI },
24944
24945   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
24946   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
24947   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
24948   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
24949   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
24950   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtudq2ps, "__builtin_ia32_cvtudq2ps", IX86_BUILTIN_CVTUDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
24951
24952   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
24953   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
24954   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
24955   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
24956   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
24957
24958   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
24959
24960   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
24961   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
24962   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
24963   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
24964
24965   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
24966   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
24967   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
24968
24969   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24970   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24971   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24972   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24973   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24974   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24975   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24976   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
24977
24978   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
24979   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
24980   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
24981   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
24982   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
24983   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
24984   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
24985   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
24986   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
24987   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
24988   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
24989   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
24990   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
24991   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
24992   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
24993   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
24994   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
24995   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
24996   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
24997   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
24998
24999   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25000   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25001   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25002   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25003
25004   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25005   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25006   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25007   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25008
25009   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysignv2df3,  "__builtin_ia32_copysignpd", IX86_BUILTIN_CPYSGNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25010
25011   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25012   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2df, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25013   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2df, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25014
25015   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_pack_sfix_v2df, "__builtin_ia32_vec_pack_sfix", IX86_BUILTIN_VEC_PACK_SFIX, UNKNOWN, (int) V4SI_FTYPE_V2DF_V2DF },
25016
25017   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25018   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25019   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25020   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25021   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25022   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25023   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25024   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25025
25026   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25027   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25028   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25029   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25030   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25031   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25032   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25033   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25034
25035   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25036   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
25037
25038   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25039   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25040   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25041   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25042
25043   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25044   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25045
25046   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25047   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25048   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
25049   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25050   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25051   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
25052
25053   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25054   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25055   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25056   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25057
25058   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv16qi, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25059   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv8hi, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
25060   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv4si, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
25061   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2di, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25062   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv16qi, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25063   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv8hi, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25064   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv4si, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25065   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2di, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25066
25067   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
25068   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
25069   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
25070
25071   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25072   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
25073
25074   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
25075   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
25076
25077   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
25078
25079   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
25080   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
25081   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
25082   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
25083
25084   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlv1ti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
25085   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25086   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25087   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
25088   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25089   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25090   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
25091
25092   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrv1ti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
25093   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25094   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25095   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
25096   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25097   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25098   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
25099
25100   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25101   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25102   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25103   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25104
25105   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
25106   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
25107   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
25108
25109   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
25110
25111   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
25112   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
25113
25114   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
25115
25116   /* SSE2 MMX */
25117   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
25118   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
25119
25120   /* SSE3 */
25121   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
25122   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
25123
25124   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25125   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25126   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25127   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25128   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25129   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25130
25131   /* SSSE3 */
25132   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
25133   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
25134   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
25135   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
25136   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
25137   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
25138
25139   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25140   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25141   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25142   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25143   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25144   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25145   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25146   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25147   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25148   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25149   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25150   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25151   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
25152   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
25153   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25154   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25155   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25156   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
25157   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25158   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
25159   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25160   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25161   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25162   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25163
25164   /* SSSE3.  */
25165   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT_CONVERT },
25166   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_INT_CONVERT },
25167
25168   /* SSE4.1 */
25169   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25170   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25171   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
25172   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
25173   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25174   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25175   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25176   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
25177   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
25178   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
25179
25180   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
25181   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
25182   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
25183   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
25184   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
25185   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
25186   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
25187   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
25188   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
25189   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
25190   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
25191   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
25192   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
25193
25194   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
25195   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25196   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25197   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25198   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25199   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25200   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25201   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25202   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25203   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25204   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
25205   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25206
25207   /* SSE4.1 */
25208   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
25209   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
25210   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25211   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25212
25213   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_floorpd", IX86_BUILTIN_FLOORPD, (enum rtx_code) ROUND_FLOOR, (int) V2DF_FTYPE_V2DF_ROUND },
25214   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_ceilpd", IX86_BUILTIN_CEILPD, (enum rtx_code) ROUND_CEIL, (int) V2DF_FTYPE_V2DF_ROUND },
25215   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_truncpd", IX86_BUILTIN_TRUNCPD, (enum rtx_code) ROUND_TRUNC, (int) V2DF_FTYPE_V2DF_ROUND },
25216   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_rintpd", IX86_BUILTIN_RINTPD, (enum rtx_code) ROUND_MXCSR, (int) V2DF_FTYPE_V2DF_ROUND },
25217
25218   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_floorps", IX86_BUILTIN_FLOORPS, (enum rtx_code) ROUND_FLOOR, (int) V4SF_FTYPE_V4SF_ROUND },
25219   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_ceilps", IX86_BUILTIN_CEILPS, (enum rtx_code) ROUND_CEIL, (int) V4SF_FTYPE_V4SF_ROUND },
25220   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_truncps", IX86_BUILTIN_TRUNCPS, (enum rtx_code) ROUND_TRUNC, (int) V4SF_FTYPE_V4SF_ROUND },
25221   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_rintps", IX86_BUILTIN_RINTPS, (enum rtx_code) ROUND_MXCSR, (int) V4SF_FTYPE_V4SF_ROUND },
25222
25223   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25224   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25225   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25226
25227   /* SSE4.2 */
25228   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25229   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, CODE_FOR_sse4_2_crc32qi, "__builtin_ia32_crc32qi", IX86_BUILTIN_CRC32QI, UNKNOWN, (int) UINT_FTYPE_UINT_UCHAR },
25230   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, CODE_FOR_sse4_2_crc32hi, "__builtin_ia32_crc32hi", IX86_BUILTIN_CRC32HI, UNKNOWN, (int) UINT_FTYPE_UINT_USHORT },
25231   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, CODE_FOR_sse4_2_crc32si, "__builtin_ia32_crc32si", IX86_BUILTIN_CRC32SI, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
25232   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse4_2_crc32di, "__builtin_ia32_crc32di", IX86_BUILTIN_CRC32DI, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
25233
25234   /* SSE4A */
25235   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
25236   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
25237   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
25238   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25239
25240   /* AES */
25241   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
25242   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
25243
25244   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25245   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25246   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25247   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25248
25249   /* PCLMUL */
25250   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
25251
25252   /* AVX */
25253   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25254   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25255   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25256   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25257   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25258   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25259   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25260   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25261   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25262   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25263   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25264   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25265   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25266   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25267   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25268   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25269   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25270   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25271   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25272   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25273   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25274   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25275   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25276   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25277   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25278   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25279
25280   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
25281   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
25282   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
25283   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
25284
25285   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25286   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25287   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
25288   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
25289   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25290   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25291   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25292   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vmcmpv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25293   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vmcmpv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25294   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25295   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25296   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25297   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25298   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
25299   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
25300   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
25301   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
25302   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
25303   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
25304   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
25305   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
25306   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
25307   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
25308   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
25309   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25310   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25311   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
25312   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
25313   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
25314   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
25315   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
25316   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
25317   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
25318   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
25319
25320   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25321   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25322   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
25323
25324   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
25325   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25326   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25327   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25328   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25329
25330   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25331
25332   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
25333   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
25334
25335   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_floorpd256", IX86_BUILTIN_FLOORPD256, (enum rtx_code) ROUND_FLOOR, (int) V4DF_FTYPE_V4DF_ROUND },
25336   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_ceilpd256", IX86_BUILTIN_CEILPD256, (enum rtx_code) ROUND_CEIL, (int) V4DF_FTYPE_V4DF_ROUND },
25337   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_truncpd256", IX86_BUILTIN_TRUNCPD256, (enum rtx_code) ROUND_TRUNC, (int) V4DF_FTYPE_V4DF_ROUND },
25338   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_rintpd256", IX86_BUILTIN_RINTPD256, (enum rtx_code) ROUND_MXCSR, (int) V4DF_FTYPE_V4DF_ROUND },
25339
25340   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_floorps256", IX86_BUILTIN_FLOORPS256, (enum rtx_code) ROUND_FLOOR, (int) V8SF_FTYPE_V8SF_ROUND },
25341   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_ceilps256", IX86_BUILTIN_CEILPS256, (enum rtx_code) ROUND_CEIL, (int) V8SF_FTYPE_V8SF_ROUND },
25342   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_truncps256", IX86_BUILTIN_TRUNCPS256, (enum rtx_code) ROUND_TRUNC, (int) V8SF_FTYPE_V8SF_ROUND },
25343   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_rintps256", IX86_BUILTIN_RINTPS256, (enum rtx_code) ROUND_MXCSR, (int) V8SF_FTYPE_V8SF_ROUND },
25344
25345   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25346   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25347   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25348   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25349
25350   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
25351   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
25352   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
25353   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v8si, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
25354   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v8sf, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
25355   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v4df, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
25356
25357   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25358   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25359   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25360   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25361   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25362   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25363   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25364   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25365   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25366   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25367   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25368   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25369   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25370   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25371   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25372
25373   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
25374   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
25375
25376   { OPTION_MASK_ISA_AVX, CODE_FOR_copysignv8sf3,  "__builtin_ia32_copysignps256", IX86_BUILTIN_CPYSGNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25377   { OPTION_MASK_ISA_AVX, CODE_FOR_copysignv4df3,  "__builtin_ia32_copysignpd256", IX86_BUILTIN_CPYSGNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25378
25379   { OPTION_MASK_ISA_ABM, CODE_FOR_clzhi2_abm,   "__builtin_clzs",   IX86_BUILTIN_CLZS,    UNKNOWN,     (int) UINT16_FTYPE_UINT16 },
25380
25381   /* BMI */
25382   { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_si, "__builtin_ia32_bextr_u32", IX86_BUILTIN_BEXTR32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
25383   { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_di, "__builtin_ia32_bextr_u64", IX86_BUILTIN_BEXTR64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
25384   { OPTION_MASK_ISA_BMI, CODE_FOR_ctzhi2,       "__builtin_ctzs",           IX86_BUILTIN_CTZS,    UNKNOWN, (int) UINT16_FTYPE_UINT16 },
25385
25386   /* TBM */
25387   { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_si, "__builtin_ia32_bextri_u32", IX86_BUILTIN_BEXTRI32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
25388   { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_di, "__builtin_ia32_bextri_u64", IX86_BUILTIN_BEXTRI64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
25389
25390   /* F16C */
25391   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtph2ps, "__builtin_ia32_vcvtph2ps", IX86_BUILTIN_CVTPH2PS, UNKNOWN, (int) V4SF_FTYPE_V8HI },
25392   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtph2ps256, "__builtin_ia32_vcvtph2ps256", IX86_BUILTIN_CVTPH2PS256, UNKNOWN, (int) V8SF_FTYPE_V8HI },
25393   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtps2ph, "__builtin_ia32_vcvtps2ph", IX86_BUILTIN_CVTPS2PH, UNKNOWN, (int) V8HI_FTYPE_V4SF_INT },
25394   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtps2ph256, "__builtin_ia32_vcvtps2ph256", IX86_BUILTIN_CVTPS2PH256, UNKNOWN, (int) V8HI_FTYPE_V8SF_INT },
25395 };
25396
25397 /* FMA4 and XOP.  */
25398 #define MULTI_ARG_4_DF2_DI_I    V2DF_FTYPE_V2DF_V2DF_V2DI_INT
25399 #define MULTI_ARG_4_DF2_DI_I1   V4DF_FTYPE_V4DF_V4DF_V4DI_INT
25400 #define MULTI_ARG_4_SF2_SI_I    V4SF_FTYPE_V4SF_V4SF_V4SI_INT
25401 #define MULTI_ARG_4_SF2_SI_I1   V8SF_FTYPE_V8SF_V8SF_V8SI_INT
25402 #define MULTI_ARG_3_SF          V4SF_FTYPE_V4SF_V4SF_V4SF
25403 #define MULTI_ARG_3_DF          V2DF_FTYPE_V2DF_V2DF_V2DF
25404 #define MULTI_ARG_3_SF2         V8SF_FTYPE_V8SF_V8SF_V8SF
25405 #define MULTI_ARG_3_DF2         V4DF_FTYPE_V4DF_V4DF_V4DF
25406 #define MULTI_ARG_3_DI          V2DI_FTYPE_V2DI_V2DI_V2DI
25407 #define MULTI_ARG_3_SI          V4SI_FTYPE_V4SI_V4SI_V4SI
25408 #define MULTI_ARG_3_SI_DI       V4SI_FTYPE_V4SI_V4SI_V2DI
25409 #define MULTI_ARG_3_HI          V8HI_FTYPE_V8HI_V8HI_V8HI
25410 #define MULTI_ARG_3_HI_SI       V8HI_FTYPE_V8HI_V8HI_V4SI
25411 #define MULTI_ARG_3_QI          V16QI_FTYPE_V16QI_V16QI_V16QI
25412 #define MULTI_ARG_3_DI2         V4DI_FTYPE_V4DI_V4DI_V4DI
25413 #define MULTI_ARG_3_SI2         V8SI_FTYPE_V8SI_V8SI_V8SI
25414 #define MULTI_ARG_3_HI2         V16HI_FTYPE_V16HI_V16HI_V16HI
25415 #define MULTI_ARG_3_QI2         V32QI_FTYPE_V32QI_V32QI_V32QI
25416 #define MULTI_ARG_2_SF          V4SF_FTYPE_V4SF_V4SF
25417 #define MULTI_ARG_2_DF          V2DF_FTYPE_V2DF_V2DF
25418 #define MULTI_ARG_2_DI          V2DI_FTYPE_V2DI_V2DI
25419 #define MULTI_ARG_2_SI          V4SI_FTYPE_V4SI_V4SI
25420 #define MULTI_ARG_2_HI          V8HI_FTYPE_V8HI_V8HI
25421 #define MULTI_ARG_2_QI          V16QI_FTYPE_V16QI_V16QI
25422 #define MULTI_ARG_2_DI_IMM      V2DI_FTYPE_V2DI_SI
25423 #define MULTI_ARG_2_SI_IMM      V4SI_FTYPE_V4SI_SI
25424 #define MULTI_ARG_2_HI_IMM      V8HI_FTYPE_V8HI_SI
25425 #define MULTI_ARG_2_QI_IMM      V16QI_FTYPE_V16QI_SI
25426 #define MULTI_ARG_2_DI_CMP      V2DI_FTYPE_V2DI_V2DI_CMP
25427 #define MULTI_ARG_2_SI_CMP      V4SI_FTYPE_V4SI_V4SI_CMP
25428 #define MULTI_ARG_2_HI_CMP      V8HI_FTYPE_V8HI_V8HI_CMP
25429 #define MULTI_ARG_2_QI_CMP      V16QI_FTYPE_V16QI_V16QI_CMP
25430 #define MULTI_ARG_2_SF_TF       V4SF_FTYPE_V4SF_V4SF_TF
25431 #define MULTI_ARG_2_DF_TF       V2DF_FTYPE_V2DF_V2DF_TF
25432 #define MULTI_ARG_2_DI_TF       V2DI_FTYPE_V2DI_V2DI_TF
25433 #define MULTI_ARG_2_SI_TF       V4SI_FTYPE_V4SI_V4SI_TF
25434 #define MULTI_ARG_2_HI_TF       V8HI_FTYPE_V8HI_V8HI_TF
25435 #define MULTI_ARG_2_QI_TF       V16QI_FTYPE_V16QI_V16QI_TF
25436 #define MULTI_ARG_1_SF          V4SF_FTYPE_V4SF
25437 #define MULTI_ARG_1_DF          V2DF_FTYPE_V2DF
25438 #define MULTI_ARG_1_SF2         V8SF_FTYPE_V8SF
25439 #define MULTI_ARG_1_DF2         V4DF_FTYPE_V4DF
25440 #define MULTI_ARG_1_DI          V2DI_FTYPE_V2DI
25441 #define MULTI_ARG_1_SI          V4SI_FTYPE_V4SI
25442 #define MULTI_ARG_1_HI          V8HI_FTYPE_V8HI
25443 #define MULTI_ARG_1_QI          V16QI_FTYPE_V16QI
25444 #define MULTI_ARG_1_SI_DI       V2DI_FTYPE_V4SI
25445 #define MULTI_ARG_1_HI_DI       V2DI_FTYPE_V8HI
25446 #define MULTI_ARG_1_HI_SI       V4SI_FTYPE_V8HI
25447 #define MULTI_ARG_1_QI_DI       V2DI_FTYPE_V16QI
25448 #define MULTI_ARG_1_QI_SI       V4SI_FTYPE_V16QI
25449 #define MULTI_ARG_1_QI_HI       V8HI_FTYPE_V16QI
25450
25451 static const struct builtin_description bdesc_multi_arg[] =
25452 {
25453   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmadd_v4sf,
25454     "__builtin_ia32_vfmaddss", IX86_BUILTIN_VFMADDSS,
25455     UNKNOWN, (int)MULTI_ARG_3_SF },
25456   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmadd_v2df,
25457     "__builtin_ia32_vfmaddsd", IX86_BUILTIN_VFMADDSD,
25458     UNKNOWN, (int)MULTI_ARG_3_DF },
25459
25460   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v4sf,
25461     "__builtin_ia32_vfmaddps", IX86_BUILTIN_VFMADDPS,
25462     UNKNOWN, (int)MULTI_ARG_3_SF },
25463   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v2df,
25464     "__builtin_ia32_vfmaddpd", IX86_BUILTIN_VFMADDPD,
25465     UNKNOWN, (int)MULTI_ARG_3_DF },
25466   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v8sf,
25467     "__builtin_ia32_vfmaddps256", IX86_BUILTIN_VFMADDPS256,
25468     UNKNOWN, (int)MULTI_ARG_3_SF2 },
25469   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v4df,
25470     "__builtin_ia32_vfmaddpd256", IX86_BUILTIN_VFMADDPD256,
25471     UNKNOWN, (int)MULTI_ARG_3_DF2 },
25472
25473   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v4sf,
25474     "__builtin_ia32_vfmaddsubps", IX86_BUILTIN_VFMADDSUBPS,
25475     UNKNOWN, (int)MULTI_ARG_3_SF },
25476   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v2df,
25477     "__builtin_ia32_vfmaddsubpd", IX86_BUILTIN_VFMADDSUBPD,
25478     UNKNOWN, (int)MULTI_ARG_3_DF },
25479   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v8sf,
25480     "__builtin_ia32_vfmaddsubps256", IX86_BUILTIN_VFMADDSUBPS256,
25481     UNKNOWN, (int)MULTI_ARG_3_SF2 },
25482   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v4df,
25483     "__builtin_ia32_vfmaddsubpd256", IX86_BUILTIN_VFMADDSUBPD256,
25484     UNKNOWN, (int)MULTI_ARG_3_DF2 },
25485
25486   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov",      IX86_BUILTIN_VPCMOV,      UNKNOWN,      (int)MULTI_ARG_3_DI },
25487   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov_v2di", IX86_BUILTIN_VPCMOV_V2DI, UNKNOWN,      (int)MULTI_ARG_3_DI },
25488   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4si,        "__builtin_ia32_vpcmov_v4si", IX86_BUILTIN_VPCMOV_V4SI, UNKNOWN,      (int)MULTI_ARG_3_SI },
25489   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8hi,        "__builtin_ia32_vpcmov_v8hi", IX86_BUILTIN_VPCMOV_V8HI, UNKNOWN,      (int)MULTI_ARG_3_HI },
25490   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16qi,       "__builtin_ia32_vpcmov_v16qi",IX86_BUILTIN_VPCMOV_V16QI,UNKNOWN,      (int)MULTI_ARG_3_QI },
25491   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2df,        "__builtin_ia32_vpcmov_v2df", IX86_BUILTIN_VPCMOV_V2DF, UNKNOWN,      (int)MULTI_ARG_3_DF },
25492   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4sf,        "__builtin_ia32_vpcmov_v4sf", IX86_BUILTIN_VPCMOV_V4SF, UNKNOWN,      (int)MULTI_ARG_3_SF },
25493
25494   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov256",       IX86_BUILTIN_VPCMOV256,       UNKNOWN,      (int)MULTI_ARG_3_DI2 },
25495   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov_v4di256",  IX86_BUILTIN_VPCMOV_V4DI256,  UNKNOWN,      (int)MULTI_ARG_3_DI2 },
25496   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8si256,        "__builtin_ia32_vpcmov_v8si256",  IX86_BUILTIN_VPCMOV_V8SI256,  UNKNOWN,      (int)MULTI_ARG_3_SI2 },
25497   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16hi256,       "__builtin_ia32_vpcmov_v16hi256", IX86_BUILTIN_VPCMOV_V16HI256, UNKNOWN,      (int)MULTI_ARG_3_HI2 },
25498   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v32qi256,       "__builtin_ia32_vpcmov_v32qi256", IX86_BUILTIN_VPCMOV_V32QI256, UNKNOWN,      (int)MULTI_ARG_3_QI2 },
25499   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4df256,        "__builtin_ia32_vpcmov_v4df256",  IX86_BUILTIN_VPCMOV_V4DF256,  UNKNOWN,      (int)MULTI_ARG_3_DF2 },
25500   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8sf256,        "__builtin_ia32_vpcmov_v8sf256",  IX86_BUILTIN_VPCMOV_V8SF256,  UNKNOWN,      (int)MULTI_ARG_3_SF2 },
25501
25502   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pperm,             "__builtin_ia32_vpperm",      IX86_BUILTIN_VPPERM,      UNKNOWN,      (int)MULTI_ARG_3_QI },
25503
25504   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssww,          "__builtin_ia32_vpmacssww",   IX86_BUILTIN_VPMACSSWW,   UNKNOWN,      (int)MULTI_ARG_3_HI },
25505   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsww,           "__builtin_ia32_vpmacsww",    IX86_BUILTIN_VPMACSWW,    UNKNOWN,      (int)MULTI_ARG_3_HI },
25506   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsswd,          "__builtin_ia32_vpmacsswd",   IX86_BUILTIN_VPMACSSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25507   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacswd,           "__builtin_ia32_vpmacswd",    IX86_BUILTIN_VPMACSWD,    UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25508   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdd,          "__builtin_ia32_vpmacssdd",   IX86_BUILTIN_VPMACSSDD,   UNKNOWN,      (int)MULTI_ARG_3_SI },
25509   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdd,           "__builtin_ia32_vpmacsdd",    IX86_BUILTIN_VPMACSDD,    UNKNOWN,      (int)MULTI_ARG_3_SI },
25510   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdql,         "__builtin_ia32_vpmacssdql",  IX86_BUILTIN_VPMACSSDQL,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25511   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdqh,         "__builtin_ia32_vpmacssdqh",  IX86_BUILTIN_VPMACSSDQH,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25512   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdql,          "__builtin_ia32_vpmacsdql",   IX86_BUILTIN_VPMACSDQL,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25513   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdqh,          "__builtin_ia32_vpmacsdqh",   IX86_BUILTIN_VPMACSDQH,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25514   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcsswd,         "__builtin_ia32_vpmadcsswd",  IX86_BUILTIN_VPMADCSSWD,  UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25515   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcswd,          "__builtin_ia32_vpmadcswd",   IX86_BUILTIN_VPMADCSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25516
25517   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv2di3,        "__builtin_ia32_vprotq",      IX86_BUILTIN_VPROTQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25518   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv4si3,        "__builtin_ia32_vprotd",      IX86_BUILTIN_VPROTD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25519   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv8hi3,        "__builtin_ia32_vprotw",      IX86_BUILTIN_VPROTW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25520   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv16qi3,       "__builtin_ia32_vprotb",      IX86_BUILTIN_VPROTB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25521   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv2di3,         "__builtin_ia32_vprotqi",     IX86_BUILTIN_VPROTQ_IMM,  UNKNOWN,      (int)MULTI_ARG_2_DI_IMM },
25522   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv4si3,         "__builtin_ia32_vprotdi",     IX86_BUILTIN_VPROTD_IMM,  UNKNOWN,      (int)MULTI_ARG_2_SI_IMM },
25523   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv8hi3,         "__builtin_ia32_vprotwi",     IX86_BUILTIN_VPROTW_IMM,  UNKNOWN,      (int)MULTI_ARG_2_HI_IMM },
25524   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv16qi3,        "__builtin_ia32_vprotbi",     IX86_BUILTIN_VPROTB_IMM,  UNKNOWN,      (int)MULTI_ARG_2_QI_IMM },
25525   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv2di3,         "__builtin_ia32_vpshaq",      IX86_BUILTIN_VPSHAQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25526   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv4si3,         "__builtin_ia32_vpshad",      IX86_BUILTIN_VPSHAD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25527   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv8hi3,         "__builtin_ia32_vpshaw",      IX86_BUILTIN_VPSHAW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25528   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv16qi3,        "__builtin_ia32_vpshab",      IX86_BUILTIN_VPSHAB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25529   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv2di3,         "__builtin_ia32_vpshlq",      IX86_BUILTIN_VPSHLQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25530   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv4si3,         "__builtin_ia32_vpshld",      IX86_BUILTIN_VPSHLD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25531   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv8hi3,         "__builtin_ia32_vpshlw",      IX86_BUILTIN_VPSHLW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25532   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv16qi3,        "__builtin_ia32_vpshlb",      IX86_BUILTIN_VPSHLB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25533
25534   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv4sf2,       "__builtin_ia32_vfrczss",     IX86_BUILTIN_VFRCZSS,     UNKNOWN,      (int)MULTI_ARG_2_SF },
25535   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv2df2,       "__builtin_ia32_vfrczsd",     IX86_BUILTIN_VFRCZSD,     UNKNOWN,      (int)MULTI_ARG_2_DF },
25536   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4sf2,         "__builtin_ia32_vfrczps",     IX86_BUILTIN_VFRCZPS,     UNKNOWN,      (int)MULTI_ARG_1_SF },
25537   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv2df2,         "__builtin_ia32_vfrczpd",     IX86_BUILTIN_VFRCZPD,     UNKNOWN,      (int)MULTI_ARG_1_DF },
25538   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv8sf2,         "__builtin_ia32_vfrczps256",  IX86_BUILTIN_VFRCZPS256,  UNKNOWN,      (int)MULTI_ARG_1_SF2 },
25539   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4df2,         "__builtin_ia32_vfrczpd256",  IX86_BUILTIN_VFRCZPD256,  UNKNOWN,      (int)MULTI_ARG_1_DF2 },
25540
25541   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbw,           "__builtin_ia32_vphaddbw",    IX86_BUILTIN_VPHADDBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25542   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbd,           "__builtin_ia32_vphaddbd",    IX86_BUILTIN_VPHADDBD,    UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
25543   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbq,           "__builtin_ia32_vphaddbq",    IX86_BUILTIN_VPHADDBQ,    UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
25544   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwd,           "__builtin_ia32_vphaddwd",    IX86_BUILTIN_VPHADDWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25545   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwq,           "__builtin_ia32_vphaddwq",    IX86_BUILTIN_VPHADDWQ,    UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
25546   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadddq,           "__builtin_ia32_vphadddq",    IX86_BUILTIN_VPHADDDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25547   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubw,          "__builtin_ia32_vphaddubw",   IX86_BUILTIN_VPHADDUBW,   UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25548   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubd,          "__builtin_ia32_vphaddubd",   IX86_BUILTIN_VPHADDUBD,   UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
25549   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubq,          "__builtin_ia32_vphaddubq",   IX86_BUILTIN_VPHADDUBQ,   UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
25550   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwd,          "__builtin_ia32_vphadduwd",   IX86_BUILTIN_VPHADDUWD,   UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25551   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwq,          "__builtin_ia32_vphadduwq",   IX86_BUILTIN_VPHADDUWQ,   UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
25552   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddudq,          "__builtin_ia32_vphaddudq",   IX86_BUILTIN_VPHADDUDQ,   UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25553   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubbw,           "__builtin_ia32_vphsubbw",    IX86_BUILTIN_VPHSUBBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25554   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubwd,           "__builtin_ia32_vphsubwd",    IX86_BUILTIN_VPHSUBWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25555   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubdq,           "__builtin_ia32_vphsubdq",    IX86_BUILTIN_VPHSUBDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25556
25557   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomeqb",    IX86_BUILTIN_VPCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
25558   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneb",    IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
25559   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneqb",   IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
25560   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomltb",    IX86_BUILTIN_VPCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
25561   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomleb",    IX86_BUILTIN_VPCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
25562   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgtb",    IX86_BUILTIN_VPCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
25563   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgeb",    IX86_BUILTIN_VPCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
25564
25565   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomeqw",    IX86_BUILTIN_VPCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
25566   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomnew",    IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
25567   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomneqw",   IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
25568   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomltw",    IX86_BUILTIN_VPCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
25569   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomlew",    IX86_BUILTIN_VPCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
25570   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgtw",    IX86_BUILTIN_VPCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
25571   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgew",    IX86_BUILTIN_VPCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
25572
25573   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomeqd",    IX86_BUILTIN_VPCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
25574   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomned",    IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
25575   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomneqd",   IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
25576   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomltd",    IX86_BUILTIN_VPCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
25577   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomled",    IX86_BUILTIN_VPCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
25578   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomgtd",    IX86_BUILTIN_VPCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
25579   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomged",    IX86_BUILTIN_VPCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
25580
25581   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomeqq",    IX86_BUILTIN_VPCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
25582   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneq",    IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
25583   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneqq",   IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
25584   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomltq",    IX86_BUILTIN_VPCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
25585   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomleq",    IX86_BUILTIN_VPCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
25586   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgtq",    IX86_BUILTIN_VPCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
25587   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgeq",    IX86_BUILTIN_VPCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
25588
25589   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomequb",   IX86_BUILTIN_VPCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
25590   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomneub",   IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
25591   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomnequb",  IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
25592   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomltub",   IX86_BUILTIN_VPCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
25593   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomleub",   IX86_BUILTIN_VPCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
25594   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgtub",   IX86_BUILTIN_VPCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
25595   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgeub",   IX86_BUILTIN_VPCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
25596
25597   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomequw",   IX86_BUILTIN_VPCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
25598   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomneuw",   IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
25599   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomnequw",  IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
25600   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomltuw",   IX86_BUILTIN_VPCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
25601   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomleuw",   IX86_BUILTIN_VPCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
25602   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgtuw",   IX86_BUILTIN_VPCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
25603   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgeuw",   IX86_BUILTIN_VPCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
25604
25605   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomequd",   IX86_BUILTIN_VPCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
25606   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomneud",   IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
25607   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomnequd",  IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
25608   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomltud",   IX86_BUILTIN_VPCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
25609   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomleud",   IX86_BUILTIN_VPCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
25610   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgtud",   IX86_BUILTIN_VPCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
25611   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgeud",   IX86_BUILTIN_VPCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
25612
25613   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomequq",   IX86_BUILTIN_VPCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
25614   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomneuq",   IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
25615   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomnequq",  IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
25616   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomltuq",   IX86_BUILTIN_VPCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
25617   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomleuq",   IX86_BUILTIN_VPCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
25618   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgtuq",   IX86_BUILTIN_VPCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
25619   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgeuq",   IX86_BUILTIN_VPCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
25620
25621   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomfalseb", IX86_BUILTIN_VPCOMFALSEB, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
25622   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomfalsew", IX86_BUILTIN_VPCOMFALSEW, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
25623   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomfalsed", IX86_BUILTIN_VPCOMFALSED, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
25624   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomfalseq", IX86_BUILTIN_VPCOMFALSEQ, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
25625   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomfalseub",IX86_BUILTIN_VPCOMFALSEUB,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
25626   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomfalseuw",IX86_BUILTIN_VPCOMFALSEUW,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
25627   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomfalseud",IX86_BUILTIN_VPCOMFALSEUD,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
25628   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomfalseuq",IX86_BUILTIN_VPCOMFALSEUQ,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
25629
25630   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomtrueb",  IX86_BUILTIN_VPCOMTRUEB,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
25631   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomtruew",  IX86_BUILTIN_VPCOMTRUEW,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
25632   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomtrued",  IX86_BUILTIN_VPCOMTRUED,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
25633   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomtrueq",  IX86_BUILTIN_VPCOMTRUEQ,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
25634   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomtrueub", IX86_BUILTIN_VPCOMTRUEUB, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
25635   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomtrueuw", IX86_BUILTIN_VPCOMTRUEUW, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
25636   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomtrueud", IX86_BUILTIN_VPCOMTRUEUD, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
25637   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomtrueuq", IX86_BUILTIN_VPCOMTRUEUQ, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
25638
25639   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v2df3,     "__builtin_ia32_vpermil2pd",  IX86_BUILTIN_VPERMIL2PD, UNKNOWN, (int)MULTI_ARG_4_DF2_DI_I },
25640   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v4sf3,     "__builtin_ia32_vpermil2ps",  IX86_BUILTIN_VPERMIL2PS, UNKNOWN, (int)MULTI_ARG_4_SF2_SI_I },
25641   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v4df3,     "__builtin_ia32_vpermil2pd256", IX86_BUILTIN_VPERMIL2PD256, UNKNOWN, (int)MULTI_ARG_4_DF2_DI_I1 },
25642   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v8sf3,     "__builtin_ia32_vpermil2ps256", IX86_BUILTIN_VPERMIL2PS256, UNKNOWN, (int)MULTI_ARG_4_SF2_SI_I1 },
25643
25644 };
25645
25646 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
25647    in the current target ISA to allow the user to compile particular modules
25648    with different target specific options that differ from the command line
25649    options.  */
25650 static void
25651 ix86_init_mmx_sse_builtins (void)
25652 {
25653   const struct builtin_description * d;
25654   enum ix86_builtin_func_type ftype;
25655   size_t i;
25656
25657   /* Add all special builtins with variable number of operands.  */
25658   for (i = 0, d = bdesc_special_args;
25659        i < ARRAY_SIZE (bdesc_special_args);
25660        i++, d++)
25661     {
25662       if (d->name == 0)
25663         continue;
25664
25665       ftype = (enum ix86_builtin_func_type) d->flag;
25666       def_builtin (d->mask, d->name, ftype, d->code);
25667     }
25668
25669   /* Add all builtins with variable number of operands.  */
25670   for (i = 0, d = bdesc_args;
25671        i < ARRAY_SIZE (bdesc_args);
25672        i++, d++)
25673     {
25674       if (d->name == 0)
25675         continue;
25676
25677       ftype = (enum ix86_builtin_func_type) d->flag;
25678       def_builtin_const (d->mask, d->name, ftype, d->code);
25679     }
25680
25681   /* pcmpestr[im] insns.  */
25682   for (i = 0, d = bdesc_pcmpestr;
25683        i < ARRAY_SIZE (bdesc_pcmpestr);
25684        i++, d++)
25685     {
25686       if (d->code == IX86_BUILTIN_PCMPESTRM128)
25687         ftype = V16QI_FTYPE_V16QI_INT_V16QI_INT_INT;
25688       else
25689         ftype = INT_FTYPE_V16QI_INT_V16QI_INT_INT;
25690       def_builtin_const (d->mask, d->name, ftype, d->code);
25691     }
25692
25693   /* pcmpistr[im] insns.  */
25694   for (i = 0, d = bdesc_pcmpistr;
25695        i < ARRAY_SIZE (bdesc_pcmpistr);
25696        i++, d++)
25697     {
25698       if (d->code == IX86_BUILTIN_PCMPISTRM128)
25699         ftype = V16QI_FTYPE_V16QI_V16QI_INT;
25700       else
25701         ftype = INT_FTYPE_V16QI_V16QI_INT;
25702       def_builtin_const (d->mask, d->name, ftype, d->code);
25703     }
25704
25705   /* comi/ucomi insns.  */
25706   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
25707     {
25708       if (d->mask == OPTION_MASK_ISA_SSE2)
25709         ftype = INT_FTYPE_V2DF_V2DF;
25710       else
25711         ftype = INT_FTYPE_V4SF_V4SF;
25712       def_builtin_const (d->mask, d->name, ftype, d->code);
25713     }
25714
25715   /* SSE */
25716   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr",
25717                VOID_FTYPE_UNSIGNED, IX86_BUILTIN_LDMXCSR);
25718   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr",
25719                UNSIGNED_FTYPE_VOID, IX86_BUILTIN_STMXCSR);
25720
25721   /* SSE or 3DNow!A */
25722   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25723                "__builtin_ia32_maskmovq", VOID_FTYPE_V8QI_V8QI_PCHAR,
25724                IX86_BUILTIN_MASKMOVQ);
25725
25726   /* SSE2 */
25727   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu",
25728                VOID_FTYPE_V16QI_V16QI_PCHAR, IX86_BUILTIN_MASKMOVDQU);
25729
25730   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush",
25731                VOID_FTYPE_PCVOID, IX86_BUILTIN_CLFLUSH);
25732   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence",
25733                             VOID_FTYPE_VOID, IX86_BUILTIN_MFENCE);
25734
25735   /* SSE3.  */
25736   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor",
25737                VOID_FTYPE_PCVOID_UNSIGNED_UNSIGNED, IX86_BUILTIN_MONITOR);
25738   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait",
25739                VOID_FTYPE_UNSIGNED_UNSIGNED, IX86_BUILTIN_MWAIT);
25740
25741   /* AES */
25742   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128",
25743                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENC128);
25744   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128",
25745                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENCLAST128);
25746   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128",
25747                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDEC128);
25748   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128",
25749                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDECLAST128);
25750   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128",
25751                      V2DI_FTYPE_V2DI, IX86_BUILTIN_AESIMC128);
25752   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128",
25753                      V2DI_FTYPE_V2DI_INT, IX86_BUILTIN_AESKEYGENASSIST128);
25754
25755   /* PCLMUL */
25756   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128",
25757                      V2DI_FTYPE_V2DI_V2DI_INT, IX86_BUILTIN_PCLMULQDQ128);
25758
25759   /* RDRND */
25760   def_builtin (OPTION_MASK_ISA_RDRND, "__builtin_ia32_rdrand16_step",
25761                INT_FTYPE_PUSHORT, IX86_BUILTIN_RDRAND16_STEP);
25762   def_builtin (OPTION_MASK_ISA_RDRND, "__builtin_ia32_rdrand32_step",
25763                INT_FTYPE_PUNSIGNED, IX86_BUILTIN_RDRAND32_STEP);
25764   def_builtin (OPTION_MASK_ISA_RDRND | OPTION_MASK_ISA_64BIT,
25765                "__builtin_ia32_rdrand64_step", INT_FTYPE_PULONGLONG,
25766                IX86_BUILTIN_RDRAND64_STEP);
25767
25768   /* MMX access to the vec_init patterns.  */
25769   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si",
25770                      V2SI_FTYPE_INT_INT, IX86_BUILTIN_VEC_INIT_V2SI);
25771
25772   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi",
25773                      V4HI_FTYPE_HI_HI_HI_HI,
25774                      IX86_BUILTIN_VEC_INIT_V4HI);
25775
25776   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi",
25777                      V8QI_FTYPE_QI_QI_QI_QI_QI_QI_QI_QI,
25778                      IX86_BUILTIN_VEC_INIT_V8QI);
25779
25780   /* Access to the vec_extract patterns.  */
25781   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df",
25782                      DOUBLE_FTYPE_V2DF_INT, IX86_BUILTIN_VEC_EXT_V2DF);
25783   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di",
25784                      DI_FTYPE_V2DI_INT, IX86_BUILTIN_VEC_EXT_V2DI);
25785   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf",
25786                      FLOAT_FTYPE_V4SF_INT, IX86_BUILTIN_VEC_EXT_V4SF);
25787   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si",
25788                      SI_FTYPE_V4SI_INT, IX86_BUILTIN_VEC_EXT_V4SI);
25789   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi",
25790                      HI_FTYPE_V8HI_INT, IX86_BUILTIN_VEC_EXT_V8HI);
25791
25792   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25793                      "__builtin_ia32_vec_ext_v4hi",
25794                      HI_FTYPE_V4HI_INT, IX86_BUILTIN_VEC_EXT_V4HI);
25795
25796   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si",
25797                      SI_FTYPE_V2SI_INT, IX86_BUILTIN_VEC_EXT_V2SI);
25798
25799   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi",
25800                      QI_FTYPE_V16QI_INT, IX86_BUILTIN_VEC_EXT_V16QI);
25801
25802   /* Access to the vec_set patterns.  */
25803   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT,
25804                      "__builtin_ia32_vec_set_v2di",
25805                      V2DI_FTYPE_V2DI_DI_INT, IX86_BUILTIN_VEC_SET_V2DI);
25806
25807   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf",
25808                      V4SF_FTYPE_V4SF_FLOAT_INT, IX86_BUILTIN_VEC_SET_V4SF);
25809
25810   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si",
25811                      V4SI_FTYPE_V4SI_SI_INT, IX86_BUILTIN_VEC_SET_V4SI);
25812
25813   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi",
25814                      V8HI_FTYPE_V8HI_HI_INT, IX86_BUILTIN_VEC_SET_V8HI);
25815
25816   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25817                      "__builtin_ia32_vec_set_v4hi",
25818                      V4HI_FTYPE_V4HI_HI_INT, IX86_BUILTIN_VEC_SET_V4HI);
25819
25820   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi",
25821                      V16QI_FTYPE_V16QI_QI_INT, IX86_BUILTIN_VEC_SET_V16QI);
25822
25823   /* Add FMA4 multi-arg argument instructions */
25824   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
25825     {
25826       if (d->name == 0)
25827         continue;
25828
25829       ftype = (enum ix86_builtin_func_type) d->flag;
25830       def_builtin_const (d->mask, d->name, ftype, d->code);
25831     }
25832 }
25833
25834 /* Internal method for ix86_init_builtins.  */
25835
25836 static void
25837 ix86_init_builtins_va_builtins_abi (void)
25838 {
25839   tree ms_va_ref, sysv_va_ref;
25840   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
25841   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
25842   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
25843   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
25844
25845   if (!TARGET_64BIT)
25846     return;
25847   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
25848   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
25849   ms_va_ref = build_reference_type (ms_va_list_type_node);
25850   sysv_va_ref =
25851     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
25852
25853   fnvoid_va_end_ms =
25854     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
25855   fnvoid_va_start_ms =
25856     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
25857   fnvoid_va_end_sysv =
25858     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
25859   fnvoid_va_start_sysv =
25860     build_varargs_function_type_list (void_type_node, sysv_va_ref,
25861                                        NULL_TREE);
25862   fnvoid_va_copy_ms =
25863     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
25864                               NULL_TREE);
25865   fnvoid_va_copy_sysv =
25866     build_function_type_list (void_type_node, sysv_va_ref,
25867                               sysv_va_ref, NULL_TREE);
25868
25869   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
25870                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
25871   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
25872                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
25873   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
25874                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
25875   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
25876                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25877   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
25878                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25879   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
25880                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25881 }
25882
25883 static void
25884 ix86_init_builtin_types (void)
25885 {
25886   tree float128_type_node, float80_type_node;
25887
25888   /* The __float80 type.  */
25889   float80_type_node = long_double_type_node;
25890   if (TYPE_MODE (float80_type_node) != XFmode)
25891     {
25892       /* The __float80 type.  */
25893       float80_type_node = make_node (REAL_TYPE);
25894
25895       TYPE_PRECISION (float80_type_node) = 80;
25896       layout_type (float80_type_node);
25897     }
25898   lang_hooks.types.register_builtin_type (float80_type_node, "__float80");
25899
25900   /* The __float128 type.  */
25901   float128_type_node = make_node (REAL_TYPE);
25902   TYPE_PRECISION (float128_type_node) = 128;
25903   layout_type (float128_type_node);
25904   lang_hooks.types.register_builtin_type (float128_type_node, "__float128");
25905
25906   /* This macro is built by i386-builtin-types.awk.  */
25907   DEFINE_BUILTIN_PRIMITIVE_TYPES;
25908 }
25909
25910 static void
25911 ix86_init_builtins (void)
25912 {
25913   tree t;
25914
25915   ix86_init_builtin_types ();
25916
25917   /* TFmode support builtins.  */
25918   def_builtin_const (0, "__builtin_infq",
25919                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_INFQ);
25920   def_builtin_const (0, "__builtin_huge_valq",
25921                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_HUGE_VALQ);
25922
25923   /* We will expand them to normal call if SSE2 isn't available since
25924      they are used by libgcc. */
25925   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128);
25926   t = add_builtin_function ("__builtin_fabsq", t, IX86_BUILTIN_FABSQ,
25927                             BUILT_IN_MD, "__fabstf2", NULL_TREE);
25928   TREE_READONLY (t) = 1;
25929   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = t;
25930
25931   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128_FLOAT128);
25932   t = add_builtin_function ("__builtin_copysignq", t, IX86_BUILTIN_COPYSIGNQ,
25933                             BUILT_IN_MD, "__copysigntf3", NULL_TREE);
25934   TREE_READONLY (t) = 1;
25935   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = t;
25936
25937   ix86_init_mmx_sse_builtins ();
25938
25939   if (TARGET_64BIT)
25940     ix86_init_builtins_va_builtins_abi ();
25941
25942 #ifdef SUBTARGET_INIT_BUILTINS
25943   SUBTARGET_INIT_BUILTINS;
25944 #endif
25945 }
25946
25947 /* Return the ix86 builtin for CODE.  */
25948
25949 static tree
25950 ix86_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
25951 {
25952   if (code >= IX86_BUILTIN_MAX)
25953     return error_mark_node;
25954
25955   return ix86_builtins[code];
25956 }
25957
25958 /* Errors in the source file can cause expand_expr to return const0_rtx
25959    where we expect a vector.  To avoid crashing, use one of the vector
25960    clear instructions.  */
25961 static rtx
25962 safe_vector_operand (rtx x, enum machine_mode mode)
25963 {
25964   if (x == const0_rtx)
25965     x = CONST0_RTX (mode);
25966   return x;
25967 }
25968
25969 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
25970
25971 static rtx
25972 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
25973 {
25974   rtx pat;
25975   tree arg0 = CALL_EXPR_ARG (exp, 0);
25976   tree arg1 = CALL_EXPR_ARG (exp, 1);
25977   rtx op0 = expand_normal (arg0);
25978   rtx op1 = expand_normal (arg1);
25979   enum machine_mode tmode = insn_data[icode].operand[0].mode;
25980   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
25981   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
25982
25983   if (VECTOR_MODE_P (mode0))
25984     op0 = safe_vector_operand (op0, mode0);
25985   if (VECTOR_MODE_P (mode1))
25986     op1 = safe_vector_operand (op1, mode1);
25987
25988   if (optimize || !target
25989       || GET_MODE (target) != tmode
25990       || !insn_data[icode].operand[0].predicate (target, tmode))
25991     target = gen_reg_rtx (tmode);
25992
25993   if (GET_MODE (op1) == SImode && mode1 == TImode)
25994     {
25995       rtx x = gen_reg_rtx (V4SImode);
25996       emit_insn (gen_sse2_loadd (x, op1));
25997       op1 = gen_lowpart (TImode, x);
25998     }
25999
26000   if (!insn_data[icode].operand[1].predicate (op0, mode0))
26001     op0 = copy_to_mode_reg (mode0, op0);
26002   if (!insn_data[icode].operand[2].predicate (op1, mode1))
26003     op1 = copy_to_mode_reg (mode1, op1);
26004
26005   pat = GEN_FCN (icode) (target, op0, op1);
26006   if (! pat)
26007     return 0;
26008
26009   emit_insn (pat);
26010
26011   return target;
26012 }
26013
26014 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
26015
26016 static rtx
26017 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
26018                                enum ix86_builtin_func_type m_type,
26019                                enum rtx_code sub_code)
26020 {
26021   rtx pat;
26022   int i;
26023   int nargs;
26024   bool comparison_p = false;
26025   bool tf_p = false;
26026   bool last_arg_constant = false;
26027   int num_memory = 0;
26028   struct {
26029     rtx op;
26030     enum machine_mode mode;
26031   } args[4];
26032
26033   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26034
26035   switch (m_type)
26036     {
26037     case MULTI_ARG_4_DF2_DI_I:
26038     case MULTI_ARG_4_DF2_DI_I1:
26039     case MULTI_ARG_4_SF2_SI_I:
26040     case MULTI_ARG_4_SF2_SI_I1:
26041       nargs = 4;
26042       last_arg_constant = true;
26043       break;
26044
26045     case MULTI_ARG_3_SF:
26046     case MULTI_ARG_3_DF:
26047     case MULTI_ARG_3_SF2:
26048     case MULTI_ARG_3_DF2:
26049     case MULTI_ARG_3_DI:
26050     case MULTI_ARG_3_SI:
26051     case MULTI_ARG_3_SI_DI:
26052     case MULTI_ARG_3_HI:
26053     case MULTI_ARG_3_HI_SI:
26054     case MULTI_ARG_3_QI:
26055     case MULTI_ARG_3_DI2:
26056     case MULTI_ARG_3_SI2:
26057     case MULTI_ARG_3_HI2:
26058     case MULTI_ARG_3_QI2:
26059       nargs = 3;
26060       break;
26061
26062     case MULTI_ARG_2_SF:
26063     case MULTI_ARG_2_DF:
26064     case MULTI_ARG_2_DI:
26065     case MULTI_ARG_2_SI:
26066     case MULTI_ARG_2_HI:
26067     case MULTI_ARG_2_QI:
26068       nargs = 2;
26069       break;
26070
26071     case MULTI_ARG_2_DI_IMM:
26072     case MULTI_ARG_2_SI_IMM:
26073     case MULTI_ARG_2_HI_IMM:
26074     case MULTI_ARG_2_QI_IMM:
26075       nargs = 2;
26076       last_arg_constant = true;
26077       break;
26078
26079     case MULTI_ARG_1_SF:
26080     case MULTI_ARG_1_DF:
26081     case MULTI_ARG_1_SF2:
26082     case MULTI_ARG_1_DF2:
26083     case MULTI_ARG_1_DI:
26084     case MULTI_ARG_1_SI:
26085     case MULTI_ARG_1_HI:
26086     case MULTI_ARG_1_QI:
26087     case MULTI_ARG_1_SI_DI:
26088     case MULTI_ARG_1_HI_DI:
26089     case MULTI_ARG_1_HI_SI:
26090     case MULTI_ARG_1_QI_DI:
26091     case MULTI_ARG_1_QI_SI:
26092     case MULTI_ARG_1_QI_HI:
26093       nargs = 1;
26094       break;
26095
26096     case MULTI_ARG_2_DI_CMP:
26097     case MULTI_ARG_2_SI_CMP:
26098     case MULTI_ARG_2_HI_CMP:
26099     case MULTI_ARG_2_QI_CMP:
26100       nargs = 2;
26101       comparison_p = true;
26102       break;
26103
26104     case MULTI_ARG_2_SF_TF:
26105     case MULTI_ARG_2_DF_TF:
26106     case MULTI_ARG_2_DI_TF:
26107     case MULTI_ARG_2_SI_TF:
26108     case MULTI_ARG_2_HI_TF:
26109     case MULTI_ARG_2_QI_TF:
26110       nargs = 2;
26111       tf_p = true;
26112       break;
26113
26114     default:
26115       gcc_unreachable ();
26116     }
26117
26118   if (optimize || !target
26119       || GET_MODE (target) != tmode
26120       || !insn_data[icode].operand[0].predicate (target, tmode))
26121     target = gen_reg_rtx (tmode);
26122
26123   gcc_assert (nargs <= 4);
26124
26125   for (i = 0; i < nargs; i++)
26126     {
26127       tree arg = CALL_EXPR_ARG (exp, i);
26128       rtx op = expand_normal (arg);
26129       int adjust = (comparison_p) ? 1 : 0;
26130       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
26131
26132       if (last_arg_constant && i == nargs-1)
26133         {
26134           if (!CONST_INT_P (op))
26135             {
26136               error ("last argument must be an immediate");
26137               return gen_reg_rtx (tmode);
26138             }
26139         }
26140       else
26141         {
26142           if (VECTOR_MODE_P (mode))
26143             op = safe_vector_operand (op, mode);
26144
26145           /* If we aren't optimizing, only allow one memory operand to be
26146              generated.  */
26147           if (memory_operand (op, mode))
26148             num_memory++;
26149
26150           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
26151
26152           if (optimize
26153               || !insn_data[icode].operand[i+adjust+1].predicate (op, mode)
26154               || num_memory > 1)
26155             op = force_reg (mode, op);
26156         }
26157
26158       args[i].op = op;
26159       args[i].mode = mode;
26160     }
26161
26162   switch (nargs)
26163     {
26164     case 1:
26165       pat = GEN_FCN (icode) (target, args[0].op);
26166       break;
26167
26168     case 2:
26169       if (tf_p)
26170         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
26171                                GEN_INT ((int)sub_code));
26172       else if (! comparison_p)
26173         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
26174       else
26175         {
26176           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
26177                                        args[0].op,
26178                                        args[1].op);
26179
26180           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
26181         }
26182       break;
26183
26184     case 3:
26185       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
26186       break;
26187
26188     case 4:
26189       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op, args[3].op);
26190       break;
26191
26192     default:
26193       gcc_unreachable ();
26194     }
26195
26196   if (! pat)
26197     return 0;
26198
26199   emit_insn (pat);
26200   return target;
26201 }
26202
26203 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
26204    insns with vec_merge.  */
26205
26206 static rtx
26207 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
26208                                     rtx target)
26209 {
26210   rtx pat;
26211   tree arg0 = CALL_EXPR_ARG (exp, 0);
26212   rtx op1, op0 = expand_normal (arg0);
26213   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26214   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
26215
26216   if (optimize || !target
26217       || GET_MODE (target) != tmode
26218       || !insn_data[icode].operand[0].predicate (target, tmode))
26219     target = gen_reg_rtx (tmode);
26220
26221   if (VECTOR_MODE_P (mode0))
26222     op0 = safe_vector_operand (op0, mode0);
26223
26224   if ((optimize && !register_operand (op0, mode0))
26225       || !insn_data[icode].operand[1].predicate (op0, mode0))
26226     op0 = copy_to_mode_reg (mode0, op0);
26227
26228   op1 = op0;
26229   if (!insn_data[icode].operand[2].predicate (op1, mode0))
26230     op1 = copy_to_mode_reg (mode0, op1);
26231
26232   pat = GEN_FCN (icode) (target, op0, op1);
26233   if (! pat)
26234     return 0;
26235   emit_insn (pat);
26236   return target;
26237 }
26238
26239 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
26240
26241 static rtx
26242 ix86_expand_sse_compare (const struct builtin_description *d,
26243                          tree exp, rtx target, bool swap)
26244 {
26245   rtx pat;
26246   tree arg0 = CALL_EXPR_ARG (exp, 0);
26247   tree arg1 = CALL_EXPR_ARG (exp, 1);
26248   rtx op0 = expand_normal (arg0);
26249   rtx op1 = expand_normal (arg1);
26250   rtx op2;
26251   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
26252   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
26253   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
26254   enum rtx_code comparison = d->comparison;
26255
26256   if (VECTOR_MODE_P (mode0))
26257     op0 = safe_vector_operand (op0, mode0);
26258   if (VECTOR_MODE_P (mode1))
26259     op1 = safe_vector_operand (op1, mode1);
26260
26261   /* Swap operands if we have a comparison that isn't available in
26262      hardware.  */
26263   if (swap)
26264     {
26265       rtx tmp = gen_reg_rtx (mode1);
26266       emit_move_insn (tmp, op1);
26267       op1 = op0;
26268       op0 = tmp;
26269     }
26270
26271   if (optimize || !target
26272       || GET_MODE (target) != tmode
26273       || !insn_data[d->icode].operand[0].predicate (target, tmode))
26274     target = gen_reg_rtx (tmode);
26275
26276   if ((optimize && !register_operand (op0, mode0))
26277       || !insn_data[d->icode].operand[1].predicate (op0, mode0))
26278     op0 = copy_to_mode_reg (mode0, op0);
26279   if ((optimize && !register_operand (op1, mode1))
26280       || !insn_data[d->icode].operand[2].predicate (op1, mode1))
26281     op1 = copy_to_mode_reg (mode1, op1);
26282
26283   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
26284   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
26285   if (! pat)
26286     return 0;
26287   emit_insn (pat);
26288   return target;
26289 }
26290
26291 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
26292
26293 static rtx
26294 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
26295                       rtx target)
26296 {
26297   rtx pat;
26298   tree arg0 = CALL_EXPR_ARG (exp, 0);
26299   tree arg1 = CALL_EXPR_ARG (exp, 1);
26300   rtx op0 = expand_normal (arg0);
26301   rtx op1 = expand_normal (arg1);
26302   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
26303   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
26304   enum rtx_code comparison = d->comparison;
26305
26306   if (VECTOR_MODE_P (mode0))
26307     op0 = safe_vector_operand (op0, mode0);
26308   if (VECTOR_MODE_P (mode1))
26309     op1 = safe_vector_operand (op1, mode1);
26310
26311   /* Swap operands if we have a comparison that isn't available in
26312      hardware.  */
26313   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
26314     {
26315       rtx tmp = op1;
26316       op1 = op0;
26317       op0 = tmp;
26318     }
26319
26320   target = gen_reg_rtx (SImode);
26321   emit_move_insn (target, const0_rtx);
26322   target = gen_rtx_SUBREG (QImode, target, 0);
26323
26324   if ((optimize && !register_operand (op0, mode0))
26325       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26326     op0 = copy_to_mode_reg (mode0, op0);
26327   if ((optimize && !register_operand (op1, mode1))
26328       || !insn_data[d->icode].operand[1].predicate (op1, mode1))
26329     op1 = copy_to_mode_reg (mode1, op1);
26330
26331   pat = GEN_FCN (d->icode) (op0, op1);
26332   if (! pat)
26333     return 0;
26334   emit_insn (pat);
26335   emit_insn (gen_rtx_SET (VOIDmode,
26336                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26337                           gen_rtx_fmt_ee (comparison, QImode,
26338                                           SET_DEST (pat),
26339                                           const0_rtx)));
26340
26341   return SUBREG_REG (target);
26342 }
26343
26344 /* Subroutine of ix86_expand_args_builtin to take care of round insns.  */
26345
26346 static rtx
26347 ix86_expand_sse_round (const struct builtin_description *d, tree exp,
26348                        rtx target)
26349 {
26350   rtx pat;
26351   tree arg0 = CALL_EXPR_ARG (exp, 0);
26352   rtx op1, op0 = expand_normal (arg0);
26353   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
26354   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
26355
26356   if (optimize || target == 0
26357       || GET_MODE (target) != tmode
26358       || !insn_data[d->icode].operand[0].predicate (target, tmode))
26359     target = gen_reg_rtx (tmode);
26360
26361   if (VECTOR_MODE_P (mode0))
26362     op0 = safe_vector_operand (op0, mode0);
26363
26364   if ((optimize && !register_operand (op0, mode0))
26365       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26366     op0 = copy_to_mode_reg (mode0, op0);
26367
26368   op1 = GEN_INT (d->comparison);
26369
26370   pat = GEN_FCN (d->icode) (target, op0, op1);
26371   if (! pat)
26372     return 0;
26373   emit_insn (pat);
26374   return target;
26375 }
26376
26377 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
26378
26379 static rtx
26380 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
26381                        rtx target)
26382 {
26383   rtx pat;
26384   tree arg0 = CALL_EXPR_ARG (exp, 0);
26385   tree arg1 = CALL_EXPR_ARG (exp, 1);
26386   rtx op0 = expand_normal (arg0);
26387   rtx op1 = expand_normal (arg1);
26388   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
26389   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
26390   enum rtx_code comparison = d->comparison;
26391
26392   if (VECTOR_MODE_P (mode0))
26393     op0 = safe_vector_operand (op0, mode0);
26394   if (VECTOR_MODE_P (mode1))
26395     op1 = safe_vector_operand (op1, mode1);
26396
26397   target = gen_reg_rtx (SImode);
26398   emit_move_insn (target, const0_rtx);
26399   target = gen_rtx_SUBREG (QImode, target, 0);
26400
26401   if ((optimize && !register_operand (op0, mode0))
26402       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26403     op0 = copy_to_mode_reg (mode0, op0);
26404   if ((optimize && !register_operand (op1, mode1))
26405       || !insn_data[d->icode].operand[1].predicate (op1, mode1))
26406     op1 = copy_to_mode_reg (mode1, op1);
26407
26408   pat = GEN_FCN (d->icode) (op0, op1);
26409   if (! pat)
26410     return 0;
26411   emit_insn (pat);
26412   emit_insn (gen_rtx_SET (VOIDmode,
26413                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26414                           gen_rtx_fmt_ee (comparison, QImode,
26415                                           SET_DEST (pat),
26416                                           const0_rtx)));
26417
26418   return SUBREG_REG (target);
26419 }
26420
26421 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
26422
26423 static rtx
26424 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
26425                           tree exp, rtx target)
26426 {
26427   rtx pat;
26428   tree arg0 = CALL_EXPR_ARG (exp, 0);
26429   tree arg1 = CALL_EXPR_ARG (exp, 1);
26430   tree arg2 = CALL_EXPR_ARG (exp, 2);
26431   tree arg3 = CALL_EXPR_ARG (exp, 3);
26432   tree arg4 = CALL_EXPR_ARG (exp, 4);
26433   rtx scratch0, scratch1;
26434   rtx op0 = expand_normal (arg0);
26435   rtx op1 = expand_normal (arg1);
26436   rtx op2 = expand_normal (arg2);
26437   rtx op3 = expand_normal (arg3);
26438   rtx op4 = expand_normal (arg4);
26439   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
26440
26441   tmode0 = insn_data[d->icode].operand[0].mode;
26442   tmode1 = insn_data[d->icode].operand[1].mode;
26443   modev2 = insn_data[d->icode].operand[2].mode;
26444   modei3 = insn_data[d->icode].operand[3].mode;
26445   modev4 = insn_data[d->icode].operand[4].mode;
26446   modei5 = insn_data[d->icode].operand[5].mode;
26447   modeimm = insn_data[d->icode].operand[6].mode;
26448
26449   if (VECTOR_MODE_P (modev2))
26450     op0 = safe_vector_operand (op0, modev2);
26451   if (VECTOR_MODE_P (modev4))
26452     op2 = safe_vector_operand (op2, modev4);
26453
26454   if (!insn_data[d->icode].operand[2].predicate (op0, modev2))
26455     op0 = copy_to_mode_reg (modev2, op0);
26456   if (!insn_data[d->icode].operand[3].predicate (op1, modei3))
26457     op1 = copy_to_mode_reg (modei3, op1);
26458   if ((optimize && !register_operand (op2, modev4))
26459       || !insn_data[d->icode].operand[4].predicate (op2, modev4))
26460     op2 = copy_to_mode_reg (modev4, op2);
26461   if (!insn_data[d->icode].operand[5].predicate (op3, modei5))
26462     op3 = copy_to_mode_reg (modei5, op3);
26463
26464   if (!insn_data[d->icode].operand[6].predicate (op4, modeimm))
26465     {
26466       error ("the fifth argument must be a 8-bit immediate");
26467       return const0_rtx;
26468     }
26469
26470   if (d->code == IX86_BUILTIN_PCMPESTRI128)
26471     {
26472       if (optimize || !target
26473           || GET_MODE (target) != tmode0
26474           || !insn_data[d->icode].operand[0].predicate (target, tmode0))
26475         target = gen_reg_rtx (tmode0);
26476
26477       scratch1 = gen_reg_rtx (tmode1);
26478
26479       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
26480     }
26481   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
26482     {
26483       if (optimize || !target
26484           || GET_MODE (target) != tmode1
26485           || !insn_data[d->icode].operand[1].predicate (target, tmode1))
26486         target = gen_reg_rtx (tmode1);
26487
26488       scratch0 = gen_reg_rtx (tmode0);
26489
26490       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
26491     }
26492   else
26493     {
26494       gcc_assert (d->flag);
26495
26496       scratch0 = gen_reg_rtx (tmode0);
26497       scratch1 = gen_reg_rtx (tmode1);
26498
26499       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
26500     }
26501
26502   if (! pat)
26503     return 0;
26504
26505   emit_insn (pat);
26506
26507   if (d->flag)
26508     {
26509       target = gen_reg_rtx (SImode);
26510       emit_move_insn (target, const0_rtx);
26511       target = gen_rtx_SUBREG (QImode, target, 0);
26512
26513       emit_insn
26514         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26515                       gen_rtx_fmt_ee (EQ, QImode,
26516                                       gen_rtx_REG ((enum machine_mode) d->flag,
26517                                                    FLAGS_REG),
26518                                       const0_rtx)));
26519       return SUBREG_REG (target);
26520     }
26521   else
26522     return target;
26523 }
26524
26525
26526 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
26527
26528 static rtx
26529 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
26530                           tree exp, rtx target)
26531 {
26532   rtx pat;
26533   tree arg0 = CALL_EXPR_ARG (exp, 0);
26534   tree arg1 = CALL_EXPR_ARG (exp, 1);
26535   tree arg2 = CALL_EXPR_ARG (exp, 2);
26536   rtx scratch0, scratch1;
26537   rtx op0 = expand_normal (arg0);
26538   rtx op1 = expand_normal (arg1);
26539   rtx op2 = expand_normal (arg2);
26540   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
26541
26542   tmode0 = insn_data[d->icode].operand[0].mode;
26543   tmode1 = insn_data[d->icode].operand[1].mode;
26544   modev2 = insn_data[d->icode].operand[2].mode;
26545   modev3 = insn_data[d->icode].operand[3].mode;
26546   modeimm = insn_data[d->icode].operand[4].mode;
26547
26548   if (VECTOR_MODE_P (modev2))
26549     op0 = safe_vector_operand (op0, modev2);
26550   if (VECTOR_MODE_P (modev3))
26551     op1 = safe_vector_operand (op1, modev3);
26552
26553   if (!insn_data[d->icode].operand[2].predicate (op0, modev2))
26554     op0 = copy_to_mode_reg (modev2, op0);
26555   if ((optimize && !register_operand (op1, modev3))
26556       || !insn_data[d->icode].operand[3].predicate (op1, modev3))
26557     op1 = copy_to_mode_reg (modev3, op1);
26558
26559   if (!insn_data[d->icode].operand[4].predicate (op2, modeimm))
26560     {
26561       error ("the third argument must be a 8-bit immediate");
26562       return const0_rtx;
26563     }
26564
26565   if (d->code == IX86_BUILTIN_PCMPISTRI128)
26566     {
26567       if (optimize || !target
26568           || GET_MODE (target) != tmode0
26569           || !insn_data[d->icode].operand[0].predicate (target, tmode0))
26570         target = gen_reg_rtx (tmode0);
26571
26572       scratch1 = gen_reg_rtx (tmode1);
26573
26574       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
26575     }
26576   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
26577     {
26578       if (optimize || !target
26579           || GET_MODE (target) != tmode1
26580           || !insn_data[d->icode].operand[1].predicate (target, tmode1))
26581         target = gen_reg_rtx (tmode1);
26582
26583       scratch0 = gen_reg_rtx (tmode0);
26584
26585       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
26586     }
26587   else
26588     {
26589       gcc_assert (d->flag);
26590
26591       scratch0 = gen_reg_rtx (tmode0);
26592       scratch1 = gen_reg_rtx (tmode1);
26593
26594       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
26595     }
26596
26597   if (! pat)
26598     return 0;
26599
26600   emit_insn (pat);
26601
26602   if (d->flag)
26603     {
26604       target = gen_reg_rtx (SImode);
26605       emit_move_insn (target, const0_rtx);
26606       target = gen_rtx_SUBREG (QImode, target, 0);
26607
26608       emit_insn
26609         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26610                       gen_rtx_fmt_ee (EQ, QImode,
26611                                       gen_rtx_REG ((enum machine_mode) d->flag,
26612                                                    FLAGS_REG),
26613                                       const0_rtx)));
26614       return SUBREG_REG (target);
26615     }
26616   else
26617     return target;
26618 }
26619
26620 /* Subroutine of ix86_expand_builtin to take care of insns with
26621    variable number of operands.  */
26622
26623 static rtx
26624 ix86_expand_args_builtin (const struct builtin_description *d,
26625                           tree exp, rtx target)
26626 {
26627   rtx pat, real_target;
26628   unsigned int i, nargs;
26629   unsigned int nargs_constant = 0;
26630   int num_memory = 0;
26631   struct
26632     {
26633       rtx op;
26634       enum machine_mode mode;
26635     } args[4];
26636   bool last_arg_count = false;
26637   enum insn_code icode = d->icode;
26638   const struct insn_data_d *insn_p = &insn_data[icode];
26639   enum machine_mode tmode = insn_p->operand[0].mode;
26640   enum machine_mode rmode = VOIDmode;
26641   bool swap = false;
26642   enum rtx_code comparison = d->comparison;
26643
26644   switch ((enum ix86_builtin_func_type) d->flag)
26645     {
26646     case V2DF_FTYPE_V2DF_ROUND:
26647     case V4DF_FTYPE_V4DF_ROUND:
26648     case V4SF_FTYPE_V4SF_ROUND:
26649     case V8SF_FTYPE_V8SF_ROUND:
26650       return ix86_expand_sse_round (d, exp, target);
26651     case INT_FTYPE_V8SF_V8SF_PTEST:
26652     case INT_FTYPE_V4DI_V4DI_PTEST:
26653     case INT_FTYPE_V4DF_V4DF_PTEST:
26654     case INT_FTYPE_V4SF_V4SF_PTEST:
26655     case INT_FTYPE_V2DI_V2DI_PTEST:
26656     case INT_FTYPE_V2DF_V2DF_PTEST:
26657       return ix86_expand_sse_ptest (d, exp, target);
26658     case FLOAT128_FTYPE_FLOAT128:
26659     case FLOAT_FTYPE_FLOAT:
26660     case INT_FTYPE_INT:
26661     case UINT64_FTYPE_INT:
26662     case UINT16_FTYPE_UINT16:
26663     case INT64_FTYPE_INT64:
26664     case INT64_FTYPE_V4SF:
26665     case INT64_FTYPE_V2DF:
26666     case INT_FTYPE_V16QI:
26667     case INT_FTYPE_V8QI:
26668     case INT_FTYPE_V8SF:
26669     case INT_FTYPE_V4DF:
26670     case INT_FTYPE_V4SF:
26671     case INT_FTYPE_V2DF:
26672     case V16QI_FTYPE_V16QI:
26673     case V8SI_FTYPE_V8SF:
26674     case V8SI_FTYPE_V4SI:
26675     case V8HI_FTYPE_V8HI:
26676     case V8HI_FTYPE_V16QI:
26677     case V8QI_FTYPE_V8QI:
26678     case V8SF_FTYPE_V8SF:
26679     case V8SF_FTYPE_V8SI:
26680     case V8SF_FTYPE_V4SF:
26681     case V8SF_FTYPE_V8HI:
26682     case V4SI_FTYPE_V4SI:
26683     case V4SI_FTYPE_V16QI:
26684     case V4SI_FTYPE_V4SF:
26685     case V4SI_FTYPE_V8SI:
26686     case V4SI_FTYPE_V8HI:
26687     case V4SI_FTYPE_V4DF:
26688     case V4SI_FTYPE_V2DF:
26689     case V4HI_FTYPE_V4HI:
26690     case V4DF_FTYPE_V4DF:
26691     case V4DF_FTYPE_V4SI:
26692     case V4DF_FTYPE_V4SF:
26693     case V4DF_FTYPE_V2DF:
26694     case V4SF_FTYPE_V4SF:
26695     case V4SF_FTYPE_V4SI:
26696     case V4SF_FTYPE_V8SF:
26697     case V4SF_FTYPE_V4DF:
26698     case V4SF_FTYPE_V8HI:
26699     case V4SF_FTYPE_V2DF:
26700     case V2DI_FTYPE_V2DI:
26701     case V2DI_FTYPE_V16QI:
26702     case V2DI_FTYPE_V8HI:
26703     case V2DI_FTYPE_V4SI:
26704     case V2DF_FTYPE_V2DF:
26705     case V2DF_FTYPE_V4SI:
26706     case V2DF_FTYPE_V4DF:
26707     case V2DF_FTYPE_V4SF:
26708     case V2DF_FTYPE_V2SI:
26709     case V2SI_FTYPE_V2SI:
26710     case V2SI_FTYPE_V4SF:
26711     case V2SI_FTYPE_V2SF:
26712     case V2SI_FTYPE_V2DF:
26713     case V2SF_FTYPE_V2SF:
26714     case V2SF_FTYPE_V2SI:
26715       nargs = 1;
26716       break;
26717     case V4SF_FTYPE_V4SF_VEC_MERGE:
26718     case V2DF_FTYPE_V2DF_VEC_MERGE:
26719       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
26720     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
26721     case V16QI_FTYPE_V16QI_V16QI:
26722     case V16QI_FTYPE_V8HI_V8HI:
26723     case V8QI_FTYPE_V8QI_V8QI:
26724     case V8QI_FTYPE_V4HI_V4HI:
26725     case V8HI_FTYPE_V8HI_V8HI:
26726     case V8HI_FTYPE_V16QI_V16QI:
26727     case V8HI_FTYPE_V4SI_V4SI:
26728     case V8SF_FTYPE_V8SF_V8SF:
26729     case V8SF_FTYPE_V8SF_V8SI:
26730     case V4SI_FTYPE_V4SI_V4SI:
26731     case V4SI_FTYPE_V8HI_V8HI:
26732     case V4SI_FTYPE_V4SF_V4SF:
26733     case V4SI_FTYPE_V2DF_V2DF:
26734     case V4HI_FTYPE_V4HI_V4HI:
26735     case V4HI_FTYPE_V8QI_V8QI:
26736     case V4HI_FTYPE_V2SI_V2SI:
26737     case V4DF_FTYPE_V4DF_V4DF:
26738     case V4DF_FTYPE_V4DF_V4DI:
26739     case V4SF_FTYPE_V4SF_V4SF:
26740     case V4SF_FTYPE_V4SF_V4SI:
26741     case V4SF_FTYPE_V4SF_V2SI:
26742     case V4SF_FTYPE_V4SF_V2DF:
26743     case V4SF_FTYPE_V4SF_DI:
26744     case V4SF_FTYPE_V4SF_SI:
26745     case V2DI_FTYPE_V2DI_V2DI:
26746     case V2DI_FTYPE_V16QI_V16QI:
26747     case V2DI_FTYPE_V4SI_V4SI:
26748     case V2DI_FTYPE_V2DI_V16QI:
26749     case V2DI_FTYPE_V2DF_V2DF:
26750     case V2SI_FTYPE_V2SI_V2SI:
26751     case V2SI_FTYPE_V4HI_V4HI:
26752     case V2SI_FTYPE_V2SF_V2SF:
26753     case V2DF_FTYPE_V2DF_V2DF:
26754     case V2DF_FTYPE_V2DF_V4SF:
26755     case V2DF_FTYPE_V2DF_V2DI:
26756     case V2DF_FTYPE_V2DF_DI:
26757     case V2DF_FTYPE_V2DF_SI:
26758     case V2SF_FTYPE_V2SF_V2SF:
26759     case V1DI_FTYPE_V1DI_V1DI:
26760     case V1DI_FTYPE_V8QI_V8QI:
26761     case V1DI_FTYPE_V2SI_V2SI:
26762       if (comparison == UNKNOWN)
26763         return ix86_expand_binop_builtin (icode, exp, target);
26764       nargs = 2;
26765       break;
26766     case V4SF_FTYPE_V4SF_V4SF_SWAP:
26767     case V2DF_FTYPE_V2DF_V2DF_SWAP:
26768       gcc_assert (comparison != UNKNOWN);
26769       nargs = 2;
26770       swap = true;
26771       break;
26772     case V8HI_FTYPE_V8HI_V8HI_COUNT:
26773     case V8HI_FTYPE_V8HI_SI_COUNT:
26774     case V4SI_FTYPE_V4SI_V4SI_COUNT:
26775     case V4SI_FTYPE_V4SI_SI_COUNT:
26776     case V4HI_FTYPE_V4HI_V4HI_COUNT:
26777     case V4HI_FTYPE_V4HI_SI_COUNT:
26778     case V2DI_FTYPE_V2DI_V2DI_COUNT:
26779     case V2DI_FTYPE_V2DI_SI_COUNT:
26780     case V2SI_FTYPE_V2SI_V2SI_COUNT:
26781     case V2SI_FTYPE_V2SI_SI_COUNT:
26782     case V1DI_FTYPE_V1DI_V1DI_COUNT:
26783     case V1DI_FTYPE_V1DI_SI_COUNT:
26784       nargs = 2;
26785       last_arg_count = true;
26786       break;
26787     case UINT64_FTYPE_UINT64_UINT64:
26788     case UINT_FTYPE_UINT_UINT:
26789     case UINT_FTYPE_UINT_USHORT:
26790     case UINT_FTYPE_UINT_UCHAR:
26791     case UINT16_FTYPE_UINT16_INT:
26792     case UINT8_FTYPE_UINT8_INT:
26793       nargs = 2;
26794       break;
26795     case V2DI_FTYPE_V2DI_INT_CONVERT:
26796       nargs = 2;
26797       rmode = V1TImode;
26798       nargs_constant = 1;
26799       break;
26800     case V8HI_FTYPE_V8HI_INT:
26801     case V8HI_FTYPE_V8SF_INT:
26802     case V8HI_FTYPE_V4SF_INT:
26803     case V8SF_FTYPE_V8SF_INT:
26804     case V4SI_FTYPE_V4SI_INT:
26805     case V4SI_FTYPE_V8SI_INT:
26806     case V4HI_FTYPE_V4HI_INT:
26807     case V4DF_FTYPE_V4DF_INT:
26808     case V4SF_FTYPE_V4SF_INT:
26809     case V4SF_FTYPE_V8SF_INT:
26810     case V2DI_FTYPE_V2DI_INT:
26811     case V2DF_FTYPE_V2DF_INT:
26812     case V2DF_FTYPE_V4DF_INT:
26813       nargs = 2;
26814       nargs_constant = 1;
26815       break;
26816     case V16QI_FTYPE_V16QI_V16QI_V16QI:
26817     case V8SF_FTYPE_V8SF_V8SF_V8SF:
26818     case V4DF_FTYPE_V4DF_V4DF_V4DF:
26819     case V4SF_FTYPE_V4SF_V4SF_V4SF:
26820     case V2DF_FTYPE_V2DF_V2DF_V2DF:
26821       nargs = 3;
26822       break;
26823     case V16QI_FTYPE_V16QI_V16QI_INT:
26824     case V8HI_FTYPE_V8HI_V8HI_INT:
26825     case V8SI_FTYPE_V8SI_V8SI_INT:
26826     case V8SI_FTYPE_V8SI_V4SI_INT:
26827     case V8SF_FTYPE_V8SF_V8SF_INT:
26828     case V8SF_FTYPE_V8SF_V4SF_INT:
26829     case V4SI_FTYPE_V4SI_V4SI_INT:
26830     case V4DF_FTYPE_V4DF_V4DF_INT:
26831     case V4DF_FTYPE_V4DF_V2DF_INT:
26832     case V4SF_FTYPE_V4SF_V4SF_INT:
26833     case V2DI_FTYPE_V2DI_V2DI_INT:
26834     case V2DF_FTYPE_V2DF_V2DF_INT:
26835       nargs = 3;
26836       nargs_constant = 1;
26837       break;
26838     case V2DI_FTYPE_V2DI_V2DI_INT_CONVERT:
26839       nargs = 3;
26840       rmode = V2DImode;
26841       nargs_constant = 1;
26842       break;
26843     case V1DI_FTYPE_V1DI_V1DI_INT_CONVERT:
26844       nargs = 3;
26845       rmode = DImode;
26846       nargs_constant = 1;
26847       break;
26848     case V2DI_FTYPE_V2DI_UINT_UINT:
26849       nargs = 3;
26850       nargs_constant = 2;
26851       break;
26852     case V2DF_FTYPE_V2DF_V2DF_V2DI_INT:
26853     case V4DF_FTYPE_V4DF_V4DF_V4DI_INT:
26854     case V4SF_FTYPE_V4SF_V4SF_V4SI_INT:
26855     case V8SF_FTYPE_V8SF_V8SF_V8SI_INT:
26856       nargs = 4;
26857       nargs_constant = 1;
26858       break;
26859     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
26860       nargs = 4;
26861       nargs_constant = 2;
26862       break;
26863     default:
26864       gcc_unreachable ();
26865     }
26866
26867   gcc_assert (nargs <= ARRAY_SIZE (args));
26868
26869   if (comparison != UNKNOWN)
26870     {
26871       gcc_assert (nargs == 2);
26872       return ix86_expand_sse_compare (d, exp, target, swap);
26873     }
26874
26875   if (rmode == VOIDmode || rmode == tmode)
26876     {
26877       if (optimize
26878           || target == 0
26879           || GET_MODE (target) != tmode
26880           || !insn_p->operand[0].predicate (target, tmode))
26881         target = gen_reg_rtx (tmode);
26882       real_target = target;
26883     }
26884   else
26885     {
26886       target = gen_reg_rtx (rmode);
26887       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
26888     }
26889
26890   for (i = 0; i < nargs; i++)
26891     {
26892       tree arg = CALL_EXPR_ARG (exp, i);
26893       rtx op = expand_normal (arg);
26894       enum machine_mode mode = insn_p->operand[i + 1].mode;
26895       bool match = insn_p->operand[i + 1].predicate (op, mode);
26896
26897       if (last_arg_count && (i + 1) == nargs)
26898         {
26899           /* SIMD shift insns take either an 8-bit immediate or
26900              register as count.  But builtin functions take int as
26901              count.  If count doesn't match, we put it in register.  */
26902           if (!match)
26903             {
26904               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
26905               if (!insn_p->operand[i + 1].predicate (op, mode))
26906                 op = copy_to_reg (op);
26907             }
26908         }
26909       else if ((nargs - i) <= nargs_constant)
26910         {
26911           if (!match)
26912             switch (icode)
26913               {
26914               case CODE_FOR_sse4_1_roundpd:
26915               case CODE_FOR_sse4_1_roundps:
26916               case CODE_FOR_sse4_1_roundsd:
26917               case CODE_FOR_sse4_1_roundss:
26918               case CODE_FOR_sse4_1_blendps:
26919               case CODE_FOR_avx_blendpd256:
26920               case CODE_FOR_avx_vpermilv4df:
26921               case CODE_FOR_avx_roundpd256:
26922               case CODE_FOR_avx_roundps256:
26923                 error ("the last argument must be a 4-bit immediate");
26924                 return const0_rtx;
26925
26926               case CODE_FOR_sse4_1_blendpd:
26927               case CODE_FOR_avx_vpermilv2df:
26928               case CODE_FOR_xop_vpermil2v2df3:
26929               case CODE_FOR_xop_vpermil2v4sf3:
26930               case CODE_FOR_xop_vpermil2v4df3:
26931               case CODE_FOR_xop_vpermil2v8sf3:
26932                 error ("the last argument must be a 2-bit immediate");
26933                 return const0_rtx;
26934
26935               case CODE_FOR_avx_vextractf128v4df:
26936               case CODE_FOR_avx_vextractf128v8sf:
26937               case CODE_FOR_avx_vextractf128v8si:
26938               case CODE_FOR_avx_vinsertf128v4df:
26939               case CODE_FOR_avx_vinsertf128v8sf:
26940               case CODE_FOR_avx_vinsertf128v8si:
26941                 error ("the last argument must be a 1-bit immediate");
26942                 return const0_rtx;
26943
26944               case CODE_FOR_avx_vmcmpv2df3:
26945               case CODE_FOR_avx_vmcmpv4sf3:
26946               case CODE_FOR_avx_cmpv2df3:
26947               case CODE_FOR_avx_cmpv4sf3:
26948               case CODE_FOR_avx_cmpv4df3:
26949               case CODE_FOR_avx_cmpv8sf3:
26950                 error ("the last argument must be a 5-bit immediate");
26951                 return const0_rtx;
26952
26953              default:
26954                 switch (nargs_constant)
26955                   {
26956                   case 2:
26957                     if ((nargs - i) == nargs_constant)
26958                       {
26959                         error ("the next to last argument must be an 8-bit immediate");
26960                         break;
26961                       }
26962                   case 1:
26963                     error ("the last argument must be an 8-bit immediate");
26964                     break;
26965                   default:
26966                     gcc_unreachable ();
26967                   }
26968                 return const0_rtx;
26969               }
26970         }
26971       else
26972         {
26973           if (VECTOR_MODE_P (mode))
26974             op = safe_vector_operand (op, mode);
26975
26976           /* If we aren't optimizing, only allow one memory operand to
26977              be generated.  */
26978           if (memory_operand (op, mode))
26979             num_memory++;
26980
26981           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
26982             {
26983               if (optimize || !match || num_memory > 1)
26984                 op = copy_to_mode_reg (mode, op);
26985             }
26986           else
26987             {
26988               op = copy_to_reg (op);
26989               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
26990             }
26991         }
26992
26993       args[i].op = op;
26994       args[i].mode = mode;
26995     }
26996
26997   switch (nargs)
26998     {
26999     case 1:
27000       pat = GEN_FCN (icode) (real_target, args[0].op);
27001       break;
27002     case 2:
27003       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
27004       break;
27005     case 3:
27006       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
27007                              args[2].op);
27008       break;
27009     case 4:
27010       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
27011                              args[2].op, args[3].op);
27012       break;
27013     default:
27014       gcc_unreachable ();
27015     }
27016
27017   if (! pat)
27018     return 0;
27019
27020   emit_insn (pat);
27021   return target;
27022 }
27023
27024 /* Subroutine of ix86_expand_builtin to take care of special insns
27025    with variable number of operands.  */
27026
27027 static rtx
27028 ix86_expand_special_args_builtin (const struct builtin_description *d,
27029                                     tree exp, rtx target)
27030 {
27031   tree arg;
27032   rtx pat, op;
27033   unsigned int i, nargs, arg_adjust, memory;
27034   struct
27035     {
27036       rtx op;
27037       enum machine_mode mode;
27038     } args[3];
27039   enum insn_code icode = d->icode;
27040   bool last_arg_constant = false;
27041   const struct insn_data_d *insn_p = &insn_data[icode];
27042   enum machine_mode tmode = insn_p->operand[0].mode;
27043   enum { load, store } klass;
27044
27045   switch ((enum ix86_builtin_func_type) d->flag)
27046     {
27047     case VOID_FTYPE_VOID:
27048       if (icode == CODE_FOR_avx_vzeroupper)
27049         target = GEN_INT (vzeroupper_intrinsic);
27050       emit_insn (GEN_FCN (icode) (target));
27051       return 0;
27052     case VOID_FTYPE_UINT64:
27053     case VOID_FTYPE_UNSIGNED:
27054       nargs = 0;
27055       klass = store;
27056       memory = 0;
27057       break;
27058       break;
27059     case UINT64_FTYPE_VOID:
27060     case UNSIGNED_FTYPE_VOID:
27061       nargs = 0;
27062       klass = load;
27063       memory = 0;
27064       break;
27065     case UINT64_FTYPE_PUNSIGNED:
27066     case V2DI_FTYPE_PV2DI:
27067     case V32QI_FTYPE_PCCHAR:
27068     case V16QI_FTYPE_PCCHAR:
27069     case V8SF_FTYPE_PCV4SF:
27070     case V8SF_FTYPE_PCFLOAT:
27071     case V4SF_FTYPE_PCFLOAT:
27072     case V4DF_FTYPE_PCV2DF:
27073     case V4DF_FTYPE_PCDOUBLE:
27074     case V2DF_FTYPE_PCDOUBLE:
27075     case VOID_FTYPE_PVOID:
27076       nargs = 1;
27077       klass = load;
27078       memory = 0;
27079       break;
27080     case VOID_FTYPE_PV2SF_V4SF:
27081     case VOID_FTYPE_PV4DI_V4DI:
27082     case VOID_FTYPE_PV2DI_V2DI:
27083     case VOID_FTYPE_PCHAR_V32QI:
27084     case VOID_FTYPE_PCHAR_V16QI:
27085     case VOID_FTYPE_PFLOAT_V8SF:
27086     case VOID_FTYPE_PFLOAT_V4SF:
27087     case VOID_FTYPE_PDOUBLE_V4DF:
27088     case VOID_FTYPE_PDOUBLE_V2DF:
27089     case VOID_FTYPE_PULONGLONG_ULONGLONG:
27090     case VOID_FTYPE_PINT_INT:
27091       nargs = 1;
27092       klass = store;
27093       /* Reserve memory operand for target.  */
27094       memory = ARRAY_SIZE (args);
27095       break;
27096     case V4SF_FTYPE_V4SF_PCV2SF:
27097     case V2DF_FTYPE_V2DF_PCDOUBLE:
27098       nargs = 2;
27099       klass = load;
27100       memory = 1;
27101       break;
27102     case V8SF_FTYPE_PCV8SF_V8SI:
27103     case V4DF_FTYPE_PCV4DF_V4DI:
27104     case V4SF_FTYPE_PCV4SF_V4SI:
27105     case V2DF_FTYPE_PCV2DF_V2DI:
27106       nargs = 2;
27107       klass = load;
27108       memory = 0;
27109       break;
27110     case VOID_FTYPE_PV8SF_V8SI_V8SF:
27111     case VOID_FTYPE_PV4DF_V4DI_V4DF:
27112     case VOID_FTYPE_PV4SF_V4SI_V4SF:
27113     case VOID_FTYPE_PV2DF_V2DI_V2DF:
27114       nargs = 2;
27115       klass = store;
27116       /* Reserve memory operand for target.  */
27117       memory = ARRAY_SIZE (args);
27118       break;
27119     case VOID_FTYPE_UINT_UINT_UINT:
27120     case VOID_FTYPE_UINT64_UINT_UINT:
27121     case UCHAR_FTYPE_UINT_UINT_UINT:
27122     case UCHAR_FTYPE_UINT64_UINT_UINT:
27123       nargs = 3;
27124       klass = load;
27125       memory = ARRAY_SIZE (args);
27126       last_arg_constant = true;
27127       break;
27128     default:
27129       gcc_unreachable ();
27130     }
27131
27132   gcc_assert (nargs <= ARRAY_SIZE (args));
27133
27134   if (klass == store)
27135     {
27136       arg = CALL_EXPR_ARG (exp, 0);
27137       op = expand_normal (arg);
27138       gcc_assert (target == 0);
27139       if (memory)
27140         target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
27141       else
27142         target = force_reg (tmode, op);
27143       arg_adjust = 1;
27144     }
27145   else
27146     {
27147       arg_adjust = 0;
27148       if (optimize
27149           || target == 0
27150           || GET_MODE (target) != tmode
27151           || !insn_p->operand[0].predicate (target, tmode))
27152         target = gen_reg_rtx (tmode);
27153     }
27154
27155   for (i = 0; i < nargs; i++)
27156     {
27157       enum machine_mode mode = insn_p->operand[i + 1].mode;
27158       bool match;
27159
27160       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
27161       op = expand_normal (arg);
27162       match = insn_p->operand[i + 1].predicate (op, mode);
27163
27164       if (last_arg_constant && (i + 1) == nargs)
27165         {
27166           if (!match)
27167             {
27168               if (icode == CODE_FOR_lwp_lwpvalsi3
27169                   || icode == CODE_FOR_lwp_lwpinssi3
27170                   || icode == CODE_FOR_lwp_lwpvaldi3
27171                   || icode == CODE_FOR_lwp_lwpinsdi3)
27172                 error ("the last argument must be a 32-bit immediate");
27173               else
27174                 error ("the last argument must be an 8-bit immediate");
27175               return const0_rtx;
27176             }
27177         }
27178       else
27179         {
27180           if (i == memory)
27181             {
27182               /* This must be the memory operand.  */
27183               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
27184               gcc_assert (GET_MODE (op) == mode
27185                           || GET_MODE (op) == VOIDmode);
27186             }
27187           else
27188             {
27189               /* This must be register.  */
27190               if (VECTOR_MODE_P (mode))
27191                 op = safe_vector_operand (op, mode);
27192
27193               gcc_assert (GET_MODE (op) == mode
27194                           || GET_MODE (op) == VOIDmode);
27195               op = copy_to_mode_reg (mode, op);
27196             }
27197         }
27198
27199       args[i].op = op;
27200       args[i].mode = mode;
27201     }
27202
27203   switch (nargs)
27204     {
27205     case 0:
27206       pat = GEN_FCN (icode) (target);
27207       break;
27208     case 1:
27209       pat = GEN_FCN (icode) (target, args[0].op);
27210       break;
27211     case 2:
27212       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
27213       break;
27214     case 3:
27215       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
27216       break;
27217     default:
27218       gcc_unreachable ();
27219     }
27220
27221   if (! pat)
27222     return 0;
27223   emit_insn (pat);
27224   return klass == store ? 0 : target;
27225 }
27226
27227 /* Return the integer constant in ARG.  Constrain it to be in the range
27228    of the subparts of VEC_TYPE; issue an error if not.  */
27229
27230 static int
27231 get_element_number (tree vec_type, tree arg)
27232 {
27233   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
27234
27235   if (!host_integerp (arg, 1)
27236       || (elt = tree_low_cst (arg, 1), elt > max))
27237     {
27238       error ("selector must be an integer constant in the range 0..%wi", max);
27239       return 0;
27240     }
27241
27242   return elt;
27243 }
27244
27245 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27246    ix86_expand_vector_init.  We DO have language-level syntax for this, in
27247    the form of  (type){ init-list }.  Except that since we can't place emms
27248    instructions from inside the compiler, we can't allow the use of MMX
27249    registers unless the user explicitly asks for it.  So we do *not* define
27250    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
27251    we have builtins invoked by mmintrin.h that gives us license to emit
27252    these sorts of instructions.  */
27253
27254 static rtx
27255 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
27256 {
27257   enum machine_mode tmode = TYPE_MODE (type);
27258   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
27259   int i, n_elt = GET_MODE_NUNITS (tmode);
27260   rtvec v = rtvec_alloc (n_elt);
27261
27262   gcc_assert (VECTOR_MODE_P (tmode));
27263   gcc_assert (call_expr_nargs (exp) == n_elt);
27264
27265   for (i = 0; i < n_elt; ++i)
27266     {
27267       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
27268       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
27269     }
27270
27271   if (!target || !register_operand (target, tmode))
27272     target = gen_reg_rtx (tmode);
27273
27274   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
27275   return target;
27276 }
27277
27278 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27279    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
27280    had a language-level syntax for referencing vector elements.  */
27281
27282 static rtx
27283 ix86_expand_vec_ext_builtin (tree exp, rtx target)
27284 {
27285   enum machine_mode tmode, mode0;
27286   tree arg0, arg1;
27287   int elt;
27288   rtx op0;
27289
27290   arg0 = CALL_EXPR_ARG (exp, 0);
27291   arg1 = CALL_EXPR_ARG (exp, 1);
27292
27293   op0 = expand_normal (arg0);
27294   elt = get_element_number (TREE_TYPE (arg0), arg1);
27295
27296   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
27297   mode0 = TYPE_MODE (TREE_TYPE (arg0));
27298   gcc_assert (VECTOR_MODE_P (mode0));
27299
27300   op0 = force_reg (mode0, op0);
27301
27302   if (optimize || !target || !register_operand (target, tmode))
27303     target = gen_reg_rtx (tmode);
27304
27305   ix86_expand_vector_extract (true, target, op0, elt);
27306
27307   return target;
27308 }
27309
27310 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27311    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
27312    a language-level syntax for referencing vector elements.  */
27313
27314 static rtx
27315 ix86_expand_vec_set_builtin (tree exp)
27316 {
27317   enum machine_mode tmode, mode1;
27318   tree arg0, arg1, arg2;
27319   int elt;
27320   rtx op0, op1, target;
27321
27322   arg0 = CALL_EXPR_ARG (exp, 0);
27323   arg1 = CALL_EXPR_ARG (exp, 1);
27324   arg2 = CALL_EXPR_ARG (exp, 2);
27325
27326   tmode = TYPE_MODE (TREE_TYPE (arg0));
27327   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
27328   gcc_assert (VECTOR_MODE_P (tmode));
27329
27330   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
27331   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
27332   elt = get_element_number (TREE_TYPE (arg0), arg2);
27333
27334   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
27335     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
27336
27337   op0 = force_reg (tmode, op0);
27338   op1 = force_reg (mode1, op1);
27339
27340   /* OP0 is the source of these builtin functions and shouldn't be
27341      modified.  Create a copy, use it and return it as target.  */
27342   target = gen_reg_rtx (tmode);
27343   emit_move_insn (target, op0);
27344   ix86_expand_vector_set (true, target, op1, elt);
27345
27346   return target;
27347 }
27348
27349 /* Expand an expression EXP that calls a built-in function,
27350    with result going to TARGET if that's convenient
27351    (and in mode MODE if that's convenient).
27352    SUBTARGET may be used as the target for computing one of EXP's operands.
27353    IGNORE is nonzero if the value is to be ignored.  */
27354
27355 static rtx
27356 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
27357                      enum machine_mode mode ATTRIBUTE_UNUSED,
27358                      int ignore ATTRIBUTE_UNUSED)
27359 {
27360   const struct builtin_description *d;
27361   size_t i;
27362   enum insn_code icode;
27363   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
27364   tree arg0, arg1, arg2;
27365   rtx op0, op1, op2, pat;
27366   enum machine_mode mode0, mode1, mode2;
27367   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
27368
27369   /* Determine whether the builtin function is available under the current ISA.
27370      Originally the builtin was not created if it wasn't applicable to the
27371      current ISA based on the command line switches.  With function specific
27372      options, we need to check in the context of the function making the call
27373      whether it is supported.  */
27374   if (ix86_builtins_isa[fcode].isa
27375       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
27376     {
27377       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
27378                                        NULL, NULL, false);
27379
27380       if (!opts)
27381         error ("%qE needs unknown isa option", fndecl);
27382       else
27383         {
27384           gcc_assert (opts != NULL);
27385           error ("%qE needs isa option %s", fndecl, opts);
27386           free (opts);
27387         }
27388       return const0_rtx;
27389     }
27390
27391   switch (fcode)
27392     {
27393     case IX86_BUILTIN_MASKMOVQ:
27394     case IX86_BUILTIN_MASKMOVDQU:
27395       icode = (fcode == IX86_BUILTIN_MASKMOVQ
27396                ? CODE_FOR_mmx_maskmovq
27397                : CODE_FOR_sse2_maskmovdqu);
27398       /* Note the arg order is different from the operand order.  */
27399       arg1 = CALL_EXPR_ARG (exp, 0);
27400       arg2 = CALL_EXPR_ARG (exp, 1);
27401       arg0 = CALL_EXPR_ARG (exp, 2);
27402       op0 = expand_normal (arg0);
27403       op1 = expand_normal (arg1);
27404       op2 = expand_normal (arg2);
27405       mode0 = insn_data[icode].operand[0].mode;
27406       mode1 = insn_data[icode].operand[1].mode;
27407       mode2 = insn_data[icode].operand[2].mode;
27408
27409       op0 = force_reg (Pmode, op0);
27410       op0 = gen_rtx_MEM (mode1, op0);
27411
27412       if (!insn_data[icode].operand[0].predicate (op0, mode0))
27413         op0 = copy_to_mode_reg (mode0, op0);
27414       if (!insn_data[icode].operand[1].predicate (op1, mode1))
27415         op1 = copy_to_mode_reg (mode1, op1);
27416       if (!insn_data[icode].operand[2].predicate (op2, mode2))
27417         op2 = copy_to_mode_reg (mode2, op2);
27418       pat = GEN_FCN (icode) (op0, op1, op2);
27419       if (! pat)
27420         return 0;
27421       emit_insn (pat);
27422       return 0;
27423
27424     case IX86_BUILTIN_LDMXCSR:
27425       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
27426       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
27427       emit_move_insn (target, op0);
27428       emit_insn (gen_sse_ldmxcsr (target));
27429       return 0;
27430
27431     case IX86_BUILTIN_STMXCSR:
27432       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
27433       emit_insn (gen_sse_stmxcsr (target));
27434       return copy_to_mode_reg (SImode, target);
27435
27436     case IX86_BUILTIN_CLFLUSH:
27437         arg0 = CALL_EXPR_ARG (exp, 0);
27438         op0 = expand_normal (arg0);
27439         icode = CODE_FOR_sse2_clflush;
27440         if (!insn_data[icode].operand[0].predicate (op0, Pmode))
27441             op0 = copy_to_mode_reg (Pmode, op0);
27442
27443         emit_insn (gen_sse2_clflush (op0));
27444         return 0;
27445
27446     case IX86_BUILTIN_MONITOR:
27447       arg0 = CALL_EXPR_ARG (exp, 0);
27448       arg1 = CALL_EXPR_ARG (exp, 1);
27449       arg2 = CALL_EXPR_ARG (exp, 2);
27450       op0 = expand_normal (arg0);
27451       op1 = expand_normal (arg1);
27452       op2 = expand_normal (arg2);
27453       if (!REG_P (op0))
27454         op0 = copy_to_mode_reg (Pmode, op0);
27455       if (!REG_P (op1))
27456         op1 = copy_to_mode_reg (SImode, op1);
27457       if (!REG_P (op2))
27458         op2 = copy_to_mode_reg (SImode, op2);
27459       emit_insn (ix86_gen_monitor (op0, op1, op2));
27460       return 0;
27461
27462     case IX86_BUILTIN_MWAIT:
27463       arg0 = CALL_EXPR_ARG (exp, 0);
27464       arg1 = CALL_EXPR_ARG (exp, 1);
27465       op0 = expand_normal (arg0);
27466       op1 = expand_normal (arg1);
27467       if (!REG_P (op0))
27468         op0 = copy_to_mode_reg (SImode, op0);
27469       if (!REG_P (op1))
27470         op1 = copy_to_mode_reg (SImode, op1);
27471       emit_insn (gen_sse3_mwait (op0, op1));
27472       return 0;
27473
27474     case IX86_BUILTIN_VEC_INIT_V2SI:
27475     case IX86_BUILTIN_VEC_INIT_V4HI:
27476     case IX86_BUILTIN_VEC_INIT_V8QI:
27477       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
27478
27479     case IX86_BUILTIN_VEC_EXT_V2DF:
27480     case IX86_BUILTIN_VEC_EXT_V2DI:
27481     case IX86_BUILTIN_VEC_EXT_V4SF:
27482     case IX86_BUILTIN_VEC_EXT_V4SI:
27483     case IX86_BUILTIN_VEC_EXT_V8HI:
27484     case IX86_BUILTIN_VEC_EXT_V2SI:
27485     case IX86_BUILTIN_VEC_EXT_V4HI:
27486     case IX86_BUILTIN_VEC_EXT_V16QI:
27487       return ix86_expand_vec_ext_builtin (exp, target);
27488
27489     case IX86_BUILTIN_VEC_SET_V2DI:
27490     case IX86_BUILTIN_VEC_SET_V4SF:
27491     case IX86_BUILTIN_VEC_SET_V4SI:
27492     case IX86_BUILTIN_VEC_SET_V8HI:
27493     case IX86_BUILTIN_VEC_SET_V4HI:
27494     case IX86_BUILTIN_VEC_SET_V16QI:
27495       return ix86_expand_vec_set_builtin (exp);
27496
27497     case IX86_BUILTIN_VEC_PERM_V2DF:
27498     case IX86_BUILTIN_VEC_PERM_V4SF:
27499     case IX86_BUILTIN_VEC_PERM_V2DI:
27500     case IX86_BUILTIN_VEC_PERM_V4SI:
27501     case IX86_BUILTIN_VEC_PERM_V8HI:
27502     case IX86_BUILTIN_VEC_PERM_V16QI:
27503     case IX86_BUILTIN_VEC_PERM_V2DI_U:
27504     case IX86_BUILTIN_VEC_PERM_V4SI_U:
27505     case IX86_BUILTIN_VEC_PERM_V8HI_U:
27506     case IX86_BUILTIN_VEC_PERM_V16QI_U:
27507     case IX86_BUILTIN_VEC_PERM_V4DF:
27508     case IX86_BUILTIN_VEC_PERM_V8SF:
27509       return ix86_expand_vec_perm_builtin (exp);
27510
27511     case IX86_BUILTIN_INFQ:
27512     case IX86_BUILTIN_HUGE_VALQ:
27513       {
27514         REAL_VALUE_TYPE inf;
27515         rtx tmp;
27516
27517         real_inf (&inf);
27518         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
27519
27520         tmp = validize_mem (force_const_mem (mode, tmp));
27521
27522         if (target == 0)
27523           target = gen_reg_rtx (mode);
27524
27525         emit_move_insn (target, tmp);
27526         return target;
27527       }
27528
27529     case IX86_BUILTIN_LLWPCB:
27530       arg0 = CALL_EXPR_ARG (exp, 0);
27531       op0 = expand_normal (arg0);
27532       icode = CODE_FOR_lwp_llwpcb;
27533       if (!insn_data[icode].operand[0].predicate (op0, Pmode))
27534         op0 = copy_to_mode_reg (Pmode, op0);
27535       emit_insn (gen_lwp_llwpcb (op0));
27536       return 0;
27537
27538     case IX86_BUILTIN_SLWPCB:
27539       icode = CODE_FOR_lwp_slwpcb;
27540       if (!target
27541           || !insn_data[icode].operand[0].predicate (target, Pmode))
27542         target = gen_reg_rtx (Pmode);
27543       emit_insn (gen_lwp_slwpcb (target));
27544       return target;
27545
27546     case IX86_BUILTIN_BEXTRI32:
27547     case IX86_BUILTIN_BEXTRI64:
27548       arg0 = CALL_EXPR_ARG (exp, 0);
27549       arg1 = CALL_EXPR_ARG (exp, 1);
27550       op0 = expand_normal (arg0);
27551       op1 = expand_normal (arg1);
27552       icode = (fcode == IX86_BUILTIN_BEXTRI32
27553           ? CODE_FOR_tbm_bextri_si
27554           : CODE_FOR_tbm_bextri_di);
27555       if (!CONST_INT_P (op1))
27556         {
27557           error ("last argument must be an immediate");
27558           return const0_rtx;
27559         }
27560       else
27561         {
27562           unsigned char length = (INTVAL (op1) >> 8) & 0xFF;
27563           unsigned char lsb_index = INTVAL (op1) & 0xFF;
27564           op1 = GEN_INT (length);
27565           op2 = GEN_INT (lsb_index);
27566           pat = GEN_FCN (icode) (target, op0, op1, op2);
27567           if (pat)
27568             emit_insn (pat);
27569           return target;
27570         }
27571
27572     case IX86_BUILTIN_RDRAND16_STEP:
27573       icode = CODE_FOR_rdrandhi_1;
27574       mode0 = HImode;
27575       goto rdrand_step;
27576
27577     case IX86_BUILTIN_RDRAND32_STEP:
27578       icode = CODE_FOR_rdrandsi_1;
27579       mode0 = SImode;
27580       goto rdrand_step;
27581
27582     case IX86_BUILTIN_RDRAND64_STEP:
27583       icode = CODE_FOR_rdranddi_1;
27584       mode0 = DImode;
27585
27586 rdrand_step:
27587       op0 = gen_reg_rtx (mode0);
27588       emit_insn (GEN_FCN (icode) (op0));
27589
27590       op1 = gen_reg_rtx (SImode);
27591       emit_move_insn (op1, CONST1_RTX (SImode));
27592
27593       /* Emit SImode conditional move.  */
27594       if (mode0 == HImode)
27595         {
27596           op2 = gen_reg_rtx (SImode);
27597           emit_insn (gen_zero_extendhisi2 (op2, op0));
27598         }
27599       else if (mode0 == SImode)
27600         op2 = op0;
27601       else
27602         op2 = gen_rtx_SUBREG (SImode, op0, 0);
27603
27604       pat = gen_rtx_GEU (VOIDmode, gen_rtx_REG (CCCmode, FLAGS_REG),
27605                          const0_rtx);
27606       emit_insn (gen_rtx_SET (VOIDmode, op1,
27607                               gen_rtx_IF_THEN_ELSE (SImode, pat, op2, op1)));
27608       emit_move_insn (target, op1);
27609
27610       arg0 = CALL_EXPR_ARG (exp, 0);
27611       op1 = expand_normal (arg0);
27612       if (!address_operand (op1, VOIDmode))
27613         op1 = copy_addr_to_reg (op1);
27614       emit_move_insn (gen_rtx_MEM (mode0, op1), op0);
27615       return target;
27616
27617     default:
27618       break;
27619     }
27620
27621   for (i = 0, d = bdesc_special_args;
27622        i < ARRAY_SIZE (bdesc_special_args);
27623        i++, d++)
27624     if (d->code == fcode)
27625       return ix86_expand_special_args_builtin (d, exp, target);
27626
27627   for (i = 0, d = bdesc_args;
27628        i < ARRAY_SIZE (bdesc_args);
27629        i++, d++)
27630     if (d->code == fcode)
27631       switch (fcode)
27632         {
27633         case IX86_BUILTIN_FABSQ:
27634         case IX86_BUILTIN_COPYSIGNQ:
27635           if (!TARGET_SSE2)
27636             /* Emit a normal call if SSE2 isn't available.  */
27637             return expand_call (exp, target, ignore);
27638         default:
27639           return ix86_expand_args_builtin (d, exp, target);
27640         }
27641
27642   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
27643     if (d->code == fcode)
27644       return ix86_expand_sse_comi (d, exp, target);
27645
27646   for (i = 0, d = bdesc_pcmpestr;
27647        i < ARRAY_SIZE (bdesc_pcmpestr);
27648        i++, d++)
27649     if (d->code == fcode)
27650       return ix86_expand_sse_pcmpestr (d, exp, target);
27651
27652   for (i = 0, d = bdesc_pcmpistr;
27653        i < ARRAY_SIZE (bdesc_pcmpistr);
27654        i++, d++)
27655     if (d->code == fcode)
27656       return ix86_expand_sse_pcmpistr (d, exp, target);
27657
27658   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
27659     if (d->code == fcode)
27660       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
27661                                             (enum ix86_builtin_func_type)
27662                                             d->flag, d->comparison);
27663
27664   gcc_unreachable ();
27665 }
27666
27667 /* Returns a function decl for a vectorized version of the builtin function
27668    with builtin function code FN and the result vector type TYPE, or NULL_TREE
27669    if it is not available.  */
27670
27671 static tree
27672 ix86_builtin_vectorized_function (tree fndecl, tree type_out,
27673                                   tree type_in)
27674 {
27675   enum machine_mode in_mode, out_mode;
27676   int in_n, out_n;
27677   enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
27678
27679   if (TREE_CODE (type_out) != VECTOR_TYPE
27680       || TREE_CODE (type_in) != VECTOR_TYPE
27681       || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
27682     return NULL_TREE;
27683
27684   out_mode = TYPE_MODE (TREE_TYPE (type_out));
27685   out_n = TYPE_VECTOR_SUBPARTS (type_out);
27686   in_mode = TYPE_MODE (TREE_TYPE (type_in));
27687   in_n = TYPE_VECTOR_SUBPARTS (type_in);
27688
27689   switch (fn)
27690     {
27691     case BUILT_IN_SQRT:
27692       if (out_mode == DFmode && in_mode == DFmode)
27693         {
27694           if (out_n == 2 && in_n == 2)
27695             return ix86_builtins[IX86_BUILTIN_SQRTPD];
27696           else if (out_n == 4 && in_n == 4)
27697             return ix86_builtins[IX86_BUILTIN_SQRTPD256];
27698         }
27699       break;
27700
27701     case BUILT_IN_SQRTF:
27702       if (out_mode == SFmode && in_mode == SFmode)
27703         {
27704           if (out_n == 4 && in_n == 4)
27705             return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
27706           else if (out_n == 8 && in_n == 8)
27707             return ix86_builtins[IX86_BUILTIN_SQRTPS_NR256];
27708         }
27709       break;
27710
27711     case BUILT_IN_LRINT:
27712       if (out_mode == SImode && out_n == 4
27713           && in_mode == DFmode && in_n == 2)
27714         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
27715       break;
27716
27717     case BUILT_IN_LRINTF:
27718       if (out_mode == SImode && in_mode == SFmode)
27719         {
27720           if (out_n == 4 && in_n == 4)
27721             return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
27722           else if (out_n == 8 && in_n == 8)
27723             return ix86_builtins[IX86_BUILTIN_CVTPS2DQ256];
27724         }
27725       break;
27726
27727     case BUILT_IN_COPYSIGN:
27728       if (out_mode == DFmode && in_mode == DFmode)
27729         {
27730           if (out_n == 2 && in_n == 2)
27731             return ix86_builtins[IX86_BUILTIN_CPYSGNPD];
27732           else if (out_n == 4 && in_n == 4)
27733             return ix86_builtins[IX86_BUILTIN_CPYSGNPD256];
27734         }
27735       break;
27736
27737     case BUILT_IN_COPYSIGNF:
27738       if (out_mode == SFmode && in_mode == SFmode)
27739         {
27740           if (out_n == 4 && in_n == 4)
27741             return ix86_builtins[IX86_BUILTIN_CPYSGNPS];
27742           else if (out_n == 8 && in_n == 8)
27743             return ix86_builtins[IX86_BUILTIN_CPYSGNPS256];
27744         }
27745       break;
27746
27747     case BUILT_IN_FLOOR:
27748       /* The round insn does not trap on denormals.  */
27749       if (flag_trapping_math || !TARGET_ROUND)
27750         break;
27751
27752       if (out_mode == DFmode && in_mode == DFmode)
27753         {
27754           if (out_n == 2 && in_n == 2)
27755             return ix86_builtins[IX86_BUILTIN_FLOORPD];
27756           else if (out_n == 4 && in_n == 4)
27757             return ix86_builtins[IX86_BUILTIN_FLOORPD256];
27758         }
27759       break;
27760
27761     case BUILT_IN_FLOORF:
27762       /* The round insn does not trap on denormals.  */
27763       if (flag_trapping_math || !TARGET_ROUND)
27764         break;
27765
27766       if (out_mode == SFmode && in_mode == SFmode)
27767         {
27768           if (out_n == 4 && in_n == 4)
27769             return ix86_builtins[IX86_BUILTIN_FLOORPS];
27770           else if (out_n == 8 && in_n == 8)
27771             return ix86_builtins[IX86_BUILTIN_FLOORPS256];
27772         }
27773       break;
27774
27775     case BUILT_IN_CEIL:
27776       /* The round insn does not trap on denormals.  */
27777       if (flag_trapping_math || !TARGET_ROUND)
27778         break;
27779
27780       if (out_mode == DFmode && in_mode == DFmode)
27781         {
27782           if (out_n == 2 && in_n == 2)
27783             return ix86_builtins[IX86_BUILTIN_CEILPD];
27784           else if (out_n == 4 && in_n == 4)
27785             return ix86_builtins[IX86_BUILTIN_CEILPD256];
27786         }
27787       break;
27788
27789     case BUILT_IN_CEILF:
27790       /* The round insn does not trap on denormals.  */
27791       if (flag_trapping_math || !TARGET_ROUND)
27792         break;
27793
27794       if (out_mode == SFmode && in_mode == SFmode)
27795         {
27796           if (out_n == 4 && in_n == 4)
27797             return ix86_builtins[IX86_BUILTIN_CEILPS];
27798           else if (out_n == 8 && in_n == 8)
27799             return ix86_builtins[IX86_BUILTIN_CEILPS256];
27800         }
27801       break;
27802
27803     case BUILT_IN_TRUNC:
27804       /* The round insn does not trap on denormals.  */
27805       if (flag_trapping_math || !TARGET_ROUND)
27806         break;
27807
27808       if (out_mode == DFmode && in_mode == DFmode)
27809         {
27810           if (out_n == 2 && in_n == 2)
27811             return ix86_builtins[IX86_BUILTIN_TRUNCPD];
27812           else if (out_n == 4 && in_n == 4)
27813             return ix86_builtins[IX86_BUILTIN_TRUNCPD256];
27814         }
27815       break;
27816
27817     case BUILT_IN_TRUNCF:
27818       /* The round insn does not trap on denormals.  */
27819       if (flag_trapping_math || !TARGET_ROUND)
27820         break;
27821
27822       if (out_mode == SFmode && in_mode == SFmode)
27823         {
27824           if (out_n == 4 && in_n == 4)
27825             return ix86_builtins[IX86_BUILTIN_TRUNCPS];
27826           else if (out_n == 8 && in_n == 8)
27827             return ix86_builtins[IX86_BUILTIN_TRUNCPS256];
27828         }
27829       break;
27830
27831     case BUILT_IN_RINT:
27832       /* The round insn does not trap on denormals.  */
27833       if (flag_trapping_math || !TARGET_ROUND)
27834         break;
27835
27836       if (out_mode == DFmode && in_mode == DFmode)
27837         {
27838           if (out_n == 2 && in_n == 2)
27839             return ix86_builtins[IX86_BUILTIN_RINTPD];
27840           else if (out_n == 4 && in_n == 4)
27841             return ix86_builtins[IX86_BUILTIN_RINTPD256];
27842         }
27843       break;
27844
27845     case BUILT_IN_RINTF:
27846       /* The round insn does not trap on denormals.  */
27847       if (flag_trapping_math || !TARGET_ROUND)
27848         break;
27849
27850       if (out_mode == SFmode && in_mode == SFmode)
27851         {
27852           if (out_n == 4 && in_n == 4)
27853             return ix86_builtins[IX86_BUILTIN_RINTPS];
27854           else if (out_n == 8 && in_n == 8)
27855             return ix86_builtins[IX86_BUILTIN_RINTPS256];
27856         }
27857       break;
27858
27859     case BUILT_IN_FMA:
27860       if (out_mode == DFmode && in_mode == DFmode)
27861         {
27862           if (out_n == 2 && in_n == 2)
27863             return ix86_builtins[IX86_BUILTIN_VFMADDPD];
27864           if (out_n == 4 && in_n == 4)
27865             return ix86_builtins[IX86_BUILTIN_VFMADDPD256];
27866         }
27867       break;
27868
27869     case BUILT_IN_FMAF:
27870       if (out_mode == SFmode && in_mode == SFmode)
27871         {
27872           if (out_n == 4 && in_n == 4)
27873             return ix86_builtins[IX86_BUILTIN_VFMADDPS];
27874           if (out_n == 8 && in_n == 8)
27875             return ix86_builtins[IX86_BUILTIN_VFMADDPS256];
27876         }
27877       break;
27878
27879     default:
27880       break;
27881     }
27882
27883   /* Dispatch to a handler for a vectorization library.  */
27884   if (ix86_veclib_handler)
27885     return ix86_veclib_handler ((enum built_in_function) fn, type_out,
27886                                 type_in);
27887
27888   return NULL_TREE;
27889 }
27890
27891 /* Handler for an SVML-style interface to
27892    a library with vectorized intrinsics.  */
27893
27894 static tree
27895 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
27896 {
27897   char name[20];
27898   tree fntype, new_fndecl, args;
27899   unsigned arity;
27900   const char *bname;
27901   enum machine_mode el_mode, in_mode;
27902   int n, in_n;
27903
27904   /* The SVML is suitable for unsafe math only.  */
27905   if (!flag_unsafe_math_optimizations)
27906     return NULL_TREE;
27907
27908   el_mode = TYPE_MODE (TREE_TYPE (type_out));
27909   n = TYPE_VECTOR_SUBPARTS (type_out);
27910   in_mode = TYPE_MODE (TREE_TYPE (type_in));
27911   in_n = TYPE_VECTOR_SUBPARTS (type_in);
27912   if (el_mode != in_mode
27913       || n != in_n)
27914     return NULL_TREE;
27915
27916   switch (fn)
27917     {
27918     case BUILT_IN_EXP:
27919     case BUILT_IN_LOG:
27920     case BUILT_IN_LOG10:
27921     case BUILT_IN_POW:
27922     case BUILT_IN_TANH:
27923     case BUILT_IN_TAN:
27924     case BUILT_IN_ATAN:
27925     case BUILT_IN_ATAN2:
27926     case BUILT_IN_ATANH:
27927     case BUILT_IN_CBRT:
27928     case BUILT_IN_SINH:
27929     case BUILT_IN_SIN:
27930     case BUILT_IN_ASINH:
27931     case BUILT_IN_ASIN:
27932     case BUILT_IN_COSH:
27933     case BUILT_IN_COS:
27934     case BUILT_IN_ACOSH:
27935     case BUILT_IN_ACOS:
27936       if (el_mode != DFmode || n != 2)
27937         return NULL_TREE;
27938       break;
27939
27940     case BUILT_IN_EXPF:
27941     case BUILT_IN_LOGF:
27942     case BUILT_IN_LOG10F:
27943     case BUILT_IN_POWF:
27944     case BUILT_IN_TANHF:
27945     case BUILT_IN_TANF:
27946     case BUILT_IN_ATANF:
27947     case BUILT_IN_ATAN2F:
27948     case BUILT_IN_ATANHF:
27949     case BUILT_IN_CBRTF:
27950     case BUILT_IN_SINHF:
27951     case BUILT_IN_SINF:
27952     case BUILT_IN_ASINHF:
27953     case BUILT_IN_ASINF:
27954     case BUILT_IN_COSHF:
27955     case BUILT_IN_COSF:
27956     case BUILT_IN_ACOSHF:
27957     case BUILT_IN_ACOSF:
27958       if (el_mode != SFmode || n != 4)
27959         return NULL_TREE;
27960       break;
27961
27962     default:
27963       return NULL_TREE;
27964     }
27965
27966   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
27967
27968   if (fn == BUILT_IN_LOGF)
27969     strcpy (name, "vmlsLn4");
27970   else if (fn == BUILT_IN_LOG)
27971     strcpy (name, "vmldLn2");
27972   else if (n == 4)
27973     {
27974       sprintf (name, "vmls%s", bname+10);
27975       name[strlen (name)-1] = '4';
27976     }
27977   else
27978     sprintf (name, "vmld%s2", bname+10);
27979
27980   /* Convert to uppercase. */
27981   name[4] &= ~0x20;
27982
27983   arity = 0;
27984   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
27985        args = TREE_CHAIN (args))
27986     arity++;
27987
27988   if (arity == 1)
27989     fntype = build_function_type_list (type_out, type_in, NULL);
27990   else
27991     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
27992
27993   /* Build a function declaration for the vectorized function.  */
27994   new_fndecl = build_decl (BUILTINS_LOCATION,
27995                            FUNCTION_DECL, get_identifier (name), fntype);
27996   TREE_PUBLIC (new_fndecl) = 1;
27997   DECL_EXTERNAL (new_fndecl) = 1;
27998   DECL_IS_NOVOPS (new_fndecl) = 1;
27999   TREE_READONLY (new_fndecl) = 1;
28000
28001   return new_fndecl;
28002 }
28003
28004 /* Handler for an ACML-style interface to
28005    a library with vectorized intrinsics.  */
28006
28007 static tree
28008 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
28009 {
28010   char name[20] = "__vr.._";
28011   tree fntype, new_fndecl, args;
28012   unsigned arity;
28013   const char *bname;
28014   enum machine_mode el_mode, in_mode;
28015   int n, in_n;
28016
28017   /* The ACML is 64bits only and suitable for unsafe math only as
28018      it does not correctly support parts of IEEE with the required
28019      precision such as denormals.  */
28020   if (!TARGET_64BIT
28021       || !flag_unsafe_math_optimizations)
28022     return NULL_TREE;
28023
28024   el_mode = TYPE_MODE (TREE_TYPE (type_out));
28025   n = TYPE_VECTOR_SUBPARTS (type_out);
28026   in_mode = TYPE_MODE (TREE_TYPE (type_in));
28027   in_n = TYPE_VECTOR_SUBPARTS (type_in);
28028   if (el_mode != in_mode
28029       || n != in_n)
28030     return NULL_TREE;
28031
28032   switch (fn)
28033     {
28034     case BUILT_IN_SIN:
28035     case BUILT_IN_COS:
28036     case BUILT_IN_EXP:
28037     case BUILT_IN_LOG:
28038     case BUILT_IN_LOG2:
28039     case BUILT_IN_LOG10:
28040       name[4] = 'd';
28041       name[5] = '2';
28042       if (el_mode != DFmode
28043           || n != 2)
28044         return NULL_TREE;
28045       break;
28046
28047     case BUILT_IN_SINF:
28048     case BUILT_IN_COSF:
28049     case BUILT_IN_EXPF:
28050     case BUILT_IN_POWF:
28051     case BUILT_IN_LOGF:
28052     case BUILT_IN_LOG2F:
28053     case BUILT_IN_LOG10F:
28054       name[4] = 's';
28055       name[5] = '4';
28056       if (el_mode != SFmode
28057           || n != 4)
28058         return NULL_TREE;
28059       break;
28060
28061     default:
28062       return NULL_TREE;
28063     }
28064
28065   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
28066   sprintf (name + 7, "%s", bname+10);
28067
28068   arity = 0;
28069   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
28070        args = TREE_CHAIN (args))
28071     arity++;
28072
28073   if (arity == 1)
28074     fntype = build_function_type_list (type_out, type_in, NULL);
28075   else
28076     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
28077
28078   /* Build a function declaration for the vectorized function.  */
28079   new_fndecl = build_decl (BUILTINS_LOCATION,
28080                            FUNCTION_DECL, get_identifier (name), fntype);
28081   TREE_PUBLIC (new_fndecl) = 1;
28082   DECL_EXTERNAL (new_fndecl) = 1;
28083   DECL_IS_NOVOPS (new_fndecl) = 1;
28084   TREE_READONLY (new_fndecl) = 1;
28085
28086   return new_fndecl;
28087 }
28088
28089
28090 /* Returns a decl of a function that implements conversion of an integer vector
28091    into a floating-point vector, or vice-versa.  DEST_TYPE and SRC_TYPE
28092    are the types involved when converting according to CODE.
28093    Return NULL_TREE if it is not available.  */
28094
28095 static tree
28096 ix86_vectorize_builtin_conversion (unsigned int code,
28097                                    tree dest_type, tree src_type)
28098 {
28099   if (! TARGET_SSE2)
28100     return NULL_TREE;
28101
28102   switch (code)
28103     {
28104     case FLOAT_EXPR:
28105       switch (TYPE_MODE (src_type))
28106         {
28107         case V4SImode:
28108           switch (TYPE_MODE (dest_type))
28109             {
28110             case V4SFmode:
28111               return (TYPE_UNSIGNED (src_type)
28112                       ? ix86_builtins[IX86_BUILTIN_CVTUDQ2PS]
28113                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PS]);
28114             case V4DFmode:
28115               return (TYPE_UNSIGNED (src_type)
28116                       ? NULL_TREE
28117                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PD256]);
28118             default:
28119               return NULL_TREE;
28120             }
28121           break;
28122         case V8SImode:
28123           switch (TYPE_MODE (dest_type))
28124             {
28125             case V8SFmode:
28126               return (TYPE_UNSIGNED (src_type)
28127                       ? NULL_TREE
28128                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PS256]);
28129             default:
28130               return NULL_TREE;
28131             }
28132           break;
28133         default:
28134           return NULL_TREE;
28135         }
28136
28137     case FIX_TRUNC_EXPR:
28138       switch (TYPE_MODE (dest_type))
28139         {
28140         case V4SImode:
28141           switch (TYPE_MODE (src_type))
28142             {
28143             case V4SFmode:
28144               return (TYPE_UNSIGNED (dest_type)
28145                       ? NULL_TREE
28146                       : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ]);
28147             case V4DFmode:
28148               return (TYPE_UNSIGNED (dest_type)
28149                       ? NULL_TREE
28150                       : ix86_builtins[IX86_BUILTIN_CVTTPD2DQ256]);
28151             default:
28152               return NULL_TREE;
28153             }
28154           break;
28155
28156         case V8SImode:
28157           switch (TYPE_MODE (src_type))
28158             {
28159             case V8SFmode:
28160               return (TYPE_UNSIGNED (dest_type)
28161                       ? NULL_TREE
28162                       : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ256]);
28163             default:
28164               return NULL_TREE;
28165             }
28166           break;
28167
28168         default:
28169           return NULL_TREE;
28170         }
28171
28172     default:
28173       return NULL_TREE;
28174     }
28175
28176   return NULL_TREE;
28177 }
28178
28179 /* Returns a code for a target-specific builtin that implements
28180    reciprocal of the function, or NULL_TREE if not available.  */
28181
28182 static tree
28183 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
28184                          bool sqrt ATTRIBUTE_UNUSED)
28185 {
28186   if (! (TARGET_SSE_MATH && !optimize_insn_for_size_p ()
28187          && flag_finite_math_only && !flag_trapping_math
28188          && flag_unsafe_math_optimizations))
28189     return NULL_TREE;
28190
28191   if (md_fn)
28192     /* Machine dependent builtins.  */
28193     switch (fn)
28194       {
28195         /* Vectorized version of sqrt to rsqrt conversion.  */
28196       case IX86_BUILTIN_SQRTPS_NR:
28197         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
28198
28199       case IX86_BUILTIN_SQRTPS_NR256:
28200         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR256];
28201
28202       default:
28203         return NULL_TREE;
28204       }
28205   else
28206     /* Normal builtins.  */
28207     switch (fn)
28208       {
28209         /* Sqrt to rsqrt conversion.  */
28210       case BUILT_IN_SQRTF:
28211         return ix86_builtins[IX86_BUILTIN_RSQRTF];
28212
28213       default:
28214         return NULL_TREE;
28215       }
28216 }
28217 \f
28218 /* Helper for avx_vpermilps256_operand et al.  This is also used by
28219    the expansion functions to turn the parallel back into a mask.
28220    The return value is 0 for no match and the imm8+1 for a match.  */
28221
28222 int
28223 avx_vpermilp_parallel (rtx par, enum machine_mode mode)
28224 {
28225   unsigned i, nelt = GET_MODE_NUNITS (mode);
28226   unsigned mask = 0;
28227   unsigned char ipar[8];
28228
28229   if (XVECLEN (par, 0) != (int) nelt)
28230     return 0;
28231
28232   /* Validate that all of the elements are constants, and not totally
28233      out of range.  Copy the data into an integral array to make the
28234      subsequent checks easier.  */
28235   for (i = 0; i < nelt; ++i)
28236     {
28237       rtx er = XVECEXP (par, 0, i);
28238       unsigned HOST_WIDE_INT ei;
28239
28240       if (!CONST_INT_P (er))
28241         return 0;
28242       ei = INTVAL (er);
28243       if (ei >= nelt)
28244         return 0;
28245       ipar[i] = ei;
28246     }
28247
28248   switch (mode)
28249     {
28250     case V4DFmode:
28251       /* In the 256-bit DFmode case, we can only move elements within
28252          a 128-bit lane.  */
28253       for (i = 0; i < 2; ++i)
28254         {
28255           if (ipar[i] >= 2)
28256             return 0;
28257           mask |= ipar[i] << i;
28258         }
28259       for (i = 2; i < 4; ++i)
28260         {
28261           if (ipar[i] < 2)
28262             return 0;
28263           mask |= (ipar[i] - 2) << i;
28264         }
28265       break;
28266
28267     case V8SFmode:
28268       /* In the 256-bit SFmode case, we have full freedom of movement
28269          within the low 128-bit lane, but the high 128-bit lane must
28270          mirror the exact same pattern.  */
28271       for (i = 0; i < 4; ++i)
28272         if (ipar[i] + 4 != ipar[i + 4])
28273           return 0;
28274       nelt = 4;
28275       /* FALLTHRU */
28276
28277     case V2DFmode:
28278     case V4SFmode:
28279       /* In the 128-bit case, we've full freedom in the placement of
28280          the elements from the source operand.  */
28281       for (i = 0; i < nelt; ++i)
28282         mask |= ipar[i] << (i * (nelt / 2));
28283       break;
28284
28285     default:
28286       gcc_unreachable ();
28287     }
28288
28289   /* Make sure success has a non-zero value by adding one.  */
28290   return mask + 1;
28291 }
28292
28293 /* Helper for avx_vperm2f128_v4df_operand et al.  This is also used by
28294    the expansion functions to turn the parallel back into a mask.
28295    The return value is 0 for no match and the imm8+1 for a match.  */
28296
28297 int
28298 avx_vperm2f128_parallel (rtx par, enum machine_mode mode)
28299 {
28300   unsigned i, nelt = GET_MODE_NUNITS (mode), nelt2 = nelt / 2;
28301   unsigned mask = 0;
28302   unsigned char ipar[8];
28303
28304   if (XVECLEN (par, 0) != (int) nelt)
28305     return 0;
28306
28307   /* Validate that all of the elements are constants, and not totally
28308      out of range.  Copy the data into an integral array to make the
28309      subsequent checks easier.  */
28310   for (i = 0; i < nelt; ++i)
28311     {
28312       rtx er = XVECEXP (par, 0, i);
28313       unsigned HOST_WIDE_INT ei;
28314
28315       if (!CONST_INT_P (er))
28316         return 0;
28317       ei = INTVAL (er);
28318       if (ei >= 2 * nelt)
28319         return 0;
28320       ipar[i] = ei;
28321     }
28322
28323   /* Validate that the halves of the permute are halves.  */
28324   for (i = 0; i < nelt2 - 1; ++i)
28325     if (ipar[i] + 1 != ipar[i + 1])
28326       return 0;
28327   for (i = nelt2; i < nelt - 1; ++i)
28328     if (ipar[i] + 1 != ipar[i + 1])
28329       return 0;
28330
28331   /* Reconstruct the mask.  */
28332   for (i = 0; i < 2; ++i)
28333     {
28334       unsigned e = ipar[i * nelt2];
28335       if (e % nelt2)
28336         return 0;
28337       e /= nelt2;
28338       mask |= e << (i * 4);
28339     }
28340
28341   /* Make sure success has a non-zero value by adding one.  */
28342   return mask + 1;
28343 }
28344 \f
28345
28346 /* Store OPERAND to the memory after reload is completed.  This means
28347    that we can't easily use assign_stack_local.  */
28348 rtx
28349 ix86_force_to_memory (enum machine_mode mode, rtx operand)
28350 {
28351   rtx result;
28352
28353   gcc_assert (reload_completed);
28354   if (ix86_using_red_zone ())
28355     {
28356       result = gen_rtx_MEM (mode,
28357                             gen_rtx_PLUS (Pmode,
28358                                           stack_pointer_rtx,
28359                                           GEN_INT (-RED_ZONE_SIZE)));
28360       emit_move_insn (result, operand);
28361     }
28362   else if (TARGET_64BIT)
28363     {
28364       switch (mode)
28365         {
28366         case HImode:
28367         case SImode:
28368           operand = gen_lowpart (DImode, operand);
28369           /* FALLTHRU */
28370         case DImode:
28371           emit_insn (
28372                       gen_rtx_SET (VOIDmode,
28373                                    gen_rtx_MEM (DImode,
28374                                                 gen_rtx_PRE_DEC (DImode,
28375                                                         stack_pointer_rtx)),
28376                                    operand));
28377           break;
28378         default:
28379           gcc_unreachable ();
28380         }
28381       result = gen_rtx_MEM (mode, stack_pointer_rtx);
28382     }
28383   else
28384     {
28385       switch (mode)
28386         {
28387         case DImode:
28388           {
28389             rtx operands[2];
28390             split_double_mode (mode, &operand, 1, operands, operands + 1);
28391             emit_insn (
28392                         gen_rtx_SET (VOIDmode,
28393                                      gen_rtx_MEM (SImode,
28394                                                   gen_rtx_PRE_DEC (Pmode,
28395                                                         stack_pointer_rtx)),
28396                                      operands[1]));
28397             emit_insn (
28398                         gen_rtx_SET (VOIDmode,
28399                                      gen_rtx_MEM (SImode,
28400                                                   gen_rtx_PRE_DEC (Pmode,
28401                                                         stack_pointer_rtx)),
28402                                      operands[0]));
28403           }
28404           break;
28405         case HImode:
28406           /* Store HImodes as SImodes.  */
28407           operand = gen_lowpart (SImode, operand);
28408           /* FALLTHRU */
28409         case SImode:
28410           emit_insn (
28411                       gen_rtx_SET (VOIDmode,
28412                                    gen_rtx_MEM (GET_MODE (operand),
28413                                                 gen_rtx_PRE_DEC (SImode,
28414                                                         stack_pointer_rtx)),
28415                                    operand));
28416           break;
28417         default:
28418           gcc_unreachable ();
28419         }
28420       result = gen_rtx_MEM (mode, stack_pointer_rtx);
28421     }
28422   return result;
28423 }
28424
28425 /* Free operand from the memory.  */
28426 void
28427 ix86_free_from_memory (enum machine_mode mode)
28428 {
28429   if (!ix86_using_red_zone ())
28430     {
28431       int size;
28432
28433       if (mode == DImode || TARGET_64BIT)
28434         size = 8;
28435       else
28436         size = 4;
28437       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
28438          to pop or add instruction if registers are available.  */
28439       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
28440                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
28441                                             GEN_INT (size))));
28442     }
28443 }
28444
28445 /* Implement TARGET_PREFERRED_RELOAD_CLASS.
28446
28447    Put float CONST_DOUBLE in the constant pool instead of fp regs.
28448    QImode must go into class Q_REGS.
28449    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
28450    movdf to do mem-to-mem moves through integer regs.  */
28451
28452 static reg_class_t
28453 ix86_preferred_reload_class (rtx x, reg_class_t regclass)
28454 {
28455   enum machine_mode mode = GET_MODE (x);
28456
28457   /* We're only allowed to return a subclass of CLASS.  Many of the
28458      following checks fail for NO_REGS, so eliminate that early.  */
28459   if (regclass == NO_REGS)
28460     return NO_REGS;
28461
28462   /* All classes can load zeros.  */
28463   if (x == CONST0_RTX (mode))
28464     return regclass;
28465
28466   /* Force constants into memory if we are loading a (nonzero) constant into
28467      an MMX or SSE register.  This is because there are no MMX/SSE instructions
28468      to load from a constant.  */
28469   if (CONSTANT_P (x)
28470       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
28471     return NO_REGS;
28472
28473   /* Prefer SSE regs only, if we can use them for math.  */
28474   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
28475     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
28476
28477   /* Floating-point constants need more complex checks.  */
28478   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
28479     {
28480       /* General regs can load everything.  */
28481       if (reg_class_subset_p (regclass, GENERAL_REGS))
28482         return regclass;
28483
28484       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
28485          zero above.  We only want to wind up preferring 80387 registers if
28486          we plan on doing computation with them.  */
28487       if (TARGET_80387
28488           && standard_80387_constant_p (x))
28489         {
28490           /* Limit class to non-sse.  */
28491           if (regclass == FLOAT_SSE_REGS)
28492             return FLOAT_REGS;
28493           if (regclass == FP_TOP_SSE_REGS)
28494             return FP_TOP_REG;
28495           if (regclass == FP_SECOND_SSE_REGS)
28496             return FP_SECOND_REG;
28497           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
28498             return regclass;
28499         }
28500
28501       return NO_REGS;
28502     }
28503
28504   /* Generally when we see PLUS here, it's the function invariant
28505      (plus soft-fp const_int).  Which can only be computed into general
28506      regs.  */
28507   if (GET_CODE (x) == PLUS)
28508     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
28509
28510   /* QImode constants are easy to load, but non-constant QImode data
28511      must go into Q_REGS.  */
28512   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
28513     {
28514       if (reg_class_subset_p (regclass, Q_REGS))
28515         return regclass;
28516       if (reg_class_subset_p (Q_REGS, regclass))
28517         return Q_REGS;
28518       return NO_REGS;
28519     }
28520
28521   return regclass;
28522 }
28523
28524 /* Discourage putting floating-point values in SSE registers unless
28525    SSE math is being used, and likewise for the 387 registers.  */
28526 static reg_class_t
28527 ix86_preferred_output_reload_class (rtx x, reg_class_t regclass)
28528 {
28529   enum machine_mode mode = GET_MODE (x);
28530
28531   /* Restrict the output reload class to the register bank that we are doing
28532      math on.  If we would like not to return a subset of CLASS, reject this
28533      alternative: if reload cannot do this, it will still use its choice.  */
28534   mode = GET_MODE (x);
28535   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
28536     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
28537
28538   if (X87_FLOAT_MODE_P (mode))
28539     {
28540       if (regclass == FP_TOP_SSE_REGS)
28541         return FP_TOP_REG;
28542       else if (regclass == FP_SECOND_SSE_REGS)
28543         return FP_SECOND_REG;
28544       else
28545         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
28546     }
28547
28548   return regclass;
28549 }
28550
28551 static reg_class_t
28552 ix86_secondary_reload (bool in_p, rtx x, reg_class_t rclass,
28553                        enum machine_mode mode,
28554                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
28555 {
28556   /* QImode spills from non-QI registers require
28557      intermediate register on 32bit targets.  */
28558   if (!TARGET_64BIT
28559       && !in_p && mode == QImode
28560       && (rclass == GENERAL_REGS
28561           || rclass == LEGACY_REGS
28562           || rclass == INDEX_REGS))
28563     {
28564       int regno;
28565
28566       if (REG_P (x))
28567         regno = REGNO (x);
28568       else
28569         regno = -1;
28570
28571       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
28572         regno = true_regnum (x);
28573
28574       /* Return Q_REGS if the operand is in memory.  */
28575       if (regno == -1)
28576         return Q_REGS;
28577     }
28578
28579   /* This condition handles corner case where an expression involving
28580      pointers gets vectorized.  We're trying to use the address of a
28581      stack slot as a vector initializer.  
28582
28583      (set (reg:V2DI 74 [ vect_cst_.2 ])
28584           (vec_duplicate:V2DI (reg/f:DI 20 frame)))
28585
28586      Eventually frame gets turned into sp+offset like this:
28587
28588      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28589           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
28590                                        (const_int 392 [0x188]))))
28591
28592      That later gets turned into:
28593
28594      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28595           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
28596             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))))
28597
28598      We'll have the following reload recorded:
28599
28600      Reload 0: reload_in (DI) =
28601            (plus:DI (reg/f:DI 7 sp)
28602             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))
28603      reload_out (V2DI) = (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28604      SSE_REGS, RELOAD_OTHER (opnum = 0), can't combine
28605      reload_in_reg: (plus:DI (reg/f:DI 7 sp) (const_int 392 [0x188]))
28606      reload_out_reg: (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28607      reload_reg_rtx: (reg:V2DI 22 xmm1)
28608
28609      Which isn't going to work since SSE instructions can't handle scalar
28610      additions.  Returning GENERAL_REGS forces the addition into integer
28611      register and reload can handle subsequent reloads without problems.  */
28612
28613   if (in_p && GET_CODE (x) == PLUS
28614       && SSE_CLASS_P (rclass)
28615       && SCALAR_INT_MODE_P (mode))
28616     return GENERAL_REGS;
28617
28618   return NO_REGS;
28619 }
28620
28621 /* Implement TARGET_CLASS_LIKELY_SPILLED_P.  */
28622
28623 static bool
28624 ix86_class_likely_spilled_p (reg_class_t rclass)
28625 {
28626   switch (rclass)
28627     {
28628       case AREG:
28629       case DREG:
28630       case CREG:
28631       case BREG:
28632       case AD_REGS:
28633       case SIREG:
28634       case DIREG:
28635       case SSE_FIRST_REG:
28636       case FP_TOP_REG:
28637       case FP_SECOND_REG:
28638         return true;
28639
28640       default:
28641         break;
28642     }
28643
28644   return false;
28645 }
28646
28647 /* If we are copying between general and FP registers, we need a memory
28648    location. The same is true for SSE and MMX registers.
28649
28650    To optimize register_move_cost performance, allow inline variant.
28651
28652    The macro can't work reliably when one of the CLASSES is class containing
28653    registers from multiple units (SSE, MMX, integer).  We avoid this by never
28654    combining those units in single alternative in the machine description.
28655    Ensure that this constraint holds to avoid unexpected surprises.
28656
28657    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
28658    enforce these sanity checks.  */
28659
28660 static inline bool
28661 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
28662                                 enum machine_mode mode, int strict)
28663 {
28664   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
28665       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
28666       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
28667       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
28668       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
28669       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
28670     {
28671       gcc_assert (!strict);
28672       return true;
28673     }
28674
28675   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
28676     return true;
28677
28678   /* ??? This is a lie.  We do have moves between mmx/general, and for
28679      mmx/sse2.  But by saying we need secondary memory we discourage the
28680      register allocator from using the mmx registers unless needed.  */
28681   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
28682     return true;
28683
28684   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
28685     {
28686       /* SSE1 doesn't have any direct moves from other classes.  */
28687       if (!TARGET_SSE2)
28688         return true;
28689
28690       /* If the target says that inter-unit moves are more expensive
28691          than moving through memory, then don't generate them.  */
28692       if (!TARGET_INTER_UNIT_MOVES)
28693         return true;
28694
28695       /* Between SSE and general, we have moves no larger than word size.  */
28696       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
28697         return true;
28698     }
28699
28700   return false;
28701 }
28702
28703 bool
28704 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
28705                               enum machine_mode mode, int strict)
28706 {
28707   return inline_secondary_memory_needed (class1, class2, mode, strict);
28708 }
28709
28710 /* Return true if the registers in CLASS cannot represent the change from
28711    modes FROM to TO.  */
28712
28713 bool
28714 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
28715                                enum reg_class regclass)
28716 {
28717   if (from == to)
28718     return false;
28719
28720   /* x87 registers can't do subreg at all, as all values are reformatted
28721      to extended precision.  */
28722   if (MAYBE_FLOAT_CLASS_P (regclass))
28723     return true;
28724
28725   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
28726     {
28727       /* Vector registers do not support QI or HImode loads.  If we don't
28728          disallow a change to these modes, reload will assume it's ok to
28729          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
28730          the vec_dupv4hi pattern.  */
28731       if (GET_MODE_SIZE (from) < 4)
28732         return true;
28733
28734       /* Vector registers do not support subreg with nonzero offsets, which
28735          are otherwise valid for integer registers.  Since we can't see
28736          whether we have a nonzero offset from here, prohibit all
28737          nonparadoxical subregs changing size.  */
28738       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
28739         return true;
28740     }
28741
28742   return false;
28743 }
28744
28745 /* Return the cost of moving data of mode M between a
28746    register and memory.  A value of 2 is the default; this cost is
28747    relative to those in `REGISTER_MOVE_COST'.
28748
28749    This function is used extensively by register_move_cost that is used to
28750    build tables at startup.  Make it inline in this case.
28751    When IN is 2, return maximum of in and out move cost.
28752
28753    If moving between registers and memory is more expensive than
28754    between two registers, you should define this macro to express the
28755    relative cost.
28756
28757    Model also increased moving costs of QImode registers in non
28758    Q_REGS classes.
28759  */
28760 static inline int
28761 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
28762                          int in)
28763 {
28764   int cost;
28765   if (FLOAT_CLASS_P (regclass))
28766     {
28767       int index;
28768       switch (mode)
28769         {
28770           case SFmode:
28771             index = 0;
28772             break;
28773           case DFmode:
28774             index = 1;
28775             break;
28776           case XFmode:
28777             index = 2;
28778             break;
28779           default:
28780             return 100;
28781         }
28782       if (in == 2)
28783         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
28784       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
28785     }
28786   if (SSE_CLASS_P (regclass))
28787     {
28788       int index;
28789       switch (GET_MODE_SIZE (mode))
28790         {
28791           case 4:
28792             index = 0;
28793             break;
28794           case 8:
28795             index = 1;
28796             break;
28797           case 16:
28798             index = 2;
28799             break;
28800           default:
28801             return 100;
28802         }
28803       if (in == 2)
28804         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
28805       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
28806     }
28807   if (MMX_CLASS_P (regclass))
28808     {
28809       int index;
28810       switch (GET_MODE_SIZE (mode))
28811         {
28812           case 4:
28813             index = 0;
28814             break;
28815           case 8:
28816             index = 1;
28817             break;
28818           default:
28819             return 100;
28820         }
28821       if (in)
28822         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
28823       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
28824     }
28825   switch (GET_MODE_SIZE (mode))
28826     {
28827       case 1:
28828         if (Q_CLASS_P (regclass) || TARGET_64BIT)
28829           {
28830             if (!in)
28831               return ix86_cost->int_store[0];
28832             if (TARGET_PARTIAL_REG_DEPENDENCY
28833                 && optimize_function_for_speed_p (cfun))
28834               cost = ix86_cost->movzbl_load;
28835             else
28836               cost = ix86_cost->int_load[0];
28837             if (in == 2)
28838               return MAX (cost, ix86_cost->int_store[0]);
28839             return cost;
28840           }
28841         else
28842           {
28843            if (in == 2)
28844              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
28845            if (in)
28846              return ix86_cost->movzbl_load;
28847            else
28848              return ix86_cost->int_store[0] + 4;
28849           }
28850         break;
28851       case 2:
28852         if (in == 2)
28853           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
28854         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
28855       default:
28856         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
28857         if (mode == TFmode)
28858           mode = XFmode;
28859         if (in == 2)
28860           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
28861         else if (in)
28862           cost = ix86_cost->int_load[2];
28863         else
28864           cost = ix86_cost->int_store[2];
28865         return (cost * (((int) GET_MODE_SIZE (mode)
28866                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
28867     }
28868 }
28869
28870 static int
28871 ix86_memory_move_cost (enum machine_mode mode, reg_class_t regclass,
28872                        bool in)
28873 {
28874   return inline_memory_move_cost (mode, (enum reg_class) regclass, in ? 1 : 0);
28875 }
28876
28877
28878 /* Return the cost of moving data from a register in class CLASS1 to
28879    one in class CLASS2.
28880
28881    It is not required that the cost always equal 2 when FROM is the same as TO;
28882    on some machines it is expensive to move between registers if they are not
28883    general registers.  */
28884
28885 static int
28886 ix86_register_move_cost (enum machine_mode mode, reg_class_t class1_i,
28887                          reg_class_t class2_i)
28888 {
28889   enum reg_class class1 = (enum reg_class) class1_i;
28890   enum reg_class class2 = (enum reg_class) class2_i;
28891
28892   /* In case we require secondary memory, compute cost of the store followed
28893      by load.  In order to avoid bad register allocation choices, we need
28894      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
28895
28896   if (inline_secondary_memory_needed (class1, class2, mode, 0))
28897     {
28898       int cost = 1;
28899
28900       cost += inline_memory_move_cost (mode, class1, 2);
28901       cost += inline_memory_move_cost (mode, class2, 2);
28902
28903       /* In case of copying from general_purpose_register we may emit multiple
28904          stores followed by single load causing memory size mismatch stall.
28905          Count this as arbitrarily high cost of 20.  */
28906       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
28907         cost += 20;
28908
28909       /* In the case of FP/MMX moves, the registers actually overlap, and we
28910          have to switch modes in order to treat them differently.  */
28911       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
28912           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
28913         cost += 20;
28914
28915       return cost;
28916     }
28917
28918   /* Moves between SSE/MMX and integer unit are expensive.  */
28919   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
28920       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
28921
28922     /* ??? By keeping returned value relatively high, we limit the number
28923        of moves between integer and MMX/SSE registers for all targets.
28924        Additionally, high value prevents problem with x86_modes_tieable_p(),
28925        where integer modes in MMX/SSE registers are not tieable
28926        because of missing QImode and HImode moves to, from or between
28927        MMX/SSE registers.  */
28928     return MAX (8, ix86_cost->mmxsse_to_integer);
28929
28930   if (MAYBE_FLOAT_CLASS_P (class1))
28931     return ix86_cost->fp_move;
28932   if (MAYBE_SSE_CLASS_P (class1))
28933     return ix86_cost->sse_move;
28934   if (MAYBE_MMX_CLASS_P (class1))
28935     return ix86_cost->mmx_move;
28936   return 2;
28937 }
28938
28939 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
28940
28941 bool
28942 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
28943 {
28944   /* Flags and only flags can only hold CCmode values.  */
28945   if (CC_REGNO_P (regno))
28946     return GET_MODE_CLASS (mode) == MODE_CC;
28947   if (GET_MODE_CLASS (mode) == MODE_CC
28948       || GET_MODE_CLASS (mode) == MODE_RANDOM
28949       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
28950     return 0;
28951   if (FP_REGNO_P (regno))
28952     return VALID_FP_MODE_P (mode);
28953   if (SSE_REGNO_P (regno))
28954     {
28955       /* We implement the move patterns for all vector modes into and
28956          out of SSE registers, even when no operation instructions
28957          are available.  OImode move is available only when AVX is
28958          enabled.  */
28959       return ((TARGET_AVX && mode == OImode)
28960               || VALID_AVX256_REG_MODE (mode)
28961               || VALID_SSE_REG_MODE (mode)
28962               || VALID_SSE2_REG_MODE (mode)
28963               || VALID_MMX_REG_MODE (mode)
28964               || VALID_MMX_REG_MODE_3DNOW (mode));
28965     }
28966   if (MMX_REGNO_P (regno))
28967     {
28968       /* We implement the move patterns for 3DNOW modes even in MMX mode,
28969          so if the register is available at all, then we can move data of
28970          the given mode into or out of it.  */
28971       return (VALID_MMX_REG_MODE (mode)
28972               || VALID_MMX_REG_MODE_3DNOW (mode));
28973     }
28974
28975   if (mode == QImode)
28976     {
28977       /* Take care for QImode values - they can be in non-QI regs,
28978          but then they do cause partial register stalls.  */
28979       if (regno <= BX_REG || TARGET_64BIT)
28980         return 1;
28981       if (!TARGET_PARTIAL_REG_STALL)
28982         return 1;
28983       return reload_in_progress || reload_completed;
28984     }
28985   /* We handle both integer and floats in the general purpose registers.  */
28986   else if (VALID_INT_MODE_P (mode))
28987     return 1;
28988   else if (VALID_FP_MODE_P (mode))
28989     return 1;
28990   else if (VALID_DFP_MODE_P (mode))
28991     return 1;
28992   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
28993      on to use that value in smaller contexts, this can easily force a
28994      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
28995      supporting DImode, allow it.  */
28996   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
28997     return 1;
28998
28999   return 0;
29000 }
29001
29002 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
29003    tieable integer mode.  */
29004
29005 static bool
29006 ix86_tieable_integer_mode_p (enum machine_mode mode)
29007 {
29008   switch (mode)
29009     {
29010     case HImode:
29011     case SImode:
29012       return true;
29013
29014     case QImode:
29015       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
29016
29017     case DImode:
29018       return TARGET_64BIT;
29019
29020     default:
29021       return false;
29022     }
29023 }
29024
29025 /* Return true if MODE1 is accessible in a register that can hold MODE2
29026    without copying.  That is, all register classes that can hold MODE2
29027    can also hold MODE1.  */
29028
29029 bool
29030 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
29031 {
29032   if (mode1 == mode2)
29033     return true;
29034
29035   if (ix86_tieable_integer_mode_p (mode1)
29036       && ix86_tieable_integer_mode_p (mode2))
29037     return true;
29038
29039   /* MODE2 being XFmode implies fp stack or general regs, which means we
29040      can tie any smaller floating point modes to it.  Note that we do not
29041      tie this with TFmode.  */
29042   if (mode2 == XFmode)
29043     return mode1 == SFmode || mode1 == DFmode;
29044
29045   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
29046      that we can tie it with SFmode.  */
29047   if (mode2 == DFmode)
29048     return mode1 == SFmode;
29049
29050   /* If MODE2 is only appropriate for an SSE register, then tie with
29051      any other mode acceptable to SSE registers.  */
29052   if (GET_MODE_SIZE (mode2) == 16
29053       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
29054     return (GET_MODE_SIZE (mode1) == 16
29055             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
29056
29057   /* If MODE2 is appropriate for an MMX register, then tie
29058      with any other mode acceptable to MMX registers.  */
29059   if (GET_MODE_SIZE (mode2) == 8
29060       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
29061     return (GET_MODE_SIZE (mode1) == 8
29062             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
29063
29064   return false;
29065 }
29066
29067 /* Compute a (partial) cost for rtx X.  Return true if the complete
29068    cost has been computed, and false if subexpressions should be
29069    scanned.  In either case, *TOTAL contains the cost result.  */
29070
29071 static bool
29072 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
29073 {
29074   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
29075   enum machine_mode mode = GET_MODE (x);
29076   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
29077
29078   switch (code)
29079     {
29080     case CONST_INT:
29081     case CONST:
29082     case LABEL_REF:
29083     case SYMBOL_REF:
29084       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
29085         *total = 3;
29086       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
29087         *total = 2;
29088       else if (flag_pic && SYMBOLIC_CONST (x)
29089                && (!TARGET_64BIT
29090                    || (!GET_CODE (x) != LABEL_REF
29091                        && (GET_CODE (x) != SYMBOL_REF
29092                            || !SYMBOL_REF_LOCAL_P (x)))))
29093         *total = 1;
29094       else
29095         *total = 0;
29096       return true;
29097
29098     case CONST_DOUBLE:
29099       if (mode == VOIDmode)
29100         *total = 0;
29101       else
29102         switch (standard_80387_constant_p (x))
29103           {
29104           case 1: /* 0.0 */
29105             *total = 1;
29106             break;
29107           default: /* Other constants */
29108             *total = 2;
29109             break;
29110           case 0:
29111           case -1:
29112             /* Start with (MEM (SYMBOL_REF)), since that's where
29113                it'll probably end up.  Add a penalty for size.  */
29114             *total = (COSTS_N_INSNS (1)
29115                       + (flag_pic != 0 && !TARGET_64BIT)
29116                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
29117             break;
29118           }
29119       return true;
29120
29121     case ZERO_EXTEND:
29122       /* The zero extensions is often completely free on x86_64, so make
29123          it as cheap as possible.  */
29124       if (TARGET_64BIT && mode == DImode
29125           && GET_MODE (XEXP (x, 0)) == SImode)
29126         *total = 1;
29127       else if (TARGET_ZERO_EXTEND_WITH_AND)
29128         *total = cost->add;
29129       else
29130         *total = cost->movzx;
29131       return false;
29132
29133     case SIGN_EXTEND:
29134       *total = cost->movsx;
29135       return false;
29136
29137     case ASHIFT:
29138       if (CONST_INT_P (XEXP (x, 1))
29139           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
29140         {
29141           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
29142           if (value == 1)
29143             {
29144               *total = cost->add;
29145               return false;
29146             }
29147           if ((value == 2 || value == 3)
29148               && cost->lea <= cost->shift_const)
29149             {
29150               *total = cost->lea;
29151               return false;
29152             }
29153         }
29154       /* FALLTHRU */
29155
29156     case ROTATE:
29157     case ASHIFTRT:
29158     case LSHIFTRT:
29159     case ROTATERT:
29160       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
29161         {
29162           if (CONST_INT_P (XEXP (x, 1)))
29163             {
29164               if (INTVAL (XEXP (x, 1)) > 32)
29165                 *total = cost->shift_const + COSTS_N_INSNS (2);
29166               else
29167                 *total = cost->shift_const * 2;
29168             }
29169           else
29170             {
29171               if (GET_CODE (XEXP (x, 1)) == AND)
29172                 *total = cost->shift_var * 2;
29173               else
29174                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
29175             }
29176         }
29177       else
29178         {
29179           if (CONST_INT_P (XEXP (x, 1)))
29180             *total = cost->shift_const;
29181           else
29182             *total = cost->shift_var;
29183         }
29184       return false;
29185
29186     case FMA:
29187       {
29188         rtx sub;
29189
29190         gcc_assert (FLOAT_MODE_P (mode));
29191         gcc_assert (TARGET_FMA || TARGET_FMA4);
29192
29193         /* ??? SSE scalar/vector cost should be used here.  */
29194         /* ??? Bald assumption that fma has the same cost as fmul.  */
29195         *total = cost->fmul;
29196         *total += rtx_cost (XEXP (x, 1), FMA, speed);
29197
29198         /* Negate in op0 or op2 is free: FMS, FNMA, FNMS.  */
29199         sub = XEXP (x, 0);
29200         if (GET_CODE (sub) == NEG)
29201           sub = XEXP (x, 0);
29202         *total += rtx_cost (sub, FMA, speed);
29203
29204         sub = XEXP (x, 2);
29205         if (GET_CODE (sub) == NEG)
29206           sub = XEXP (x, 0);
29207         *total += rtx_cost (sub, FMA, speed);
29208         return true;
29209       }
29210
29211     case MULT:
29212       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29213         {
29214           /* ??? SSE scalar cost should be used here.  */
29215           *total = cost->fmul;
29216           return false;
29217         }
29218       else if (X87_FLOAT_MODE_P (mode))
29219         {
29220           *total = cost->fmul;
29221           return false;
29222         }
29223       else if (FLOAT_MODE_P (mode))
29224         {
29225           /* ??? SSE vector cost should be used here.  */
29226           *total = cost->fmul;
29227           return false;
29228         }
29229       else
29230         {
29231           rtx op0 = XEXP (x, 0);
29232           rtx op1 = XEXP (x, 1);
29233           int nbits;
29234           if (CONST_INT_P (XEXP (x, 1)))
29235             {
29236               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
29237               for (nbits = 0; value != 0; value &= value - 1)
29238                 nbits++;
29239             }
29240           else
29241             /* This is arbitrary.  */
29242             nbits = 7;
29243
29244           /* Compute costs correctly for widening multiplication.  */
29245           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
29246               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
29247                  == GET_MODE_SIZE (mode))
29248             {
29249               int is_mulwiden = 0;
29250               enum machine_mode inner_mode = GET_MODE (op0);
29251
29252               if (GET_CODE (op0) == GET_CODE (op1))
29253                 is_mulwiden = 1, op1 = XEXP (op1, 0);
29254               else if (CONST_INT_P (op1))
29255                 {
29256                   if (GET_CODE (op0) == SIGN_EXTEND)
29257                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
29258                                   == INTVAL (op1);
29259                   else
29260                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
29261                 }
29262
29263               if (is_mulwiden)
29264                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
29265             }
29266
29267           *total = (cost->mult_init[MODE_INDEX (mode)]
29268                     + nbits * cost->mult_bit
29269                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
29270
29271           return true;
29272         }
29273
29274     case DIV:
29275     case UDIV:
29276     case MOD:
29277     case UMOD:
29278       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29279         /* ??? SSE cost should be used here.  */
29280         *total = cost->fdiv;
29281       else if (X87_FLOAT_MODE_P (mode))
29282         *total = cost->fdiv;
29283       else if (FLOAT_MODE_P (mode))
29284         /* ??? SSE vector cost should be used here.  */
29285         *total = cost->fdiv;
29286       else
29287         *total = cost->divide[MODE_INDEX (mode)];
29288       return false;
29289
29290     case PLUS:
29291       if (GET_MODE_CLASS (mode) == MODE_INT
29292                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
29293         {
29294           if (GET_CODE (XEXP (x, 0)) == PLUS
29295               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
29296               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
29297               && CONSTANT_P (XEXP (x, 1)))
29298             {
29299               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
29300               if (val == 2 || val == 4 || val == 8)
29301                 {
29302                   *total = cost->lea;
29303                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
29304                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
29305                                       outer_code, speed);
29306                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29307                   return true;
29308                 }
29309             }
29310           else if (GET_CODE (XEXP (x, 0)) == MULT
29311                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
29312             {
29313               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
29314               if (val == 2 || val == 4 || val == 8)
29315                 {
29316                   *total = cost->lea;
29317                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
29318                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29319                   return true;
29320                 }
29321             }
29322           else if (GET_CODE (XEXP (x, 0)) == PLUS)
29323             {
29324               *total = cost->lea;
29325               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
29326               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
29327               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29328               return true;
29329             }
29330         }
29331       /* FALLTHRU */
29332
29333     case MINUS:
29334       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29335         {
29336           /* ??? SSE cost should be used here.  */
29337           *total = cost->fadd;
29338           return false;
29339         }
29340       else if (X87_FLOAT_MODE_P (mode))
29341         {
29342           *total = cost->fadd;
29343           return false;
29344         }
29345       else if (FLOAT_MODE_P (mode))
29346         {
29347           /* ??? SSE vector cost should be used here.  */
29348           *total = cost->fadd;
29349           return false;
29350         }
29351       /* FALLTHRU */
29352
29353     case AND:
29354     case IOR:
29355     case XOR:
29356       if (!TARGET_64BIT && mode == DImode)
29357         {
29358           *total = (cost->add * 2
29359                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
29360                        << (GET_MODE (XEXP (x, 0)) != DImode))
29361                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
29362                        << (GET_MODE (XEXP (x, 1)) != DImode)));
29363           return true;
29364         }
29365       /* FALLTHRU */
29366
29367     case NEG:
29368       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29369         {
29370           /* ??? SSE cost should be used here.  */
29371           *total = cost->fchs;
29372           return false;
29373         }
29374       else if (X87_FLOAT_MODE_P (mode))
29375         {
29376           *total = cost->fchs;
29377           return false;
29378         }
29379       else if (FLOAT_MODE_P (mode))
29380         {
29381           /* ??? SSE vector cost should be used here.  */
29382           *total = cost->fchs;
29383           return false;
29384         }
29385       /* FALLTHRU */
29386
29387     case NOT:
29388       if (!TARGET_64BIT && mode == DImode)
29389         *total = cost->add * 2;
29390       else
29391         *total = cost->add;
29392       return false;
29393
29394     case COMPARE:
29395       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
29396           && XEXP (XEXP (x, 0), 1) == const1_rtx
29397           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
29398           && XEXP (x, 1) == const0_rtx)
29399         {
29400           /* This kind of construct is implemented using test[bwl].
29401              Treat it as if we had an AND.  */
29402           *total = (cost->add
29403                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
29404                     + rtx_cost (const1_rtx, outer_code, speed));
29405           return true;
29406         }
29407       return false;
29408
29409     case FLOAT_EXTEND:
29410       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
29411         *total = 0;
29412       return false;
29413
29414     case ABS:
29415       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29416         /* ??? SSE cost should be used here.  */
29417         *total = cost->fabs;
29418       else if (X87_FLOAT_MODE_P (mode))
29419         *total = cost->fabs;
29420       else if (FLOAT_MODE_P (mode))
29421         /* ??? SSE vector cost should be used here.  */
29422         *total = cost->fabs;
29423       return false;
29424
29425     case SQRT:
29426       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29427         /* ??? SSE cost should be used here.  */
29428         *total = cost->fsqrt;
29429       else if (X87_FLOAT_MODE_P (mode))
29430         *total = cost->fsqrt;
29431       else if (FLOAT_MODE_P (mode))
29432         /* ??? SSE vector cost should be used here.  */
29433         *total = cost->fsqrt;
29434       return false;
29435
29436     case UNSPEC:
29437       if (XINT (x, 1) == UNSPEC_TP)
29438         *total = 0;
29439       return false;
29440
29441     case VEC_SELECT:
29442     case VEC_CONCAT:
29443     case VEC_MERGE:
29444     case VEC_DUPLICATE:
29445       /* ??? Assume all of these vector manipulation patterns are
29446          recognizable.  In which case they all pretty much have the
29447          same cost.  */
29448      *total = COSTS_N_INSNS (1);
29449      return true;
29450
29451     default:
29452       return false;
29453     }
29454 }
29455
29456 #if TARGET_MACHO
29457
29458 static int current_machopic_label_num;
29459
29460 /* Given a symbol name and its associated stub, write out the
29461    definition of the stub.  */
29462
29463 void
29464 machopic_output_stub (FILE *file, const char *symb, const char *stub)
29465 {
29466   unsigned int length;
29467   char *binder_name, *symbol_name, lazy_ptr_name[32];
29468   int label = ++current_machopic_label_num;
29469
29470   /* For 64-bit we shouldn't get here.  */
29471   gcc_assert (!TARGET_64BIT);
29472
29473   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
29474   symb = targetm.strip_name_encoding (symb);
29475
29476   length = strlen (stub);
29477   binder_name = XALLOCAVEC (char, length + 32);
29478   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
29479
29480   length = strlen (symb);
29481   symbol_name = XALLOCAVEC (char, length + 32);
29482   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
29483
29484   sprintf (lazy_ptr_name, "L%d$lz", label);
29485
29486   if (MACHOPIC_ATT_STUB)
29487     switch_to_section (darwin_sections[machopic_picsymbol_stub3_section]);
29488   else if (MACHOPIC_PURE)
29489     {
29490       if (TARGET_DEEP_BRANCH_PREDICTION)
29491         switch_to_section (darwin_sections[machopic_picsymbol_stub2_section]);
29492       else
29493     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
29494     }
29495   else
29496     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
29497
29498   fprintf (file, "%s:\n", stub);
29499   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
29500
29501   if (MACHOPIC_ATT_STUB)
29502     {
29503       fprintf (file, "\thlt ; hlt ; hlt ; hlt ; hlt\n");
29504     }
29505   else if (MACHOPIC_PURE)
29506     {
29507       /* PIC stub.  */
29508       if (TARGET_DEEP_BRANCH_PREDICTION)
29509         {
29510           /* 25-byte PIC stub using "CALL get_pc_thunk".  */
29511           rtx tmp = gen_rtx_REG (SImode, 2 /* ECX */);
29512           output_set_got (tmp, NULL_RTX);       /* "CALL ___<cpu>.get_pc_thunk.cx".  */
29513           fprintf (file, "LPC$%d:\tmovl\t%s-LPC$%d(%%ecx),%%ecx\n", label, lazy_ptr_name, label);
29514         }
29515       else
29516         {
29517           /* 26-byte PIC stub using inline picbase: "CALL L42 ! L42: pop %eax".  */
29518           fprintf (file, "\tcall LPC$%d\nLPC$%d:\tpopl %%ecx\n", label, label);
29519           fprintf (file, "\tmovl %s-LPC$%d(%%ecx),%%ecx\n", lazy_ptr_name, label);
29520         }
29521       fprintf (file, "\tjmp\t*%%ecx\n");
29522     }
29523   else
29524     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
29525
29526   /* The AT&T-style ("self-modifying") stub is not lazily bound, thus
29527      it needs no stub-binding-helper.  */
29528   if (MACHOPIC_ATT_STUB)
29529     return;
29530
29531   fprintf (file, "%s:\n", binder_name);
29532
29533   if (MACHOPIC_PURE)
29534     {
29535       fprintf (file, "\tlea\t%s-%s(%%ecx),%%ecx\n", lazy_ptr_name, binder_name);
29536       fprintf (file, "\tpushl\t%%ecx\n");
29537     }
29538   else
29539     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
29540
29541   fputs ("\tjmp\tdyld_stub_binding_helper\n", file);
29542
29543   /* N.B. Keep the correspondence of these
29544      'symbol_ptr/symbol_ptr2/symbol_ptr3' sections consistent with the
29545      old-pic/new-pic/non-pic stubs; altering this will break
29546      compatibility with existing dylibs.  */
29547   if (MACHOPIC_PURE)
29548     {
29549       /* PIC stubs.  */
29550       if (TARGET_DEEP_BRANCH_PREDICTION)
29551         /* 25-byte PIC stub using "CALL get_pc_thunk".  */
29552         switch_to_section (darwin_sections[machopic_lazy_symbol_ptr2_section]);
29553       else
29554         /* 26-byte PIC stub using inline picbase: "CALL L42 ! L42: pop %ebx".  */
29555   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
29556     }
29557   else
29558     /* 16-byte -mdynamic-no-pic stub.  */
29559     switch_to_section(darwin_sections[machopic_lazy_symbol_ptr3_section]);
29560
29561   fprintf (file, "%s:\n", lazy_ptr_name);
29562   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
29563   fprintf (file, ASM_LONG "%s\n", binder_name);
29564 }
29565 #endif /* TARGET_MACHO */
29566
29567 /* Order the registers for register allocator.  */
29568
29569 void
29570 x86_order_regs_for_local_alloc (void)
29571 {
29572    int pos = 0;
29573    int i;
29574
29575    /* First allocate the local general purpose registers.  */
29576    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
29577      if (GENERAL_REGNO_P (i) && call_used_regs[i])
29578         reg_alloc_order [pos++] = i;
29579
29580    /* Global general purpose registers.  */
29581    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
29582      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
29583         reg_alloc_order [pos++] = i;
29584
29585    /* x87 registers come first in case we are doing FP math
29586       using them.  */
29587    if (!TARGET_SSE_MATH)
29588      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
29589        reg_alloc_order [pos++] = i;
29590
29591    /* SSE registers.  */
29592    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
29593      reg_alloc_order [pos++] = i;
29594    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
29595      reg_alloc_order [pos++] = i;
29596
29597    /* x87 registers.  */
29598    if (TARGET_SSE_MATH)
29599      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
29600        reg_alloc_order [pos++] = i;
29601
29602    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
29603      reg_alloc_order [pos++] = i;
29604
29605    /* Initialize the rest of array as we do not allocate some registers
29606       at all.  */
29607    while (pos < FIRST_PSEUDO_REGISTER)
29608      reg_alloc_order [pos++] = 0;
29609 }
29610
29611 /* Handle a "callee_pop_aggregate_return" attribute; arguments as
29612    in struct attribute_spec handler.  */
29613 static tree
29614 ix86_handle_callee_pop_aggregate_return (tree *node, tree name,
29615                                               tree args,
29616                                               int flags ATTRIBUTE_UNUSED,
29617                                               bool *no_add_attrs)
29618 {
29619   if (TREE_CODE (*node) != FUNCTION_TYPE
29620       && TREE_CODE (*node) != METHOD_TYPE
29621       && TREE_CODE (*node) != FIELD_DECL
29622       && TREE_CODE (*node) != TYPE_DECL)
29623     {
29624       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29625                name);
29626       *no_add_attrs = true;
29627       return NULL_TREE;
29628     }
29629   if (TARGET_64BIT)
29630     {
29631       warning (OPT_Wattributes, "%qE attribute only available for 32-bit",
29632                name);
29633       *no_add_attrs = true;
29634       return NULL_TREE;
29635     }
29636   if (is_attribute_p ("callee_pop_aggregate_return", name))
29637     {
29638       tree cst;
29639
29640       cst = TREE_VALUE (args);
29641       if (TREE_CODE (cst) != INTEGER_CST)
29642         {
29643           warning (OPT_Wattributes,
29644                    "%qE attribute requires an integer constant argument",
29645                    name);
29646           *no_add_attrs = true;
29647         }
29648       else if (compare_tree_int (cst, 0) != 0
29649                && compare_tree_int (cst, 1) != 0)
29650         {
29651           warning (OPT_Wattributes,
29652                    "argument to %qE attribute is neither zero, nor one",
29653                    name);
29654           *no_add_attrs = true;
29655         }
29656
29657       return NULL_TREE;
29658     }
29659
29660   return NULL_TREE;
29661 }
29662
29663 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
29664    struct attribute_spec.handler.  */
29665 static tree
29666 ix86_handle_abi_attribute (tree *node, tree name,
29667                               tree args ATTRIBUTE_UNUSED,
29668                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29669 {
29670   if (TREE_CODE (*node) != FUNCTION_TYPE
29671       && TREE_CODE (*node) != METHOD_TYPE
29672       && TREE_CODE (*node) != FIELD_DECL
29673       && TREE_CODE (*node) != TYPE_DECL)
29674     {
29675       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29676                name);
29677       *no_add_attrs = true;
29678       return NULL_TREE;
29679     }
29680   if (!TARGET_64BIT)
29681     {
29682       warning (OPT_Wattributes, "%qE attribute only available for 64-bit",
29683                name);
29684       *no_add_attrs = true;
29685       return NULL_TREE;
29686     }
29687
29688   /* Can combine regparm with all attributes but fastcall.  */
29689   if (is_attribute_p ("ms_abi", name))
29690     {
29691       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
29692         {
29693           error ("ms_abi and sysv_abi attributes are not compatible");
29694         }
29695
29696       return NULL_TREE;
29697     }
29698   else if (is_attribute_p ("sysv_abi", name))
29699     {
29700       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
29701         {
29702           error ("ms_abi and sysv_abi attributes are not compatible");
29703         }
29704
29705       return NULL_TREE;
29706     }
29707
29708   return NULL_TREE;
29709 }
29710
29711 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
29712    struct attribute_spec.handler.  */
29713 static tree
29714 ix86_handle_struct_attribute (tree *node, tree name,
29715                               tree args ATTRIBUTE_UNUSED,
29716                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29717 {
29718   tree *type = NULL;
29719   if (DECL_P (*node))
29720     {
29721       if (TREE_CODE (*node) == TYPE_DECL)
29722         type = &TREE_TYPE (*node);
29723     }
29724   else
29725     type = node;
29726
29727   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
29728                  || TREE_CODE (*type) == UNION_TYPE)))
29729     {
29730       warning (OPT_Wattributes, "%qE attribute ignored",
29731                name);
29732       *no_add_attrs = true;
29733     }
29734
29735   else if ((is_attribute_p ("ms_struct", name)
29736             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
29737            || ((is_attribute_p ("gcc_struct", name)
29738                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
29739     {
29740       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
29741                name);
29742       *no_add_attrs = true;
29743     }
29744
29745   return NULL_TREE;
29746 }
29747
29748 static tree
29749 ix86_handle_fndecl_attribute (tree *node, tree name,
29750                               tree args ATTRIBUTE_UNUSED,
29751                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29752 {
29753   if (TREE_CODE (*node) != FUNCTION_DECL)
29754     {
29755       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29756                name);
29757       *no_add_attrs = true;
29758     }
29759   return NULL_TREE;
29760 }
29761
29762 static bool
29763 ix86_ms_bitfield_layout_p (const_tree record_type)
29764 {
29765   return ((TARGET_MS_BITFIELD_LAYOUT
29766            && !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
29767           || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type)));
29768 }
29769
29770 /* Returns an expression indicating where the this parameter is
29771    located on entry to the FUNCTION.  */
29772
29773 static rtx
29774 x86_this_parameter (tree function)
29775 {
29776   tree type = TREE_TYPE (function);
29777   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
29778   int nregs;
29779
29780   if (TARGET_64BIT)
29781     {
29782       const int *parm_regs;
29783
29784       if (ix86_function_type_abi (type) == MS_ABI)
29785         parm_regs = x86_64_ms_abi_int_parameter_registers;
29786       else
29787         parm_regs = x86_64_int_parameter_registers;
29788       return gen_rtx_REG (DImode, parm_regs[aggr]);
29789     }
29790
29791   nregs = ix86_function_regparm (type, function);
29792
29793   if (nregs > 0 && !stdarg_p (type))
29794     {
29795       int regno;
29796       unsigned int ccvt = ix86_get_callcvt (type);
29797
29798       if ((ccvt & IX86_CALLCVT_FASTCALL) != 0)
29799         regno = aggr ? DX_REG : CX_REG;
29800       else if ((ccvt & IX86_CALLCVT_THISCALL) != 0)
29801         {
29802           regno = CX_REG;
29803           if (aggr)
29804             return gen_rtx_MEM (SImode,
29805                                 plus_constant (stack_pointer_rtx, 4));
29806         }
29807       else
29808         {
29809           regno = AX_REG;
29810           if (aggr)
29811             {
29812               regno = DX_REG;
29813               if (nregs == 1)
29814                 return gen_rtx_MEM (SImode,
29815                                     plus_constant (stack_pointer_rtx, 4));
29816             }
29817         }
29818       return gen_rtx_REG (SImode, regno);
29819     }
29820
29821   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
29822 }
29823
29824 /* Determine whether x86_output_mi_thunk can succeed.  */
29825
29826 static bool
29827 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
29828                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
29829                          HOST_WIDE_INT vcall_offset, const_tree function)
29830 {
29831   /* 64-bit can handle anything.  */
29832   if (TARGET_64BIT)
29833     return true;
29834
29835   /* For 32-bit, everything's fine if we have one free register.  */
29836   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
29837     return true;
29838
29839   /* Need a free register for vcall_offset.  */
29840   if (vcall_offset)
29841     return false;
29842
29843   /* Need a free register for GOT references.  */
29844   if (flag_pic && !targetm.binds_local_p (function))
29845     return false;
29846
29847   /* Otherwise ok.  */
29848   return true;
29849 }
29850
29851 /* Output the assembler code for a thunk function.  THUNK_DECL is the
29852    declaration for the thunk function itself, FUNCTION is the decl for
29853    the target function.  DELTA is an immediate constant offset to be
29854    added to THIS.  If VCALL_OFFSET is nonzero, the word at
29855    *(*this + vcall_offset) should be added to THIS.  */
29856
29857 static void
29858 x86_output_mi_thunk (FILE *file,
29859                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
29860                      HOST_WIDE_INT vcall_offset, tree function)
29861 {
29862   rtx xops[3];
29863   rtx this_param = x86_this_parameter (function);
29864   rtx this_reg, tmp;
29865
29866   /* Make sure unwind info is emitted for the thunk if needed.  */
29867   final_start_function (emit_barrier (), file, 1);
29868
29869   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
29870      pull it in now and let DELTA benefit.  */
29871   if (REG_P (this_param))
29872     this_reg = this_param;
29873   else if (vcall_offset)
29874     {
29875       /* Put the this parameter into %eax.  */
29876       xops[0] = this_param;
29877       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
29878       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29879     }
29880   else
29881     this_reg = NULL_RTX;
29882
29883   /* Adjust the this parameter by a fixed constant.  */
29884   if (delta)
29885     {
29886       xops[0] = GEN_INT (delta);
29887       xops[1] = this_reg ? this_reg : this_param;
29888       if (TARGET_64BIT)
29889         {
29890           if (!x86_64_general_operand (xops[0], DImode))
29891             {
29892               tmp = gen_rtx_REG (DImode, R10_REG);
29893               xops[1] = tmp;
29894               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
29895               xops[0] = tmp;
29896               xops[1] = this_param;
29897             }
29898           if (x86_maybe_negate_const_int (&xops[0], DImode))
29899             output_asm_insn ("sub{q}\t{%0, %1|%1, %0}", xops);
29900           else
29901             output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
29902         }
29903       else if (x86_maybe_negate_const_int (&xops[0], SImode))
29904         output_asm_insn ("sub{l}\t{%0, %1|%1, %0}", xops);
29905       else
29906         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
29907     }
29908
29909   /* Adjust the this parameter by a value stored in the vtable.  */
29910   if (vcall_offset)
29911     {
29912       if (TARGET_64BIT)
29913         tmp = gen_rtx_REG (DImode, R10_REG);
29914       else
29915         {
29916           int tmp_regno = CX_REG;
29917           unsigned int ccvt = ix86_get_callcvt (TREE_TYPE (function));
29918           if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) != 0)
29919             tmp_regno = AX_REG;
29920           tmp = gen_rtx_REG (SImode, tmp_regno);
29921         }
29922
29923       xops[0] = gen_rtx_MEM (Pmode, this_reg);
29924       xops[1] = tmp;
29925       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29926
29927       /* Adjust the this parameter.  */
29928       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
29929       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
29930         {
29931           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
29932           xops[0] = GEN_INT (vcall_offset);
29933           xops[1] = tmp2;
29934           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
29935           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
29936         }
29937       xops[1] = this_reg;
29938       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
29939     }
29940
29941   /* If necessary, drop THIS back to its stack slot.  */
29942   if (this_reg && this_reg != this_param)
29943     {
29944       xops[0] = this_reg;
29945       xops[1] = this_param;
29946       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29947     }
29948
29949   xops[0] = XEXP (DECL_RTL (function), 0);
29950   if (TARGET_64BIT)
29951     {
29952       if (!flag_pic || targetm.binds_local_p (function)
29953           || DEFAULT_ABI == MS_ABI)
29954         output_asm_insn ("jmp\t%P0", xops);
29955       /* All thunks should be in the same object as their target,
29956          and thus binds_local_p should be true.  */
29957       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
29958         gcc_unreachable ();
29959       else
29960         {
29961           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
29962           tmp = gen_rtx_CONST (Pmode, tmp);
29963           tmp = gen_rtx_MEM (QImode, tmp);
29964           xops[0] = tmp;
29965           output_asm_insn ("jmp\t%A0", xops);
29966         }
29967     }
29968   else
29969     {
29970       if (!flag_pic || targetm.binds_local_p (function))
29971         output_asm_insn ("jmp\t%P0", xops);
29972       else
29973 #if TARGET_MACHO
29974         if (TARGET_MACHO)
29975           {
29976             rtx sym_ref = XEXP (DECL_RTL (function), 0);
29977             if (TARGET_MACHO_BRANCH_ISLANDS)
29978               sym_ref = (gen_rtx_SYMBOL_REF
29979                    (Pmode,
29980                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
29981             tmp = gen_rtx_MEM (QImode, sym_ref);
29982             xops[0] = tmp;
29983             output_asm_insn ("jmp\t%0", xops);
29984           }
29985         else
29986 #endif /* TARGET_MACHO */
29987         {
29988           tmp = gen_rtx_REG (SImode, CX_REG);
29989           output_set_got (tmp, NULL_RTX);
29990
29991           xops[1] = tmp;
29992           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
29993           output_asm_insn ("jmp\t{*}%1", xops);
29994         }
29995     }
29996   final_end_function ();
29997 }
29998
29999 static void
30000 x86_file_start (void)
30001 {
30002   default_file_start ();
30003 #if TARGET_MACHO
30004   darwin_file_start ();
30005 #endif
30006   if (X86_FILE_START_VERSION_DIRECTIVE)
30007     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
30008   if (X86_FILE_START_FLTUSED)
30009     fputs ("\t.global\t__fltused\n", asm_out_file);
30010   if (ix86_asm_dialect == ASM_INTEL)
30011     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
30012 }
30013
30014 int
30015 x86_field_alignment (tree field, int computed)
30016 {
30017   enum machine_mode mode;
30018   tree type = TREE_TYPE (field);
30019
30020   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
30021     return computed;
30022   mode = TYPE_MODE (strip_array_types (type));
30023   if (mode == DFmode || mode == DCmode
30024       || GET_MODE_CLASS (mode) == MODE_INT
30025       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
30026     return MIN (32, computed);
30027   return computed;
30028 }
30029
30030 /* Output assembler code to FILE to increment profiler label # LABELNO
30031    for profiling a function entry.  */
30032 void
30033 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
30034 {
30035   const char *mcount_name = (flag_fentry ? MCOUNT_NAME_BEFORE_PROLOGUE
30036                                          : MCOUNT_NAME);
30037
30038   if (TARGET_64BIT)
30039     {
30040 #ifndef NO_PROFILE_COUNTERS
30041       fprintf (file, "\tleaq\t%sP%d(%%rip),%%r11\n", LPREFIX, labelno);
30042 #endif
30043
30044       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
30045         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", mcount_name);
30046       else
30047         fprintf (file, "\tcall\t%s\n", mcount_name);
30048     }
30049   else if (flag_pic)
30050     {
30051 #ifndef NO_PROFILE_COUNTERS
30052       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%" PROFILE_COUNT_REGISTER "\n",
30053                LPREFIX, labelno);
30054 #endif
30055       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", mcount_name);
30056     }
30057   else
30058     {
30059 #ifndef NO_PROFILE_COUNTERS
30060       fprintf (file, "\tmovl\t$%sP%d,%%" PROFILE_COUNT_REGISTER "\n",
30061                LPREFIX, labelno);
30062 #endif
30063       fprintf (file, "\tcall\t%s\n", mcount_name);
30064     }
30065 }
30066
30067 /* We don't have exact information about the insn sizes, but we may assume
30068    quite safely that we are informed about all 1 byte insns and memory
30069    address sizes.  This is enough to eliminate unnecessary padding in
30070    99% of cases.  */
30071
30072 static int
30073 min_insn_size (rtx insn)
30074 {
30075   int l = 0, len;
30076
30077   if (!INSN_P (insn) || !active_insn_p (insn))
30078     return 0;
30079
30080   /* Discard alignments we've emit and jump instructions.  */
30081   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
30082       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
30083     return 0;
30084   if (JUMP_TABLE_DATA_P (insn))
30085     return 0;
30086
30087   /* Important case - calls are always 5 bytes.
30088      It is common to have many calls in the row.  */
30089   if (CALL_P (insn)
30090       && symbolic_reference_mentioned_p (PATTERN (insn))
30091       && !SIBLING_CALL_P (insn))
30092     return 5;
30093   len = get_attr_length (insn);
30094   if (len <= 1)
30095     return 1;
30096
30097   /* For normal instructions we rely on get_attr_length being exact,
30098      with a few exceptions.  */
30099   if (!JUMP_P (insn))
30100     {
30101       enum attr_type type = get_attr_type (insn);
30102
30103       switch (type)
30104         {
30105         case TYPE_MULTI:
30106           if (GET_CODE (PATTERN (insn)) == ASM_INPUT
30107               || asm_noperands (PATTERN (insn)) >= 0)
30108             return 0;
30109           break;
30110         case TYPE_OTHER:
30111         case TYPE_FCMP:
30112           break;
30113         default:
30114           /* Otherwise trust get_attr_length.  */
30115           return len;
30116         }
30117
30118       l = get_attr_length_address (insn);
30119       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
30120         l = 4;
30121     }
30122   if (l)
30123     return 1+l;
30124   else
30125     return 2;
30126 }
30127
30128 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
30129
30130 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
30131    window.  */
30132
30133 static void
30134 ix86_avoid_jump_mispredicts (void)
30135 {
30136   rtx insn, start = get_insns ();
30137   int nbytes = 0, njumps = 0;
30138   int isjump = 0;
30139
30140   /* Look for all minimal intervals of instructions containing 4 jumps.
30141      The intervals are bounded by START and INSN.  NBYTES is the total
30142      size of instructions in the interval including INSN and not including
30143      START.  When the NBYTES is smaller than 16 bytes, it is possible
30144      that the end of START and INSN ends up in the same 16byte page.
30145
30146      The smallest offset in the page INSN can start is the case where START
30147      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
30148      We add p2align to 16byte window with maxskip 15 - NBYTES + sizeof (INSN).
30149      */
30150   for (insn = start; insn; insn = NEXT_INSN (insn))
30151     {
30152       int min_size;
30153
30154       if (LABEL_P (insn))
30155         {
30156           int align = label_to_alignment (insn);
30157           int max_skip = label_to_max_skip (insn);
30158
30159           if (max_skip > 15)
30160             max_skip = 15;
30161           /* If align > 3, only up to 16 - max_skip - 1 bytes can be
30162              already in the current 16 byte page, because otherwise
30163              ASM_OUTPUT_MAX_SKIP_ALIGN could skip max_skip or fewer
30164              bytes to reach 16 byte boundary.  */
30165           if (align <= 0
30166               || (align <= 3 && max_skip != (1 << align) - 1))
30167             max_skip = 0;
30168           if (dump_file)
30169             fprintf (dump_file, "Label %i with max_skip %i\n",
30170                      INSN_UID (insn), max_skip);
30171           if (max_skip)
30172             {
30173               while (nbytes + max_skip >= 16)
30174                 {
30175                   start = NEXT_INSN (start);
30176                   if ((JUMP_P (start)
30177                        && GET_CODE (PATTERN (start)) != ADDR_VEC
30178                        && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
30179                       || CALL_P (start))
30180                     njumps--, isjump = 1;
30181                   else
30182                     isjump = 0;
30183                   nbytes -= min_insn_size (start);
30184                 }
30185             }
30186           continue;
30187         }
30188
30189       min_size = min_insn_size (insn);
30190       nbytes += min_size;
30191       if (dump_file)
30192         fprintf (dump_file, "Insn %i estimated to %i bytes\n",
30193                  INSN_UID (insn), min_size);
30194       if ((JUMP_P (insn)
30195            && GET_CODE (PATTERN (insn)) != ADDR_VEC
30196            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
30197           || CALL_P (insn))
30198         njumps++;
30199       else
30200         continue;
30201
30202       while (njumps > 3)
30203         {
30204           start = NEXT_INSN (start);
30205           if ((JUMP_P (start)
30206                && GET_CODE (PATTERN (start)) != ADDR_VEC
30207                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
30208               || CALL_P (start))
30209             njumps--, isjump = 1;
30210           else
30211             isjump = 0;
30212           nbytes -= min_insn_size (start);
30213         }
30214       gcc_assert (njumps >= 0);
30215       if (dump_file)
30216         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
30217                  INSN_UID (start), INSN_UID (insn), nbytes);
30218
30219       if (njumps == 3 && isjump && nbytes < 16)
30220         {
30221           int padsize = 15 - nbytes + min_insn_size (insn);
30222
30223           if (dump_file)
30224             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
30225                      INSN_UID (insn), padsize);
30226           emit_insn_before (gen_pad (GEN_INT (padsize)), insn);
30227         }
30228     }
30229 }
30230 #endif
30231
30232 /* AMD Athlon works faster
30233    when RET is not destination of conditional jump or directly preceded
30234    by other jump instruction.  We avoid the penalty by inserting NOP just
30235    before the RET instructions in such cases.  */
30236 static void
30237 ix86_pad_returns (void)
30238 {
30239   edge e;
30240   edge_iterator ei;
30241
30242   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
30243     {
30244       basic_block bb = e->src;
30245       rtx ret = BB_END (bb);
30246       rtx prev;
30247       bool replace = false;
30248
30249       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
30250           || optimize_bb_for_size_p (bb))
30251         continue;
30252       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
30253         if (active_insn_p (prev) || LABEL_P (prev))
30254           break;
30255       if (prev && LABEL_P (prev))
30256         {
30257           edge e;
30258           edge_iterator ei;
30259
30260           FOR_EACH_EDGE (e, ei, bb->preds)
30261             if (EDGE_FREQUENCY (e) && e->src->index >= 0
30262                 && !(e->flags & EDGE_FALLTHRU))
30263               replace = true;
30264         }
30265       if (!replace)
30266         {
30267           prev = prev_active_insn (ret);
30268           if (prev
30269               && ((JUMP_P (prev) && any_condjump_p (prev))
30270                   || CALL_P (prev)))
30271             replace = true;
30272           /* Empty functions get branch mispredict even when
30273              the jump destination is not visible to us.  */
30274           if (!prev && !optimize_function_for_size_p (cfun))
30275             replace = true;
30276         }
30277       if (replace)
30278         {
30279           emit_jump_insn_before (gen_return_internal_long (), ret);
30280           delete_insn (ret);
30281         }
30282     }
30283 }
30284
30285 /* Count the minimum number of instructions in BB.  Return 4 if the
30286    number of instructions >= 4.  */
30287
30288 static int 
30289 ix86_count_insn_bb (basic_block bb)
30290 {
30291   rtx insn;
30292   int insn_count = 0;
30293
30294   /* Count number of instructions in this block.  Return 4 if the number
30295      of instructions >= 4.  */
30296   FOR_BB_INSNS (bb, insn)
30297     {
30298       /* Only happen in exit blocks.  */
30299       if (JUMP_P (insn)
30300           && GET_CODE (PATTERN (insn)) == RETURN)
30301         break;
30302
30303       if (NONDEBUG_INSN_P (insn)
30304           && GET_CODE (PATTERN (insn)) != USE
30305           && GET_CODE (PATTERN (insn)) != CLOBBER)
30306         {
30307           insn_count++;
30308           if (insn_count >= 4)
30309             return insn_count;
30310         }
30311     }
30312
30313   return insn_count;
30314 }
30315
30316
30317 /* Count the minimum number of instructions in code path in BB.  
30318    Return 4 if the number of instructions >= 4.  */
30319
30320 static int 
30321 ix86_count_insn (basic_block bb)
30322 {
30323   edge e;
30324   edge_iterator ei;
30325   int min_prev_count;
30326
30327   /* Only bother counting instructions along paths with no
30328      more than 2 basic blocks between entry and exit.  Given
30329      that BB has an edge to exit, determine if a predecessor
30330      of BB has an edge from entry.  If so, compute the number
30331      of instructions in the predecessor block.  If there
30332      happen to be multiple such blocks, compute the minimum.  */
30333   min_prev_count = 4;
30334   FOR_EACH_EDGE (e, ei, bb->preds)
30335     {
30336       edge prev_e;
30337       edge_iterator prev_ei;
30338
30339       if (e->src == ENTRY_BLOCK_PTR)
30340         {
30341           min_prev_count = 0;
30342           break;
30343         }
30344       FOR_EACH_EDGE (prev_e, prev_ei, e->src->preds)
30345         {
30346           if (prev_e->src == ENTRY_BLOCK_PTR)
30347             {
30348               int count = ix86_count_insn_bb (e->src);
30349               if (count < min_prev_count)
30350                 min_prev_count = count;
30351               break;
30352             }
30353         }
30354     }
30355
30356   if (min_prev_count < 4)
30357     min_prev_count += ix86_count_insn_bb (bb);
30358
30359   return min_prev_count;
30360 }
30361
30362 /* Pad short funtion to 4 instructions.   */
30363
30364 static void
30365 ix86_pad_short_function (void)
30366 {
30367   edge e;
30368   edge_iterator ei;
30369
30370   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
30371     {
30372       rtx ret = BB_END (e->src);
30373       if (JUMP_P (ret) && GET_CODE (PATTERN (ret)) == RETURN)
30374         {
30375           int insn_count = ix86_count_insn (e->src);
30376
30377           /* Pad short function.  */
30378           if (insn_count < 4)
30379             {
30380               rtx insn = ret;
30381
30382               /* Find epilogue.  */
30383               while (insn
30384                      && (!NOTE_P (insn)
30385                          || NOTE_KIND (insn) != NOTE_INSN_EPILOGUE_BEG))
30386                 insn = PREV_INSN (insn);
30387
30388               if (!insn)
30389                 insn = ret;
30390
30391               /* Two NOPs count as one instruction.  */
30392               insn_count = 2 * (4 - insn_count);
30393               emit_insn_before (gen_nops (GEN_INT (insn_count)), insn);
30394             }
30395         }
30396     }
30397 }
30398
30399 /* Implement machine specific optimizations.  We implement padding of returns
30400    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
30401 static void
30402 ix86_reorg (void)
30403 {
30404   /* We are freeing block_for_insn in the toplev to keep compatibility
30405      with old MDEP_REORGS that are not CFG based.  Recompute it now.  */
30406   compute_bb_for_insn ();
30407
30408   /* Run the vzeroupper optimization if needed.  */
30409   if (TARGET_VZEROUPPER)
30410     move_or_delete_vzeroupper ();
30411
30412   if (optimize && optimize_function_for_speed_p (cfun))
30413     {
30414       if (TARGET_PAD_SHORT_FUNCTION)
30415         ix86_pad_short_function ();
30416       else if (TARGET_PAD_RETURNS)
30417         ix86_pad_returns ();
30418 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
30419       if (TARGET_FOUR_JUMP_LIMIT)
30420         ix86_avoid_jump_mispredicts ();
30421 #endif
30422     }
30423 }
30424
30425 /* Return nonzero when QImode register that must be represented via REX prefix
30426    is used.  */
30427 bool
30428 x86_extended_QIreg_mentioned_p (rtx insn)
30429 {
30430   int i;
30431   extract_insn_cached (insn);
30432   for (i = 0; i < recog_data.n_operands; i++)
30433     if (REG_P (recog_data.operand[i])
30434         && REGNO (recog_data.operand[i]) > BX_REG)
30435        return true;
30436   return false;
30437 }
30438
30439 /* Return nonzero when P points to register encoded via REX prefix.
30440    Called via for_each_rtx.  */
30441 static int
30442 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
30443 {
30444    unsigned int regno;
30445    if (!REG_P (*p))
30446      return 0;
30447    regno = REGNO (*p);
30448    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
30449 }
30450
30451 /* Return true when INSN mentions register that must be encoded using REX
30452    prefix.  */
30453 bool
30454 x86_extended_reg_mentioned_p (rtx insn)
30455 {
30456   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
30457                        extended_reg_mentioned_1, NULL);
30458 }
30459
30460 /* If profitable, negate (without causing overflow) integer constant
30461    of mode MODE at location LOC.  Return true in this case.  */
30462 bool
30463 x86_maybe_negate_const_int (rtx *loc, enum machine_mode mode)
30464 {
30465   HOST_WIDE_INT val;
30466
30467   if (!CONST_INT_P (*loc))
30468     return false;
30469
30470   switch (mode)
30471     {
30472     case DImode:
30473       /* DImode x86_64 constants must fit in 32 bits.  */
30474       gcc_assert (x86_64_immediate_operand (*loc, mode));
30475
30476       mode = SImode;
30477       break;
30478
30479     case SImode:
30480     case HImode:
30481     case QImode:
30482       break;
30483
30484     default:
30485       gcc_unreachable ();
30486     }
30487
30488   /* Avoid overflows.  */
30489   if (mode_signbit_p (mode, *loc))
30490     return false;
30491
30492   val = INTVAL (*loc);
30493
30494   /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
30495      Exceptions: -128 encodes smaller than 128, so swap sign and op.  */
30496   if ((val < 0 && val != -128)
30497       || val == 128)
30498     {
30499       *loc = GEN_INT (-val);
30500       return true;
30501     }
30502
30503   return false;
30504 }
30505
30506 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
30507    optabs would emit if we didn't have TFmode patterns.  */
30508
30509 void
30510 x86_emit_floatuns (rtx operands[2])
30511 {
30512   rtx neglab, donelab, i0, i1, f0, in, out;
30513   enum machine_mode mode, inmode;
30514
30515   inmode = GET_MODE (operands[1]);
30516   gcc_assert (inmode == SImode || inmode == DImode);
30517
30518   out = operands[0];
30519   in = force_reg (inmode, operands[1]);
30520   mode = GET_MODE (out);
30521   neglab = gen_label_rtx ();
30522   donelab = gen_label_rtx ();
30523   f0 = gen_reg_rtx (mode);
30524
30525   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
30526
30527   expand_float (out, in, 0);
30528
30529   emit_jump_insn (gen_jump (donelab));
30530   emit_barrier ();
30531
30532   emit_label (neglab);
30533
30534   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
30535                             1, OPTAB_DIRECT);
30536   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
30537                             1, OPTAB_DIRECT);
30538   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
30539
30540   expand_float (f0, i0, 0);
30541
30542   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
30543
30544   emit_label (donelab);
30545 }
30546 \f
30547 /* AVX does not support 32-byte integer vector operations,
30548    thus the longest vector we are faced with is V16QImode.  */
30549 #define MAX_VECT_LEN    16
30550
30551 struct expand_vec_perm_d
30552 {
30553   rtx target, op0, op1;
30554   unsigned char perm[MAX_VECT_LEN];
30555   enum machine_mode vmode;
30556   unsigned char nelt;
30557   bool testing_p;
30558 };
30559
30560 static bool expand_vec_perm_1 (struct expand_vec_perm_d *d);
30561 static bool expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d);
30562
30563 /* Get a vector mode of the same size as the original but with elements
30564    twice as wide.  This is only guaranteed to apply to integral vectors.  */
30565
30566 static inline enum machine_mode
30567 get_mode_wider_vector (enum machine_mode o)
30568 {
30569   /* ??? Rely on the ordering that genmodes.c gives to vectors.  */
30570   enum machine_mode n = GET_MODE_WIDER_MODE (o);
30571   gcc_assert (GET_MODE_NUNITS (o) == GET_MODE_NUNITS (n) * 2);
30572   gcc_assert (GET_MODE_SIZE (o) == GET_MODE_SIZE (n));
30573   return n;
30574 }
30575
30576 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30577    with all elements equal to VAR.  Return true if successful.  */
30578
30579 static bool
30580 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
30581                                    rtx target, rtx val)
30582 {
30583   bool ok;
30584
30585   switch (mode)
30586     {
30587     case V2SImode:
30588     case V2SFmode:
30589       if (!mmx_ok)
30590         return false;
30591       /* FALLTHRU */
30592
30593     case V4DFmode:
30594     case V4DImode:
30595     case V8SFmode:
30596     case V8SImode:
30597     case V2DFmode:
30598     case V2DImode:
30599     case V4SFmode:
30600     case V4SImode:
30601       {
30602         rtx insn, dup;
30603
30604         /* First attempt to recognize VAL as-is.  */
30605         dup = gen_rtx_VEC_DUPLICATE (mode, val);
30606         insn = emit_insn (gen_rtx_SET (VOIDmode, target, dup));
30607         if (recog_memoized (insn) < 0)
30608           {
30609             rtx seq;
30610             /* If that fails, force VAL into a register.  */
30611
30612             start_sequence ();
30613             XEXP (dup, 0) = force_reg (GET_MODE_INNER (mode), val);
30614             seq = get_insns ();
30615             end_sequence ();
30616             if (seq)
30617               emit_insn_before (seq, insn);
30618
30619             ok = recog_memoized (insn) >= 0;
30620             gcc_assert (ok);
30621           }
30622       }
30623       return true;
30624
30625     case V4HImode:
30626       if (!mmx_ok)
30627         return false;
30628       if (TARGET_SSE || TARGET_3DNOW_A)
30629         {
30630           rtx x;
30631
30632           val = gen_lowpart (SImode, val);
30633           x = gen_rtx_TRUNCATE (HImode, val);
30634           x = gen_rtx_VEC_DUPLICATE (mode, x);
30635           emit_insn (gen_rtx_SET (VOIDmode, target, x));
30636           return true;
30637         }
30638       goto widen;
30639
30640     case V8QImode:
30641       if (!mmx_ok)
30642         return false;
30643       goto widen;
30644
30645     case V8HImode:
30646       if (TARGET_SSE2)
30647         {
30648           struct expand_vec_perm_d dperm;
30649           rtx tmp1, tmp2;
30650
30651         permute:
30652           memset (&dperm, 0, sizeof (dperm));
30653           dperm.target = target;
30654           dperm.vmode = mode;
30655           dperm.nelt = GET_MODE_NUNITS (mode);
30656           dperm.op0 = dperm.op1 = gen_reg_rtx (mode);
30657
30658           /* Extend to SImode using a paradoxical SUBREG.  */
30659           tmp1 = gen_reg_rtx (SImode);
30660           emit_move_insn (tmp1, gen_lowpart (SImode, val));
30661
30662           /* Insert the SImode value as low element of a V4SImode vector. */
30663           tmp2 = gen_lowpart (V4SImode, dperm.op0);
30664           emit_insn (gen_vec_setv4si_0 (tmp2, CONST0_RTX (V4SImode), tmp1));
30665
30666           ok = (expand_vec_perm_1 (&dperm)
30667                 || expand_vec_perm_broadcast_1 (&dperm));
30668           gcc_assert (ok);
30669           return ok;
30670         }
30671       goto widen;
30672
30673     case V16QImode:
30674       if (TARGET_SSE2)
30675         goto permute;
30676       goto widen;
30677
30678     widen:
30679       /* Replicate the value once into the next wider mode and recurse.  */
30680       {
30681         enum machine_mode smode, wsmode, wvmode;
30682         rtx x;
30683
30684         smode = GET_MODE_INNER (mode);
30685         wvmode = get_mode_wider_vector (mode);
30686         wsmode = GET_MODE_INNER (wvmode);
30687
30688         val = convert_modes (wsmode, smode, val, true);
30689         x = expand_simple_binop (wsmode, ASHIFT, val,
30690                                  GEN_INT (GET_MODE_BITSIZE (smode)),
30691                                  NULL_RTX, 1, OPTAB_LIB_WIDEN);
30692         val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
30693
30694         x = gen_lowpart (wvmode, target);
30695         ok = ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val);
30696         gcc_assert (ok);
30697         return ok;
30698       }
30699
30700     case V16HImode:
30701     case V32QImode:
30702       {
30703         enum machine_mode hvmode = (mode == V16HImode ? V8HImode : V16QImode);
30704         rtx x = gen_reg_rtx (hvmode);
30705
30706         ok = ix86_expand_vector_init_duplicate (false, hvmode, x, val);
30707         gcc_assert (ok);
30708
30709         x = gen_rtx_VEC_CONCAT (mode, x, x);
30710         emit_insn (gen_rtx_SET (VOIDmode, target, x));
30711       }
30712       return true;
30713
30714     default:
30715       return false;
30716     }
30717 }
30718
30719 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30720    whose ONE_VAR element is VAR, and other elements are zero.  Return true
30721    if successful.  */
30722
30723 static bool
30724 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
30725                                      rtx target, rtx var, int one_var)
30726 {
30727   enum machine_mode vsimode;
30728   rtx new_target;
30729   rtx x, tmp;
30730   bool use_vector_set = false;
30731
30732   switch (mode)
30733     {
30734     case V2DImode:
30735       /* For SSE4.1, we normally use vector set.  But if the second
30736          element is zero and inter-unit moves are OK, we use movq
30737          instead.  */
30738       use_vector_set = (TARGET_64BIT
30739                         && TARGET_SSE4_1
30740                         && !(TARGET_INTER_UNIT_MOVES
30741                              && one_var == 0));
30742       break;
30743     case V16QImode:
30744     case V4SImode:
30745     case V4SFmode:
30746       use_vector_set = TARGET_SSE4_1;
30747       break;
30748     case V8HImode:
30749       use_vector_set = TARGET_SSE2;
30750       break;
30751     case V4HImode:
30752       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
30753       break;
30754     case V32QImode:
30755     case V16HImode:
30756     case V8SImode:
30757     case V8SFmode:
30758     case V4DFmode:
30759       use_vector_set = TARGET_AVX;
30760       break;
30761     case V4DImode:
30762       /* Use ix86_expand_vector_set in 64bit mode only.  */
30763       use_vector_set = TARGET_AVX && TARGET_64BIT;
30764       break;
30765     default:
30766       break;
30767     }
30768
30769   if (use_vector_set)
30770     {
30771       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
30772       var = force_reg (GET_MODE_INNER (mode), var);
30773       ix86_expand_vector_set (mmx_ok, target, var, one_var);
30774       return true;
30775     }
30776
30777   switch (mode)
30778     {
30779     case V2SFmode:
30780     case V2SImode:
30781       if (!mmx_ok)
30782         return false;
30783       /* FALLTHRU */
30784
30785     case V2DFmode:
30786     case V2DImode:
30787       if (one_var != 0)
30788         return false;
30789       var = force_reg (GET_MODE_INNER (mode), var);
30790       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
30791       emit_insn (gen_rtx_SET (VOIDmode, target, x));
30792       return true;
30793
30794     case V4SFmode:
30795     case V4SImode:
30796       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
30797         new_target = gen_reg_rtx (mode);
30798       else
30799         new_target = target;
30800       var = force_reg (GET_MODE_INNER (mode), var);
30801       x = gen_rtx_VEC_DUPLICATE (mode, var);
30802       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
30803       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
30804       if (one_var != 0)
30805         {
30806           /* We need to shuffle the value to the correct position, so
30807              create a new pseudo to store the intermediate result.  */
30808
30809           /* With SSE2, we can use the integer shuffle insns.  */
30810           if (mode != V4SFmode && TARGET_SSE2)
30811             {
30812               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
30813                                             const1_rtx,
30814                                             GEN_INT (one_var == 1 ? 0 : 1),
30815                                             GEN_INT (one_var == 2 ? 0 : 1),
30816                                             GEN_INT (one_var == 3 ? 0 : 1)));
30817               if (target != new_target)
30818                 emit_move_insn (target, new_target);
30819               return true;
30820             }
30821
30822           /* Otherwise convert the intermediate result to V4SFmode and
30823              use the SSE1 shuffle instructions.  */
30824           if (mode != V4SFmode)
30825             {
30826               tmp = gen_reg_rtx (V4SFmode);
30827               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
30828             }
30829           else
30830             tmp = new_target;
30831
30832           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
30833                                        const1_rtx,
30834                                        GEN_INT (one_var == 1 ? 0 : 1),
30835                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
30836                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
30837
30838           if (mode != V4SFmode)
30839             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
30840           else if (tmp != target)
30841             emit_move_insn (target, tmp);
30842         }
30843       else if (target != new_target)
30844         emit_move_insn (target, new_target);
30845       return true;
30846
30847     case V8HImode:
30848     case V16QImode:
30849       vsimode = V4SImode;
30850       goto widen;
30851     case V4HImode:
30852     case V8QImode:
30853       if (!mmx_ok)
30854         return false;
30855       vsimode = V2SImode;
30856       goto widen;
30857     widen:
30858       if (one_var != 0)
30859         return false;
30860
30861       /* Zero extend the variable element to SImode and recurse.  */
30862       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
30863
30864       x = gen_reg_rtx (vsimode);
30865       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
30866                                                 var, one_var))
30867         gcc_unreachable ();
30868
30869       emit_move_insn (target, gen_lowpart (mode, x));
30870       return true;
30871
30872     default:
30873       return false;
30874     }
30875 }
30876
30877 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30878    consisting of the values in VALS.  It is known that all elements
30879    except ONE_VAR are constants.  Return true if successful.  */
30880
30881 static bool
30882 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
30883                                  rtx target, rtx vals, int one_var)
30884 {
30885   rtx var = XVECEXP (vals, 0, one_var);
30886   enum machine_mode wmode;
30887   rtx const_vec, x;
30888
30889   const_vec = copy_rtx (vals);
30890   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
30891   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
30892
30893   switch (mode)
30894     {
30895     case V2DFmode:
30896     case V2DImode:
30897     case V2SFmode:
30898     case V2SImode:
30899       /* For the two element vectors, it's just as easy to use
30900          the general case.  */
30901       return false;
30902
30903     case V4DImode:
30904       /* Use ix86_expand_vector_set in 64bit mode only.  */
30905       if (!TARGET_64BIT)
30906         return false;
30907     case V4DFmode:
30908     case V8SFmode:
30909     case V8SImode:
30910     case V16HImode:
30911     case V32QImode:
30912     case V4SFmode:
30913     case V4SImode:
30914     case V8HImode:
30915     case V4HImode:
30916       break;
30917
30918     case V16QImode:
30919       if (TARGET_SSE4_1)
30920         break;
30921       wmode = V8HImode;
30922       goto widen;
30923     case V8QImode:
30924       wmode = V4HImode;
30925       goto widen;
30926     widen:
30927       /* There's no way to set one QImode entry easily.  Combine
30928          the variable value with its adjacent constant value, and
30929          promote to an HImode set.  */
30930       x = XVECEXP (vals, 0, one_var ^ 1);
30931       if (one_var & 1)
30932         {
30933           var = convert_modes (HImode, QImode, var, true);
30934           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
30935                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
30936           x = GEN_INT (INTVAL (x) & 0xff);
30937         }
30938       else
30939         {
30940           var = convert_modes (HImode, QImode, var, true);
30941           x = gen_int_mode (INTVAL (x) << 8, HImode);
30942         }
30943       if (x != const0_rtx)
30944         var = expand_simple_binop (HImode, IOR, var, x, var,
30945                                    1, OPTAB_LIB_WIDEN);
30946
30947       x = gen_reg_rtx (wmode);
30948       emit_move_insn (x, gen_lowpart (wmode, const_vec));
30949       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
30950
30951       emit_move_insn (target, gen_lowpart (mode, x));
30952       return true;
30953
30954     default:
30955       return false;
30956     }
30957
30958   emit_move_insn (target, const_vec);
30959   ix86_expand_vector_set (mmx_ok, target, var, one_var);
30960   return true;
30961 }
30962
30963 /* A subroutine of ix86_expand_vector_init_general.  Use vector
30964    concatenate to handle the most general case: all values variable,
30965    and none identical.  */
30966
30967 static void
30968 ix86_expand_vector_init_concat (enum machine_mode mode,
30969                                 rtx target, rtx *ops, int n)
30970 {
30971   enum machine_mode cmode, hmode = VOIDmode;
30972   rtx first[8], second[4];
30973   rtvec v;
30974   int i, j;
30975
30976   switch (n)
30977     {
30978     case 2:
30979       switch (mode)
30980         {
30981         case V8SImode:
30982           cmode = V4SImode;
30983           break;
30984         case V8SFmode:
30985           cmode = V4SFmode;
30986           break;
30987         case V4DImode:
30988           cmode = V2DImode;
30989           break;
30990         case V4DFmode:
30991           cmode = V2DFmode;
30992           break;
30993         case V4SImode:
30994           cmode = V2SImode;
30995           break;
30996         case V4SFmode:
30997           cmode = V2SFmode;
30998           break;
30999         case V2DImode:
31000           cmode = DImode;
31001           break;
31002         case V2SImode:
31003           cmode = SImode;
31004           break;
31005         case V2DFmode:
31006           cmode = DFmode;
31007           break;
31008         case V2SFmode:
31009           cmode = SFmode;
31010           break;
31011         default:
31012           gcc_unreachable ();
31013         }
31014
31015       if (!register_operand (ops[1], cmode))
31016         ops[1] = force_reg (cmode, ops[1]);
31017       if (!register_operand (ops[0], cmode))
31018         ops[0] = force_reg (cmode, ops[0]);
31019       emit_insn (gen_rtx_SET (VOIDmode, target,
31020                               gen_rtx_VEC_CONCAT (mode, ops[0],
31021                                                   ops[1])));
31022       break;
31023
31024     case 4:
31025       switch (mode)
31026         {
31027         case V4DImode:
31028           cmode = V2DImode;
31029           break;
31030         case V4DFmode:
31031           cmode = V2DFmode;
31032           break;
31033         case V4SImode:
31034           cmode = V2SImode;
31035           break;
31036         case V4SFmode:
31037           cmode = V2SFmode;
31038           break;
31039         default:
31040           gcc_unreachable ();
31041         }
31042       goto half;
31043
31044     case 8:
31045       switch (mode)
31046         {
31047         case V8SImode:
31048           cmode = V2SImode;
31049           hmode = V4SImode;
31050           break;
31051         case V8SFmode:
31052           cmode = V2SFmode;
31053           hmode = V4SFmode;
31054           break;
31055         default:
31056           gcc_unreachable ();
31057         }
31058       goto half;
31059
31060 half:
31061       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
31062       i = n - 1;
31063       j = (n >> 1) - 1;
31064       for (; i > 0; i -= 2, j--)
31065         {
31066           first[j] = gen_reg_rtx (cmode);
31067           v = gen_rtvec (2, ops[i - 1], ops[i]);
31068           ix86_expand_vector_init (false, first[j],
31069                                    gen_rtx_PARALLEL (cmode, v));
31070         }
31071
31072       n >>= 1;
31073       if (n > 2)
31074         {
31075           gcc_assert (hmode != VOIDmode);
31076           for (i = j = 0; i < n; i += 2, j++)
31077             {
31078               second[j] = gen_reg_rtx (hmode);
31079               ix86_expand_vector_init_concat (hmode, second [j],
31080                                               &first [i], 2);
31081             }
31082           n >>= 1;
31083           ix86_expand_vector_init_concat (mode, target, second, n);
31084         }
31085       else
31086         ix86_expand_vector_init_concat (mode, target, first, n);
31087       break;
31088
31089     default:
31090       gcc_unreachable ();
31091     }
31092 }
31093
31094 /* A subroutine of ix86_expand_vector_init_general.  Use vector
31095    interleave to handle the most general case: all values variable,
31096    and none identical.  */
31097
31098 static void
31099 ix86_expand_vector_init_interleave (enum machine_mode mode,
31100                                     rtx target, rtx *ops, int n)
31101 {
31102   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
31103   int i, j;
31104   rtx op0, op1;
31105   rtx (*gen_load_even) (rtx, rtx, rtx);
31106   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
31107   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
31108
31109   switch (mode)
31110     {
31111     case V8HImode:
31112       gen_load_even = gen_vec_setv8hi;
31113       gen_interleave_first_low = gen_vec_interleave_lowv4si;
31114       gen_interleave_second_low = gen_vec_interleave_lowv2di;
31115       inner_mode = HImode;
31116       first_imode = V4SImode;
31117       second_imode = V2DImode;
31118       third_imode = VOIDmode;
31119       break;
31120     case V16QImode:
31121       gen_load_even = gen_vec_setv16qi;
31122       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
31123       gen_interleave_second_low = gen_vec_interleave_lowv4si;
31124       inner_mode = QImode;
31125       first_imode = V8HImode;
31126       second_imode = V4SImode;
31127       third_imode = V2DImode;
31128       break;
31129     default:
31130       gcc_unreachable ();
31131     }
31132
31133   for (i = 0; i < n; i++)
31134     {
31135       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
31136       op0 = gen_reg_rtx (SImode);
31137       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
31138
31139       /* Insert the SImode value as low element of V4SImode vector. */
31140       op1 = gen_reg_rtx (V4SImode);
31141       op0 = gen_rtx_VEC_MERGE (V4SImode,
31142                                gen_rtx_VEC_DUPLICATE (V4SImode,
31143                                                       op0),
31144                                CONST0_RTX (V4SImode),
31145                                const1_rtx);
31146       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
31147
31148       /* Cast the V4SImode vector back to a vector in orignal mode.  */
31149       op0 = gen_reg_rtx (mode);
31150       emit_move_insn (op0, gen_lowpart (mode, op1));
31151
31152       /* Load even elements into the second positon.  */
31153       emit_insn (gen_load_even (op0,
31154                                 force_reg (inner_mode,
31155                                            ops [i + i + 1]),
31156                                 const1_rtx));
31157
31158       /* Cast vector to FIRST_IMODE vector.  */
31159       ops[i] = gen_reg_rtx (first_imode);
31160       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
31161     }
31162
31163   /* Interleave low FIRST_IMODE vectors.  */
31164   for (i = j = 0; i < n; i += 2, j++)
31165     {
31166       op0 = gen_reg_rtx (first_imode);
31167       emit_insn (gen_interleave_first_low (op0, ops[i], ops[i + 1]));
31168
31169       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
31170       ops[j] = gen_reg_rtx (second_imode);
31171       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
31172     }
31173
31174   /* Interleave low SECOND_IMODE vectors.  */
31175   switch (second_imode)
31176     {
31177     case V4SImode:
31178       for (i = j = 0; i < n / 2; i += 2, j++)
31179         {
31180           op0 = gen_reg_rtx (second_imode);
31181           emit_insn (gen_interleave_second_low (op0, ops[i],
31182                                                 ops[i + 1]));
31183
31184           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
31185              vector.  */
31186           ops[j] = gen_reg_rtx (third_imode);
31187           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
31188         }
31189       second_imode = V2DImode;
31190       gen_interleave_second_low = gen_vec_interleave_lowv2di;
31191       /* FALLTHRU */
31192
31193     case V2DImode:
31194       op0 = gen_reg_rtx (second_imode);
31195       emit_insn (gen_interleave_second_low (op0, ops[0],
31196                                             ops[1]));
31197
31198       /* Cast the SECOND_IMODE vector back to a vector on original
31199          mode.  */
31200       emit_insn (gen_rtx_SET (VOIDmode, target,
31201                               gen_lowpart (mode, op0)));
31202       break;
31203
31204     default:
31205       gcc_unreachable ();
31206     }
31207 }
31208
31209 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
31210    all values variable, and none identical.  */
31211
31212 static void
31213 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
31214                                  rtx target, rtx vals)
31215 {
31216   rtx ops[32], op0, op1;
31217   enum machine_mode half_mode = VOIDmode;
31218   int n, i;
31219
31220   switch (mode)
31221     {
31222     case V2SFmode:
31223     case V2SImode:
31224       if (!mmx_ok && !TARGET_SSE)
31225         break;
31226       /* FALLTHRU */
31227
31228     case V8SFmode:
31229     case V8SImode:
31230     case V4DFmode:
31231     case V4DImode:
31232     case V4SFmode:
31233     case V4SImode:
31234     case V2DFmode:
31235     case V2DImode:
31236       n = GET_MODE_NUNITS (mode);
31237       for (i = 0; i < n; i++)
31238         ops[i] = XVECEXP (vals, 0, i);
31239       ix86_expand_vector_init_concat (mode, target, ops, n);
31240       return;
31241
31242     case V32QImode:
31243       half_mode = V16QImode;
31244       goto half;
31245
31246     case V16HImode:
31247       half_mode = V8HImode;
31248       goto half;
31249
31250 half:
31251       n = GET_MODE_NUNITS (mode);
31252       for (i = 0; i < n; i++)
31253         ops[i] = XVECEXP (vals, 0, i);
31254       op0 = gen_reg_rtx (half_mode);
31255       op1 = gen_reg_rtx (half_mode);
31256       ix86_expand_vector_init_interleave (half_mode, op0, ops,
31257                                           n >> 2);
31258       ix86_expand_vector_init_interleave (half_mode, op1,
31259                                           &ops [n >> 1], n >> 2);
31260       emit_insn (gen_rtx_SET (VOIDmode, target,
31261                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
31262       return;
31263
31264     case V16QImode:
31265       if (!TARGET_SSE4_1)
31266         break;
31267       /* FALLTHRU */
31268
31269     case V8HImode:
31270       if (!TARGET_SSE2)
31271         break;
31272
31273       /* Don't use ix86_expand_vector_init_interleave if we can't
31274          move from GPR to SSE register directly.  */
31275       if (!TARGET_INTER_UNIT_MOVES)
31276         break;
31277
31278       n = GET_MODE_NUNITS (mode);
31279       for (i = 0; i < n; i++)
31280         ops[i] = XVECEXP (vals, 0, i);
31281       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
31282       return;
31283
31284     case V4HImode:
31285     case V8QImode:
31286       break;
31287
31288     default:
31289       gcc_unreachable ();
31290     }
31291
31292     {
31293       int i, j, n_elts, n_words, n_elt_per_word;
31294       enum machine_mode inner_mode;
31295       rtx words[4], shift;
31296
31297       inner_mode = GET_MODE_INNER (mode);
31298       n_elts = GET_MODE_NUNITS (mode);
31299       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
31300       n_elt_per_word = n_elts / n_words;
31301       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
31302
31303       for (i = 0; i < n_words; ++i)
31304         {
31305           rtx word = NULL_RTX;
31306
31307           for (j = 0; j < n_elt_per_word; ++j)
31308             {
31309               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
31310               elt = convert_modes (word_mode, inner_mode, elt, true);
31311
31312               if (j == 0)
31313                 word = elt;
31314               else
31315                 {
31316                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
31317                                               word, 1, OPTAB_LIB_WIDEN);
31318                   word = expand_simple_binop (word_mode, IOR, word, elt,
31319                                               word, 1, OPTAB_LIB_WIDEN);
31320                 }
31321             }
31322
31323           words[i] = word;
31324         }
31325
31326       if (n_words == 1)
31327         emit_move_insn (target, gen_lowpart (mode, words[0]));
31328       else if (n_words == 2)
31329         {
31330           rtx tmp = gen_reg_rtx (mode);
31331           emit_clobber (tmp);
31332           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
31333           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
31334           emit_move_insn (target, tmp);
31335         }
31336       else if (n_words == 4)
31337         {
31338           rtx tmp = gen_reg_rtx (V4SImode);
31339           gcc_assert (word_mode == SImode);
31340           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
31341           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
31342           emit_move_insn (target, gen_lowpart (mode, tmp));
31343         }
31344       else
31345         gcc_unreachable ();
31346     }
31347 }
31348
31349 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
31350    instructions unless MMX_OK is true.  */
31351
31352 void
31353 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
31354 {
31355   enum machine_mode mode = GET_MODE (target);
31356   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31357   int n_elts = GET_MODE_NUNITS (mode);
31358   int n_var = 0, one_var = -1;
31359   bool all_same = true, all_const_zero = true;
31360   int i;
31361   rtx x;
31362
31363   for (i = 0; i < n_elts; ++i)
31364     {
31365       x = XVECEXP (vals, 0, i);
31366       if (!(CONST_INT_P (x)
31367             || GET_CODE (x) == CONST_DOUBLE
31368             || GET_CODE (x) == CONST_FIXED))
31369         n_var++, one_var = i;
31370       else if (x != CONST0_RTX (inner_mode))
31371         all_const_zero = false;
31372       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
31373         all_same = false;
31374     }
31375
31376   /* Constants are best loaded from the constant pool.  */
31377   if (n_var == 0)
31378     {
31379       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
31380       return;
31381     }
31382
31383   /* If all values are identical, broadcast the value.  */
31384   if (all_same
31385       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
31386                                             XVECEXP (vals, 0, 0)))
31387     return;
31388
31389   /* Values where only one field is non-constant are best loaded from
31390      the pool and overwritten via move later.  */
31391   if (n_var == 1)
31392     {
31393       if (all_const_zero
31394           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
31395                                                   XVECEXP (vals, 0, one_var),
31396                                                   one_var))
31397         return;
31398
31399       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
31400         return;
31401     }
31402
31403   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
31404 }
31405
31406 void
31407 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
31408 {
31409   enum machine_mode mode = GET_MODE (target);
31410   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31411   enum machine_mode half_mode;
31412   bool use_vec_merge = false;
31413   rtx tmp;
31414   static rtx (*gen_extract[6][2]) (rtx, rtx)
31415     = {
31416         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
31417         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
31418         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
31419         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
31420         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
31421         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
31422       };
31423   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
31424     = {
31425         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
31426         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
31427         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
31428         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
31429         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
31430         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
31431       };
31432   int i, j, n;
31433
31434   switch (mode)
31435     {
31436     case V2SFmode:
31437     case V2SImode:
31438       if (mmx_ok)
31439         {
31440           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
31441           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
31442           if (elt == 0)
31443             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
31444           else
31445             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
31446           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31447           return;
31448         }
31449       break;
31450
31451     case V2DImode:
31452       use_vec_merge = TARGET_SSE4_1 && TARGET_64BIT;
31453       if (use_vec_merge)
31454         break;
31455
31456       tmp = gen_reg_rtx (GET_MODE_INNER (mode));
31457       ix86_expand_vector_extract (false, tmp, target, 1 - elt);
31458       if (elt == 0)
31459         tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
31460       else
31461         tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
31462       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31463       return;
31464
31465     case V2DFmode:
31466       {
31467         rtx op0, op1;
31468
31469         /* For the two element vectors, we implement a VEC_CONCAT with
31470            the extraction of the other element.  */
31471
31472         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
31473         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
31474
31475         if (elt == 0)
31476           op0 = val, op1 = tmp;
31477         else
31478           op0 = tmp, op1 = val;
31479
31480         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
31481         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31482       }
31483       return;
31484
31485     case V4SFmode:
31486       use_vec_merge = TARGET_SSE4_1;
31487       if (use_vec_merge)
31488         break;
31489
31490       switch (elt)
31491         {
31492         case 0:
31493           use_vec_merge = true;
31494           break;
31495
31496         case 1:
31497           /* tmp = target = A B C D */
31498           tmp = copy_to_reg (target);
31499           /* target = A A B B */
31500           emit_insn (gen_vec_interleave_lowv4sf (target, target, target));
31501           /* target = X A B B */
31502           ix86_expand_vector_set (false, target, val, 0);
31503           /* target = A X C D  */
31504           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31505                                           const1_rtx, const0_rtx,
31506                                           GEN_INT (2+4), GEN_INT (3+4)));
31507           return;
31508
31509         case 2:
31510           /* tmp = target = A B C D */
31511           tmp = copy_to_reg (target);
31512           /* tmp = X B C D */
31513           ix86_expand_vector_set (false, tmp, val, 0);
31514           /* target = A B X D */
31515           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31516                                           const0_rtx, const1_rtx,
31517                                           GEN_INT (0+4), GEN_INT (3+4)));
31518           return;
31519
31520         case 3:
31521           /* tmp = target = A B C D */
31522           tmp = copy_to_reg (target);
31523           /* tmp = X B C D */
31524           ix86_expand_vector_set (false, tmp, val, 0);
31525           /* target = A B X D */
31526           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31527                                           const0_rtx, const1_rtx,
31528                                           GEN_INT (2+4), GEN_INT (0+4)));
31529           return;
31530
31531         default:
31532           gcc_unreachable ();
31533         }
31534       break;
31535
31536     case V4SImode:
31537       use_vec_merge = TARGET_SSE4_1;
31538       if (use_vec_merge)
31539         break;
31540
31541       /* Element 0 handled by vec_merge below.  */
31542       if (elt == 0)
31543         {
31544           use_vec_merge = true;
31545           break;
31546         }
31547
31548       if (TARGET_SSE2)
31549         {
31550           /* With SSE2, use integer shuffles to swap element 0 and ELT,
31551              store into element 0, then shuffle them back.  */
31552
31553           rtx order[4];
31554
31555           order[0] = GEN_INT (elt);
31556           order[1] = const1_rtx;
31557           order[2] = const2_rtx;
31558           order[3] = GEN_INT (3);
31559           order[elt] = const0_rtx;
31560
31561           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
31562                                         order[1], order[2], order[3]));
31563
31564           ix86_expand_vector_set (false, target, val, 0);
31565
31566           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
31567                                         order[1], order[2], order[3]));
31568         }
31569       else
31570         {
31571           /* For SSE1, we have to reuse the V4SF code.  */
31572           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
31573                                   gen_lowpart (SFmode, val), elt);
31574         }
31575       return;
31576
31577     case V8HImode:
31578       use_vec_merge = TARGET_SSE2;
31579       break;
31580     case V4HImode:
31581       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
31582       break;
31583
31584     case V16QImode:
31585       use_vec_merge = TARGET_SSE4_1;
31586       break;
31587
31588     case V8QImode:
31589       break;
31590
31591     case V32QImode:
31592       half_mode = V16QImode;
31593       j = 0;
31594       n = 16;
31595       goto half;
31596
31597     case V16HImode:
31598       half_mode = V8HImode;
31599       j = 1;
31600       n = 8;
31601       goto half;
31602
31603     case V8SImode:
31604       half_mode = V4SImode;
31605       j = 2;
31606       n = 4;
31607       goto half;
31608
31609     case V4DImode:
31610       half_mode = V2DImode;
31611       j = 3;
31612       n = 2;
31613       goto half;
31614
31615     case V8SFmode:
31616       half_mode = V4SFmode;
31617       j = 4;
31618       n = 4;
31619       goto half;
31620
31621     case V4DFmode:
31622       half_mode = V2DFmode;
31623       j = 5;
31624       n = 2;
31625       goto half;
31626
31627 half:
31628       /* Compute offset.  */
31629       i = elt / n;
31630       elt %= n;
31631
31632       gcc_assert (i <= 1);
31633
31634       /* Extract the half.  */
31635       tmp = gen_reg_rtx (half_mode);
31636       emit_insn (gen_extract[j][i] (tmp, target));
31637
31638       /* Put val in tmp at elt.  */
31639       ix86_expand_vector_set (false, tmp, val, elt);
31640
31641       /* Put it back.  */
31642       emit_insn (gen_insert[j][i] (target, target, tmp));
31643       return;
31644
31645     default:
31646       break;
31647     }
31648
31649   if (use_vec_merge)
31650     {
31651       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
31652       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
31653       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31654     }
31655   else
31656     {
31657       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
31658
31659       emit_move_insn (mem, target);
31660
31661       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
31662       emit_move_insn (tmp, val);
31663
31664       emit_move_insn (target, mem);
31665     }
31666 }
31667
31668 void
31669 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
31670 {
31671   enum machine_mode mode = GET_MODE (vec);
31672   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31673   bool use_vec_extr = false;
31674   rtx tmp;
31675
31676   switch (mode)
31677     {
31678     case V2SImode:
31679     case V2SFmode:
31680       if (!mmx_ok)
31681         break;
31682       /* FALLTHRU */
31683
31684     case V2DFmode:
31685     case V2DImode:
31686       use_vec_extr = true;
31687       break;
31688
31689     case V4SFmode:
31690       use_vec_extr = TARGET_SSE4_1;
31691       if (use_vec_extr)
31692         break;
31693
31694       switch (elt)
31695         {
31696         case 0:
31697           tmp = vec;
31698           break;
31699
31700         case 1:
31701         case 3:
31702           tmp = gen_reg_rtx (mode);
31703           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
31704                                        GEN_INT (elt), GEN_INT (elt),
31705                                        GEN_INT (elt+4), GEN_INT (elt+4)));
31706           break;
31707
31708         case 2:
31709           tmp = gen_reg_rtx (mode);
31710           emit_insn (gen_vec_interleave_highv4sf (tmp, vec, vec));
31711           break;
31712
31713         default:
31714           gcc_unreachable ();
31715         }
31716       vec = tmp;
31717       use_vec_extr = true;
31718       elt = 0;
31719       break;
31720
31721     case V4SImode:
31722       use_vec_extr = TARGET_SSE4_1;
31723       if (use_vec_extr)
31724         break;
31725
31726       if (TARGET_SSE2)
31727         {
31728           switch (elt)
31729             {
31730             case 0:
31731               tmp = vec;
31732               break;
31733
31734             case 1:
31735             case 3:
31736               tmp = gen_reg_rtx (mode);
31737               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
31738                                             GEN_INT (elt), GEN_INT (elt),
31739                                             GEN_INT (elt), GEN_INT (elt)));
31740               break;
31741
31742             case 2:
31743               tmp = gen_reg_rtx (mode);
31744               emit_insn (gen_vec_interleave_highv4si (tmp, vec, vec));
31745               break;
31746
31747             default:
31748               gcc_unreachable ();
31749             }
31750           vec = tmp;
31751           use_vec_extr = true;
31752           elt = 0;
31753         }
31754       else
31755         {
31756           /* For SSE1, we have to reuse the V4SF code.  */
31757           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
31758                                       gen_lowpart (V4SFmode, vec), elt);
31759           return;
31760         }
31761       break;
31762
31763     case V8HImode:
31764       use_vec_extr = TARGET_SSE2;
31765       break;
31766     case V4HImode:
31767       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
31768       break;
31769
31770     case V16QImode:
31771       use_vec_extr = TARGET_SSE4_1;
31772       break;
31773
31774     case V8QImode:
31775       /* ??? Could extract the appropriate HImode element and shift.  */
31776     default:
31777       break;
31778     }
31779
31780   if (use_vec_extr)
31781     {
31782       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
31783       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
31784
31785       /* Let the rtl optimizers know about the zero extension performed.  */
31786       if (inner_mode == QImode || inner_mode == HImode)
31787         {
31788           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
31789           target = gen_lowpart (SImode, target);
31790         }
31791
31792       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31793     }
31794   else
31795     {
31796       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
31797
31798       emit_move_insn (mem, vec);
31799
31800       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
31801       emit_move_insn (target, tmp);
31802     }
31803 }
31804
31805 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
31806    pattern to reduce; DEST is the destination; IN is the input vector.  */
31807
31808 void
31809 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
31810 {
31811   rtx tmp1, tmp2, tmp3;
31812
31813   tmp1 = gen_reg_rtx (V4SFmode);
31814   tmp2 = gen_reg_rtx (V4SFmode);
31815   tmp3 = gen_reg_rtx (V4SFmode);
31816
31817   emit_insn (gen_sse_movhlps (tmp1, in, in));
31818   emit_insn (fn (tmp2, tmp1, in));
31819
31820   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
31821                                   const1_rtx, const1_rtx,
31822                                   GEN_INT (1+4), GEN_INT (1+4)));
31823   emit_insn (fn (dest, tmp2, tmp3));
31824 }
31825 \f
31826 /* Target hook for scalar_mode_supported_p.  */
31827 static bool
31828 ix86_scalar_mode_supported_p (enum machine_mode mode)
31829 {
31830   if (DECIMAL_FLOAT_MODE_P (mode))
31831     return default_decimal_float_supported_p ();
31832   else if (mode == TFmode)
31833     return true;
31834   else
31835     return default_scalar_mode_supported_p (mode);
31836 }
31837
31838 /* Implements target hook vector_mode_supported_p.  */
31839 static bool
31840 ix86_vector_mode_supported_p (enum machine_mode mode)
31841 {
31842   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
31843     return true;
31844   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
31845     return true;
31846   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
31847     return true;
31848   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
31849     return true;
31850   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
31851     return true;
31852   return false;
31853 }
31854
31855 /* Target hook for c_mode_for_suffix.  */
31856 static enum machine_mode
31857 ix86_c_mode_for_suffix (char suffix)
31858 {
31859   if (suffix == 'q')
31860     return TFmode;
31861   if (suffix == 'w')
31862     return XFmode;
31863
31864   return VOIDmode;
31865 }
31866
31867 /* Worker function for TARGET_MD_ASM_CLOBBERS.
31868
31869    We do this in the new i386 backend to maintain source compatibility
31870    with the old cc0-based compiler.  */
31871
31872 static tree
31873 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
31874                       tree inputs ATTRIBUTE_UNUSED,
31875                       tree clobbers)
31876 {
31877   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
31878                         clobbers);
31879   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
31880                         clobbers);
31881   return clobbers;
31882 }
31883
31884 /* Implements target vector targetm.asm.encode_section_info.  This
31885    is not used by netware.  */
31886
31887 static void ATTRIBUTE_UNUSED
31888 ix86_encode_section_info (tree decl, rtx rtl, int first)
31889 {
31890   default_encode_section_info (decl, rtl, first);
31891
31892   if (TREE_CODE (decl) == VAR_DECL
31893       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
31894       && ix86_in_large_data_p (decl))
31895     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
31896 }
31897
31898 /* Worker function for REVERSE_CONDITION.  */
31899
31900 enum rtx_code
31901 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
31902 {
31903   return (mode != CCFPmode && mode != CCFPUmode
31904           ? reverse_condition (code)
31905           : reverse_condition_maybe_unordered (code));
31906 }
31907
31908 /* Output code to perform an x87 FP register move, from OPERANDS[1]
31909    to OPERANDS[0].  */
31910
31911 const char *
31912 output_387_reg_move (rtx insn, rtx *operands)
31913 {
31914   if (REG_P (operands[0]))
31915     {
31916       if (REG_P (operands[1])
31917           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
31918         {
31919           if (REGNO (operands[0]) == FIRST_STACK_REG)
31920             return output_387_ffreep (operands, 0);
31921           return "fstp\t%y0";
31922         }
31923       if (STACK_TOP_P (operands[0]))
31924         return "fld%Z1\t%y1";
31925       return "fst\t%y0";
31926     }
31927   else if (MEM_P (operands[0]))
31928     {
31929       gcc_assert (REG_P (operands[1]));
31930       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
31931         return "fstp%Z0\t%y0";
31932       else
31933         {
31934           /* There is no non-popping store to memory for XFmode.
31935              So if we need one, follow the store with a load.  */
31936           if (GET_MODE (operands[0]) == XFmode)
31937             return "fstp%Z0\t%y0\n\tfld%Z0\t%y0";
31938           else
31939             return "fst%Z0\t%y0";
31940         }
31941     }
31942   else
31943     gcc_unreachable();
31944 }
31945
31946 /* Output code to perform a conditional jump to LABEL, if C2 flag in
31947    FP status register is set.  */
31948
31949 void
31950 ix86_emit_fp_unordered_jump (rtx label)
31951 {
31952   rtx reg = gen_reg_rtx (HImode);
31953   rtx temp;
31954
31955   emit_insn (gen_x86_fnstsw_1 (reg));
31956
31957   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
31958     {
31959       emit_insn (gen_x86_sahf_1 (reg));
31960
31961       temp = gen_rtx_REG (CCmode, FLAGS_REG);
31962       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
31963     }
31964   else
31965     {
31966       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
31967
31968       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
31969       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
31970     }
31971
31972   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
31973                               gen_rtx_LABEL_REF (VOIDmode, label),
31974                               pc_rtx);
31975   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
31976
31977   emit_jump_insn (temp);
31978   predict_jump (REG_BR_PROB_BASE * 10 / 100);
31979 }
31980
31981 /* Output code to perform a log1p XFmode calculation.  */
31982
31983 void ix86_emit_i387_log1p (rtx op0, rtx op1)
31984 {
31985   rtx label1 = gen_label_rtx ();
31986   rtx label2 = gen_label_rtx ();
31987
31988   rtx tmp = gen_reg_rtx (XFmode);
31989   rtx tmp2 = gen_reg_rtx (XFmode);
31990   rtx test;
31991
31992   emit_insn (gen_absxf2 (tmp, op1));
31993   test = gen_rtx_GE (VOIDmode, tmp,
31994     CONST_DOUBLE_FROM_REAL_VALUE (
31995        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
31996        XFmode));
31997   emit_jump_insn (gen_cbranchxf4 (test, XEXP (test, 0), XEXP (test, 1), label1));
31998
31999   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
32000   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
32001   emit_jump (label2);
32002
32003   emit_label (label1);
32004   emit_move_insn (tmp, CONST1_RTX (XFmode));
32005   emit_insn (gen_addxf3 (tmp, op1, tmp));
32006   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
32007   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
32008
32009   emit_label (label2);
32010 }
32011
32012 /* Output code to perform a Newton-Rhapson approximation of a single precision
32013    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
32014
32015 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
32016 {
32017   rtx x0, x1, e0, e1;
32018
32019   x0 = gen_reg_rtx (mode);
32020   e0 = gen_reg_rtx (mode);
32021   e1 = gen_reg_rtx (mode);
32022   x1 = gen_reg_rtx (mode);
32023
32024   /* a / b = a * ((rcp(b) + rcp(b)) - (b * rcp(b) * rcp (b))) */
32025
32026   /* x0 = rcp(b) estimate */
32027   emit_insn (gen_rtx_SET (VOIDmode, x0,
32028                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
32029                                           UNSPEC_RCP)));
32030   /* e0 = x0 * b */
32031   emit_insn (gen_rtx_SET (VOIDmode, e0,
32032                           gen_rtx_MULT (mode, x0, b)));
32033
32034   /* e0 = x0 * e0 */
32035   emit_insn (gen_rtx_SET (VOIDmode, e0,
32036                           gen_rtx_MULT (mode, x0, e0)));
32037
32038   /* e1 = x0 + x0 */
32039   emit_insn (gen_rtx_SET (VOIDmode, e1,
32040                           gen_rtx_PLUS (mode, x0, x0)));
32041
32042   /* x1 = e1 - e0 */
32043   emit_insn (gen_rtx_SET (VOIDmode, x1,
32044                           gen_rtx_MINUS (mode, e1, e0)));
32045
32046   /* res = a * x1 */
32047   emit_insn (gen_rtx_SET (VOIDmode, res,
32048                           gen_rtx_MULT (mode, a, x1)));
32049 }
32050
32051 /* Output code to perform a Newton-Rhapson approximation of a
32052    single precision floating point [reciprocal] square root.  */
32053
32054 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
32055                          bool recip)
32056 {
32057   rtx x0, e0, e1, e2, e3, mthree, mhalf;
32058   REAL_VALUE_TYPE r;
32059
32060   x0 = gen_reg_rtx (mode);
32061   e0 = gen_reg_rtx (mode);
32062   e1 = gen_reg_rtx (mode);
32063   e2 = gen_reg_rtx (mode);
32064   e3 = gen_reg_rtx (mode);
32065
32066   real_from_integer (&r, VOIDmode, -3, -1, 0);
32067   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
32068
32069   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
32070   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
32071
32072   if (VECTOR_MODE_P (mode))
32073     {
32074       mthree = ix86_build_const_vector (mode, true, mthree);
32075       mhalf = ix86_build_const_vector (mode, true, mhalf);
32076     }
32077
32078   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
32079      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
32080
32081   /* x0 = rsqrt(a) estimate */
32082   emit_insn (gen_rtx_SET (VOIDmode, x0,
32083                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
32084                                           UNSPEC_RSQRT)));
32085
32086   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
32087   if (!recip)
32088     {
32089       rtx zero, mask;
32090
32091       zero = gen_reg_rtx (mode);
32092       mask = gen_reg_rtx (mode);
32093
32094       zero = force_reg (mode, CONST0_RTX(mode));
32095       emit_insn (gen_rtx_SET (VOIDmode, mask,
32096                               gen_rtx_NE (mode, zero, a)));
32097
32098       emit_insn (gen_rtx_SET (VOIDmode, x0,
32099                               gen_rtx_AND (mode, x0, mask)));
32100     }
32101
32102   /* e0 = x0 * a */
32103   emit_insn (gen_rtx_SET (VOIDmode, e0,
32104                           gen_rtx_MULT (mode, x0, a)));
32105   /* e1 = e0 * x0 */
32106   emit_insn (gen_rtx_SET (VOIDmode, e1,
32107                           gen_rtx_MULT (mode, e0, x0)));
32108
32109   /* e2 = e1 - 3. */
32110   mthree = force_reg (mode, mthree);
32111   emit_insn (gen_rtx_SET (VOIDmode, e2,
32112                           gen_rtx_PLUS (mode, e1, mthree)));
32113
32114   mhalf = force_reg (mode, mhalf);
32115   if (recip)
32116     /* e3 = -.5 * x0 */
32117     emit_insn (gen_rtx_SET (VOIDmode, e3,
32118                             gen_rtx_MULT (mode, x0, mhalf)));
32119   else
32120     /* e3 = -.5 * e0 */
32121     emit_insn (gen_rtx_SET (VOIDmode, e3,
32122                             gen_rtx_MULT (mode, e0, mhalf)));
32123   /* ret = e2 * e3 */
32124   emit_insn (gen_rtx_SET (VOIDmode, res,
32125                           gen_rtx_MULT (mode, e2, e3)));
32126 }
32127
32128 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
32129
32130 static void ATTRIBUTE_UNUSED
32131 i386_solaris_elf_named_section (const char *name, unsigned int flags,
32132                                 tree decl)
32133 {
32134   /* With Binutils 2.15, the "@unwind" marker must be specified on
32135      every occurrence of the ".eh_frame" section, not just the first
32136      one.  */
32137   if (TARGET_64BIT
32138       && strcmp (name, ".eh_frame") == 0)
32139     {
32140       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
32141                flags & SECTION_WRITE ? "aw" : "a");
32142       return;
32143     }
32144   default_elf_asm_named_section (name, flags, decl);
32145 }
32146
32147 /* Return the mangling of TYPE if it is an extended fundamental type.  */
32148
32149 static const char *
32150 ix86_mangle_type (const_tree type)
32151 {
32152   type = TYPE_MAIN_VARIANT (type);
32153
32154   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
32155       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
32156     return NULL;
32157
32158   switch (TYPE_MODE (type))
32159     {
32160     case TFmode:
32161       /* __float128 is "g".  */
32162       return "g";
32163     case XFmode:
32164       /* "long double" or __float80 is "e".  */
32165       return "e";
32166     default:
32167       return NULL;
32168     }
32169 }
32170
32171 /* For 32-bit code we can save PIC register setup by using
32172    __stack_chk_fail_local hidden function instead of calling
32173    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
32174    register, so it is better to call __stack_chk_fail directly.  */
32175
32176 static tree
32177 ix86_stack_protect_fail (void)
32178 {
32179   return TARGET_64BIT
32180          ? default_external_stack_protect_fail ()
32181          : default_hidden_stack_protect_fail ();
32182 }
32183
32184 /* Select a format to encode pointers in exception handling data.  CODE
32185    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
32186    true if the symbol may be affected by dynamic relocations.
32187
32188    ??? All x86 object file formats are capable of representing this.
32189    After all, the relocation needed is the same as for the call insn.
32190    Whether or not a particular assembler allows us to enter such, I
32191    guess we'll have to see.  */
32192 int
32193 asm_preferred_eh_data_format (int code, int global)
32194 {
32195   if (flag_pic)
32196     {
32197       int type = DW_EH_PE_sdata8;
32198       if (!TARGET_64BIT
32199           || ix86_cmodel == CM_SMALL_PIC
32200           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
32201         type = DW_EH_PE_sdata4;
32202       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
32203     }
32204   if (ix86_cmodel == CM_SMALL
32205       || (ix86_cmodel == CM_MEDIUM && code))
32206     return DW_EH_PE_udata4;
32207   return DW_EH_PE_absptr;
32208 }
32209 \f
32210 /* Expand copysign from SIGN to the positive value ABS_VALUE
32211    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
32212    the sign-bit.  */
32213 static void
32214 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
32215 {
32216   enum machine_mode mode = GET_MODE (sign);
32217   rtx sgn = gen_reg_rtx (mode);
32218   if (mask == NULL_RTX)
32219     {
32220       enum machine_mode vmode;
32221
32222       if (mode == SFmode)
32223         vmode = V4SFmode;
32224       else if (mode == DFmode)
32225         vmode = V2DFmode;
32226       else
32227         vmode = mode;
32228
32229       mask = ix86_build_signbit_mask (vmode, VECTOR_MODE_P (mode), false);
32230       if (!VECTOR_MODE_P (mode))
32231         {
32232           /* We need to generate a scalar mode mask in this case.  */
32233           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
32234           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
32235           mask = gen_reg_rtx (mode);
32236           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
32237         }
32238     }
32239   else
32240     mask = gen_rtx_NOT (mode, mask);
32241   emit_insn (gen_rtx_SET (VOIDmode, sgn,
32242                           gen_rtx_AND (mode, mask, sign)));
32243   emit_insn (gen_rtx_SET (VOIDmode, result,
32244                           gen_rtx_IOR (mode, abs_value, sgn)));
32245 }
32246
32247 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
32248    mask for masking out the sign-bit is stored in *SMASK, if that is
32249    non-null.  */
32250 static rtx
32251 ix86_expand_sse_fabs (rtx op0, rtx *smask)
32252 {
32253   enum machine_mode vmode, mode = GET_MODE (op0);
32254   rtx xa, mask;
32255
32256   xa = gen_reg_rtx (mode);
32257   if (mode == SFmode)
32258     vmode = V4SFmode;
32259   else if (mode == DFmode)
32260     vmode = V2DFmode;
32261   else
32262     vmode = mode;
32263   mask = ix86_build_signbit_mask (vmode, VECTOR_MODE_P (mode), true);
32264   if (!VECTOR_MODE_P (mode))
32265     {
32266       /* We need to generate a scalar mode mask in this case.  */
32267       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
32268       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
32269       mask = gen_reg_rtx (mode);
32270       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
32271     }
32272   emit_insn (gen_rtx_SET (VOIDmode, xa,
32273                           gen_rtx_AND (mode, op0, mask)));
32274
32275   if (smask)
32276     *smask = mask;
32277
32278   return xa;
32279 }
32280
32281 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
32282    swapping the operands if SWAP_OPERANDS is true.  The expanded
32283    code is a forward jump to a newly created label in case the
32284    comparison is true.  The generated label rtx is returned.  */
32285 static rtx
32286 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
32287                                   bool swap_operands)
32288 {
32289   rtx label, tmp;
32290
32291   if (swap_operands)
32292     {
32293       tmp = op0;
32294       op0 = op1;
32295       op1 = tmp;
32296     }
32297
32298   label = gen_label_rtx ();
32299   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
32300   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32301                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
32302   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
32303   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
32304                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
32305   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
32306   JUMP_LABEL (tmp) = label;
32307
32308   return label;
32309 }
32310
32311 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
32312    using comparison code CODE.  Operands are swapped for the comparison if
32313    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
32314 static rtx
32315 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
32316                               bool swap_operands)
32317 {
32318   rtx (*insn)(rtx, rtx, rtx, rtx);
32319   enum machine_mode mode = GET_MODE (op0);
32320   rtx mask = gen_reg_rtx (mode);
32321
32322   if (swap_operands)
32323     {
32324       rtx tmp = op0;
32325       op0 = op1;
32326       op1 = tmp;
32327     }
32328
32329   insn = mode == DFmode ? gen_setcc_df_sse : gen_setcc_sf_sse;
32330
32331   emit_insn (insn (mask, op0, op1,
32332                    gen_rtx_fmt_ee (code, mode, op0, op1)));
32333   return mask;
32334 }
32335
32336 /* Generate and return a rtx of mode MODE for 2**n where n is the number
32337    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
32338 static rtx
32339 ix86_gen_TWO52 (enum machine_mode mode)
32340 {
32341   REAL_VALUE_TYPE TWO52r;
32342   rtx TWO52;
32343
32344   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
32345   TWO52 = const_double_from_real_value (TWO52r, mode);
32346   TWO52 = force_reg (mode, TWO52);
32347
32348   return TWO52;
32349 }
32350
32351 /* Expand SSE sequence for computing lround from OP1 storing
32352    into OP0.  */
32353 void
32354 ix86_expand_lround (rtx op0, rtx op1)
32355 {
32356   /* C code for the stuff we're doing below:
32357        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
32358        return (long)tmp;
32359    */
32360   enum machine_mode mode = GET_MODE (op1);
32361   const struct real_format *fmt;
32362   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
32363   rtx adj;
32364
32365   /* load nextafter (0.5, 0.0) */
32366   fmt = REAL_MODE_FORMAT (mode);
32367   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
32368   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
32369
32370   /* adj = copysign (0.5, op1) */
32371   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
32372   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
32373
32374   /* adj = op1 + adj */
32375   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
32376
32377   /* op0 = (imode)adj */
32378   expand_fix (op0, adj, 0);
32379 }
32380
32381 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
32382    into OPERAND0.  */
32383 void
32384 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
32385 {
32386   /* C code for the stuff we're doing below (for do_floor):
32387         xi = (long)op1;
32388         xi -= (double)xi > op1 ? 1 : 0;
32389         return xi;
32390    */
32391   enum machine_mode fmode = GET_MODE (op1);
32392   enum machine_mode imode = GET_MODE (op0);
32393   rtx ireg, freg, label, tmp;
32394
32395   /* reg = (long)op1 */
32396   ireg = gen_reg_rtx (imode);
32397   expand_fix (ireg, op1, 0);
32398
32399   /* freg = (double)reg */
32400   freg = gen_reg_rtx (fmode);
32401   expand_float (freg, ireg, 0);
32402
32403   /* ireg = (freg > op1) ? ireg - 1 : ireg */
32404   label = ix86_expand_sse_compare_and_jump (UNLE,
32405                                             freg, op1, !do_floor);
32406   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
32407                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
32408   emit_move_insn (ireg, tmp);
32409
32410   emit_label (label);
32411   LABEL_NUSES (label) = 1;
32412
32413   emit_move_insn (op0, ireg);
32414 }
32415
32416 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
32417    result in OPERAND0.  */
32418 void
32419 ix86_expand_rint (rtx operand0, rtx operand1)
32420 {
32421   /* C code for the stuff we're doing below:
32422         xa = fabs (operand1);
32423         if (!isless (xa, 2**52))
32424           return operand1;
32425         xa = xa + 2**52 - 2**52;
32426         return copysign (xa, operand1);
32427    */
32428   enum machine_mode mode = GET_MODE (operand0);
32429   rtx res, xa, label, TWO52, mask;
32430
32431   res = gen_reg_rtx (mode);
32432   emit_move_insn (res, operand1);
32433
32434   /* xa = abs (operand1) */
32435   xa = ix86_expand_sse_fabs (res, &mask);
32436
32437   /* if (!isless (xa, TWO52)) goto label; */
32438   TWO52 = ix86_gen_TWO52 (mode);
32439   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32440
32441   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32442   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
32443
32444   ix86_sse_copysign_to_positive (res, xa, res, mask);
32445
32446   emit_label (label);
32447   LABEL_NUSES (label) = 1;
32448
32449   emit_move_insn (operand0, res);
32450 }
32451
32452 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
32453    into OPERAND0.  */
32454 void
32455 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
32456 {
32457   /* C code for the stuff we expand below.
32458         double xa = fabs (x), x2;
32459         if (!isless (xa, TWO52))
32460           return x;
32461         xa = xa + TWO52 - TWO52;
32462         x2 = copysign (xa, x);
32463      Compensate.  Floor:
32464         if (x2 > x)
32465           x2 -= 1;
32466      Compensate.  Ceil:
32467         if (x2 < x)
32468           x2 -= -1;
32469         return x2;
32470    */
32471   enum machine_mode mode = GET_MODE (operand0);
32472   rtx xa, TWO52, tmp, label, one, res, mask;
32473
32474   TWO52 = ix86_gen_TWO52 (mode);
32475
32476   /* Temporary for holding the result, initialized to the input
32477      operand to ease control flow.  */
32478   res = gen_reg_rtx (mode);
32479   emit_move_insn (res, operand1);
32480
32481   /* xa = abs (operand1) */
32482   xa = ix86_expand_sse_fabs (res, &mask);
32483
32484   /* if (!isless (xa, TWO52)) goto label; */
32485   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32486
32487   /* xa = xa + TWO52 - TWO52; */
32488   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32489   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
32490
32491   /* xa = copysign (xa, operand1) */
32492   ix86_sse_copysign_to_positive (xa, xa, res, mask);
32493
32494   /* generate 1.0 or -1.0 */
32495   one = force_reg (mode,
32496                    const_double_from_real_value (do_floor
32497                                                  ? dconst1 : dconstm1, mode));
32498
32499   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
32500   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
32501   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32502                           gen_rtx_AND (mode, one, tmp)));
32503   /* We always need to subtract here to preserve signed zero.  */
32504   tmp = expand_simple_binop (mode, MINUS,
32505                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32506   emit_move_insn (res, tmp);
32507
32508   emit_label (label);
32509   LABEL_NUSES (label) = 1;
32510
32511   emit_move_insn (operand0, res);
32512 }
32513
32514 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
32515    into OPERAND0.  */
32516 void
32517 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
32518 {
32519   /* C code for the stuff we expand below.
32520         double xa = fabs (x), x2;
32521         if (!isless (xa, TWO52))
32522           return x;
32523         x2 = (double)(long)x;
32524      Compensate.  Floor:
32525         if (x2 > x)
32526           x2 -= 1;
32527      Compensate.  Ceil:
32528         if (x2 < x)
32529           x2 += 1;
32530         if (HONOR_SIGNED_ZEROS (mode))
32531           return copysign (x2, x);
32532         return x2;
32533    */
32534   enum machine_mode mode = GET_MODE (operand0);
32535   rtx xa, xi, TWO52, tmp, label, one, res, mask;
32536
32537   TWO52 = ix86_gen_TWO52 (mode);
32538
32539   /* Temporary for holding the result, initialized to the input
32540      operand to ease control flow.  */
32541   res = gen_reg_rtx (mode);
32542   emit_move_insn (res, operand1);
32543
32544   /* xa = abs (operand1) */
32545   xa = ix86_expand_sse_fabs (res, &mask);
32546
32547   /* if (!isless (xa, TWO52)) goto label; */
32548   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32549
32550   /* xa = (double)(long)x */
32551   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32552   expand_fix (xi, res, 0);
32553   expand_float (xa, xi, 0);
32554
32555   /* generate 1.0 */
32556   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
32557
32558   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
32559   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
32560   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32561                           gen_rtx_AND (mode, one, tmp)));
32562   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
32563                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32564   emit_move_insn (res, tmp);
32565
32566   if (HONOR_SIGNED_ZEROS (mode))
32567     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
32568
32569   emit_label (label);
32570   LABEL_NUSES (label) = 1;
32571
32572   emit_move_insn (operand0, res);
32573 }
32574
32575 /* Expand SSE sequence for computing round from OPERAND1 storing
32576    into OPERAND0.  Sequence that works without relying on DImode truncation
32577    via cvttsd2siq that is only available on 64bit targets.  */
32578 void
32579 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
32580 {
32581   /* C code for the stuff we expand below.
32582         double xa = fabs (x), xa2, x2;
32583         if (!isless (xa, TWO52))
32584           return x;
32585      Using the absolute value and copying back sign makes
32586      -0.0 -> -0.0 correct.
32587         xa2 = xa + TWO52 - TWO52;
32588      Compensate.
32589         dxa = xa2 - xa;
32590         if (dxa <= -0.5)
32591           xa2 += 1;
32592         else if (dxa > 0.5)
32593           xa2 -= 1;
32594         x2 = copysign (xa2, x);
32595         return x2;
32596    */
32597   enum machine_mode mode = GET_MODE (operand0);
32598   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
32599
32600   TWO52 = ix86_gen_TWO52 (mode);
32601
32602   /* Temporary for holding the result, initialized to the input
32603      operand to ease control flow.  */
32604   res = gen_reg_rtx (mode);
32605   emit_move_insn (res, operand1);
32606
32607   /* xa = abs (operand1) */
32608   xa = ix86_expand_sse_fabs (res, &mask);
32609
32610   /* if (!isless (xa, TWO52)) goto label; */
32611   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32612
32613   /* xa2 = xa + TWO52 - TWO52; */
32614   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32615   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
32616
32617   /* dxa = xa2 - xa; */
32618   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
32619
32620   /* generate 0.5, 1.0 and -0.5 */
32621   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
32622   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
32623   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
32624                                0, OPTAB_DIRECT);
32625
32626   /* Compensate.  */
32627   tmp = gen_reg_rtx (mode);
32628   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
32629   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
32630   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32631                           gen_rtx_AND (mode, one, tmp)));
32632   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32633   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
32634   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
32635   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32636                           gen_rtx_AND (mode, one, tmp)));
32637   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32638
32639   /* res = copysign (xa2, operand1) */
32640   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
32641
32642   emit_label (label);
32643   LABEL_NUSES (label) = 1;
32644
32645   emit_move_insn (operand0, res);
32646 }
32647
32648 /* Expand SSE sequence for computing trunc from OPERAND1 storing
32649    into OPERAND0.  */
32650 void
32651 ix86_expand_trunc (rtx operand0, rtx operand1)
32652 {
32653   /* C code for SSE variant we expand below.
32654         double xa = fabs (x), x2;
32655         if (!isless (xa, TWO52))
32656           return x;
32657         x2 = (double)(long)x;
32658         if (HONOR_SIGNED_ZEROS (mode))
32659           return copysign (x2, x);
32660         return x2;
32661    */
32662   enum machine_mode mode = GET_MODE (operand0);
32663   rtx xa, xi, TWO52, label, res, mask;
32664
32665   TWO52 = ix86_gen_TWO52 (mode);
32666
32667   /* Temporary for holding the result, initialized to the input
32668      operand to ease control flow.  */
32669   res = gen_reg_rtx (mode);
32670   emit_move_insn (res, operand1);
32671
32672   /* xa = abs (operand1) */
32673   xa = ix86_expand_sse_fabs (res, &mask);
32674
32675   /* if (!isless (xa, TWO52)) goto label; */
32676   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32677
32678   /* x = (double)(long)x */
32679   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32680   expand_fix (xi, res, 0);
32681   expand_float (res, xi, 0);
32682
32683   if (HONOR_SIGNED_ZEROS (mode))
32684     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
32685
32686   emit_label (label);
32687   LABEL_NUSES (label) = 1;
32688
32689   emit_move_insn (operand0, res);
32690 }
32691
32692 /* Expand SSE sequence for computing trunc from OPERAND1 storing
32693    into OPERAND0.  */
32694 void
32695 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
32696 {
32697   enum machine_mode mode = GET_MODE (operand0);
32698   rtx xa, mask, TWO52, label, one, res, smask, tmp;
32699
32700   /* C code for SSE variant we expand below.
32701         double xa = fabs (x), x2;
32702         if (!isless (xa, TWO52))
32703           return x;
32704         xa2 = xa + TWO52 - TWO52;
32705      Compensate:
32706         if (xa2 > xa)
32707           xa2 -= 1.0;
32708         x2 = copysign (xa2, x);
32709         return x2;
32710    */
32711
32712   TWO52 = ix86_gen_TWO52 (mode);
32713
32714   /* Temporary for holding the result, initialized to the input
32715      operand to ease control flow.  */
32716   res = gen_reg_rtx (mode);
32717   emit_move_insn (res, operand1);
32718
32719   /* xa = abs (operand1) */
32720   xa = ix86_expand_sse_fabs (res, &smask);
32721
32722   /* if (!isless (xa, TWO52)) goto label; */
32723   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32724
32725   /* res = xa + TWO52 - TWO52; */
32726   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32727   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
32728   emit_move_insn (res, tmp);
32729
32730   /* generate 1.0 */
32731   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
32732
32733   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
32734   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
32735   emit_insn (gen_rtx_SET (VOIDmode, mask,
32736                           gen_rtx_AND (mode, mask, one)));
32737   tmp = expand_simple_binop (mode, MINUS,
32738                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
32739   emit_move_insn (res, tmp);
32740
32741   /* res = copysign (res, operand1) */
32742   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
32743
32744   emit_label (label);
32745   LABEL_NUSES (label) = 1;
32746
32747   emit_move_insn (operand0, res);
32748 }
32749
32750 /* Expand SSE sequence for computing round from OPERAND1 storing
32751    into OPERAND0.  */
32752 void
32753 ix86_expand_round (rtx operand0, rtx operand1)
32754 {
32755   /* C code for the stuff we're doing below:
32756         double xa = fabs (x);
32757         if (!isless (xa, TWO52))
32758           return x;
32759         xa = (double)(long)(xa + nextafter (0.5, 0.0));
32760         return copysign (xa, x);
32761    */
32762   enum machine_mode mode = GET_MODE (operand0);
32763   rtx res, TWO52, xa, label, xi, half, mask;
32764   const struct real_format *fmt;
32765   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
32766
32767   /* Temporary for holding the result, initialized to the input
32768      operand to ease control flow.  */
32769   res = gen_reg_rtx (mode);
32770   emit_move_insn (res, operand1);
32771
32772   TWO52 = ix86_gen_TWO52 (mode);
32773   xa = ix86_expand_sse_fabs (res, &mask);
32774   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32775
32776   /* load nextafter (0.5, 0.0) */
32777   fmt = REAL_MODE_FORMAT (mode);
32778   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
32779   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
32780
32781   /* xa = xa + 0.5 */
32782   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
32783   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
32784
32785   /* xa = (double)(int64_t)xa */
32786   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32787   expand_fix (xi, xa, 0);
32788   expand_float (xa, xi, 0);
32789
32790   /* res = copysign (xa, operand1) */
32791   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
32792
32793   emit_label (label);
32794   LABEL_NUSES (label) = 1;
32795
32796   emit_move_insn (operand0, res);
32797 }
32798 \f
32799
32800 /* Table of valid machine attributes.  */
32801 static const struct attribute_spec ix86_attribute_table[] =
32802 {
32803   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
32804        affects_type_identity } */
32805   /* Stdcall attribute says callee is responsible for popping arguments
32806      if they are not variable.  */
32807   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32808     true },
32809   /* Fastcall attribute says callee is responsible for popping arguments
32810      if they are not variable.  */
32811   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32812     true },
32813   /* Thiscall attribute says callee is responsible for popping arguments
32814      if they are not variable.  */
32815   { "thiscall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32816     true },
32817   /* Cdecl attribute says the callee is a normal C declaration */
32818   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32819     true },
32820   /* Regparm attribute specifies how many integer arguments are to be
32821      passed in registers.  */
32822   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute,
32823     true },
32824   /* Sseregparm attribute says we are using x86_64 calling conventions
32825      for FP arguments.  */
32826   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute,
32827     true },
32828   /* force_align_arg_pointer says this function realigns the stack at entry.  */
32829   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
32830     false, true,  true, ix86_handle_cconv_attribute, false },
32831 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
32832   { "dllimport", 0, 0, false, false, false, handle_dll_attribute, false },
32833   { "dllexport", 0, 0, false, false, false, handle_dll_attribute, false },
32834   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute,
32835     false },
32836 #endif
32837   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
32838     false },
32839   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
32840     false },
32841 #ifdef SUBTARGET_ATTRIBUTE_TABLE
32842   SUBTARGET_ATTRIBUTE_TABLE,
32843 #endif
32844   /* ms_abi and sysv_abi calling convention function attributes.  */
32845   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true },
32846   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true },
32847   { "ms_hook_prologue", 0, 0, true, false, false, ix86_handle_fndecl_attribute,
32848     false },
32849   { "callee_pop_aggregate_return", 1, 1, false, true, true,
32850     ix86_handle_callee_pop_aggregate_return, true },
32851   /* End element.  */
32852   { NULL,        0, 0, false, false, false, NULL, false }
32853 };
32854
32855 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
32856 static int
32857 ix86_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
32858                                  tree vectype ATTRIBUTE_UNUSED,
32859                                  int misalign ATTRIBUTE_UNUSED)
32860 {
32861   switch (type_of_cost)
32862     {
32863       case scalar_stmt:
32864         return ix86_cost->scalar_stmt_cost;
32865
32866       case scalar_load:
32867         return ix86_cost->scalar_load_cost;
32868
32869       case scalar_store:
32870         return ix86_cost->scalar_store_cost;
32871
32872       case vector_stmt:
32873         return ix86_cost->vec_stmt_cost;
32874
32875       case vector_load:
32876         return ix86_cost->vec_align_load_cost;
32877
32878       case vector_store:
32879         return ix86_cost->vec_store_cost;
32880
32881       case vec_to_scalar:
32882         return ix86_cost->vec_to_scalar_cost;
32883
32884       case scalar_to_vec:
32885         return ix86_cost->scalar_to_vec_cost;
32886
32887       case unaligned_load:
32888       case unaligned_store:
32889         return ix86_cost->vec_unalign_load_cost;
32890
32891       case cond_branch_taken:
32892         return ix86_cost->cond_taken_branch_cost;
32893
32894       case cond_branch_not_taken:
32895         return ix86_cost->cond_not_taken_branch_cost;
32896
32897       case vec_perm:
32898         return 1;
32899
32900       default:
32901         gcc_unreachable ();
32902     }
32903 }
32904
32905
32906 /* Implement targetm.vectorize.builtin_vec_perm.  */
32907
32908 static tree
32909 ix86_vectorize_builtin_vec_perm (tree vec_type, tree *mask_type)
32910 {
32911   tree itype = TREE_TYPE (vec_type);
32912   bool u = TYPE_UNSIGNED (itype);
32913   enum machine_mode vmode = TYPE_MODE (vec_type);
32914   enum ix86_builtins fcode;
32915   bool ok = TARGET_SSE2;
32916
32917   switch (vmode)
32918     {
32919     case V4DFmode:
32920       ok = TARGET_AVX;
32921       fcode = IX86_BUILTIN_VEC_PERM_V4DF;
32922       goto get_di;
32923     case V2DFmode:
32924       fcode = IX86_BUILTIN_VEC_PERM_V2DF;
32925     get_di:
32926       itype = ix86_get_builtin_type (IX86_BT_DI);
32927       break;
32928
32929     case V8SFmode:
32930       ok = TARGET_AVX;
32931       fcode = IX86_BUILTIN_VEC_PERM_V8SF;
32932       goto get_si;
32933     case V4SFmode:
32934       ok = TARGET_SSE;
32935       fcode = IX86_BUILTIN_VEC_PERM_V4SF;
32936     get_si:
32937       itype = ix86_get_builtin_type (IX86_BT_SI);
32938       break;
32939
32940     case V2DImode:
32941       fcode = u ? IX86_BUILTIN_VEC_PERM_V2DI_U : IX86_BUILTIN_VEC_PERM_V2DI;
32942       break;
32943     case V4SImode:
32944       fcode = u ? IX86_BUILTIN_VEC_PERM_V4SI_U : IX86_BUILTIN_VEC_PERM_V4SI;
32945       break;
32946     case V8HImode:
32947       fcode = u ? IX86_BUILTIN_VEC_PERM_V8HI_U : IX86_BUILTIN_VEC_PERM_V8HI;
32948       break;
32949     case V16QImode:
32950       fcode = u ? IX86_BUILTIN_VEC_PERM_V16QI_U : IX86_BUILTIN_VEC_PERM_V16QI;
32951       break;
32952     default:
32953       ok = false;
32954       break;
32955     }
32956
32957   if (!ok)
32958     return NULL_TREE;
32959
32960   *mask_type = itype;
32961   return ix86_builtins[(int) fcode];
32962 }
32963
32964 /* Return a vector mode with twice as many elements as VMODE.  */
32965 /* ??? Consider moving this to a table generated by genmodes.c.  */
32966
32967 static enum machine_mode
32968 doublesize_vector_mode (enum machine_mode vmode)
32969 {
32970   switch (vmode)
32971     {
32972     case V2SFmode:      return V4SFmode;
32973     case V1DImode:      return V2DImode;
32974     case V2SImode:      return V4SImode;
32975     case V4HImode:      return V8HImode;
32976     case V8QImode:      return V16QImode;
32977
32978     case V2DFmode:      return V4DFmode;
32979     case V4SFmode:      return V8SFmode;
32980     case V2DImode:      return V4DImode;
32981     case V4SImode:      return V8SImode;
32982     case V8HImode:      return V16HImode;
32983     case V16QImode:     return V32QImode;
32984
32985     case V4DFmode:      return V8DFmode;
32986     case V8SFmode:      return V16SFmode;
32987     case V4DImode:      return V8DImode;
32988     case V8SImode:      return V16SImode;
32989     case V16HImode:     return V32HImode;
32990     case V32QImode:     return V64QImode;
32991
32992     default:
32993       gcc_unreachable ();
32994     }
32995 }
32996
32997 /* Construct (set target (vec_select op0 (parallel perm))) and
32998    return true if that's a valid instruction in the active ISA.  */
32999
33000 static bool
33001 expand_vselect (rtx target, rtx op0, const unsigned char *perm, unsigned nelt)
33002 {
33003   rtx rperm[MAX_VECT_LEN], x;
33004   unsigned i;
33005
33006   for (i = 0; i < nelt; ++i)
33007     rperm[i] = GEN_INT (perm[i]);
33008
33009   x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
33010   x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
33011   x = gen_rtx_SET (VOIDmode, target, x);
33012
33013   x = emit_insn (x);
33014   if (recog_memoized (x) < 0)
33015     {
33016       remove_insn (x);
33017       return false;
33018     }
33019   return true;
33020 }
33021
33022 /* Similar, but generate a vec_concat from op0 and op1 as well.  */
33023
33024 static bool
33025 expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
33026                         const unsigned char *perm, unsigned nelt)
33027 {
33028   enum machine_mode v2mode;
33029   rtx x;
33030
33031   v2mode = doublesize_vector_mode (GET_MODE (op0));
33032   x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
33033   return expand_vselect (target, x, perm, nelt);
33034 }
33035
33036 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33037    in terms of blendp[sd] / pblendw / pblendvb.  */
33038
33039 static bool
33040 expand_vec_perm_blend (struct expand_vec_perm_d *d)
33041 {
33042   enum machine_mode vmode = d->vmode;
33043   unsigned i, mask, nelt = d->nelt;
33044   rtx target, op0, op1, x;
33045
33046   if (!TARGET_SSE4_1 || d->op0 == d->op1)
33047     return false;
33048   if (!(GET_MODE_SIZE (vmode) == 16 || vmode == V4DFmode || vmode == V8SFmode))
33049     return false;
33050
33051   /* This is a blend, not a permute.  Elements must stay in their
33052      respective lanes.  */
33053   for (i = 0; i < nelt; ++i)
33054     {
33055       unsigned e = d->perm[i];
33056       if (!(e == i || e == i + nelt))
33057         return false;
33058     }
33059
33060   if (d->testing_p)
33061     return true;
33062
33063   /* ??? Without SSE4.1, we could implement this with and/andn/or.  This
33064      decision should be extracted elsewhere, so that we only try that
33065      sequence once all budget==3 options have been tried.  */
33066
33067   /* For bytes, see if bytes move in pairs so we can use pblendw with
33068      an immediate argument, rather than pblendvb with a vector argument.  */
33069   if (vmode == V16QImode)
33070     {
33071       bool pblendw_ok = true;
33072       for (i = 0; i < 16 && pblendw_ok; i += 2)
33073         pblendw_ok = (d->perm[i] + 1 == d->perm[i + 1]);
33074
33075       if (!pblendw_ok)
33076         {
33077           rtx rperm[16], vperm;
33078
33079           for (i = 0; i < nelt; ++i)
33080             rperm[i] = (d->perm[i] < nelt ? const0_rtx : constm1_rtx);
33081
33082           vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
33083           vperm = force_reg (V16QImode, vperm);
33084
33085           emit_insn (gen_sse4_1_pblendvb (d->target, d->op0, d->op1, vperm));
33086           return true;
33087         }
33088     }
33089
33090   target = d->target;
33091   op0 = d->op0;
33092   op1 = d->op1;
33093   mask = 0;
33094
33095   switch (vmode)
33096     {
33097     case V4DFmode:
33098     case V8SFmode:
33099     case V2DFmode:
33100     case V4SFmode:
33101     case V8HImode:
33102       for (i = 0; i < nelt; ++i)
33103         mask |= (d->perm[i] >= nelt) << i;
33104       break;
33105
33106     case V2DImode:
33107       for (i = 0; i < 2; ++i)
33108         mask |= (d->perm[i] >= 2 ? 15 : 0) << (i * 4);
33109       goto do_subreg;
33110
33111     case V4SImode:
33112       for (i = 0; i < 4; ++i)
33113         mask |= (d->perm[i] >= 4 ? 3 : 0) << (i * 2);
33114       goto do_subreg;
33115
33116     case V16QImode:
33117       for (i = 0; i < 8; ++i)
33118         mask |= (d->perm[i * 2] >= 16) << i;
33119
33120     do_subreg:
33121       vmode = V8HImode;
33122       target = gen_lowpart (vmode, target);
33123       op0 = gen_lowpart (vmode, op0);
33124       op1 = gen_lowpart (vmode, op1);
33125       break;
33126
33127     default:
33128       gcc_unreachable ();
33129     }
33130
33131   /* This matches five different patterns with the different modes.  */
33132   x = gen_rtx_VEC_MERGE (vmode, op1, op0, GEN_INT (mask));
33133   x = gen_rtx_SET (VOIDmode, target, x);
33134   emit_insn (x);
33135
33136   return true;
33137 }
33138
33139 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33140    in terms of the variable form of vpermilps.
33141
33142    Note that we will have already failed the immediate input vpermilps,
33143    which requires that the high and low part shuffle be identical; the
33144    variable form doesn't require that.  */
33145
33146 static bool
33147 expand_vec_perm_vpermil (struct expand_vec_perm_d *d)
33148 {
33149   rtx rperm[8], vperm;
33150   unsigned i;
33151
33152   if (!TARGET_AVX || d->vmode != V8SFmode || d->op0 != d->op1)
33153     return false;
33154
33155   /* We can only permute within the 128-bit lane.  */
33156   for (i = 0; i < 8; ++i)
33157     {
33158       unsigned e = d->perm[i];
33159       if (i < 4 ? e >= 4 : e < 4)
33160         return false;
33161     }
33162
33163   if (d->testing_p)
33164     return true;
33165
33166   for (i = 0; i < 8; ++i)
33167     {
33168       unsigned e = d->perm[i];
33169
33170       /* Within each 128-bit lane, the elements of op0 are numbered
33171          from 0 and the elements of op1 are numbered from 4.  */
33172       if (e >= 8 + 4)
33173         e -= 8;
33174       else if (e >= 4)
33175         e -= 4;
33176
33177       rperm[i] = GEN_INT (e);
33178     }
33179
33180   vperm = gen_rtx_CONST_VECTOR (V8SImode, gen_rtvec_v (8, rperm));
33181   vperm = force_reg (V8SImode, vperm);
33182   emit_insn (gen_avx_vpermilvarv8sf3 (d->target, d->op0, vperm));
33183
33184   return true;
33185 }
33186
33187 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33188    in terms of pshufb or vpperm.  */
33189
33190 static bool
33191 expand_vec_perm_pshufb (struct expand_vec_perm_d *d)
33192 {
33193   unsigned i, nelt, eltsz;
33194   rtx rperm[16], vperm, target, op0, op1;
33195
33196   if (!(d->op0 == d->op1 ? TARGET_SSSE3 : TARGET_XOP))
33197     return false;
33198   if (GET_MODE_SIZE (d->vmode) != 16)
33199     return false;
33200
33201   if (d->testing_p)
33202     return true;
33203
33204   nelt = d->nelt;
33205   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
33206
33207   for (i = 0; i < nelt; ++i)
33208     {
33209       unsigned j, e = d->perm[i];
33210       for (j = 0; j < eltsz; ++j)
33211         rperm[i * eltsz + j] = GEN_INT (e * eltsz + j);
33212     }
33213
33214   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
33215   vperm = force_reg (V16QImode, vperm);
33216
33217   target = gen_lowpart (V16QImode, d->target);
33218   op0 = gen_lowpart (V16QImode, d->op0);
33219   if (d->op0 == d->op1)
33220     emit_insn (gen_ssse3_pshufbv16qi3 (target, op0, vperm));
33221   else
33222     {
33223       op1 = gen_lowpart (V16QImode, d->op1);
33224       emit_insn (gen_xop_pperm (target, op0, op1, vperm));
33225     }
33226
33227   return true;
33228 }
33229
33230 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to instantiate D
33231    in a single instruction.  */
33232
33233 static bool
33234 expand_vec_perm_1 (struct expand_vec_perm_d *d)
33235 {
33236   unsigned i, nelt = d->nelt;
33237   unsigned char perm2[MAX_VECT_LEN];
33238
33239   /* Check plain VEC_SELECT first, because AVX has instructions that could
33240      match both SEL and SEL+CONCAT, but the plain SEL will allow a memory
33241      input where SEL+CONCAT may not.  */
33242   if (d->op0 == d->op1)
33243     {
33244       int mask = nelt - 1;
33245
33246       for (i = 0; i < nelt; i++)
33247         perm2[i] = d->perm[i] & mask;
33248
33249       if (expand_vselect (d->target, d->op0, perm2, nelt))
33250         return true;
33251
33252       /* There are plenty of patterns in sse.md that are written for
33253          SEL+CONCAT and are not replicated for a single op.  Perhaps
33254          that should be changed, to avoid the nastiness here.  */
33255
33256       /* Recognize interleave style patterns, which means incrementing
33257          every other permutation operand.  */
33258       for (i = 0; i < nelt; i += 2)
33259         {
33260           perm2[i] = d->perm[i] & mask;
33261           perm2[i + 1] = (d->perm[i + 1] & mask) + nelt;
33262         }
33263       if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
33264         return true;
33265
33266       /* Recognize shufps, which means adding {0, 0, nelt, nelt}.  */
33267       if (nelt >= 4)
33268         {
33269           for (i = 0; i < nelt; i += 4)
33270             {
33271               perm2[i + 0] = d->perm[i + 0] & mask;
33272               perm2[i + 1] = d->perm[i + 1] & mask;
33273               perm2[i + 2] = (d->perm[i + 2] & mask) + nelt;
33274               perm2[i + 3] = (d->perm[i + 3] & mask) + nelt;
33275             }
33276
33277           if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
33278             return true;
33279         }
33280     }
33281
33282   /* Finally, try the fully general two operand permute.  */
33283   if (expand_vselect_vconcat (d->target, d->op0, d->op1, d->perm, nelt))
33284     return true;
33285
33286   /* Recognize interleave style patterns with reversed operands.  */
33287   if (d->op0 != d->op1)
33288     {
33289       for (i = 0; i < nelt; ++i)
33290         {
33291           unsigned e = d->perm[i];
33292           if (e >= nelt)
33293             e -= nelt;
33294           else
33295             e += nelt;
33296           perm2[i] = e;
33297         }
33298
33299       if (expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
33300         return true;
33301     }
33302
33303   /* Try the SSE4.1 blend variable merge instructions.  */
33304   if (expand_vec_perm_blend (d))
33305     return true;
33306
33307   /* Try one of the AVX vpermil variable permutations.  */
33308   if (expand_vec_perm_vpermil (d))
33309     return true;
33310
33311   /* Try the SSSE3 pshufb or XOP vpperm variable permutation.  */
33312   if (expand_vec_perm_pshufb (d))
33313     return true;
33314
33315   return false;
33316 }
33317
33318 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33319    in terms of a pair of pshuflw + pshufhw instructions.  */
33320
33321 static bool
33322 expand_vec_perm_pshuflw_pshufhw (struct expand_vec_perm_d *d)
33323 {
33324   unsigned char perm2[MAX_VECT_LEN];
33325   unsigned i;
33326   bool ok;
33327
33328   if (d->vmode != V8HImode || d->op0 != d->op1)
33329     return false;
33330
33331   /* The two permutations only operate in 64-bit lanes.  */
33332   for (i = 0; i < 4; ++i)
33333     if (d->perm[i] >= 4)
33334       return false;
33335   for (i = 4; i < 8; ++i)
33336     if (d->perm[i] < 4)
33337       return false;
33338
33339   if (d->testing_p)
33340     return true;
33341
33342   /* Emit the pshuflw.  */
33343   memcpy (perm2, d->perm, 4);
33344   for (i = 4; i < 8; ++i)
33345     perm2[i] = i;
33346   ok = expand_vselect (d->target, d->op0, perm2, 8);
33347   gcc_assert (ok);
33348
33349   /* Emit the pshufhw.  */
33350   memcpy (perm2 + 4, d->perm + 4, 4);
33351   for (i = 0; i < 4; ++i)
33352     perm2[i] = i;
33353   ok = expand_vselect (d->target, d->target, perm2, 8);
33354   gcc_assert (ok);
33355
33356   return true;
33357 }
33358
33359 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
33360    the permutation using the SSSE3 palignr instruction.  This succeeds
33361    when all of the elements in PERM fit within one vector and we merely
33362    need to shift them down so that a single vector permutation has a
33363    chance to succeed.  */
33364
33365 static bool
33366 expand_vec_perm_palignr (struct expand_vec_perm_d *d)
33367 {
33368   unsigned i, nelt = d->nelt;
33369   unsigned min, max;
33370   bool in_order, ok;
33371   rtx shift;
33372
33373   /* Even with AVX, palignr only operates on 128-bit vectors.  */
33374   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
33375     return false;
33376
33377   min = nelt, max = 0;
33378   for (i = 0; i < nelt; ++i)
33379     {
33380       unsigned e = d->perm[i];
33381       if (e < min)
33382         min = e;
33383       if (e > max)
33384         max = e;
33385     }
33386   if (min == 0 || max - min >= nelt)
33387     return false;
33388
33389   /* Given that we have SSSE3, we know we'll be able to implement the
33390      single operand permutation after the palignr with pshufb.  */
33391   if (d->testing_p)
33392     return true;
33393
33394   shift = GEN_INT (min * GET_MODE_BITSIZE (GET_MODE_INNER (d->vmode)));
33395   emit_insn (gen_ssse3_palignrti (gen_lowpart (TImode, d->target),
33396                                   gen_lowpart (TImode, d->op1),
33397                                   gen_lowpart (TImode, d->op0), shift));
33398
33399   d->op0 = d->op1 = d->target;
33400
33401   in_order = true;
33402   for (i = 0; i < nelt; ++i)
33403     {
33404       unsigned e = d->perm[i] - min;
33405       if (e != i)
33406         in_order = false;
33407       d->perm[i] = e;
33408     }
33409
33410   /* Test for the degenerate case where the alignment by itself
33411      produces the desired permutation.  */
33412   if (in_order)
33413     return true;
33414
33415   ok = expand_vec_perm_1 (d);
33416   gcc_assert (ok);
33417
33418   return ok;
33419 }
33420
33421 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
33422    a two vector permutation into a single vector permutation by using
33423    an interleave operation to merge the vectors.  */
33424
33425 static bool
33426 expand_vec_perm_interleave2 (struct expand_vec_perm_d *d)
33427 {
33428   struct expand_vec_perm_d dremap, dfinal;
33429   unsigned i, nelt = d->nelt, nelt2 = nelt / 2;
33430   unsigned contents, h1, h2, h3, h4;
33431   unsigned char remap[2 * MAX_VECT_LEN];
33432   rtx seq;
33433   bool ok;
33434
33435   if (d->op0 == d->op1)
33436     return false;
33437
33438   /* The 256-bit unpck[lh]p[sd] instructions only operate within the 128-bit
33439      lanes.  We can use similar techniques with the vperm2f128 instruction,
33440      but it requires slightly different logic.  */
33441   if (GET_MODE_SIZE (d->vmode) != 16)
33442     return false;
33443
33444   /* Examine from whence the elements come.  */
33445   contents = 0;
33446   for (i = 0; i < nelt; ++i)
33447     contents |= 1u << d->perm[i];
33448
33449   /* Split the two input vectors into 4 halves.  */
33450   h1 = (1u << nelt2) - 1;
33451   h2 = h1 << nelt2;
33452   h3 = h2 << nelt2;
33453   h4 = h3 << nelt2;
33454
33455   memset (remap, 0xff, sizeof (remap));
33456   dremap = *d;
33457
33458   /* If the elements from the low halves use interleave low, and similarly
33459      for interleave high.  If the elements are from mis-matched halves, we
33460      can use shufps for V4SF/V4SI or do a DImode shuffle.  */
33461   if ((contents & (h1 | h3)) == contents)
33462     {
33463       for (i = 0; i < nelt2; ++i)
33464         {
33465           remap[i] = i * 2;
33466           remap[i + nelt] = i * 2 + 1;
33467           dremap.perm[i * 2] = i;
33468           dremap.perm[i * 2 + 1] = i + nelt;
33469         }
33470     }
33471   else if ((contents & (h2 | h4)) == contents)
33472     {
33473       for (i = 0; i < nelt2; ++i)
33474         {
33475           remap[i + nelt2] = i * 2;
33476           remap[i + nelt + nelt2] = i * 2 + 1;
33477           dremap.perm[i * 2] = i + nelt2;
33478           dremap.perm[i * 2 + 1] = i + nelt + nelt2;
33479         }
33480     }
33481   else if ((contents & (h1 | h4)) == contents)
33482     {
33483       for (i = 0; i < nelt2; ++i)
33484         {
33485           remap[i] = i;
33486           remap[i + nelt + nelt2] = i + nelt2;
33487           dremap.perm[i] = i;
33488           dremap.perm[i + nelt2] = i + nelt + nelt2;
33489         }
33490       if (nelt != 4)
33491         {
33492           dremap.vmode = V2DImode;
33493           dremap.nelt = 2;
33494           dremap.perm[0] = 0;
33495           dremap.perm[1] = 3;
33496         }
33497     }
33498   else if ((contents & (h2 | h3)) == contents)
33499     {
33500       for (i = 0; i < nelt2; ++i)
33501         {
33502           remap[i + nelt2] = i;
33503           remap[i + nelt] = i + nelt2;
33504           dremap.perm[i] = i + nelt2;
33505           dremap.perm[i + nelt2] = i + nelt;
33506         }
33507       if (nelt != 4)
33508         {
33509           dremap.vmode = V2DImode;
33510           dremap.nelt = 2;
33511           dremap.perm[0] = 1;
33512           dremap.perm[1] = 2;
33513         }
33514     }
33515   else
33516     return false;
33517
33518   /* Use the remapping array set up above to move the elements from their
33519      swizzled locations into their final destinations.  */
33520   dfinal = *d;
33521   for (i = 0; i < nelt; ++i)
33522     {
33523       unsigned e = remap[d->perm[i]];
33524       gcc_assert (e < nelt);
33525       dfinal.perm[i] = e;
33526     }
33527   dfinal.op0 = gen_reg_rtx (dfinal.vmode);
33528   dfinal.op1 = dfinal.op0;
33529   dremap.target = dfinal.op0;
33530
33531   /* Test if the final remap can be done with a single insn.  For V4SFmode or
33532      V4SImode this *will* succeed.  For V8HImode or V16QImode it may not.  */
33533   start_sequence ();
33534   ok = expand_vec_perm_1 (&dfinal);
33535   seq = get_insns ();
33536   end_sequence ();
33537
33538   if (!ok)
33539     return false;
33540
33541   if (dremap.vmode != dfinal.vmode)
33542     {
33543       dremap.target = gen_lowpart (dremap.vmode, dremap.target);
33544       dremap.op0 = gen_lowpart (dremap.vmode, dremap.op0);
33545       dremap.op1 = gen_lowpart (dremap.vmode, dremap.op1);
33546     }
33547
33548   ok = expand_vec_perm_1 (&dremap);
33549   gcc_assert (ok);
33550
33551   emit_insn (seq);
33552   return true;
33553 }
33554
33555 /* A subroutine of expand_vec_perm_even_odd_1.  Implement the double-word
33556    permutation with two pshufb insns and an ior.  We should have already
33557    failed all two instruction sequences.  */
33558
33559 static bool
33560 expand_vec_perm_pshufb2 (struct expand_vec_perm_d *d)
33561 {
33562   rtx rperm[2][16], vperm, l, h, op, m128;
33563   unsigned int i, nelt, eltsz;
33564
33565   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
33566     return false;
33567   gcc_assert (d->op0 != d->op1);
33568
33569   nelt = d->nelt;
33570   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
33571
33572   /* Generate two permutation masks.  If the required element is within
33573      the given vector it is shuffled into the proper lane.  If the required
33574      element is in the other vector, force a zero into the lane by setting
33575      bit 7 in the permutation mask.  */
33576   m128 = GEN_INT (-128);
33577   for (i = 0; i < nelt; ++i)
33578     {
33579       unsigned j, e = d->perm[i];
33580       unsigned which = (e >= nelt);
33581       if (e >= nelt)
33582         e -= nelt;
33583
33584       for (j = 0; j < eltsz; ++j)
33585         {
33586           rperm[which][i*eltsz + j] = GEN_INT (e*eltsz + j);
33587           rperm[1-which][i*eltsz + j] = m128;
33588         }
33589     }
33590
33591   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[0]));
33592   vperm = force_reg (V16QImode, vperm);
33593
33594   l = gen_reg_rtx (V16QImode);
33595   op = gen_lowpart (V16QImode, d->op0);
33596   emit_insn (gen_ssse3_pshufbv16qi3 (l, op, vperm));
33597
33598   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[1]));
33599   vperm = force_reg (V16QImode, vperm);
33600
33601   h = gen_reg_rtx (V16QImode);
33602   op = gen_lowpart (V16QImode, d->op1);
33603   emit_insn (gen_ssse3_pshufbv16qi3 (h, op, vperm));
33604
33605   op = gen_lowpart (V16QImode, d->target);
33606   emit_insn (gen_iorv16qi3 (op, l, h));
33607
33608   return true;
33609 }
33610
33611 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement extract-even
33612    and extract-odd permutations.  */
33613
33614 static bool
33615 expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
33616 {
33617   rtx t1, t2, t3;
33618
33619   switch (d->vmode)
33620     {
33621     case V4DFmode:
33622       t1 = gen_reg_rtx (V4DFmode);
33623       t2 = gen_reg_rtx (V4DFmode);
33624
33625       /* Shuffle the lanes around into { 0 1 4 5 } and { 2 3 6 7 }.  */
33626       emit_insn (gen_avx_vperm2f128v4df3 (t1, d->op0, d->op1, GEN_INT (0x20)));
33627       emit_insn (gen_avx_vperm2f128v4df3 (t2, d->op0, d->op1, GEN_INT (0x31)));
33628
33629       /* Now an unpck[lh]pd will produce the result required.  */
33630       if (odd)
33631         t3 = gen_avx_unpckhpd256 (d->target, t1, t2);
33632       else
33633         t3 = gen_avx_unpcklpd256 (d->target, t1, t2);
33634       emit_insn (t3);
33635       break;
33636
33637     case V8SFmode:
33638       {
33639         int mask = odd ? 0xdd : 0x88;
33640
33641         t1 = gen_reg_rtx (V8SFmode);
33642         t2 = gen_reg_rtx (V8SFmode);
33643         t3 = gen_reg_rtx (V8SFmode);
33644
33645         /* Shuffle within the 128-bit lanes to produce:
33646            { 0 2 8 a 4 6 c e } | { 1 3 9 b 5 7 d f }.  */
33647         emit_insn (gen_avx_shufps256 (t1, d->op0, d->op1,
33648                                       GEN_INT (mask)));
33649
33650         /* Shuffle the lanes around to produce:
33651            { 4 6 c e 0 2 8 a } and { 5 7 d f 1 3 9 b }.  */
33652         emit_insn (gen_avx_vperm2f128v8sf3 (t2, t1, t1,
33653                                             GEN_INT (0x3)));
33654
33655         /* Shuffle within the 128-bit lanes to produce:
33656            { 0 2 4 6 4 6 0 2 } | { 1 3 5 7 5 7 1 3 }.  */
33657         emit_insn (gen_avx_shufps256 (t3, t1, t2, GEN_INT (0x44)));
33658
33659         /* Shuffle within the 128-bit lanes to produce:
33660            { 8 a c e c e 8 a } | { 9 b d f d f 9 b }.  */
33661         emit_insn (gen_avx_shufps256 (t2, t1, t2, GEN_INT (0xee)));
33662
33663         /* Shuffle the lanes around to produce:
33664            { 0 2 4 6 8 a c e } | { 1 3 5 7 9 b d f }.  */
33665         emit_insn (gen_avx_vperm2f128v8sf3 (d->target, t3, t2,
33666                                             GEN_INT (0x20)));
33667       }
33668       break;
33669
33670     case V2DFmode:
33671     case V4SFmode:
33672     case V2DImode:
33673     case V4SImode:
33674       /* These are always directly implementable by expand_vec_perm_1.  */
33675       gcc_unreachable ();
33676
33677     case V8HImode:
33678       if (TARGET_SSSE3)
33679         return expand_vec_perm_pshufb2 (d);
33680       else
33681         {
33682           /* We need 2*log2(N)-1 operations to achieve odd/even
33683              with interleave. */
33684           t1 = gen_reg_rtx (V8HImode);
33685           t2 = gen_reg_rtx (V8HImode);
33686           emit_insn (gen_vec_interleave_highv8hi (t1, d->op0, d->op1));
33687           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->op0, d->op1));
33688           emit_insn (gen_vec_interleave_highv8hi (t2, d->target, t1));
33689           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->target, t1));
33690           if (odd)
33691             t3 = gen_vec_interleave_highv8hi (d->target, d->target, t2);
33692           else
33693             t3 = gen_vec_interleave_lowv8hi (d->target, d->target, t2);
33694           emit_insn (t3);
33695         }
33696       break;
33697
33698     case V16QImode:
33699       if (TARGET_SSSE3)
33700         return expand_vec_perm_pshufb2 (d);
33701       else
33702         {
33703           t1 = gen_reg_rtx (V16QImode);
33704           t2 = gen_reg_rtx (V16QImode);
33705           t3 = gen_reg_rtx (V16QImode);
33706           emit_insn (gen_vec_interleave_highv16qi (t1, d->op0, d->op1));
33707           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->op0, d->op1));
33708           emit_insn (gen_vec_interleave_highv16qi (t2, d->target, t1));
33709           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t1));
33710           emit_insn (gen_vec_interleave_highv16qi (t3, d->target, t2));
33711           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t2));
33712           if (odd)
33713             t3 = gen_vec_interleave_highv16qi (d->target, d->target, t3);
33714           else
33715             t3 = gen_vec_interleave_lowv16qi (d->target, d->target, t3);
33716           emit_insn (t3);
33717         }
33718       break;
33719
33720     default:
33721       gcc_unreachable ();
33722     }
33723
33724   return true;
33725 }
33726
33727 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
33728    extract-even and extract-odd permutations.  */
33729
33730 static bool
33731 expand_vec_perm_even_odd (struct expand_vec_perm_d *d)
33732 {
33733   unsigned i, odd, nelt = d->nelt;
33734
33735   odd = d->perm[0];
33736   if (odd != 0 && odd != 1)
33737     return false;
33738
33739   for (i = 1; i < nelt; ++i)
33740     if (d->perm[i] != 2 * i + odd)
33741       return false;
33742
33743   return expand_vec_perm_even_odd_1 (d, odd);
33744 }
33745
33746 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement broadcast
33747    permutations.  We assume that expand_vec_perm_1 has already failed.  */
33748
33749 static bool
33750 expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d)
33751 {
33752   unsigned elt = d->perm[0], nelt2 = d->nelt / 2;
33753   enum machine_mode vmode = d->vmode;
33754   unsigned char perm2[4];
33755   rtx op0 = d->op0;
33756   bool ok;
33757
33758   switch (vmode)
33759     {
33760     case V4DFmode:
33761     case V8SFmode:
33762       /* These are special-cased in sse.md so that we can optionally
33763          use the vbroadcast instruction.  They expand to two insns
33764          if the input happens to be in a register.  */
33765       gcc_unreachable ();
33766
33767     case V2DFmode:
33768     case V2DImode:
33769     case V4SFmode:
33770     case V4SImode:
33771       /* These are always implementable using standard shuffle patterns.  */
33772       gcc_unreachable ();
33773
33774     case V8HImode:
33775     case V16QImode:
33776       /* These can be implemented via interleave.  We save one insn by
33777          stopping once we have promoted to V4SImode and then use pshufd.  */
33778       do
33779         {
33780           optab otab = vec_interleave_low_optab;
33781
33782           if (elt >= nelt2)
33783             {
33784               otab = vec_interleave_high_optab;
33785               elt -= nelt2;
33786             }
33787           nelt2 /= 2;
33788
33789           op0 = expand_binop (vmode, otab, op0, op0, NULL, 0, OPTAB_DIRECT);
33790           vmode = get_mode_wider_vector (vmode);
33791           op0 = gen_lowpart (vmode, op0);
33792         }
33793       while (vmode != V4SImode);
33794
33795       memset (perm2, elt, 4);
33796       ok = expand_vselect (gen_lowpart (V4SImode, d->target), op0, perm2, 4);
33797       gcc_assert (ok);
33798       return true;
33799
33800     default:
33801       gcc_unreachable ();
33802     }
33803 }
33804
33805 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
33806    broadcast permutations.  */
33807
33808 static bool
33809 expand_vec_perm_broadcast (struct expand_vec_perm_d *d)
33810 {
33811   unsigned i, elt, nelt = d->nelt;
33812
33813   if (d->op0 != d->op1)
33814     return false;
33815
33816   elt = d->perm[0];
33817   for (i = 1; i < nelt; ++i)
33818     if (d->perm[i] != elt)
33819       return false;
33820
33821   return expand_vec_perm_broadcast_1 (d);
33822 }
33823
33824 /* The guts of ix86_expand_vec_perm_builtin, also used by the ok hook.
33825    With all of the interface bits taken care of, perform the expansion
33826    in D and return true on success.  */
33827
33828 static bool
33829 ix86_expand_vec_perm_builtin_1 (struct expand_vec_perm_d *d)
33830 {
33831   /* Try a single instruction expansion.  */
33832   if (expand_vec_perm_1 (d))
33833     return true;
33834
33835   /* Try sequences of two instructions.  */
33836
33837   if (expand_vec_perm_pshuflw_pshufhw (d))
33838     return true;
33839
33840   if (expand_vec_perm_palignr (d))
33841     return true;
33842
33843   if (expand_vec_perm_interleave2 (d))
33844     return true;
33845
33846   if (expand_vec_perm_broadcast (d))
33847     return true;
33848
33849   /* Try sequences of three instructions.  */
33850
33851   if (expand_vec_perm_pshufb2 (d))
33852     return true;
33853
33854   /* ??? Look for narrow permutations whose element orderings would
33855      allow the promotion to a wider mode.  */
33856
33857   /* ??? Look for sequences of interleave or a wider permute that place
33858      the data into the correct lanes for a half-vector shuffle like
33859      pshuf[lh]w or vpermilps.  */
33860
33861   /* ??? Look for sequences of interleave that produce the desired results.
33862      The combinatorics of punpck[lh] get pretty ugly... */
33863
33864   if (expand_vec_perm_even_odd (d))
33865     return true;
33866
33867   return false;
33868 }
33869
33870 /* Extract the values from the vector CST into the permutation array in D.
33871    Return 0 on error, 1 if all values from the permutation come from the
33872    first vector, 2 if all values from the second vector, and 3 otherwise.  */
33873
33874 static int
33875 extract_vec_perm_cst (struct expand_vec_perm_d *d, tree cst)
33876 {
33877   tree list = TREE_VECTOR_CST_ELTS (cst);
33878   unsigned i, nelt = d->nelt;
33879   int ret = 0;
33880
33881   for (i = 0; i < nelt; ++i, list = TREE_CHAIN (list))
33882     {
33883       unsigned HOST_WIDE_INT e;
33884
33885       if (!host_integerp (TREE_VALUE (list), 1))
33886         return 0;
33887       e = tree_low_cst (TREE_VALUE (list), 1);
33888       if (e >= 2 * nelt)
33889         return 0;
33890
33891       ret |= (e < nelt ? 1 : 2);
33892       d->perm[i] = e;
33893     }
33894   gcc_assert (list == NULL);
33895
33896   /* For all elements from second vector, fold the elements to first.  */
33897   if (ret == 2)
33898     for (i = 0; i < nelt; ++i)
33899       d->perm[i] -= nelt;
33900
33901   return ret;
33902 }
33903
33904 static rtx
33905 ix86_expand_vec_perm_builtin (tree exp)
33906 {
33907   struct expand_vec_perm_d d;
33908   tree arg0, arg1, arg2;
33909
33910   arg0 = CALL_EXPR_ARG (exp, 0);
33911   arg1 = CALL_EXPR_ARG (exp, 1);
33912   arg2 = CALL_EXPR_ARG (exp, 2);
33913
33914   d.vmode = TYPE_MODE (TREE_TYPE (arg0));
33915   d.nelt = GET_MODE_NUNITS (d.vmode);
33916   d.testing_p = false;
33917   gcc_assert (VECTOR_MODE_P (d.vmode));
33918
33919   if (TREE_CODE (arg2) != VECTOR_CST)
33920     {
33921       error_at (EXPR_LOCATION (exp),
33922                 "vector permutation requires vector constant");
33923       goto exit_error;
33924     }
33925
33926   switch (extract_vec_perm_cst (&d, arg2))
33927     {
33928     default:
33929       gcc_unreachable();
33930
33931     case 0:
33932       error_at (EXPR_LOCATION (exp), "invalid vector permutation constant");
33933       goto exit_error;
33934
33935     case 3:
33936       if (!operand_equal_p (arg0, arg1, 0))
33937         {
33938           d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
33939           d.op0 = force_reg (d.vmode, d.op0);
33940           d.op1 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
33941           d.op1 = force_reg (d.vmode, d.op1);
33942           break;
33943         }
33944
33945       /* The elements of PERM do not suggest that only the first operand
33946          is used, but both operands are identical.  Allow easier matching
33947          of the permutation by folding the permutation into the single
33948          input vector.  */
33949       {
33950         unsigned i, nelt = d.nelt;
33951         for (i = 0; i < nelt; ++i)
33952           if (d.perm[i] >= nelt)
33953             d.perm[i] -= nelt;
33954       }
33955       /* FALLTHRU */
33956
33957     case 1:
33958       d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
33959       d.op0 = force_reg (d.vmode, d.op0);
33960       d.op1 = d.op0;
33961       break;
33962
33963     case 2:
33964       d.op0 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
33965       d.op0 = force_reg (d.vmode, d.op0);
33966       d.op1 = d.op0;
33967       break;
33968     }
33969
33970   d.target = gen_reg_rtx (d.vmode);
33971   if (ix86_expand_vec_perm_builtin_1 (&d))
33972     return d.target;
33973
33974   /* For compiler generated permutations, we should never got here, because
33975      the compiler should also be checking the ok hook.  But since this is a
33976      builtin the user has access too, so don't abort.  */
33977   switch (d.nelt)
33978     {
33979     case 2:
33980       sorry ("vector permutation (%d %d)", d.perm[0], d.perm[1]);
33981       break;
33982     case 4:
33983       sorry ("vector permutation (%d %d %d %d)",
33984              d.perm[0], d.perm[1], d.perm[2], d.perm[3]);
33985       break;
33986     case 8:
33987       sorry ("vector permutation (%d %d %d %d %d %d %d %d)",
33988              d.perm[0], d.perm[1], d.perm[2], d.perm[3],
33989              d.perm[4], d.perm[5], d.perm[6], d.perm[7]);
33990       break;
33991     case 16:
33992       sorry ("vector permutation "
33993              "(%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d)",
33994              d.perm[0], d.perm[1], d.perm[2], d.perm[3],
33995              d.perm[4], d.perm[5], d.perm[6], d.perm[7],
33996              d.perm[8], d.perm[9], d.perm[10], d.perm[11],
33997              d.perm[12], d.perm[13], d.perm[14], d.perm[15]);
33998       break;
33999     default:
34000       gcc_unreachable ();
34001     }
34002  exit_error:
34003   return CONST0_RTX (d.vmode);
34004 }
34005
34006 /* Implement targetm.vectorize.builtin_vec_perm_ok.  */
34007
34008 static bool
34009 ix86_vectorize_builtin_vec_perm_ok (tree vec_type, tree mask)
34010 {
34011   struct expand_vec_perm_d d;
34012   int vec_mask;
34013   bool ret, one_vec;
34014
34015   d.vmode = TYPE_MODE (vec_type);
34016   d.nelt = GET_MODE_NUNITS (d.vmode);
34017   d.testing_p = true;
34018
34019   /* Given sufficient ISA support we can just return true here
34020      for selected vector modes.  */
34021   if (GET_MODE_SIZE (d.vmode) == 16)
34022     {
34023       /* All implementable with a single vpperm insn.  */
34024       if (TARGET_XOP)
34025         return true;
34026       /* All implementable with 2 pshufb + 1 ior.  */
34027       if (TARGET_SSSE3)
34028         return true;
34029       /* All implementable with shufpd or unpck[lh]pd.  */
34030       if (d.nelt == 2)
34031         return true;
34032     }
34033
34034   vec_mask = extract_vec_perm_cst (&d, mask);
34035
34036   /* This hook is cannot be called in response to something that the
34037      user does (unlike the builtin expander) so we shouldn't ever see
34038      an error generated from the extract.  */
34039   gcc_assert (vec_mask > 0 && vec_mask <= 3);
34040   one_vec = (vec_mask != 3);
34041
34042   /* Implementable with shufps or pshufd.  */
34043   if (one_vec && (d.vmode == V4SFmode || d.vmode == V4SImode))
34044     return true;
34045
34046   /* Otherwise we have to go through the motions and see if we can
34047      figure out how to generate the requested permutation.  */
34048   d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
34049   d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
34050   if (!one_vec)
34051     d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
34052
34053   start_sequence ();
34054   ret = ix86_expand_vec_perm_builtin_1 (&d);
34055   end_sequence ();
34056
34057   return ret;
34058 }
34059
34060 void
34061 ix86_expand_vec_extract_even_odd (rtx targ, rtx op0, rtx op1, unsigned odd)
34062 {
34063   struct expand_vec_perm_d d;
34064   unsigned i, nelt;
34065
34066   d.target = targ;
34067   d.op0 = op0;
34068   d.op1 = op1;
34069   d.vmode = GET_MODE (targ);
34070   d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
34071   d.testing_p = false;
34072
34073   for (i = 0; i < nelt; ++i)
34074     d.perm[i] = i * 2 + odd;
34075
34076   /* We'll either be able to implement the permutation directly...  */
34077   if (expand_vec_perm_1 (&d))
34078     return;
34079
34080   /* ... or we use the special-case patterns.  */
34081   expand_vec_perm_even_odd_1 (&d, odd);
34082 }
34083
34084 /* Expand an insert into a vector register through pinsr insn.
34085    Return true if successful.  */
34086
34087 bool
34088 ix86_expand_pinsr (rtx *operands)
34089 {
34090   rtx dst = operands[0];
34091   rtx src = operands[3];
34092
34093   unsigned int size = INTVAL (operands[1]);
34094   unsigned int pos = INTVAL (operands[2]);
34095
34096   if (GET_CODE (dst) == SUBREG)
34097     {
34098       pos += SUBREG_BYTE (dst) * BITS_PER_UNIT;
34099       dst = SUBREG_REG (dst);
34100     }
34101
34102   if (GET_CODE (src) == SUBREG)
34103     src = SUBREG_REG (src);
34104
34105   switch (GET_MODE (dst))
34106     {
34107     case V16QImode:
34108     case V8HImode:
34109     case V4SImode:
34110     case V2DImode:
34111       {
34112         enum machine_mode srcmode, dstmode;
34113         rtx (*pinsr)(rtx, rtx, rtx, rtx);
34114
34115         srcmode = mode_for_size (size, MODE_INT, 0);
34116
34117         switch (srcmode)
34118           {
34119           case QImode:
34120             if (!TARGET_SSE4_1)
34121               return false;
34122             dstmode = V16QImode;
34123             pinsr = gen_sse4_1_pinsrb;
34124             break;
34125
34126           case HImode:
34127             if (!TARGET_SSE2)
34128               return false;
34129             dstmode = V8HImode;
34130             pinsr = gen_sse2_pinsrw;
34131             break;
34132
34133           case SImode:
34134             if (!TARGET_SSE4_1)
34135               return false;
34136             dstmode = V4SImode;
34137             pinsr = gen_sse4_1_pinsrd;
34138             break;
34139
34140           case DImode:
34141             gcc_assert (TARGET_64BIT);
34142             if (!TARGET_SSE4_1)
34143               return false;
34144             dstmode = V2DImode;
34145             pinsr = gen_sse4_1_pinsrq;
34146             break;
34147
34148           default:
34149             return false;
34150           }
34151
34152         dst = gen_lowpart (dstmode, dst);
34153         src = gen_lowpart (srcmode, src);
34154
34155         pos /= size;
34156
34157         emit_insn (pinsr (dst, dst, src, GEN_INT (1 << pos)));
34158         return true;
34159       }
34160
34161     default:
34162       return false;
34163     }
34164 }
34165 \f
34166 /* This function returns the calling abi specific va_list type node.
34167    It returns  the FNDECL specific va_list type.  */
34168
34169 static tree
34170 ix86_fn_abi_va_list (tree fndecl)
34171 {
34172   if (!TARGET_64BIT)
34173     return va_list_type_node;
34174   gcc_assert (fndecl != NULL_TREE);
34175
34176   if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
34177     return ms_va_list_type_node;
34178   else
34179     return sysv_va_list_type_node;
34180 }
34181
34182 /* Returns the canonical va_list type specified by TYPE. If there
34183    is no valid TYPE provided, it return NULL_TREE.  */
34184
34185 static tree
34186 ix86_canonical_va_list_type (tree type)
34187 {
34188   tree wtype, htype;
34189
34190   /* Resolve references and pointers to va_list type.  */
34191   if (TREE_CODE (type) == MEM_REF)
34192     type = TREE_TYPE (type);
34193   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
34194     type = TREE_TYPE (type);
34195   else if (POINTER_TYPE_P (type) && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
34196     type = TREE_TYPE (type);
34197
34198   if (TARGET_64BIT && va_list_type_node != NULL_TREE)
34199     {
34200       wtype = va_list_type_node;
34201           gcc_assert (wtype != NULL_TREE);
34202       htype = type;
34203       if (TREE_CODE (wtype) == ARRAY_TYPE)
34204         {
34205           /* If va_list is an array type, the argument may have decayed
34206              to a pointer type, e.g. by being passed to another function.
34207              In that case, unwrap both types so that we can compare the
34208              underlying records.  */
34209           if (TREE_CODE (htype) == ARRAY_TYPE
34210               || POINTER_TYPE_P (htype))
34211             {
34212               wtype = TREE_TYPE (wtype);
34213               htype = TREE_TYPE (htype);
34214             }
34215         }
34216       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34217         return va_list_type_node;
34218       wtype = sysv_va_list_type_node;
34219           gcc_assert (wtype != NULL_TREE);
34220       htype = type;
34221       if (TREE_CODE (wtype) == ARRAY_TYPE)
34222         {
34223           /* If va_list is an array type, the argument may have decayed
34224              to a pointer type, e.g. by being passed to another function.
34225              In that case, unwrap both types so that we can compare the
34226              underlying records.  */
34227           if (TREE_CODE (htype) == ARRAY_TYPE
34228               || POINTER_TYPE_P (htype))
34229             {
34230               wtype = TREE_TYPE (wtype);
34231               htype = TREE_TYPE (htype);
34232             }
34233         }
34234       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34235         return sysv_va_list_type_node;
34236       wtype = ms_va_list_type_node;
34237           gcc_assert (wtype != NULL_TREE);
34238       htype = type;
34239       if (TREE_CODE (wtype) == ARRAY_TYPE)
34240         {
34241           /* If va_list is an array type, the argument may have decayed
34242              to a pointer type, e.g. by being passed to another function.
34243              In that case, unwrap both types so that we can compare the
34244              underlying records.  */
34245           if (TREE_CODE (htype) == ARRAY_TYPE
34246               || POINTER_TYPE_P (htype))
34247             {
34248               wtype = TREE_TYPE (wtype);
34249               htype = TREE_TYPE (htype);
34250             }
34251         }
34252       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34253         return ms_va_list_type_node;
34254       return NULL_TREE;
34255     }
34256   return std_canonical_va_list_type (type);
34257 }
34258
34259 /* Iterate through the target-specific builtin types for va_list.
34260    IDX denotes the iterator, *PTREE is set to the result type of
34261    the va_list builtin, and *PNAME to its internal type.
34262    Returns zero if there is no element for this index, otherwise
34263    IDX should be increased upon the next call.
34264    Note, do not iterate a base builtin's name like __builtin_va_list.
34265    Used from c_common_nodes_and_builtins.  */
34266
34267 static int
34268 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
34269 {
34270   if (TARGET_64BIT)
34271     {
34272       switch (idx)
34273         {
34274         default:
34275           break;
34276
34277         case 0:
34278           *ptree = ms_va_list_type_node;
34279           *pname = "__builtin_ms_va_list";
34280           return 1;
34281
34282         case 1:
34283           *ptree = sysv_va_list_type_node;
34284           *pname = "__builtin_sysv_va_list";
34285           return 1;
34286         }
34287     }
34288
34289   return 0;
34290 }
34291
34292 #undef TARGET_SCHED_DISPATCH
34293 #define TARGET_SCHED_DISPATCH has_dispatch
34294 #undef TARGET_SCHED_DISPATCH_DO
34295 #define TARGET_SCHED_DISPATCH_DO do_dispatch
34296
34297 /* The size of the dispatch window is the total number of bytes of
34298    object code allowed in a window.  */
34299 #define DISPATCH_WINDOW_SIZE 16
34300
34301 /* Number of dispatch windows considered for scheduling.  */
34302 #define MAX_DISPATCH_WINDOWS 3
34303
34304 /* Maximum number of instructions in a window.  */
34305 #define MAX_INSN 4
34306
34307 /* Maximum number of immediate operands in a window.  */
34308 #define MAX_IMM 4
34309
34310 /* Maximum number of immediate bits allowed in a window.  */
34311 #define MAX_IMM_SIZE 128
34312
34313 /* Maximum number of 32 bit immediates allowed in a window.  */
34314 #define MAX_IMM_32 4
34315
34316 /* Maximum number of 64 bit immediates allowed in a window.  */
34317 #define MAX_IMM_64 2
34318
34319 /* Maximum total of loads or prefetches allowed in a window.  */
34320 #define MAX_LOAD 2
34321
34322 /* Maximum total of stores allowed in a window.  */
34323 #define MAX_STORE 1
34324
34325 #undef BIG
34326 #define BIG 100
34327
34328
34329 /* Dispatch groups.  Istructions that affect the mix in a dispatch window.  */
34330 enum dispatch_group {
34331   disp_no_group = 0,
34332   disp_load,
34333   disp_store,
34334   disp_load_store,
34335   disp_prefetch,
34336   disp_imm,
34337   disp_imm_32,
34338   disp_imm_64,
34339   disp_branch,
34340   disp_cmp,
34341   disp_jcc,
34342   disp_last
34343 };
34344
34345 /* Number of allowable groups in a dispatch window.  It is an array
34346    indexed by dispatch_group enum.  100 is used as a big number,
34347    because the number of these kind of operations does not have any
34348    effect in dispatch window, but we need them for other reasons in
34349    the table.  */
34350 static unsigned int num_allowable_groups[disp_last] = {
34351   0, 2, 1, 1, 2, 4, 4, 2, 1, BIG, BIG
34352 };
34353
34354 char group_name[disp_last + 1][16] = {
34355   "disp_no_group", "disp_load", "disp_store", "disp_load_store",
34356   "disp_prefetch", "disp_imm", "disp_imm_32", "disp_imm_64",
34357   "disp_branch", "disp_cmp", "disp_jcc", "disp_last"
34358 };
34359
34360 /* Instruction path.  */
34361 enum insn_path {
34362   no_path = 0,
34363   path_single, /* Single micro op.  */
34364   path_double, /* Double micro op.  */
34365   path_multi,  /* Instructions with more than 2 micro op..  */
34366   last_path
34367 };
34368
34369 /* sched_insn_info defines a window to the instructions scheduled in
34370    the basic block.  It contains a pointer to the insn_info table and
34371    the instruction scheduled.
34372
34373    Windows are allocated for each basic block and are linked
34374    together.  */
34375 typedef struct sched_insn_info_s {
34376   rtx insn;
34377   enum dispatch_group group;
34378   enum insn_path path;
34379   int byte_len;
34380   int imm_bytes;
34381 } sched_insn_info;
34382
34383 /* Linked list of dispatch windows.  This is a two way list of
34384    dispatch windows of a basic block.  It contains information about
34385    the number of uops in the window and the total number of
34386    instructions and of bytes in the object code for this dispatch
34387    window.  */
34388 typedef struct dispatch_windows_s {
34389   int num_insn;            /* Number of insn in the window.  */
34390   int num_uops;            /* Number of uops in the window.  */
34391   int window_size;         /* Number of bytes in the window.  */
34392   int window_num;          /* Window number between 0 or 1.  */
34393   int num_imm;             /* Number of immediates in an insn.  */
34394   int num_imm_32;          /* Number of 32 bit immediates in an insn.  */
34395   int num_imm_64;          /* Number of 64 bit immediates in an insn.  */
34396   int imm_size;            /* Total immediates in the window.  */
34397   int num_loads;           /* Total memory loads in the window.  */
34398   int num_stores;          /* Total memory stores in the window.  */
34399   int violation;          /* Violation exists in window.  */
34400   sched_insn_info *window; /* Pointer to the window.  */
34401   struct dispatch_windows_s *next;
34402   struct dispatch_windows_s *prev;
34403 } dispatch_windows;
34404
34405 /* Immediate valuse used in an insn.  */
34406 typedef struct imm_info_s
34407   {
34408     int imm;
34409     int imm32;
34410     int imm64;
34411   } imm_info;
34412
34413 static dispatch_windows *dispatch_window_list;
34414 static dispatch_windows *dispatch_window_list1;
34415
34416 /* Get dispatch group of insn.  */
34417
34418 static enum dispatch_group
34419 get_mem_group (rtx insn)
34420 {
34421   enum attr_memory memory;
34422
34423   if (INSN_CODE (insn) < 0)
34424     return disp_no_group;
34425   memory = get_attr_memory (insn);
34426   if (memory == MEMORY_STORE)
34427     return disp_store;
34428
34429   if (memory == MEMORY_LOAD)
34430     return disp_load;
34431
34432   if (memory == MEMORY_BOTH)
34433     return disp_load_store;
34434
34435   return disp_no_group;
34436 }
34437
34438 /* Return true if insn is a compare instruction.  */
34439
34440 static bool
34441 is_cmp (rtx insn)
34442 {
34443   enum attr_type type;
34444
34445   type = get_attr_type (insn);
34446   return (type == TYPE_TEST
34447           || type == TYPE_ICMP
34448           || type == TYPE_FCMP
34449           || GET_CODE (PATTERN (insn)) == COMPARE);
34450 }
34451
34452 /* Return true if a dispatch violation encountered.  */
34453
34454 static bool
34455 dispatch_violation (void)
34456 {
34457   if (dispatch_window_list->next)
34458     return dispatch_window_list->next->violation;
34459   return dispatch_window_list->violation;
34460 }
34461
34462 /* Return true if insn is a branch instruction.  */
34463
34464 static bool
34465 is_branch (rtx insn)
34466 {
34467   return (CALL_P (insn) || JUMP_P (insn));
34468 }
34469
34470 /* Return true if insn is a prefetch instruction.  */
34471
34472 static bool
34473 is_prefetch (rtx insn)
34474 {
34475   return NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == PREFETCH;
34476 }
34477
34478 /* This function initializes a dispatch window and the list container holding a
34479    pointer to the window.  */
34480
34481 static void
34482 init_window (int window_num)
34483 {
34484   int i;
34485   dispatch_windows *new_list;
34486
34487   if (window_num == 0)
34488     new_list = dispatch_window_list;
34489   else
34490     new_list = dispatch_window_list1;
34491
34492   new_list->num_insn = 0;
34493   new_list->num_uops = 0;
34494   new_list->window_size = 0;
34495   new_list->next = NULL;
34496   new_list->prev = NULL;
34497   new_list->window_num = window_num;
34498   new_list->num_imm = 0;
34499   new_list->num_imm_32 = 0;
34500   new_list->num_imm_64 = 0;
34501   new_list->imm_size = 0;
34502   new_list->num_loads = 0;
34503   new_list->num_stores = 0;
34504   new_list->violation = false;
34505
34506   for (i = 0; i < MAX_INSN; i++)
34507     {
34508       new_list->window[i].insn = NULL;
34509       new_list->window[i].group = disp_no_group;
34510       new_list->window[i].path = no_path;
34511       new_list->window[i].byte_len = 0;
34512       new_list->window[i].imm_bytes = 0;
34513     }
34514   return;
34515 }
34516
34517 /* This function allocates and initializes a dispatch window and the
34518    list container holding a pointer to the window.  */
34519
34520 static dispatch_windows *
34521 allocate_window (void)
34522 {
34523   dispatch_windows *new_list = XNEW (struct dispatch_windows_s);
34524   new_list->window = XNEWVEC (struct sched_insn_info_s, MAX_INSN + 1);
34525
34526   return new_list;
34527 }
34528
34529 /* This routine initializes the dispatch scheduling information.  It
34530    initiates building dispatch scheduler tables and constructs the
34531    first dispatch window.  */
34532
34533 static void
34534 init_dispatch_sched (void)
34535 {
34536   /* Allocate a dispatch list and a window.  */
34537   dispatch_window_list = allocate_window ();
34538   dispatch_window_list1 = allocate_window ();
34539   init_window (0);
34540   init_window (1);
34541 }
34542
34543 /* This function returns true if a branch is detected.  End of a basic block
34544    does not have to be a branch, but here we assume only branches end a
34545    window.  */
34546
34547 static bool
34548 is_end_basic_block (enum dispatch_group group)
34549 {
34550   return group == disp_branch;
34551 }
34552
34553 /* This function is called when the end of a window processing is reached.  */
34554
34555 static void
34556 process_end_window (void)
34557 {
34558   gcc_assert (dispatch_window_list->num_insn <= MAX_INSN);
34559   if (dispatch_window_list->next)
34560     {
34561       gcc_assert (dispatch_window_list1->num_insn <= MAX_INSN);
34562       gcc_assert (dispatch_window_list->window_size
34563                   + dispatch_window_list1->window_size <= 48);
34564       init_window (1);
34565     }
34566   init_window (0);
34567 }
34568
34569 /* Allocates a new dispatch window and adds it to WINDOW_LIST.
34570    WINDOW_NUM is either 0 or 1.  A maximum of two windows are generated
34571    for 48 bytes of instructions.  Note that these windows are not dispatch
34572    windows that their sizes are DISPATCH_WINDOW_SIZE.  */
34573
34574 static dispatch_windows *
34575 allocate_next_window (int window_num)
34576 {
34577   if (window_num == 0)
34578     {
34579       if (dispatch_window_list->next)
34580           init_window (1);
34581       init_window (0);
34582       return dispatch_window_list;
34583     }
34584
34585   dispatch_window_list->next = dispatch_window_list1;
34586   dispatch_window_list1->prev = dispatch_window_list;
34587
34588   return dispatch_window_list1;
34589 }
34590
34591 /* Increment the number of immediate operands of an instruction.  */
34592
34593 static int
34594 find_constant_1 (rtx *in_rtx, imm_info *imm_values)
34595 {
34596   if (*in_rtx == 0)
34597     return 0;
34598
34599     switch ( GET_CODE (*in_rtx))
34600     {
34601     case CONST:
34602     case SYMBOL_REF:
34603     case CONST_INT:
34604       (imm_values->imm)++;
34605       if (x86_64_immediate_operand (*in_rtx, SImode))
34606         (imm_values->imm32)++;
34607       else
34608         (imm_values->imm64)++;
34609       break;
34610
34611     case CONST_DOUBLE:
34612       (imm_values->imm)++;
34613       (imm_values->imm64)++;
34614       break;
34615
34616     case CODE_LABEL:
34617       if (LABEL_KIND (*in_rtx) == LABEL_NORMAL)
34618         {
34619           (imm_values->imm)++;
34620           (imm_values->imm32)++;
34621         }
34622       break;
34623
34624     default:
34625       break;
34626     }
34627
34628   return 0;
34629 }
34630
34631 /* Compute number of immediate operands of an instruction.  */
34632
34633 static void
34634 find_constant (rtx in_rtx, imm_info *imm_values)
34635 {
34636   for_each_rtx (INSN_P (in_rtx) ? &PATTERN (in_rtx) : &in_rtx,
34637                 (rtx_function) find_constant_1, (void *) imm_values);
34638 }
34639
34640 /* Return total size of immediate operands of an instruction along with number
34641    of corresponding immediate-operands.  It initializes its parameters to zero
34642    befor calling FIND_CONSTANT.
34643    INSN is the input instruction.  IMM is the total of immediates.
34644    IMM32 is the number of 32 bit immediates.  IMM64 is the number of 64
34645    bit immediates.  */
34646
34647 static int
34648 get_num_immediates (rtx insn, int *imm, int *imm32, int *imm64)
34649 {
34650   imm_info imm_values = {0, 0, 0};
34651
34652   find_constant (insn, &imm_values);
34653   *imm = imm_values.imm;
34654   *imm32 = imm_values.imm32;
34655   *imm64 = imm_values.imm64;
34656   return imm_values.imm32 * 4 + imm_values.imm64 * 8;
34657 }
34658
34659 /* This function indicates if an operand of an instruction is an
34660    immediate.  */
34661
34662 static bool
34663 has_immediate (rtx insn)
34664 {
34665   int num_imm_operand;
34666   int num_imm32_operand;
34667   int num_imm64_operand;
34668
34669   if (insn)
34670     return get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34671                                &num_imm64_operand);
34672   return false;
34673 }
34674
34675 /* Return single or double path for instructions.  */
34676
34677 static enum insn_path
34678 get_insn_path (rtx insn)
34679 {
34680   enum attr_amdfam10_decode path = get_attr_amdfam10_decode (insn);
34681
34682   if ((int)path == 0)
34683     return path_single;
34684
34685   if ((int)path == 1)
34686     return path_double;
34687
34688   return path_multi;
34689 }
34690
34691 /* Return insn dispatch group.  */
34692
34693 static enum dispatch_group
34694 get_insn_group (rtx insn)
34695 {
34696   enum dispatch_group group = get_mem_group (insn);
34697   if (group)
34698     return group;
34699
34700   if (is_branch (insn))
34701     return disp_branch;
34702
34703   if (is_cmp (insn))
34704     return disp_cmp;
34705
34706   if (has_immediate (insn))
34707     return disp_imm;
34708
34709   if (is_prefetch (insn))
34710     return disp_prefetch;
34711
34712   return disp_no_group;
34713 }
34714
34715 /* Count number of GROUP restricted instructions in a dispatch
34716    window WINDOW_LIST.  */
34717
34718 static int
34719 count_num_restricted (rtx insn, dispatch_windows *window_list)
34720 {
34721   enum dispatch_group group = get_insn_group (insn);
34722   int imm_size;
34723   int num_imm_operand;
34724   int num_imm32_operand;
34725   int num_imm64_operand;
34726
34727   if (group == disp_no_group)
34728     return 0;
34729
34730   if (group == disp_imm)
34731     {
34732       imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34733                               &num_imm64_operand);
34734       if (window_list->imm_size + imm_size > MAX_IMM_SIZE
34735           || num_imm_operand + window_list->num_imm > MAX_IMM
34736           || (num_imm32_operand > 0
34737               && (window_list->num_imm_32 + num_imm32_operand > MAX_IMM_32
34738                   || window_list->num_imm_64 * 2 + num_imm32_operand > MAX_IMM_32))
34739           || (num_imm64_operand > 0
34740               && (window_list->num_imm_64 + num_imm64_operand > MAX_IMM_64
34741                   || window_list->num_imm_32 + num_imm64_operand * 2 > MAX_IMM_32))
34742           || (window_list->imm_size + imm_size == MAX_IMM_SIZE
34743               && num_imm64_operand > 0
34744               && ((window_list->num_imm_64 > 0
34745                    && window_list->num_insn >= 2)
34746                   || window_list->num_insn >= 3)))
34747         return BIG;
34748
34749       return 1;
34750     }
34751
34752   if ((group == disp_load_store
34753        && (window_list->num_loads >= MAX_LOAD
34754            || window_list->num_stores >= MAX_STORE))
34755       || ((group == disp_load
34756            || group == disp_prefetch)
34757           && window_list->num_loads >= MAX_LOAD)
34758       || (group == disp_store
34759           && window_list->num_stores >= MAX_STORE))
34760     return BIG;
34761
34762   return 1;
34763 }
34764
34765 /* This function returns true if insn satisfies dispatch rules on the
34766    last window scheduled.  */
34767
34768 static bool
34769 fits_dispatch_window (rtx insn)
34770 {
34771   dispatch_windows *window_list = dispatch_window_list;
34772   dispatch_windows *window_list_next = dispatch_window_list->next;
34773   unsigned int num_restrict;
34774   enum dispatch_group group = get_insn_group (insn);
34775   enum insn_path path = get_insn_path (insn);
34776   int sum;
34777
34778   /* Make disp_cmp and disp_jcc get scheduled at the latest.  These
34779      instructions should be given the lowest priority in the
34780      scheduling process in Haifa scheduler to make sure they will be
34781      scheduled in the same dispatch window as the refrence to them.  */
34782   if (group == disp_jcc || group == disp_cmp)
34783     return false;
34784
34785   /* Check nonrestricted.  */
34786   if (group == disp_no_group || group == disp_branch)
34787     return true;
34788
34789   /* Get last dispatch window.  */
34790   if (window_list_next)
34791     window_list = window_list_next;
34792
34793   if (window_list->window_num == 1)
34794     {
34795       sum = window_list->prev->window_size + window_list->window_size;
34796
34797       if (sum == 32
34798           || (min_insn_size (insn) + sum) >= 48)
34799         /* Window 1 is full.  Go for next window.  */
34800         return true;
34801     }
34802
34803   num_restrict = count_num_restricted (insn, window_list);
34804
34805   if (num_restrict > num_allowable_groups[group])
34806     return false;
34807
34808   /* See if it fits in the first window.  */
34809   if (window_list->window_num == 0)
34810     {
34811       /* The first widow should have only single and double path
34812          uops.  */
34813       if (path == path_double
34814           && (window_list->num_uops + 2) > MAX_INSN)
34815         return false;
34816       else if (path != path_single)
34817         return false;
34818     }
34819   return true;
34820 }
34821
34822 /* Add an instruction INSN with NUM_UOPS micro-operations to the
34823    dispatch window WINDOW_LIST.  */
34824
34825 static void
34826 add_insn_window (rtx insn, dispatch_windows *window_list, int num_uops)
34827 {
34828   int byte_len = min_insn_size (insn);
34829   int num_insn = window_list->num_insn;
34830   int imm_size;
34831   sched_insn_info *window = window_list->window;
34832   enum dispatch_group group = get_insn_group (insn);
34833   enum insn_path path = get_insn_path (insn);
34834   int num_imm_operand;
34835   int num_imm32_operand;
34836   int num_imm64_operand;
34837
34838   if (!window_list->violation && group != disp_cmp
34839       && !fits_dispatch_window (insn))
34840     window_list->violation = true;
34841
34842   imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34843                                  &num_imm64_operand);
34844
34845   /* Initialize window with new instruction.  */
34846   window[num_insn].insn = insn;
34847   window[num_insn].byte_len = byte_len;
34848   window[num_insn].group = group;
34849   window[num_insn].path = path;
34850   window[num_insn].imm_bytes = imm_size;
34851
34852   window_list->window_size += byte_len;
34853   window_list->num_insn = num_insn + 1;
34854   window_list->num_uops = window_list->num_uops + num_uops;
34855   window_list->imm_size += imm_size;
34856   window_list->num_imm += num_imm_operand;
34857   window_list->num_imm_32 += num_imm32_operand;
34858   window_list->num_imm_64 += num_imm64_operand;
34859
34860   if (group == disp_store)
34861     window_list->num_stores += 1;
34862   else if (group == disp_load
34863            || group == disp_prefetch)
34864     window_list->num_loads += 1;
34865   else if (group == disp_load_store)
34866     {
34867       window_list->num_stores += 1;
34868       window_list->num_loads += 1;
34869     }
34870 }
34871
34872 /* Adds a scheduled instruction, INSN, to the current dispatch window.
34873    If the total bytes of instructions or the number of instructions in
34874    the window exceed allowable, it allocates a new window.  */
34875
34876 static void
34877 add_to_dispatch_window (rtx insn)
34878 {
34879   int byte_len;
34880   dispatch_windows *window_list;
34881   dispatch_windows *next_list;
34882   dispatch_windows *window0_list;
34883   enum insn_path path;
34884   enum dispatch_group insn_group;
34885   bool insn_fits;
34886   int num_insn;
34887   int num_uops;
34888   int window_num;
34889   int insn_num_uops;
34890   int sum;
34891
34892   if (INSN_CODE (insn) < 0)
34893     return;
34894
34895   byte_len = min_insn_size (insn);
34896   window_list = dispatch_window_list;
34897   next_list = window_list->next;
34898   path = get_insn_path (insn);
34899   insn_group = get_insn_group (insn);
34900
34901   /* Get the last dispatch window.  */
34902   if (next_list)
34903       window_list = dispatch_window_list->next;
34904
34905   if (path == path_single)
34906     insn_num_uops = 1;
34907   else if (path == path_double)
34908     insn_num_uops = 2;
34909   else
34910     insn_num_uops = (int) path;
34911
34912   /* If current window is full, get a new window.
34913      Window number zero is full, if MAX_INSN uops are scheduled in it.
34914      Window number one is full, if window zero's bytes plus window
34915      one's bytes is 32, or if the bytes of the new instruction added
34916      to the total makes it greater than 48, or it has already MAX_INSN
34917      instructions in it.  */
34918   num_insn = window_list->num_insn;
34919   num_uops = window_list->num_uops;
34920   window_num = window_list->window_num;
34921   insn_fits = fits_dispatch_window (insn);
34922
34923   if (num_insn >= MAX_INSN
34924       || num_uops + insn_num_uops > MAX_INSN
34925       || !(insn_fits))
34926     {
34927       window_num = ~window_num & 1;
34928       window_list = allocate_next_window (window_num);
34929     }
34930
34931   if (window_num == 0)
34932     {
34933       add_insn_window (insn, window_list, insn_num_uops);
34934       if (window_list->num_insn >= MAX_INSN
34935           && insn_group == disp_branch)
34936         {
34937           process_end_window ();
34938           return;
34939         }
34940     }
34941   else if (window_num == 1)
34942     {
34943       window0_list = window_list->prev;
34944       sum = window0_list->window_size + window_list->window_size;
34945       if (sum == 32
34946           || (byte_len + sum) >= 48)
34947         {
34948           process_end_window ();
34949           window_list = dispatch_window_list;
34950         }
34951
34952       add_insn_window (insn, window_list, insn_num_uops);
34953     }
34954   else
34955     gcc_unreachable ();
34956
34957   if (is_end_basic_block (insn_group))
34958     {
34959       /* End of basic block is reached do end-basic-block process.  */
34960       process_end_window ();
34961       return;
34962     }
34963 }
34964
34965 /* Print the dispatch window, WINDOW_NUM, to FILE.  */
34966
34967 DEBUG_FUNCTION static void
34968 debug_dispatch_window_file (FILE *file, int window_num)
34969 {
34970   dispatch_windows *list;
34971   int i;
34972
34973   if (window_num == 0)
34974     list = dispatch_window_list;
34975   else
34976     list = dispatch_window_list1;
34977
34978   fprintf (file, "Window #%d:\n", list->window_num);
34979   fprintf (file, "  num_insn = %d, num_uops = %d, window_size = %d\n",
34980           list->num_insn, list->num_uops, list->window_size);
34981   fprintf (file, "  num_imm = %d, num_imm_32 = %d, num_imm_64 = %d, imm_size = %d\n",
34982            list->num_imm, list->num_imm_32, list->num_imm_64, list->imm_size);
34983
34984   fprintf (file, "  num_loads = %d, num_stores = %d\n", list->num_loads,
34985           list->num_stores);
34986   fprintf (file, " insn info:\n");
34987
34988   for (i = 0; i < MAX_INSN; i++)
34989     {
34990       if (!list->window[i].insn)
34991         break;
34992       fprintf (file, "    group[%d] = %s, insn[%d] = %p, path[%d] = %d byte_len[%d] = %d, imm_bytes[%d] = %d\n",
34993               i, group_name[list->window[i].group],
34994               i, (void *)list->window[i].insn,
34995               i, list->window[i].path,
34996               i, list->window[i].byte_len,
34997               i, list->window[i].imm_bytes);
34998     }
34999 }
35000
35001 /* Print to stdout a dispatch window.  */
35002
35003 DEBUG_FUNCTION void
35004 debug_dispatch_window (int window_num)
35005 {
35006   debug_dispatch_window_file (stdout, window_num);
35007 }
35008
35009 /* Print INSN dispatch information to FILE.  */
35010
35011 DEBUG_FUNCTION static void
35012 debug_insn_dispatch_info_file (FILE *file, rtx insn)
35013 {
35014   int byte_len;
35015   enum insn_path path;
35016   enum dispatch_group group;
35017   int imm_size;
35018   int num_imm_operand;
35019   int num_imm32_operand;
35020   int num_imm64_operand;
35021
35022   if (INSN_CODE (insn) < 0)
35023     return;
35024
35025   byte_len = min_insn_size (insn);
35026   path = get_insn_path (insn);
35027   group = get_insn_group (insn);
35028   imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
35029                                  &num_imm64_operand);
35030
35031   fprintf (file, " insn info:\n");
35032   fprintf (file, "  group = %s, path = %d, byte_len = %d\n",
35033            group_name[group], path, byte_len);
35034   fprintf (file, "  num_imm = %d, num_imm_32 = %d, num_imm_64 = %d, imm_size = %d\n",
35035            num_imm_operand, num_imm32_operand, num_imm64_operand, imm_size);
35036 }
35037
35038 /* Print to STDERR the status of the ready list with respect to
35039    dispatch windows.  */
35040
35041 DEBUG_FUNCTION void
35042 debug_ready_dispatch (void)
35043 {
35044   int i;
35045   int no_ready = number_in_ready ();
35046
35047   fprintf (stdout, "Number of ready: %d\n", no_ready);
35048
35049   for (i = 0; i < no_ready; i++)
35050     debug_insn_dispatch_info_file (stdout, get_ready_element (i));
35051 }
35052
35053 /* This routine is the driver of the dispatch scheduler.  */
35054
35055 static void
35056 do_dispatch (rtx insn, int mode)
35057 {
35058   if (mode == DISPATCH_INIT)
35059     init_dispatch_sched ();
35060   else if (mode == ADD_TO_DISPATCH_WINDOW)
35061     add_to_dispatch_window (insn);
35062 }
35063
35064 /* Return TRUE if Dispatch Scheduling is supported.  */
35065
35066 static bool
35067 has_dispatch (rtx insn, int action)
35068 {
35069   if (ix86_tune == PROCESSOR_BDVER1 && flag_dispatch_scheduler)
35070     switch (action)
35071       {
35072       default:
35073         return false;
35074
35075       case IS_DISPATCH_ON:
35076         return true;
35077         break;
35078
35079       case IS_CMP:
35080         return is_cmp (insn);
35081
35082       case DISPATCH_VIOLATION:
35083         return dispatch_violation ();
35084
35085       case FITS_DISPATCH_WINDOW:
35086         return fits_dispatch_window (insn);
35087       }
35088
35089   return false;
35090 }
35091
35092 /* ??? No autovectorization into MMX or 3DNOW until we can reliably
35093    place emms and femms instructions.  */
35094
35095 static enum machine_mode
35096 ix86_preferred_simd_mode (enum machine_mode mode)
35097 {
35098   if (!TARGET_SSE)
35099     return word_mode;
35100
35101   switch (mode)
35102     {
35103     case QImode:
35104       return V16QImode;
35105     case HImode:
35106       return V8HImode;
35107     case SImode:
35108       return V4SImode;
35109     case DImode:
35110       return V2DImode;
35111
35112     case SFmode:
35113       if (TARGET_AVX && !flag_prefer_avx128)
35114         return V8SFmode;
35115       else
35116         return V4SFmode;
35117
35118     case DFmode:
35119       if (!TARGET_VECTORIZE_DOUBLE)
35120         return word_mode;
35121       else if (TARGET_AVX && !flag_prefer_avx128)
35122         return V4DFmode;
35123       else if (TARGET_SSE2)
35124         return V2DFmode;
35125       /* FALLTHRU */
35126
35127     default:
35128       return word_mode;
35129     }
35130 }
35131
35132 /* If AVX is enabled then try vectorizing with both 256bit and 128bit
35133    vectors.  */
35134
35135 static unsigned int
35136 ix86_autovectorize_vector_sizes (void)
35137 {
35138   return (TARGET_AVX && !flag_prefer_avx128) ? 32 | 16 : 0;
35139 }
35140
35141 /* Initialize the GCC target structure.  */
35142 #undef TARGET_RETURN_IN_MEMORY
35143 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
35144
35145 #undef TARGET_LEGITIMIZE_ADDRESS
35146 #define TARGET_LEGITIMIZE_ADDRESS ix86_legitimize_address
35147
35148 #undef TARGET_ATTRIBUTE_TABLE
35149 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
35150 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
35151 #  undef TARGET_MERGE_DECL_ATTRIBUTES
35152 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
35153 #endif
35154
35155 #undef TARGET_COMP_TYPE_ATTRIBUTES
35156 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
35157
35158 #undef TARGET_INIT_BUILTINS
35159 #define TARGET_INIT_BUILTINS ix86_init_builtins
35160 #undef TARGET_BUILTIN_DECL
35161 #define TARGET_BUILTIN_DECL ix86_builtin_decl
35162 #undef TARGET_EXPAND_BUILTIN
35163 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
35164
35165 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
35166 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
35167   ix86_builtin_vectorized_function
35168
35169 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
35170 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
35171
35172 #undef TARGET_BUILTIN_RECIPROCAL
35173 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
35174
35175 #undef TARGET_ASM_FUNCTION_EPILOGUE
35176 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
35177
35178 #undef TARGET_ENCODE_SECTION_INFO
35179 #ifndef SUBTARGET_ENCODE_SECTION_INFO
35180 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
35181 #else
35182 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
35183 #endif
35184
35185 #undef TARGET_ASM_OPEN_PAREN
35186 #define TARGET_ASM_OPEN_PAREN ""
35187 #undef TARGET_ASM_CLOSE_PAREN
35188 #define TARGET_ASM_CLOSE_PAREN ""
35189
35190 #undef TARGET_ASM_BYTE_OP
35191 #define TARGET_ASM_BYTE_OP ASM_BYTE
35192
35193 #undef TARGET_ASM_ALIGNED_HI_OP
35194 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
35195 #undef TARGET_ASM_ALIGNED_SI_OP
35196 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
35197 #ifdef ASM_QUAD
35198 #undef TARGET_ASM_ALIGNED_DI_OP
35199 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
35200 #endif
35201
35202 #undef TARGET_PROFILE_BEFORE_PROLOGUE
35203 #define TARGET_PROFILE_BEFORE_PROLOGUE ix86_profile_before_prologue
35204
35205 #undef TARGET_ASM_UNALIGNED_HI_OP
35206 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
35207 #undef TARGET_ASM_UNALIGNED_SI_OP
35208 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
35209 #undef TARGET_ASM_UNALIGNED_DI_OP
35210 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
35211
35212 #undef TARGET_PRINT_OPERAND
35213 #define TARGET_PRINT_OPERAND ix86_print_operand
35214 #undef TARGET_PRINT_OPERAND_ADDRESS
35215 #define TARGET_PRINT_OPERAND_ADDRESS ix86_print_operand_address
35216 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
35217 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P ix86_print_operand_punct_valid_p
35218 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
35219 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA i386_asm_output_addr_const_extra 
35220
35221 #undef TARGET_SCHED_INIT_GLOBAL
35222 #define TARGET_SCHED_INIT_GLOBAL ix86_sched_init_global
35223 #undef TARGET_SCHED_ADJUST_COST
35224 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
35225 #undef TARGET_SCHED_ISSUE_RATE
35226 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
35227 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
35228 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
35229   ia32_multipass_dfa_lookahead
35230
35231 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
35232 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
35233
35234 #ifdef HAVE_AS_TLS
35235 #undef TARGET_HAVE_TLS
35236 #define TARGET_HAVE_TLS true
35237 #endif
35238 #undef TARGET_CANNOT_FORCE_CONST_MEM
35239 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
35240 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
35241 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
35242
35243 #undef TARGET_DELEGITIMIZE_ADDRESS
35244 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
35245
35246 #undef TARGET_MS_BITFIELD_LAYOUT_P
35247 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
35248
35249 #if TARGET_MACHO
35250 #undef TARGET_BINDS_LOCAL_P
35251 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
35252 #endif
35253 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
35254 #undef TARGET_BINDS_LOCAL_P
35255 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
35256 #endif
35257
35258 #undef TARGET_ASM_OUTPUT_MI_THUNK
35259 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
35260 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
35261 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
35262
35263 #undef TARGET_ASM_FILE_START
35264 #define TARGET_ASM_FILE_START x86_file_start
35265
35266 #undef TARGET_DEFAULT_TARGET_FLAGS
35267 #define TARGET_DEFAULT_TARGET_FLAGS     \
35268   (TARGET_DEFAULT                       \
35269    | TARGET_SUBTARGET_DEFAULT           \
35270    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
35271
35272 #undef TARGET_HANDLE_OPTION
35273 #define TARGET_HANDLE_OPTION ix86_handle_option
35274
35275 #undef TARGET_OPTION_OVERRIDE
35276 #define TARGET_OPTION_OVERRIDE ix86_option_override
35277 #undef TARGET_OPTION_OPTIMIZATION_TABLE
35278 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
35279 #undef TARGET_OPTION_INIT_STRUCT
35280 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
35281
35282 #undef TARGET_REGISTER_MOVE_COST
35283 #define TARGET_REGISTER_MOVE_COST ix86_register_move_cost
35284 #undef TARGET_MEMORY_MOVE_COST
35285 #define TARGET_MEMORY_MOVE_COST ix86_memory_move_cost
35286 #undef TARGET_RTX_COSTS
35287 #define TARGET_RTX_COSTS ix86_rtx_costs
35288 #undef TARGET_ADDRESS_COST
35289 #define TARGET_ADDRESS_COST ix86_address_cost
35290
35291 #undef TARGET_FIXED_CONDITION_CODE_REGS
35292 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
35293 #undef TARGET_CC_MODES_COMPATIBLE
35294 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
35295
35296 #undef TARGET_MACHINE_DEPENDENT_REORG
35297 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
35298
35299 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
35300 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
35301
35302 #undef TARGET_BUILD_BUILTIN_VA_LIST
35303 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
35304
35305 #undef TARGET_ENUM_VA_LIST_P
35306 #define TARGET_ENUM_VA_LIST_P ix86_enum_va_list
35307
35308 #undef TARGET_FN_ABI_VA_LIST
35309 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
35310
35311 #undef TARGET_CANONICAL_VA_LIST_TYPE
35312 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
35313
35314 #undef TARGET_EXPAND_BUILTIN_VA_START
35315 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
35316
35317 #undef TARGET_MD_ASM_CLOBBERS
35318 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
35319
35320 #undef TARGET_PROMOTE_PROTOTYPES
35321 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
35322 #undef TARGET_STRUCT_VALUE_RTX
35323 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
35324 #undef TARGET_SETUP_INCOMING_VARARGS
35325 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
35326 #undef TARGET_MUST_PASS_IN_STACK
35327 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
35328 #undef TARGET_FUNCTION_ARG_ADVANCE
35329 #define TARGET_FUNCTION_ARG_ADVANCE ix86_function_arg_advance
35330 #undef TARGET_FUNCTION_ARG
35331 #define TARGET_FUNCTION_ARG ix86_function_arg
35332 #undef TARGET_FUNCTION_ARG_BOUNDARY
35333 #define TARGET_FUNCTION_ARG_BOUNDARY ix86_function_arg_boundary
35334 #undef TARGET_PASS_BY_REFERENCE
35335 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
35336 #undef TARGET_INTERNAL_ARG_POINTER
35337 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
35338 #undef TARGET_UPDATE_STACK_BOUNDARY
35339 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
35340 #undef TARGET_GET_DRAP_RTX
35341 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
35342 #undef TARGET_STRICT_ARGUMENT_NAMING
35343 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
35344 #undef TARGET_STATIC_CHAIN
35345 #define TARGET_STATIC_CHAIN ix86_static_chain
35346 #undef TARGET_TRAMPOLINE_INIT
35347 #define TARGET_TRAMPOLINE_INIT ix86_trampoline_init
35348 #undef TARGET_RETURN_POPS_ARGS
35349 #define TARGET_RETURN_POPS_ARGS ix86_return_pops_args
35350
35351 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
35352 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
35353
35354 #undef TARGET_SCALAR_MODE_SUPPORTED_P
35355 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
35356
35357 #undef TARGET_VECTOR_MODE_SUPPORTED_P
35358 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
35359
35360 #undef TARGET_C_MODE_FOR_SUFFIX
35361 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
35362
35363 #ifdef HAVE_AS_TLS
35364 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
35365 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
35366 #endif
35367
35368 #ifdef SUBTARGET_INSERT_ATTRIBUTES
35369 #undef TARGET_INSERT_ATTRIBUTES
35370 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
35371 #endif
35372
35373 #undef TARGET_MANGLE_TYPE
35374 #define TARGET_MANGLE_TYPE ix86_mangle_type
35375
35376 #undef TARGET_STACK_PROTECT_FAIL
35377 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
35378
35379 #undef TARGET_SUPPORTS_SPLIT_STACK
35380 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
35381
35382 #undef TARGET_FUNCTION_VALUE
35383 #define TARGET_FUNCTION_VALUE ix86_function_value
35384
35385 #undef TARGET_FUNCTION_VALUE_REGNO_P
35386 #define TARGET_FUNCTION_VALUE_REGNO_P ix86_function_value_regno_p
35387
35388 #undef TARGET_SECONDARY_RELOAD
35389 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
35390
35391 #undef TARGET_PREFERRED_RELOAD_CLASS
35392 #define TARGET_PREFERRED_RELOAD_CLASS ix86_preferred_reload_class
35393 #undef TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
35394 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS ix86_preferred_output_reload_class
35395 #undef TARGET_CLASS_LIKELY_SPILLED_P
35396 #define TARGET_CLASS_LIKELY_SPILLED_P ix86_class_likely_spilled_p
35397
35398 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
35399 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
35400   ix86_builtin_vectorization_cost
35401 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
35402 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM \
35403   ix86_vectorize_builtin_vec_perm
35404 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK
35405 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK \
35406   ix86_vectorize_builtin_vec_perm_ok
35407 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
35408 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
35409   ix86_preferred_simd_mode
35410 #undef TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES
35411 #define TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES \
35412   ix86_autovectorize_vector_sizes
35413
35414 #undef TARGET_SET_CURRENT_FUNCTION
35415 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
35416
35417 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
35418 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
35419
35420 #undef TARGET_OPTION_SAVE
35421 #define TARGET_OPTION_SAVE ix86_function_specific_save
35422
35423 #undef TARGET_OPTION_RESTORE
35424 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
35425
35426 #undef TARGET_OPTION_PRINT
35427 #define TARGET_OPTION_PRINT ix86_function_specific_print
35428
35429 #undef TARGET_CAN_INLINE_P
35430 #define TARGET_CAN_INLINE_P ix86_can_inline_p
35431
35432 #undef TARGET_EXPAND_TO_RTL_HOOK
35433 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
35434
35435 #undef TARGET_LEGITIMATE_ADDRESS_P
35436 #define TARGET_LEGITIMATE_ADDRESS_P ix86_legitimate_address_p
35437
35438 #undef TARGET_LEGITIMATE_CONSTANT_P
35439 #define TARGET_LEGITIMATE_CONSTANT_P ix86_legitimate_constant_p
35440
35441 #undef TARGET_FRAME_POINTER_REQUIRED
35442 #define TARGET_FRAME_POINTER_REQUIRED ix86_frame_pointer_required
35443
35444 #undef TARGET_CAN_ELIMINATE
35445 #define TARGET_CAN_ELIMINATE ix86_can_eliminate
35446
35447 #undef TARGET_EXTRA_LIVE_ON_ENTRY
35448 #define TARGET_EXTRA_LIVE_ON_ENTRY ix86_live_on_entry
35449
35450 #undef TARGET_ASM_CODE_END
35451 #define TARGET_ASM_CODE_END ix86_code_end
35452
35453 #undef TARGET_CONDITIONAL_REGISTER_USAGE
35454 #define TARGET_CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage
35455
35456 #if TARGET_MACHO
35457 #undef TARGET_INIT_LIBFUNCS
35458 #define TARGET_INIT_LIBFUNCS darwin_rename_builtins
35459 #endif
35460
35461 struct gcc_target targetm = TARGET_INITIALIZER;
35462 \f
35463 #include "gt-i386.h"