OSDN Git Service

Remove doubled up words.
[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
2088 /* Feature tests against the various architecture variations.  */
2089 unsigned char ix86_arch_features[X86_ARCH_LAST];
2090
2091 /* Feature tests against the various architecture variations, used to create
2092    ix86_arch_features based on the processor mask.  */
2093 static unsigned int initial_ix86_arch_features[X86_ARCH_LAST] = {
2094   /* X86_ARCH_CMOVE: Conditional move was added for pentiumpro.  */
2095   ~(m_386 | m_486 | m_PENT | m_K6),
2096
2097   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
2098   ~m_386,
2099
2100   /* X86_ARCH_CMPXCHG8B: Compare and exchange 8 bytes was added for pentium. */
2101   ~(m_386 | m_486),
2102
2103   /* X86_ARCH_XADD: Exchange and add was added for 80486.  */
2104   ~m_386,
2105
2106   /* X86_ARCH_BSWAP: Byteswap was added for 80486.  */
2107   ~m_386,
2108 };
2109
2110 static const unsigned int x86_accumulate_outgoing_args
2111   = m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2I7
2112     | m_GENERIC;
2113
2114 static const unsigned int x86_arch_always_fancy_math_387
2115   = m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4
2116     | m_NOCONA | m_CORE2I7 | m_GENERIC;
2117
2118 static enum stringop_alg stringop_alg = no_stringop;
2119
2120 /* In case the average insn count for single function invocation is
2121    lower than this constant, emit fast (but longer) prologue and
2122    epilogue code.  */
2123 #define FAST_PROLOGUE_INSN_COUNT 20
2124
2125 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
2126 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
2127 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
2128 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
2129
2130 /* Array of the smallest class containing reg number REGNO, indexed by
2131    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
2132
2133 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
2134 {
2135   /* ax, dx, cx, bx */
2136   AREG, DREG, CREG, BREG,
2137   /* si, di, bp, sp */
2138   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
2139   /* FP registers */
2140   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
2141   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
2142   /* arg pointer */
2143   NON_Q_REGS,
2144   /* flags, fpsr, fpcr, frame */
2145   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
2146   /* SSE registers */
2147   SSE_FIRST_REG, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
2148   SSE_REGS, SSE_REGS,
2149   /* MMX registers */
2150   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
2151   MMX_REGS, MMX_REGS,
2152   /* REX registers */
2153   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
2154   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
2155   /* SSE REX registers */
2156   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
2157   SSE_REGS, SSE_REGS,
2158 };
2159
2160 /* The "default" register map used in 32bit mode.  */
2161
2162 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
2163 {
2164   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
2165   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
2166   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
2167   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
2168   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
2169   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
2170   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
2171 };
2172
2173 /* The "default" register map used in 64bit mode.  */
2174
2175 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
2176 {
2177   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
2178   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
2179   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
2180   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
2181   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
2182   8,9,10,11,12,13,14,15,                /* extended integer registers */
2183   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
2184 };
2185
2186 /* Define the register numbers to be used in Dwarf debugging information.
2187    The SVR4 reference port C compiler uses the following register numbers
2188    in its Dwarf output code:
2189         0 for %eax (gcc regno = 0)
2190         1 for %ecx (gcc regno = 2)
2191         2 for %edx (gcc regno = 1)
2192         3 for %ebx (gcc regno = 3)
2193         4 for %esp (gcc regno = 7)
2194         5 for %ebp (gcc regno = 6)
2195         6 for %esi (gcc regno = 4)
2196         7 for %edi (gcc regno = 5)
2197    The following three DWARF register numbers are never generated by
2198    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
2199    believes these numbers have these meanings.
2200         8  for %eip    (no gcc equivalent)
2201         9  for %eflags (gcc regno = 17)
2202         10 for %trapno (no gcc equivalent)
2203    It is not at all clear how we should number the FP stack registers
2204    for the x86 architecture.  If the version of SDB on x86/svr4 were
2205    a bit less brain dead with respect to floating-point then we would
2206    have a precedent to follow with respect to DWARF register numbers
2207    for x86 FP registers, but the SDB on x86/svr4 is so completely
2208    broken with respect to FP registers that it is hardly worth thinking
2209    of it as something to strive for compatibility with.
2210    The version of x86/svr4 SDB I have at the moment does (partially)
2211    seem to believe that DWARF register number 11 is associated with
2212    the x86 register %st(0), but that's about all.  Higher DWARF
2213    register numbers don't seem to be associated with anything in
2214    particular, and even for DWARF regno 11, SDB only seems to under-
2215    stand that it should say that a variable lives in %st(0) (when
2216    asked via an `=' command) if we said it was in DWARF regno 11,
2217    but SDB still prints garbage when asked for the value of the
2218    variable in question (via a `/' command).
2219    (Also note that the labels SDB prints for various FP stack regs
2220    when doing an `x' command are all wrong.)
2221    Note that these problems generally don't affect the native SVR4
2222    C compiler because it doesn't allow the use of -O with -g and
2223    because when it is *not* optimizing, it allocates a memory
2224    location for each floating-point variable, and the memory
2225    location is what gets described in the DWARF AT_location
2226    attribute for the variable in question.
2227    Regardless of the severe mental illness of the x86/svr4 SDB, we
2228    do something sensible here and we use the following DWARF
2229    register numbers.  Note that these are all stack-top-relative
2230    numbers.
2231         11 for %st(0) (gcc regno = 8)
2232         12 for %st(1) (gcc regno = 9)
2233         13 for %st(2) (gcc regno = 10)
2234         14 for %st(3) (gcc regno = 11)
2235         15 for %st(4) (gcc regno = 12)
2236         16 for %st(5) (gcc regno = 13)
2237         17 for %st(6) (gcc regno = 14)
2238         18 for %st(7) (gcc regno = 15)
2239 */
2240 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
2241 {
2242   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
2243   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
2244   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
2245   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
2246   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
2247   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
2248   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
2249 };
2250
2251 /* Define parameter passing and return registers.  */
2252
2253 static int const x86_64_int_parameter_registers[6] =
2254 {
2255   DI_REG, SI_REG, DX_REG, CX_REG, R8_REG, R9_REG
2256 };
2257
2258 static int const x86_64_ms_abi_int_parameter_registers[4] =
2259 {
2260   CX_REG, DX_REG, R8_REG, R9_REG
2261 };
2262
2263 static int const x86_64_int_return_registers[4] =
2264 {
2265   AX_REG, DX_REG, DI_REG, SI_REG
2266 };
2267
2268 /* Define the structure for the machine field in struct function.  */
2269
2270 struct GTY(()) stack_local_entry {
2271   unsigned short mode;
2272   unsigned short n;
2273   rtx rtl;
2274   struct stack_local_entry *next;
2275 };
2276
2277 /* Structure describing stack frame layout.
2278    Stack grows downward:
2279
2280    [arguments]
2281                                         <- ARG_POINTER
2282    saved pc
2283
2284    saved static chain                   if ix86_static_chain_on_stack
2285
2286    saved frame pointer                  if frame_pointer_needed
2287                                         <- HARD_FRAME_POINTER
2288    [saved regs]
2289                                         <- regs_save_offset
2290    [padding0]
2291
2292    [saved SSE regs]
2293                                         <- sse_regs_save_offset
2294    [padding1]          |
2295                        |                <- FRAME_POINTER
2296    [va_arg registers]  |
2297                        |
2298    [frame]             |
2299                        |
2300    [padding2]          | = to_allocate
2301                                         <- STACK_POINTER
2302   */
2303 struct ix86_frame
2304 {
2305   int nsseregs;
2306   int nregs;
2307   int va_arg_size;
2308   int red_zone_size;
2309   int outgoing_arguments_size;
2310   HOST_WIDE_INT frame;
2311
2312   /* The offsets relative to ARG_POINTER.  */
2313   HOST_WIDE_INT frame_pointer_offset;
2314   HOST_WIDE_INT hard_frame_pointer_offset;
2315   HOST_WIDE_INT stack_pointer_offset;
2316   HOST_WIDE_INT hfp_save_offset;
2317   HOST_WIDE_INT reg_save_offset;
2318   HOST_WIDE_INT sse_reg_save_offset;
2319
2320   /* When save_regs_using_mov is set, emit prologue using
2321      move instead of push instructions.  */
2322   bool save_regs_using_mov;
2323 };
2324
2325 /* Code model option.  */
2326 enum cmodel ix86_cmodel;
2327 /* Asm dialect.  */
2328 enum asm_dialect ix86_asm_dialect = ASM_ATT;
2329 /* TLS dialects.  */
2330 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
2331
2332 /* Which unit we are generating floating point math for.  */
2333 enum fpmath_unit ix86_fpmath;
2334
2335 /* Which cpu are we scheduling for.  */
2336 enum attr_cpu ix86_schedule;
2337
2338 /* Which cpu are we optimizing for.  */
2339 enum processor_type ix86_tune;
2340
2341 /* Which instruction set architecture to use.  */
2342 enum processor_type ix86_arch;
2343
2344 /* true if sse prefetch instruction is not NOOP.  */
2345 int x86_prefetch_sse;
2346
2347 /* ix86_regparm_string as a number */
2348 static int ix86_regparm;
2349
2350 /* -mstackrealign option */
2351 static const char ix86_force_align_arg_pointer_string[]
2352   = "force_align_arg_pointer";
2353
2354 static rtx (*ix86_gen_leave) (void);
2355 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
2356 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
2357 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx, rtx);
2358 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
2359 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
2360 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
2361 static rtx (*ix86_gen_allocate_stack_worker) (rtx, rtx);
2362 static rtx (*ix86_gen_adjust_stack_and_probe) (rtx, rtx, rtx);
2363 static rtx (*ix86_gen_probe_stack_range) (rtx, rtx, rtx);
2364
2365 /* Preferred alignment for stack boundary in bits.  */
2366 unsigned int ix86_preferred_stack_boundary;
2367
2368 /* Alignment for incoming stack boundary in bits specified at
2369    command line.  */
2370 static unsigned int ix86_user_incoming_stack_boundary;
2371
2372 /* Default alignment for incoming stack boundary in bits.  */
2373 static unsigned int ix86_default_incoming_stack_boundary;
2374
2375 /* Alignment for incoming stack boundary in bits.  */
2376 unsigned int ix86_incoming_stack_boundary;
2377
2378 /* The abi used by target.  */
2379 enum calling_abi ix86_abi;
2380
2381 /* Values 1-5: see jump.c */
2382 int ix86_branch_cost;
2383
2384 /* Calling abi specific va_list type nodes.  */
2385 static GTY(()) tree sysv_va_list_type_node;
2386 static GTY(()) tree ms_va_list_type_node;
2387
2388 /* Variables which are this size or smaller are put in the data/bss
2389    or ldata/lbss sections.  */
2390
2391 int ix86_section_threshold = 65536;
2392
2393 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
2394 char internal_label_prefix[16];
2395 int internal_label_prefix_len;
2396
2397 /* Fence to use after loop using movnt.  */
2398 tree x86_mfence;
2399
2400 /* Register class used for passing given 64bit part of the argument.
2401    These represent classes as documented by the PS ABI, with the exception
2402    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
2403    use SF or DFmode move instead of DImode to avoid reformatting penalties.
2404
2405    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
2406    whenever possible (upper half does contain padding).  */
2407 enum x86_64_reg_class
2408   {
2409     X86_64_NO_CLASS,
2410     X86_64_INTEGER_CLASS,
2411     X86_64_INTEGERSI_CLASS,
2412     X86_64_SSE_CLASS,
2413     X86_64_SSESF_CLASS,
2414     X86_64_SSEDF_CLASS,
2415     X86_64_SSEUP_CLASS,
2416     X86_64_X87_CLASS,
2417     X86_64_X87UP_CLASS,
2418     X86_64_COMPLEX_X87_CLASS,
2419     X86_64_MEMORY_CLASS
2420   };
2421
2422 #define MAX_CLASSES 4
2423
2424 /* Table of constants used by fldpi, fldln2, etc....  */
2425 static REAL_VALUE_TYPE ext_80387_constants_table [5];
2426 static bool ext_80387_constants_init = 0;
2427
2428 \f
2429 static struct machine_function * ix86_init_machine_status (void);
2430 static rtx ix86_function_value (const_tree, const_tree, bool);
2431 static bool ix86_function_value_regno_p (const unsigned int);
2432 static unsigned int ix86_function_arg_boundary (enum machine_mode,
2433                                                 const_tree);
2434 static rtx ix86_static_chain (const_tree, bool);
2435 static int ix86_function_regparm (const_tree, const_tree);
2436 static void ix86_compute_frame_layout (struct ix86_frame *);
2437 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
2438                                                  rtx, rtx, int);
2439 static void ix86_add_new_builtins (int);
2440 static rtx ix86_expand_vec_perm_builtin (tree);
2441 static tree ix86_canonical_va_list_type (tree);
2442 static void predict_jump (int);
2443 static unsigned int split_stack_prologue_scratch_regno (void);
2444 static bool i386_asm_output_addr_const_extra (FILE *, rtx);
2445
2446 enum ix86_function_specific_strings
2447 {
2448   IX86_FUNCTION_SPECIFIC_ARCH,
2449   IX86_FUNCTION_SPECIFIC_TUNE,
2450   IX86_FUNCTION_SPECIFIC_FPMATH,
2451   IX86_FUNCTION_SPECIFIC_MAX
2452 };
2453
2454 static char *ix86_target_string (int, int, const char *, const char *,
2455                                  const char *, bool);
2456 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
2457 static void ix86_function_specific_save (struct cl_target_option *);
2458 static void ix86_function_specific_restore (struct cl_target_option *);
2459 static void ix86_function_specific_print (FILE *, int,
2460                                           struct cl_target_option *);
2461 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
2462 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
2463 static bool ix86_can_inline_p (tree, tree);
2464 static void ix86_set_current_function (tree);
2465 static unsigned int ix86_minimum_incoming_stack_boundary (bool);
2466
2467 static enum calling_abi ix86_function_abi (const_tree);
2468
2469 \f
2470 #ifndef SUBTARGET32_DEFAULT_CPU
2471 #define SUBTARGET32_DEFAULT_CPU "i386"
2472 #endif
2473
2474 /* The svr4 ABI for the i386 says that records and unions are returned
2475    in memory.  */
2476 #ifndef DEFAULT_PCC_STRUCT_RETURN
2477 #define DEFAULT_PCC_STRUCT_RETURN 1
2478 #endif
2479
2480 /* Whether -mtune= or -march= were specified */
2481 static int ix86_tune_defaulted;
2482 static int ix86_arch_specified;
2483
2484 /* Define a set of ISAs which are available when a given ISA is
2485    enabled.  MMX and SSE ISAs are handled separately.  */
2486
2487 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
2488 #define OPTION_MASK_ISA_3DNOW_SET \
2489   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
2490
2491 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
2492 #define OPTION_MASK_ISA_SSE2_SET \
2493   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
2494 #define OPTION_MASK_ISA_SSE3_SET \
2495   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
2496 #define OPTION_MASK_ISA_SSSE3_SET \
2497   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
2498 #define OPTION_MASK_ISA_SSE4_1_SET \
2499   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
2500 #define OPTION_MASK_ISA_SSE4_2_SET \
2501   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
2502 #define OPTION_MASK_ISA_AVX_SET \
2503   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
2504 #define OPTION_MASK_ISA_FMA_SET \
2505   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
2506
2507 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
2508    as -msse4.2.  */
2509 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
2510
2511 #define OPTION_MASK_ISA_SSE4A_SET \
2512   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
2513 #define OPTION_MASK_ISA_FMA4_SET \
2514   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
2515    | OPTION_MASK_ISA_AVX_SET)
2516 #define OPTION_MASK_ISA_XOP_SET \
2517   (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
2518 #define OPTION_MASK_ISA_LWP_SET \
2519   OPTION_MASK_ISA_LWP
2520
2521 /* AES and PCLMUL need SSE2 because they use xmm registers */
2522 #define OPTION_MASK_ISA_AES_SET \
2523   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
2524 #define OPTION_MASK_ISA_PCLMUL_SET \
2525   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
2526
2527 #define OPTION_MASK_ISA_ABM_SET \
2528   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
2529
2530 #define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI
2531 #define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM
2532 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
2533 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
2534 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
2535 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
2536 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
2537
2538 #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
2539 #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
2540 #define OPTION_MASK_ISA_F16C_SET \
2541   (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
2542
2543 /* Define a set of ISAs which aren't available when a given ISA is
2544    disabled.  MMX and SSE ISAs are handled separately.  */
2545
2546 #define OPTION_MASK_ISA_MMX_UNSET \
2547   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
2548 #define OPTION_MASK_ISA_3DNOW_UNSET \
2549   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
2550 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
2551
2552 #define OPTION_MASK_ISA_SSE_UNSET \
2553   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
2554 #define OPTION_MASK_ISA_SSE2_UNSET \
2555   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
2556 #define OPTION_MASK_ISA_SSE3_UNSET \
2557   (OPTION_MASK_ISA_SSE3 \
2558    | OPTION_MASK_ISA_SSSE3_UNSET \
2559    | OPTION_MASK_ISA_SSE4A_UNSET )
2560 #define OPTION_MASK_ISA_SSSE3_UNSET \
2561   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
2562 #define OPTION_MASK_ISA_SSE4_1_UNSET \
2563   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
2564 #define OPTION_MASK_ISA_SSE4_2_UNSET \
2565   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
2566 #define OPTION_MASK_ISA_AVX_UNSET \
2567   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
2568    | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET)
2569 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
2570
2571 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
2572    as -mno-sse4.1. */
2573 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
2574
2575 #define OPTION_MASK_ISA_SSE4A_UNSET \
2576   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
2577
2578 #define OPTION_MASK_ISA_FMA4_UNSET \
2579   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
2580 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
2581 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
2582
2583 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
2584 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
2585 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
2586 #define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI
2587 #define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM
2588 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
2589 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
2590 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
2591 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
2592 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
2593
2594 #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
2595 #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
2596 #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
2597
2598 /* Vectorization library interface and handlers.  */
2599 static tree (*ix86_veclib_handler) (enum built_in_function, tree, tree);
2600
2601 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
2602 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
2603
2604 /* Processor target table, indexed by processor number */
2605 struct ptt
2606 {
2607   const struct processor_costs *cost;           /* Processor costs */
2608   const int align_loop;                         /* Default alignments.  */
2609   const int align_loop_max_skip;
2610   const int align_jump;
2611   const int align_jump_max_skip;
2612   const int align_func;
2613 };
2614
2615 static const struct ptt processor_target_table[PROCESSOR_max] =
2616 {
2617   {&i386_cost, 4, 3, 4, 3, 4},
2618   {&i486_cost, 16, 15, 16, 15, 16},
2619   {&pentium_cost, 16, 7, 16, 7, 16},
2620   {&pentiumpro_cost, 16, 15, 16, 10, 16},
2621   {&geode_cost, 0, 0, 0, 0, 0},
2622   {&k6_cost, 32, 7, 32, 7, 32},
2623   {&athlon_cost, 16, 7, 16, 7, 16},
2624   {&pentium4_cost, 0, 0, 0, 0, 0},
2625   {&k8_cost, 16, 7, 16, 7, 16},
2626   {&nocona_cost, 0, 0, 0, 0, 0},
2627   /* Core 2 32-bit.  */
2628   {&generic32_cost, 16, 10, 16, 10, 16},
2629   /* Core 2 64-bit.  */
2630   {&generic64_cost, 16, 10, 16, 10, 16},
2631   /* Core i7 32-bit.  */
2632   {&generic32_cost, 16, 10, 16, 10, 16},
2633   /* Core i7 64-bit.  */
2634   {&generic64_cost, 16, 10, 16, 10, 16},
2635   {&generic32_cost, 16, 7, 16, 7, 16},
2636   {&generic64_cost, 16, 10, 16, 10, 16},
2637   {&amdfam10_cost, 32, 24, 32, 7, 32},
2638   {&bdver1_cost, 32, 24, 32, 7, 32},
2639   {&btver1_cost, 32, 24, 32, 7, 32},
2640   {&atom_cost, 16, 7, 16, 7, 16}
2641 };
2642
2643 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
2644 {
2645   "generic",
2646   "i386",
2647   "i486",
2648   "pentium",
2649   "pentium-mmx",
2650   "pentiumpro",
2651   "pentium2",
2652   "pentium3",
2653   "pentium4",
2654   "pentium-m",
2655   "prescott",
2656   "nocona",
2657   "core2",
2658   "corei7",
2659   "atom",
2660   "geode",
2661   "k6",
2662   "k6-2",
2663   "k6-3",
2664   "athlon",
2665   "athlon-4",
2666   "k8",
2667   "amdfam10",
2668   "bdver1",
2669   "btver1"
2670 };
2671 \f
2672 /* Return true if a red-zone is in use.  */
2673
2674 static inline bool
2675 ix86_using_red_zone (void)
2676 {
2677   return TARGET_RED_ZONE && !TARGET_64BIT_MS_ABI;
2678 }
2679
2680 /* Implement TARGET_HANDLE_OPTION.  */
2681
2682 static bool
2683 ix86_handle_option (struct gcc_options *opts,
2684                     struct gcc_options *opts_set ATTRIBUTE_UNUSED,
2685                     const struct cl_decoded_option *decoded,
2686                     location_t loc ATTRIBUTE_UNUSED)
2687 {
2688   size_t code = decoded->opt_index;
2689   int value = decoded->value;
2690
2691   switch (code)
2692     {
2693     case OPT_mmmx:
2694       if (value)
2695         {
2696           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
2697           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
2698         }
2699       else
2700         {
2701           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
2702           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2703         }
2704       return true;
2705
2706     case OPT_m3dnow:
2707       if (value)
2708         {
2709           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2710           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2711         }
2712       else
2713         {
2714           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2715           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2716         }
2717       return true;
2718
2719     case OPT_m3dnowa:
2720       return false;
2721
2722     case OPT_msse:
2723       if (value)
2724         {
2725           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2726           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2727         }
2728       else
2729         {
2730           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2731           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2732         }
2733       return true;
2734
2735     case OPT_msse2:
2736       if (value)
2737         {
2738           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2739           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2740         }
2741       else
2742         {
2743           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2744           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2745         }
2746       return true;
2747
2748     case OPT_msse3:
2749       if (value)
2750         {
2751           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2752           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2753         }
2754       else
2755         {
2756           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2757           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2758         }
2759       return true;
2760
2761     case OPT_mssse3:
2762       if (value)
2763         {
2764           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2765           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2766         }
2767       else
2768         {
2769           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2770           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2771         }
2772       return true;
2773
2774     case OPT_msse4_1:
2775       if (value)
2776         {
2777           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2778           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2779         }
2780       else
2781         {
2782           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2783           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2784         }
2785       return true;
2786
2787     case OPT_msse4_2:
2788       if (value)
2789         {
2790           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2791           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2792         }
2793       else
2794         {
2795           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2796           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2797         }
2798       return true;
2799
2800     case OPT_mavx:
2801       if (value)
2802         {
2803           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2804           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2805         }
2806       else
2807         {
2808           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2809           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2810         }
2811       return true;
2812
2813     case OPT_mfma:
2814       if (value)
2815         {
2816           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2817           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2818         }
2819       else
2820         {
2821           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2822           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2823         }
2824       return true;
2825
2826     case OPT_msse4:
2827       opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2828       opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2829       return true;
2830
2831     case OPT_mno_sse4:
2832       opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2833       opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2834       return true;
2835
2836     case OPT_msse4a:
2837       if (value)
2838         {
2839           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2840           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2841         }
2842       else
2843         {
2844           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2845           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2846         }
2847       return true;
2848
2849     case OPT_mfma4:
2850       if (value)
2851         {
2852           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
2853           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
2854         }
2855       else
2856         {
2857           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
2858           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
2859         }
2860       return true;
2861
2862    case OPT_mxop:
2863       if (value)
2864         {
2865           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
2866           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
2867         }
2868       else
2869         {
2870           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
2871           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
2872         }
2873       return true;
2874
2875    case OPT_mlwp:
2876       if (value)
2877         {
2878           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
2879           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
2880         }
2881       else
2882         {
2883           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
2884           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
2885         }
2886       return true;
2887
2888     case OPT_mabm:
2889       if (value)
2890         {
2891           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2892           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2893         }
2894       else
2895         {
2896           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2897           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2898         }
2899       return true;
2900
2901     case OPT_mbmi:
2902       if (value)
2903         {
2904           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI_SET;
2905           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_SET;
2906         }
2907       else
2908         {
2909           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI_UNSET;
2910           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_UNSET;
2911         }
2912       return true;
2913
2914     case OPT_mtbm:
2915       if (value)
2916         {
2917           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_TBM_SET;
2918           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_SET;
2919         }
2920       else
2921         {
2922           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_TBM_UNSET;
2923           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_UNSET;
2924         }
2925       return true;
2926
2927     case OPT_mpopcnt:
2928       if (value)
2929         {
2930           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2931           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2932         }
2933       else
2934         {
2935           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2936           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2937         }
2938       return true;
2939
2940     case OPT_msahf:
2941       if (value)
2942         {
2943           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2944           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2945         }
2946       else
2947         {
2948           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2949           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2950         }
2951       return true;
2952
2953     case OPT_mcx16:
2954       if (value)
2955         {
2956           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2957           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2958         }
2959       else
2960         {
2961           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2962           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2963         }
2964       return true;
2965
2966     case OPT_mmovbe:
2967       if (value)
2968         {
2969           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
2970           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
2971         }
2972       else
2973         {
2974           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
2975           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
2976         }
2977       return true;
2978
2979     case OPT_mcrc32:
2980       if (value)
2981         {
2982           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
2983           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
2984         }
2985       else
2986         {
2987           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
2988           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
2989         }
2990       return true;
2991
2992     case OPT_maes:
2993       if (value)
2994         {
2995           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2996           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2997         }
2998       else
2999         {
3000           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
3001           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
3002         }
3003       return true;
3004
3005     case OPT_mpclmul:
3006       if (value)
3007         {
3008           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
3009           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
3010         }
3011       else
3012         {
3013           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
3014           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
3015         }
3016       return true;
3017
3018     case OPT_mfsgsbase:
3019       if (value)
3020         {
3021           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE_SET;
3022           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_SET;
3023         }
3024       else
3025         {
3026           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FSGSBASE_UNSET;
3027           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_UNSET;
3028         }
3029       return true;
3030
3031     case OPT_mrdrnd:
3032       if (value)
3033         {
3034           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDRND_SET;
3035           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_SET;
3036         }
3037       else
3038         {
3039           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDRND_UNSET;
3040           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_UNSET;
3041         }
3042       return true;
3043
3044     case OPT_mf16c:
3045       if (value)
3046         {
3047           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_F16C_SET;
3048           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_SET;
3049         }
3050       else
3051         {
3052           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_F16C_UNSET;
3053           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_UNSET;
3054         }
3055       return true;
3056
3057     default:
3058       return true;
3059     }
3060 }
3061 \f
3062 /* Return a string that documents the current -m options.  The caller is
3063    responsible for freeing the string.  */
3064
3065 static char *
3066 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
3067                     const char *fpmath, bool add_nl_p)
3068 {
3069   struct ix86_target_opts
3070   {
3071     const char *option;         /* option string */
3072     int mask;                   /* isa mask options */
3073   };
3074
3075   /* This table is ordered so that options like -msse4.2 that imply
3076      preceding options while match those first.  */
3077   static struct ix86_target_opts isa_opts[] =
3078   {
3079     { "-m64",           OPTION_MASK_ISA_64BIT },
3080     { "-mfma4",         OPTION_MASK_ISA_FMA4 },
3081     { "-mfma",          OPTION_MASK_ISA_FMA },
3082     { "-mxop",          OPTION_MASK_ISA_XOP },
3083     { "-mlwp",          OPTION_MASK_ISA_LWP },
3084     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
3085     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
3086     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
3087     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
3088     { "-msse3",         OPTION_MASK_ISA_SSE3 },
3089     { "-msse2",         OPTION_MASK_ISA_SSE2 },
3090     { "-msse",          OPTION_MASK_ISA_SSE },
3091     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
3092     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
3093     { "-mmmx",          OPTION_MASK_ISA_MMX },
3094     { "-mabm",          OPTION_MASK_ISA_ABM },
3095     { "-mbmi",          OPTION_MASK_ISA_BMI },
3096     { "-mtbm",          OPTION_MASK_ISA_TBM },
3097     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
3098     { "-mmovbe",        OPTION_MASK_ISA_MOVBE },
3099     { "-mcrc32",        OPTION_MASK_ISA_CRC32 },
3100     { "-maes",          OPTION_MASK_ISA_AES },
3101     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
3102     { "-mfsgsbase",     OPTION_MASK_ISA_FSGSBASE },
3103     { "-mrdrnd",        OPTION_MASK_ISA_RDRND },
3104     { "-mf16c",         OPTION_MASK_ISA_F16C },
3105   };
3106
3107   /* Flag options.  */
3108   static struct ix86_target_opts flag_opts[] =
3109   {
3110     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
3111     { "-m80387",                        MASK_80387 },
3112     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
3113     { "-malign-double",                 MASK_ALIGN_DOUBLE },
3114     { "-mcld",                          MASK_CLD },
3115     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
3116     { "-mieee-fp",                      MASK_IEEE_FP },
3117     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
3118     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
3119     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
3120     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
3121     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
3122     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
3123     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
3124     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
3125     { "-mrecip",                        MASK_RECIP },
3126     { "-mrtd",                          MASK_RTD },
3127     { "-msseregparm",                   MASK_SSEREGPARM },
3128     { "-mstack-arg-probe",              MASK_STACK_PROBE },
3129     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
3130     { "-mvect8-ret-in-mem",             MASK_VECT8_RETURNS },
3131     { "-m8bit-idiv",                    MASK_USE_8BIT_IDIV },
3132     { "-mvzeroupper",                   MASK_VZEROUPPER },
3133     { "-mavx256-split-unaligned-load",  MASK_AVX256_SPLIT_UNALIGNED_LOAD},
3134     { "-mavx256-split-unaligned-store", MASK_AVX256_SPLIT_UNALIGNED_STORE},
3135   };
3136
3137   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
3138
3139   char isa_other[40];
3140   char target_other[40];
3141   unsigned num = 0;
3142   unsigned i, j;
3143   char *ret;
3144   char *ptr;
3145   size_t len;
3146   size_t line_len;
3147   size_t sep_len;
3148
3149   memset (opts, '\0', sizeof (opts));
3150
3151   /* Add -march= option.  */
3152   if (arch)
3153     {
3154       opts[num][0] = "-march=";
3155       opts[num++][1] = arch;
3156     }
3157
3158   /* Add -mtune= option.  */
3159   if (tune)
3160     {
3161       opts[num][0] = "-mtune=";
3162       opts[num++][1] = tune;
3163     }
3164
3165   /* Pick out the options in isa options.  */
3166   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
3167     {
3168       if ((isa & isa_opts[i].mask) != 0)
3169         {
3170           opts[num++][0] = isa_opts[i].option;
3171           isa &= ~ isa_opts[i].mask;
3172         }
3173     }
3174
3175   if (isa && add_nl_p)
3176     {
3177       opts[num++][0] = isa_other;
3178       sprintf (isa_other, "(other isa: %#x)", isa);
3179     }
3180
3181   /* Add flag options.  */
3182   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
3183     {
3184       if ((flags & flag_opts[i].mask) != 0)
3185         {
3186           opts[num++][0] = flag_opts[i].option;
3187           flags &= ~ flag_opts[i].mask;
3188         }
3189     }
3190
3191   if (flags && add_nl_p)
3192     {
3193       opts[num++][0] = target_other;
3194       sprintf (target_other, "(other flags: %#x)", flags);
3195     }
3196
3197   /* Add -fpmath= option.  */
3198   if (fpmath)
3199     {
3200       opts[num][0] = "-mfpmath=";
3201       opts[num++][1] = fpmath;
3202     }
3203
3204   /* Any options?  */
3205   if (num == 0)
3206     return NULL;
3207
3208   gcc_assert (num < ARRAY_SIZE (opts));
3209
3210   /* Size the string.  */
3211   len = 0;
3212   sep_len = (add_nl_p) ? 3 : 1;
3213   for (i = 0; i < num; i++)
3214     {
3215       len += sep_len;
3216       for (j = 0; j < 2; j++)
3217         if (opts[i][j])
3218           len += strlen (opts[i][j]);
3219     }
3220
3221   /* Build the string.  */
3222   ret = ptr = (char *) xmalloc (len);
3223   line_len = 0;
3224
3225   for (i = 0; i < num; i++)
3226     {
3227       size_t len2[2];
3228
3229       for (j = 0; j < 2; j++)
3230         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
3231
3232       if (i != 0)
3233         {
3234           *ptr++ = ' ';
3235           line_len++;
3236
3237           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
3238             {
3239               *ptr++ = '\\';
3240               *ptr++ = '\n';
3241               line_len = 0;
3242             }
3243         }
3244
3245       for (j = 0; j < 2; j++)
3246         if (opts[i][j])
3247           {
3248             memcpy (ptr, opts[i][j], len2[j]);
3249             ptr += len2[j];
3250             line_len += len2[j];
3251           }
3252     }
3253
3254   *ptr = '\0';
3255   gcc_assert (ret + len >= ptr);
3256
3257   return ret;
3258 }
3259
3260 /* Return TRUE if software prefetching is beneficial for the
3261    given CPU. */
3262
3263 static bool
3264 software_prefetching_beneficial_p (void)
3265 {
3266   switch (ix86_tune)
3267     {
3268     case PROCESSOR_GEODE:
3269     case PROCESSOR_K6:
3270     case PROCESSOR_ATHLON:
3271     case PROCESSOR_K8:
3272     case PROCESSOR_AMDFAM10:
3273     case PROCESSOR_BTVER1:
3274       return true;
3275
3276     default:
3277       return false;
3278     }
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   /* Comes from final.c -- no real reason to change it.  */
3325 #define MAX_CODE_ALIGN 16
3326
3327   enum pta_flags
3328     {
3329       PTA_SSE = 1 << 0,
3330       PTA_SSE2 = 1 << 1,
3331       PTA_SSE3 = 1 << 2,
3332       PTA_MMX = 1 << 3,
3333       PTA_PREFETCH_SSE = 1 << 4,
3334       PTA_3DNOW = 1 << 5,
3335       PTA_3DNOW_A = 1 << 6,
3336       PTA_64BIT = 1 << 7,
3337       PTA_SSSE3 = 1 << 8,
3338       PTA_CX16 = 1 << 9,
3339       PTA_POPCNT = 1 << 10,
3340       PTA_ABM = 1 << 11,
3341       PTA_SSE4A = 1 << 12,
3342       PTA_NO_SAHF = 1 << 13,
3343       PTA_SSE4_1 = 1 << 14,
3344       PTA_SSE4_2 = 1 << 15,
3345       PTA_AES = 1 << 16,
3346       PTA_PCLMUL = 1 << 17,
3347       PTA_AVX = 1 << 18,
3348       PTA_FMA = 1 << 19,
3349       PTA_MOVBE = 1 << 20,
3350       PTA_FMA4 = 1 << 21,
3351       PTA_XOP = 1 << 22,
3352       PTA_LWP = 1 << 23,
3353       PTA_FSGSBASE = 1 << 24,
3354       PTA_RDRND = 1 << 25,
3355       PTA_F16C = 1 << 26,
3356       PTA_BMI = 1 << 27,
3357       PTA_TBM = 1 << 28
3358       /* if this reaches 32, need to widen struct pta flags below */
3359     };
3360
3361   static struct pta
3362     {
3363       const char *const name;           /* processor name or nickname.  */
3364       const enum processor_type processor;
3365       const enum attr_cpu schedule;
3366       const unsigned /*enum pta_flags*/ flags;
3367     }
3368   const processor_alias_table[] =
3369     {
3370       {"i386", PROCESSOR_I386, CPU_NONE, 0},
3371       {"i486", PROCESSOR_I486, CPU_NONE, 0},
3372       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
3373       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
3374       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
3375       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
3376       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
3377       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
3378       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
3379       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
3380       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
3381       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
3382       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
3383         PTA_MMX | PTA_SSE},
3384       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
3385         PTA_MMX | PTA_SSE},
3386       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
3387         PTA_MMX | PTA_SSE | PTA_SSE2},
3388       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
3389         PTA_MMX |PTA_SSE | PTA_SSE2},
3390       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
3391         PTA_MMX | PTA_SSE | PTA_SSE2},
3392       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
3393         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
3394       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
3395         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3396         | PTA_CX16 | PTA_NO_SAHF},
3397       {"core2", PROCESSOR_CORE2_64, CPU_CORE2,
3398         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3399         | PTA_SSSE3 | PTA_CX16},
3400       {"corei7", 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_CX16},
3403       {"corei7-avx", PROCESSOR_COREI7_64, CPU_COREI7,
3404         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3405         | PTA_SSSE3 | PTA_SSE4_1 | PTA_SSE4_2 | PTA_AVX
3406         | PTA_CX16 | PTA_POPCNT | PTA_AES | PTA_PCLMUL},
3407       {"atom", PROCESSOR_ATOM, CPU_ATOM,
3408         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3409         | PTA_SSSE3 | PTA_CX16 | PTA_MOVBE},
3410       {"geode", PROCESSOR_GEODE, CPU_GEODE,
3411         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
3412       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
3413       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
3414       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
3415       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
3416         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
3417       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
3418         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
3419       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
3420         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
3421       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
3422         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
3423       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
3424         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
3425       {"x86-64", PROCESSOR_K8, CPU_K8,
3426         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
3427       {"k8", PROCESSOR_K8, CPU_K8,
3428         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3429         | PTA_SSE2 | PTA_NO_SAHF},
3430       {"k8-sse3", PROCESSOR_K8, CPU_K8,
3431         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3432         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
3433       {"opteron", PROCESSOR_K8, CPU_K8,
3434         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3435         | PTA_SSE2 | PTA_NO_SAHF},
3436       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
3437         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3438         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
3439       {"athlon64", PROCESSOR_K8, CPU_K8,
3440         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3441         | PTA_SSE2 | PTA_NO_SAHF},
3442       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
3443         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3444         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
3445       {"athlon-fx", PROCESSOR_K8, CPU_K8,
3446         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3447         | PTA_SSE2 | PTA_NO_SAHF},
3448       {"amdfam10", 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       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
3452         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
3453         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
3454       {"bdver1", PROCESSOR_BDVER1, CPU_BDVER1,
3455         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
3456         | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
3457         | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
3458         | PTA_XOP | PTA_LWP},
3459       {"btver1", PROCESSOR_BTVER1, CPU_GENERIC64,
3460         PTA_64BIT | PTA_MMX |  PTA_SSE  | PTA_SSE2 | PTA_SSE3
3461         | PTA_SSSE3 | PTA_SSE4A |PTA_ABM | PTA_CX16},
3462       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
3463         0 /* flags are only used for -march switch.  */ },
3464       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
3465         PTA_64BIT /* flags are only used for -march switch.  */ },
3466     };
3467
3468   int const pta_size = ARRAY_SIZE (processor_alias_table);
3469
3470   /* Set up prefix/suffix so the error messages refer to either the command
3471      line argument, or the attribute(target).  */
3472   if (main_args_p)
3473     {
3474       prefix = "-m";
3475       suffix = "";
3476       sw = "switch";
3477     }
3478   else
3479     {
3480       prefix = "option(\"";
3481       suffix = "\")";
3482       sw = "attribute";
3483     }
3484
3485 #ifdef SUBTARGET_OVERRIDE_OPTIONS
3486   SUBTARGET_OVERRIDE_OPTIONS;
3487 #endif
3488
3489 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
3490   SUBSUBTARGET_OVERRIDE_OPTIONS;
3491 #endif
3492
3493   /* -fPIC is the default for x86_64.  */
3494   if (TARGET_MACHO && TARGET_64BIT)
3495     flag_pic = 2;
3496
3497   /* Need to check -mtune=generic first.  */
3498   if (ix86_tune_string)
3499     {
3500       if (!strcmp (ix86_tune_string, "generic")
3501           || !strcmp (ix86_tune_string, "i686")
3502           /* As special support for cross compilers we read -mtune=native
3503              as -mtune=generic.  With native compilers we won't see the
3504              -mtune=native, as it was changed by the driver.  */
3505           || !strcmp (ix86_tune_string, "native"))
3506         {
3507           if (TARGET_64BIT)
3508             ix86_tune_string = "generic64";
3509           else
3510             ix86_tune_string = "generic32";
3511         }
3512       /* If this call is for setting the option attribute, allow the
3513          generic32/generic64 that was previously set.  */
3514       else if (!main_args_p
3515                && (!strcmp (ix86_tune_string, "generic32")
3516                    || !strcmp (ix86_tune_string, "generic64")))
3517         ;
3518       else if (!strncmp (ix86_tune_string, "generic", 7))
3519         error ("bad value (%s) for %stune=%s %s",
3520                ix86_tune_string, prefix, suffix, sw);
3521       else if (!strcmp (ix86_tune_string, "x86-64"))
3522         warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated; use "
3523                  "%stune=k8%s or %stune=generic%s instead as appropriate",
3524                  prefix, suffix, prefix, suffix, prefix, suffix);
3525     }
3526   else
3527     {
3528       if (ix86_arch_string)
3529         ix86_tune_string = ix86_arch_string;
3530       if (!ix86_tune_string)
3531         {
3532           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
3533           ix86_tune_defaulted = 1;
3534         }
3535
3536       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
3537          need to use a sensible tune option.  */
3538       if (!strcmp (ix86_tune_string, "generic")
3539           || !strcmp (ix86_tune_string, "x86-64")
3540           || !strcmp (ix86_tune_string, "i686"))
3541         {
3542           if (TARGET_64BIT)
3543             ix86_tune_string = "generic64";
3544           else
3545             ix86_tune_string = "generic32";
3546         }
3547     }
3548
3549   if (ix86_stringop_string)
3550     {
3551       if (!strcmp (ix86_stringop_string, "rep_byte"))
3552         stringop_alg = rep_prefix_1_byte;
3553       else if (!strcmp (ix86_stringop_string, "libcall"))
3554         stringop_alg = libcall;
3555       else if (!strcmp (ix86_stringop_string, "rep_4byte"))
3556         stringop_alg = rep_prefix_4_byte;
3557       else if (!strcmp (ix86_stringop_string, "rep_8byte")
3558                && TARGET_64BIT)
3559         /* rep; movq isn't available in 32-bit code.  */
3560         stringop_alg = rep_prefix_8_byte;
3561       else if (!strcmp (ix86_stringop_string, "byte_loop"))
3562         stringop_alg = loop_1_byte;
3563       else if (!strcmp (ix86_stringop_string, "loop"))
3564         stringop_alg = loop;
3565       else if (!strcmp (ix86_stringop_string, "unrolled_loop"))
3566         stringop_alg = unrolled_loop;
3567       else
3568         error ("bad value (%s) for %sstringop-strategy=%s %s",
3569                ix86_stringop_string, prefix, suffix, sw);
3570     }
3571
3572   if (!ix86_arch_string)
3573     ix86_arch_string = TARGET_64BIT ? "x86-64" : SUBTARGET32_DEFAULT_CPU;
3574   else
3575     ix86_arch_specified = 1;
3576
3577   /* Validate -mabi= value.  */
3578   if (ix86_abi_string)
3579     {
3580       if (strcmp (ix86_abi_string, "sysv") == 0)
3581         ix86_abi = SYSV_ABI;
3582       else if (strcmp (ix86_abi_string, "ms") == 0)
3583         ix86_abi = MS_ABI;
3584       else
3585         error ("unknown ABI (%s) for %sabi=%s %s",
3586                ix86_abi_string, prefix, suffix, sw);
3587     }
3588   else
3589     ix86_abi = DEFAULT_ABI;
3590
3591   if (ix86_cmodel_string != 0)
3592     {
3593       if (!strcmp (ix86_cmodel_string, "small"))
3594         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
3595       else if (!strcmp (ix86_cmodel_string, "medium"))
3596         ix86_cmodel = flag_pic ? CM_MEDIUM_PIC : CM_MEDIUM;
3597       else if (!strcmp (ix86_cmodel_string, "large"))
3598         ix86_cmodel = flag_pic ? CM_LARGE_PIC : CM_LARGE;
3599       else if (flag_pic)
3600         error ("code model %s does not support PIC mode", ix86_cmodel_string);
3601       else if (!strcmp (ix86_cmodel_string, "32"))
3602         ix86_cmodel = CM_32;
3603       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
3604         ix86_cmodel = CM_KERNEL;
3605       else
3606         error ("bad value (%s) for %scmodel=%s %s",
3607                ix86_cmodel_string, prefix, suffix, sw);
3608     }
3609   else
3610     {
3611       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
3612          use of rip-relative addressing.  This eliminates fixups that
3613          would otherwise be needed if this object is to be placed in a
3614          DLL, and is essentially just as efficient as direct addressing.  */
3615       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
3616         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
3617       else if (TARGET_64BIT)
3618         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
3619       else
3620         ix86_cmodel = CM_32;
3621     }
3622   if (ix86_asm_string != 0)
3623     {
3624       if (! TARGET_MACHO
3625           && !strcmp (ix86_asm_string, "intel"))
3626         ix86_asm_dialect = ASM_INTEL;
3627       else if (!strcmp (ix86_asm_string, "att"))
3628         ix86_asm_dialect = ASM_ATT;
3629       else
3630         error ("bad value (%s) for %sasm=%s %s",
3631                ix86_asm_string, prefix, suffix, sw);
3632     }
3633   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
3634     error ("code model %qs not supported in the %s bit mode",
3635            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
3636   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
3637     sorry ("%i-bit mode not compiled in",
3638            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
3639
3640   for (i = 0; i < pta_size; i++)
3641     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
3642       {
3643         ix86_schedule = processor_alias_table[i].schedule;
3644         ix86_arch = processor_alias_table[i].processor;
3645         /* Default cpu tuning to the architecture.  */
3646         ix86_tune = ix86_arch;
3647
3648         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
3649           error ("CPU you selected does not support x86-64 "
3650                  "instruction set");
3651
3652         if (processor_alias_table[i].flags & PTA_MMX
3653             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
3654           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
3655         if (processor_alias_table[i].flags & PTA_3DNOW
3656             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
3657           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
3658         if (processor_alias_table[i].flags & PTA_3DNOW_A
3659             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
3660           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
3661         if (processor_alias_table[i].flags & PTA_SSE
3662             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
3663           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
3664         if (processor_alias_table[i].flags & PTA_SSE2
3665             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
3666           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
3667         if (processor_alias_table[i].flags & PTA_SSE3
3668             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
3669           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
3670         if (processor_alias_table[i].flags & PTA_SSSE3
3671             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
3672           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
3673         if (processor_alias_table[i].flags & PTA_SSE4_1
3674             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
3675           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
3676         if (processor_alias_table[i].flags & PTA_SSE4_2
3677             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
3678           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
3679         if (processor_alias_table[i].flags & PTA_AVX
3680             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
3681           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
3682         if (processor_alias_table[i].flags & PTA_FMA
3683             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
3684           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
3685         if (processor_alias_table[i].flags & PTA_SSE4A
3686             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
3687           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
3688         if (processor_alias_table[i].flags & PTA_FMA4
3689             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA4))
3690           ix86_isa_flags |= OPTION_MASK_ISA_FMA4;
3691         if (processor_alias_table[i].flags & PTA_XOP
3692             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_XOP))
3693           ix86_isa_flags |= OPTION_MASK_ISA_XOP;
3694         if (processor_alias_table[i].flags & PTA_LWP
3695             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_LWP))
3696           ix86_isa_flags |= OPTION_MASK_ISA_LWP;
3697         if (processor_alias_table[i].flags & PTA_ABM
3698             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
3699           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
3700         if (processor_alias_table[i].flags & PTA_BMI
3701             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_BMI))
3702           ix86_isa_flags |= OPTION_MASK_ISA_BMI;
3703         if (processor_alias_table[i].flags & PTA_TBM
3704             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_TBM))
3705           ix86_isa_flags |= OPTION_MASK_ISA_TBM;
3706         if (processor_alias_table[i].flags & PTA_CX16
3707             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
3708           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
3709         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
3710             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
3711           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
3712         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
3713             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
3714           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
3715         if (processor_alias_table[i].flags & PTA_MOVBE
3716             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MOVBE))
3717           ix86_isa_flags |= OPTION_MASK_ISA_MOVBE;
3718         if (processor_alias_table[i].flags & PTA_AES
3719             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
3720           ix86_isa_flags |= OPTION_MASK_ISA_AES;
3721         if (processor_alias_table[i].flags & PTA_PCLMUL
3722             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
3723           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
3724         if (processor_alias_table[i].flags & PTA_FSGSBASE
3725             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FSGSBASE))
3726           ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE;
3727         if (processor_alias_table[i].flags & PTA_RDRND
3728             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_RDRND))
3729           ix86_isa_flags |= OPTION_MASK_ISA_RDRND;
3730         if (processor_alias_table[i].flags & PTA_F16C
3731             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_F16C))
3732           ix86_isa_flags |= OPTION_MASK_ISA_F16C;
3733         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
3734           x86_prefetch_sse = true;
3735
3736         break;
3737       }
3738
3739   if (!strcmp (ix86_arch_string, "generic"))
3740     error ("generic CPU can be used only for %stune=%s %s",
3741            prefix, suffix, sw);
3742   else if (!strncmp (ix86_arch_string, "generic", 7) || i == pta_size)
3743     error ("bad value (%s) for %sarch=%s %s",
3744            ix86_arch_string, prefix, suffix, sw);
3745
3746   ix86_arch_mask = 1u << ix86_arch;
3747   for (i = 0; i < X86_ARCH_LAST; ++i)
3748     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3749
3750   for (i = 0; i < pta_size; i++)
3751     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
3752       {
3753         ix86_schedule = processor_alias_table[i].schedule;
3754         ix86_tune = processor_alias_table[i].processor;
3755         if (TARGET_64BIT)
3756           {
3757             if (!(processor_alias_table[i].flags & PTA_64BIT))
3758               {
3759                 if (ix86_tune_defaulted)
3760                   {
3761                     ix86_tune_string = "x86-64";
3762                     for (i = 0; i < pta_size; i++)
3763                       if (! strcmp (ix86_tune_string,
3764                                     processor_alias_table[i].name))
3765                         break;
3766                     ix86_schedule = processor_alias_table[i].schedule;
3767                     ix86_tune = processor_alias_table[i].processor;
3768                   }
3769                 else
3770                   error ("CPU you selected does not support x86-64 "
3771                          "instruction set");
3772               }
3773           }
3774         else
3775           {
3776             /* Adjust tuning when compiling for 32-bit ABI.  */
3777             switch (ix86_tune)
3778               {
3779               case PROCESSOR_GENERIC64:
3780                 ix86_tune = PROCESSOR_GENERIC32;
3781                 ix86_schedule = CPU_PENTIUMPRO;
3782                 break;
3783
3784               case PROCESSOR_CORE2_64:
3785                 ix86_tune = PROCESSOR_CORE2_32;
3786                 break;
3787
3788               case PROCESSOR_COREI7_64:
3789                 ix86_tune = PROCESSOR_COREI7_32;
3790                 break;
3791
3792               default:
3793                 break;
3794               }
3795           }
3796         /* Intel CPUs have always interpreted SSE prefetch instructions as
3797            NOPs; so, we can enable SSE prefetch instructions even when
3798            -mtune (rather than -march) points us to a processor that has them.
3799            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
3800            higher processors.  */
3801         if (TARGET_CMOVE
3802             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
3803           x86_prefetch_sse = true;
3804         break;
3805       }
3806
3807   if (ix86_tune_specified && i == pta_size)
3808     error ("bad value (%s) for %stune=%s %s",
3809            ix86_tune_string, prefix, suffix, sw);
3810
3811   ix86_tune_mask = 1u << ix86_tune;
3812   for (i = 0; i < X86_TUNE_LAST; ++i)
3813     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3814
3815 #ifndef USE_IX86_FRAME_POINTER
3816 #define USE_IX86_FRAME_POINTER 0
3817 #endif
3818
3819 #ifndef USE_X86_64_FRAME_POINTER
3820 #define USE_X86_64_FRAME_POINTER 0
3821 #endif
3822
3823   /* Set the default values for switches whose default depends on TARGET_64BIT
3824      in case they weren't overwritten by command line options.  */
3825   if (TARGET_64BIT)
3826     {
3827       if (optimize > 1 && !global_options_set.x_flag_zee)
3828         flag_zee = 1;
3829       if (optimize >= 1 && !global_options_set.x_flag_omit_frame_pointer)
3830         flag_omit_frame_pointer = !USE_X86_64_FRAME_POINTER;
3831       if (flag_asynchronous_unwind_tables == 2)
3832         flag_unwind_tables = flag_asynchronous_unwind_tables = 1;
3833       if (flag_pcc_struct_return == 2)
3834         flag_pcc_struct_return = 0;
3835     }
3836   else
3837     {
3838       if (optimize >= 1 && !global_options_set.x_flag_omit_frame_pointer)
3839         flag_omit_frame_pointer = !(USE_IX86_FRAME_POINTER || optimize_size);
3840       if (flag_asynchronous_unwind_tables == 2)
3841         flag_asynchronous_unwind_tables = !USE_IX86_FRAME_POINTER;
3842       if (flag_pcc_struct_return == 2)
3843         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
3844     }
3845
3846   if (optimize_size)
3847     ix86_cost = &ix86_size_cost;
3848   else
3849     ix86_cost = processor_target_table[ix86_tune].cost;
3850
3851   /* Arrange to set up i386_stack_locals for all functions.  */
3852   init_machine_status = ix86_init_machine_status;
3853
3854   /* Validate -mregparm= value.  */
3855   if (ix86_regparm_string)
3856     {
3857       if (TARGET_64BIT)
3858         warning (0, "%sregparm%s is ignored in 64-bit mode", prefix, suffix);
3859       i = atoi (ix86_regparm_string);
3860       if (i < 0 || i > REGPARM_MAX)
3861         error ("%sregparm=%d%s is not between 0 and %d",
3862                prefix, i, suffix, REGPARM_MAX);
3863       else
3864         ix86_regparm = i;
3865     }
3866   if (TARGET_64BIT)
3867     ix86_regparm = REGPARM_MAX;
3868
3869   /* If the user has provided any of the -malign-* options,
3870      warn and use that value only if -falign-* is not set.
3871      Remove this code in GCC 3.2 or later.  */
3872   if (ix86_align_loops_string)
3873     {
3874       warning (0, "%salign-loops%s is obsolete, use -falign-loops%s",
3875                prefix, suffix, suffix);
3876       if (align_loops == 0)
3877         {
3878           i = atoi (ix86_align_loops_string);
3879           if (i < 0 || i > MAX_CODE_ALIGN)
3880             error ("%salign-loops=%d%s is not between 0 and %d",
3881                    prefix, i, suffix, MAX_CODE_ALIGN);
3882           else
3883             align_loops = 1 << i;
3884         }
3885     }
3886
3887   if (ix86_align_jumps_string)
3888     {
3889       warning (0, "%salign-jumps%s is obsolete, use -falign-jumps%s",
3890                prefix, suffix, suffix);
3891       if (align_jumps == 0)
3892         {
3893           i = atoi (ix86_align_jumps_string);
3894           if (i < 0 || i > MAX_CODE_ALIGN)
3895             error ("%salign-loops=%d%s is not between 0 and %d",
3896                    prefix, i, suffix, MAX_CODE_ALIGN);
3897           else
3898             align_jumps = 1 << i;
3899         }
3900     }
3901
3902   if (ix86_align_funcs_string)
3903     {
3904       warning (0, "%salign-functions%s is obsolete, use -falign-functions%s",
3905                prefix, suffix, suffix);
3906       if (align_functions == 0)
3907         {
3908           i = atoi (ix86_align_funcs_string);
3909           if (i < 0 || i > MAX_CODE_ALIGN)
3910             error ("%salign-loops=%d%s is not between 0 and %d",
3911                    prefix, i, suffix, MAX_CODE_ALIGN);
3912           else
3913             align_functions = 1 << i;
3914         }
3915     }
3916
3917   /* Default align_* from the processor table.  */
3918   if (align_loops == 0)
3919     {
3920       align_loops = processor_target_table[ix86_tune].align_loop;
3921       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
3922     }
3923   if (align_jumps == 0)
3924     {
3925       align_jumps = processor_target_table[ix86_tune].align_jump;
3926       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
3927     }
3928   if (align_functions == 0)
3929     {
3930       align_functions = processor_target_table[ix86_tune].align_func;
3931     }
3932
3933   /* Validate -mbranch-cost= value, or provide default.  */
3934   ix86_branch_cost = ix86_cost->branch_cost;
3935   if (ix86_branch_cost_string)
3936     {
3937       i = atoi (ix86_branch_cost_string);
3938       if (i < 0 || i > 5)
3939         error ("%sbranch-cost=%d%s is not between 0 and 5", prefix, i, suffix);
3940       else
3941         ix86_branch_cost = i;
3942     }
3943   if (ix86_section_threshold_string)
3944     {
3945       i = atoi (ix86_section_threshold_string);
3946       if (i < 0)
3947         error ("%slarge-data-threshold=%d%s is negative", prefix, i, suffix);
3948       else
3949         ix86_section_threshold = i;
3950     }
3951
3952   if (ix86_tls_dialect_string)
3953     {
3954       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
3955         ix86_tls_dialect = TLS_DIALECT_GNU;
3956       else if (strcmp (ix86_tls_dialect_string, "gnu2") == 0)
3957         ix86_tls_dialect = TLS_DIALECT_GNU2;
3958       else
3959         error ("bad value (%s) for %stls-dialect=%s %s",
3960                ix86_tls_dialect_string, prefix, suffix, sw);
3961     }
3962
3963   if (ix87_precision_string)
3964     {
3965       i = atoi (ix87_precision_string);
3966       if (i != 32 && i != 64 && i != 80)
3967         error ("pc%d is not valid precision setting (32, 64 or 80)", i);
3968     }
3969
3970   if (TARGET_64BIT)
3971     {
3972       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3973
3974       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3975          explicitly disable any of these.  In particular, disabling SSE and
3976          MMX for kernel code is extremely useful.  */
3977       if (!ix86_arch_specified)
3978       ix86_isa_flags
3979         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3980              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3981
3982       if (TARGET_RTD)
3983         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3984     }
3985   else
3986     {
3987       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3988
3989       if (!ix86_arch_specified)
3990       ix86_isa_flags
3991         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3992
3993       /* i386 ABI does not specify red zone.  It still makes sense to use it
3994          when programmer takes care to stack from being destroyed.  */
3995       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3996         target_flags |= MASK_NO_RED_ZONE;
3997     }
3998
3999   /* Keep nonleaf frame pointers.  */
4000   if (flag_omit_frame_pointer)
4001     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
4002   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
4003     flag_omit_frame_pointer = 1;
4004
4005   /* If we're doing fast math, we don't care about comparison order
4006      wrt NaNs.  This lets us use a shorter comparison sequence.  */
4007   if (flag_finite_math_only)
4008     target_flags &= ~MASK_IEEE_FP;
4009
4010   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
4011      since the insns won't need emulation.  */
4012   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
4013     target_flags &= ~MASK_NO_FANCY_MATH_387;
4014
4015   /* Likewise, if the target doesn't have a 387, or we've specified
4016      software floating point, don't use 387 inline intrinsics.  */
4017   if (!TARGET_80387)
4018     target_flags |= MASK_NO_FANCY_MATH_387;
4019
4020   /* Turn on MMX builtins for -msse.  */
4021   if (TARGET_SSE)
4022     {
4023       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
4024       x86_prefetch_sse = true;
4025     }
4026
4027   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
4028   if (TARGET_SSE4_2 || TARGET_ABM)
4029     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
4030
4031   /* Validate -mpreferred-stack-boundary= value or default it to
4032      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
4033   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
4034   if (ix86_preferred_stack_boundary_string)
4035     {
4036       int min = (TARGET_64BIT ? 4 : 2);
4037       int max = (TARGET_SEH ? 4 : 12);
4038
4039       i = atoi (ix86_preferred_stack_boundary_string);
4040       if (i < min || i > max)
4041         {
4042           if (min == max)
4043             error ("%spreferred-stack-boundary%s is not supported "
4044                    "for this target", prefix, suffix);
4045           else
4046             error ("%spreferred-stack-boundary=%d%s is not between %d and %d",
4047                    prefix, i, suffix, min, max);
4048         }
4049       else
4050         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
4051     }
4052
4053   /* Set the default value for -mstackrealign.  */
4054   if (ix86_force_align_arg_pointer == -1)
4055     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
4056
4057   ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
4058
4059   /* Validate -mincoming-stack-boundary= value or default it to
4060      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
4061   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
4062   if (ix86_incoming_stack_boundary_string)
4063     {
4064       i = atoi (ix86_incoming_stack_boundary_string);
4065       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
4066         error ("-mincoming-stack-boundary=%d is not between %d and 12",
4067                i, TARGET_64BIT ? 4 : 2);
4068       else
4069         {
4070           ix86_user_incoming_stack_boundary = (1 << i) * BITS_PER_UNIT;
4071           ix86_incoming_stack_boundary
4072             = ix86_user_incoming_stack_boundary;
4073         }
4074     }
4075
4076   /* Accept -msseregparm only if at least SSE support is enabled.  */
4077   if (TARGET_SSEREGPARM
4078       && ! TARGET_SSE)
4079     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
4080
4081   ix86_fpmath = TARGET_FPMATH_DEFAULT;
4082   if (ix86_fpmath_string != 0)
4083     {
4084       if (! strcmp (ix86_fpmath_string, "387"))
4085         ix86_fpmath = FPMATH_387;
4086       else if (! strcmp (ix86_fpmath_string, "sse"))
4087         {
4088           if (!TARGET_SSE)
4089             {
4090               warning (0, "SSE instruction set disabled, using 387 arithmetics");
4091               ix86_fpmath = FPMATH_387;
4092             }
4093           else
4094             ix86_fpmath = FPMATH_SSE;
4095         }
4096       else if (! strcmp (ix86_fpmath_string, "387,sse")
4097                || ! strcmp (ix86_fpmath_string, "387+sse")
4098                || ! strcmp (ix86_fpmath_string, "sse,387")
4099                || ! strcmp (ix86_fpmath_string, "sse+387")
4100                || ! strcmp (ix86_fpmath_string, "both"))
4101         {
4102           if (!TARGET_SSE)
4103             {
4104               warning (0, "SSE instruction set disabled, using 387 arithmetics");
4105               ix86_fpmath = FPMATH_387;
4106             }
4107           else if (!TARGET_80387)
4108             {
4109               warning (0, "387 instruction set disabled, using SSE arithmetics");
4110               ix86_fpmath = FPMATH_SSE;
4111             }
4112           else
4113             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
4114         }
4115       else
4116         error ("bad value (%s) for %sfpmath=%s %s",
4117                ix86_fpmath_string, prefix, suffix, sw);
4118     }
4119
4120   /* If the i387 is disabled, then do not return values in it. */
4121   if (!TARGET_80387)
4122     target_flags &= ~MASK_FLOAT_RETURNS;
4123
4124   /* Use external vectorized library in vectorizing intrinsics.  */
4125   if (ix86_veclibabi_string)
4126     {
4127       if (strcmp (ix86_veclibabi_string, "svml") == 0)
4128         ix86_veclib_handler = ix86_veclibabi_svml;
4129       else if (strcmp (ix86_veclibabi_string, "acml") == 0)
4130         ix86_veclib_handler = ix86_veclibabi_acml;
4131       else
4132         error ("unknown vectorization library ABI type (%s) for "
4133                "%sveclibabi=%s %s", ix86_veclibabi_string,
4134                prefix, suffix, sw);
4135     }
4136
4137   if ((!USE_IX86_FRAME_POINTER
4138        || (x86_accumulate_outgoing_args & ix86_tune_mask))
4139       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
4140       && !optimize_size)
4141     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
4142
4143   /* ??? Unwind info is not correct around the CFG unless either a frame
4144      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
4145      unwind info generation to be aware of the CFG and propagating states
4146      around edges.  */
4147   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
4148        || flag_exceptions || flag_non_call_exceptions)
4149       && flag_omit_frame_pointer
4150       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
4151     {
4152       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
4153         warning (0, "unwind tables currently require either a frame pointer "
4154                  "or %saccumulate-outgoing-args%s for correctness",
4155                  prefix, suffix);
4156       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
4157     }
4158
4159   /* If stack probes are required, the space used for large function
4160      arguments on the stack must also be probed, so enable
4161      -maccumulate-outgoing-args so this happens in the prologue.  */
4162   if (TARGET_STACK_PROBE
4163       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
4164     {
4165       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
4166         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
4167                  "for correctness", prefix, suffix);
4168       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
4169     }
4170
4171   /* For sane SSE instruction set generation we need fcomi instruction.
4172      It is safe to enable all CMOVE instructions.  */
4173   if (TARGET_SSE)
4174     TARGET_CMOVE = 1;
4175
4176   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
4177   {
4178     char *p;
4179     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
4180     p = strchr (internal_label_prefix, 'X');
4181     internal_label_prefix_len = p - internal_label_prefix;
4182     *p = '\0';
4183   }
4184
4185   /* When scheduling description is not available, disable scheduler pass
4186      so it won't slow down the compilation and make x87 code slower.  */
4187   if (!TARGET_SCHEDULE)
4188     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
4189
4190   maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
4191                          ix86_cost->simultaneous_prefetches,
4192                          global_options.x_param_values,
4193                          global_options_set.x_param_values);
4194   maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE, ix86_cost->prefetch_block,
4195                          global_options.x_param_values,
4196                          global_options_set.x_param_values);
4197   maybe_set_param_value (PARAM_L1_CACHE_SIZE, ix86_cost->l1_cache_size,
4198                          global_options.x_param_values,
4199                          global_options_set.x_param_values);
4200   maybe_set_param_value (PARAM_L2_CACHE_SIZE, ix86_cost->l2_cache_size,
4201                          global_options.x_param_values,
4202                          global_options_set.x_param_values);
4203
4204   /* Enable sw prefetching at -O3 for CPUS that prefetching is helpful.  */
4205   if (flag_prefetch_loop_arrays < 0
4206       && HAVE_prefetch
4207       && optimize >= 3
4208       && software_prefetching_beneficial_p ())
4209     flag_prefetch_loop_arrays = 1;
4210
4211   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
4212      can be optimized to ap = __builtin_next_arg (0).  */
4213   if (!TARGET_64BIT && !flag_split_stack)
4214     targetm.expand_builtin_va_start = NULL;
4215
4216   if (TARGET_64BIT)
4217     {
4218       ix86_gen_leave = gen_leave_rex64;
4219       ix86_gen_add3 = gen_adddi3;
4220       ix86_gen_sub3 = gen_subdi3;
4221       ix86_gen_sub3_carry = gen_subdi3_carry;
4222       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
4223       ix86_gen_monitor = gen_sse3_monitor64;
4224       ix86_gen_andsp = gen_anddi3;
4225       ix86_gen_allocate_stack_worker = gen_allocate_stack_worker_probe_di;
4226       ix86_gen_adjust_stack_and_probe = gen_adjust_stack_and_probedi;
4227       ix86_gen_probe_stack_range = gen_probe_stack_rangedi;
4228     }
4229   else
4230     {
4231       ix86_gen_leave = gen_leave;
4232       ix86_gen_add3 = gen_addsi3;
4233       ix86_gen_sub3 = gen_subsi3;
4234       ix86_gen_sub3_carry = gen_subsi3_carry;
4235       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
4236       ix86_gen_monitor = gen_sse3_monitor;
4237       ix86_gen_andsp = gen_andsi3;
4238       ix86_gen_allocate_stack_worker = gen_allocate_stack_worker_probe_si;
4239       ix86_gen_adjust_stack_and_probe = gen_adjust_stack_and_probesi;
4240       ix86_gen_probe_stack_range = gen_probe_stack_rangesi;
4241     }
4242
4243 #ifdef USE_IX86_CLD
4244   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
4245   if (!TARGET_64BIT)
4246     target_flags |= MASK_CLD & ~target_flags_explicit;
4247 #endif
4248
4249   if (!TARGET_64BIT && flag_pic)
4250     {
4251       if (flag_fentry > 0)
4252         sorry ("-mfentry isn%'t supported for 32-bit in combination "
4253                "with -fpic");
4254       flag_fentry = 0;
4255     }
4256   else if (TARGET_SEH)
4257     {
4258       if (flag_fentry == 0)
4259         sorry ("-mno-fentry isn%'t compatible with SEH");
4260       flag_fentry = 1;
4261     }
4262   else if (flag_fentry < 0)
4263    {
4264 #if defined(PROFILE_BEFORE_PROLOGUE)
4265      flag_fentry = 1;
4266 #else
4267      flag_fentry = 0;
4268 #endif
4269    }
4270
4271   /* Save the initial options in case the user does function specific options */
4272   if (main_args_p)
4273     target_option_default_node = target_option_current_node
4274       = build_target_option_node ();
4275
4276   if (TARGET_AVX)
4277     {
4278       /* When not optimize for size, enable vzeroupper optimization for
4279          TARGET_AVX with -fexpensive-optimizations and split 32-byte
4280          AVX unaligned load/store.  */
4281       if (!optimize_size)
4282         {
4283           if (flag_expensive_optimizations
4284               && !(target_flags_explicit & MASK_VZEROUPPER))
4285             target_flags |= MASK_VZEROUPPER;
4286           if (!(target_flags_explicit & MASK_AVX256_SPLIT_UNALIGNED_LOAD))
4287             target_flags |= MASK_AVX256_SPLIT_UNALIGNED_LOAD;
4288           if (!(target_flags_explicit & MASK_AVX256_SPLIT_UNALIGNED_STORE))
4289             target_flags |= MASK_AVX256_SPLIT_UNALIGNED_STORE;
4290         }
4291     }
4292   else 
4293     {
4294       /* Disable vzeroupper pass if TARGET_AVX is disabled.  */
4295       target_flags &= ~MASK_VZEROUPPER;
4296     }
4297 }
4298
4299 /* Return TRUE if VAL is passed in register with 256bit AVX modes.  */
4300
4301 static bool
4302 function_pass_avx256_p (const_rtx val)
4303 {
4304   if (!val)
4305     return false;
4306
4307   if (REG_P (val) && VALID_AVX256_REG_MODE (GET_MODE (val)))
4308     return true;
4309
4310   if (GET_CODE (val) == PARALLEL)
4311     {
4312       int i;
4313       rtx r;
4314
4315       for (i = XVECLEN (val, 0) - 1; i >= 0; i--)
4316         {
4317           r = XVECEXP (val, 0, i);
4318           if (GET_CODE (r) == EXPR_LIST
4319               && XEXP (r, 0)
4320               && REG_P (XEXP (r, 0))
4321               && (GET_MODE (XEXP (r, 0)) == OImode
4322                   || VALID_AVX256_REG_MODE (GET_MODE (XEXP (r, 0)))))
4323             return true;
4324         }
4325     }
4326
4327   return false;
4328 }
4329
4330 /* Implement the TARGET_OPTION_OVERRIDE hook.  */
4331
4332 static void
4333 ix86_option_override (void)
4334 {
4335   ix86_option_override_internal (true);
4336 }
4337
4338 /* Update register usage after having seen the compiler flags.  */
4339
4340 static void
4341 ix86_conditional_register_usage (void)
4342 {
4343   int i;
4344   unsigned int j;
4345
4346   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4347     {
4348       if (fixed_regs[i] > 1)
4349         fixed_regs[i] = (fixed_regs[i] == (TARGET_64BIT ? 3 : 2));
4350       if (call_used_regs[i] > 1)
4351         call_used_regs[i] = (call_used_regs[i] == (TARGET_64BIT ? 3 : 2));
4352     }
4353
4354   /* The PIC register, if it exists, is fixed.  */
4355   j = PIC_OFFSET_TABLE_REGNUM;
4356   if (j != INVALID_REGNUM)
4357     fixed_regs[j] = call_used_regs[j] = 1;
4358
4359   /* The 64-bit MS_ABI changes the set of call-used registers.  */
4360   if (TARGET_64BIT_MS_ABI)
4361     {
4362       call_used_regs[SI_REG] = 0;
4363       call_used_regs[DI_REG] = 0;
4364       call_used_regs[XMM6_REG] = 0;
4365       call_used_regs[XMM7_REG] = 0;
4366       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
4367         call_used_regs[i] = 0;
4368     }
4369
4370   /* The default setting of CLOBBERED_REGS is for 32-bit; add in the
4371      other call-clobbered regs for 64-bit.  */
4372   if (TARGET_64BIT)
4373     {
4374       CLEAR_HARD_REG_SET (reg_class_contents[(int)CLOBBERED_REGS]);
4375
4376       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4377         if (TEST_HARD_REG_BIT (reg_class_contents[(int)GENERAL_REGS], i)
4378             && call_used_regs[i])
4379           SET_HARD_REG_BIT (reg_class_contents[(int)CLOBBERED_REGS], i);
4380     }
4381
4382   /* If MMX is disabled, squash the registers.  */
4383   if (! TARGET_MMX)
4384     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4385       if (TEST_HARD_REG_BIT (reg_class_contents[(int)MMX_REGS], i))
4386         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
4387
4388   /* If SSE is disabled, squash the registers.  */
4389   if (! TARGET_SSE)
4390     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4391       if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i))
4392         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
4393
4394   /* If the FPU is disabled, squash the registers.  */
4395   if (! (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387))
4396     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4397       if (TEST_HARD_REG_BIT (reg_class_contents[(int)FLOAT_REGS], i))
4398         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
4399
4400   /* If 32-bit, squash the 64-bit registers.  */
4401   if (! TARGET_64BIT)
4402     {
4403       for (i = FIRST_REX_INT_REG; i <= LAST_REX_INT_REG; i++)
4404         reg_names[i] = "";
4405       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
4406         reg_names[i] = "";
4407     }
4408 }
4409
4410 \f
4411 /* Save the current options */
4412
4413 static void
4414 ix86_function_specific_save (struct cl_target_option *ptr)
4415 {
4416   ptr->arch = ix86_arch;
4417   ptr->schedule = ix86_schedule;
4418   ptr->tune = ix86_tune;
4419   ptr->fpmath = ix86_fpmath;
4420   ptr->branch_cost = ix86_branch_cost;
4421   ptr->tune_defaulted = ix86_tune_defaulted;
4422   ptr->arch_specified = ix86_arch_specified;
4423   ptr->x_ix86_isa_flags_explicit = ix86_isa_flags_explicit;
4424   ptr->ix86_target_flags_explicit = target_flags_explicit;
4425
4426   /* The fields are char but the variables are not; make sure the
4427      values fit in the fields.  */
4428   gcc_assert (ptr->arch == ix86_arch);
4429   gcc_assert (ptr->schedule == ix86_schedule);
4430   gcc_assert (ptr->tune == ix86_tune);
4431   gcc_assert (ptr->fpmath == ix86_fpmath);
4432   gcc_assert (ptr->branch_cost == ix86_branch_cost);
4433 }
4434
4435 /* Restore the current options */
4436
4437 static void
4438 ix86_function_specific_restore (struct cl_target_option *ptr)
4439 {
4440   enum processor_type old_tune = ix86_tune;
4441   enum processor_type old_arch = ix86_arch;
4442   unsigned int ix86_arch_mask, ix86_tune_mask;
4443   int i;
4444
4445   ix86_arch = (enum processor_type) ptr->arch;
4446   ix86_schedule = (enum attr_cpu) ptr->schedule;
4447   ix86_tune = (enum processor_type) ptr->tune;
4448   ix86_fpmath = (enum fpmath_unit) ptr->fpmath;
4449   ix86_branch_cost = ptr->branch_cost;
4450   ix86_tune_defaulted = ptr->tune_defaulted;
4451   ix86_arch_specified = ptr->arch_specified;
4452   ix86_isa_flags_explicit = ptr->x_ix86_isa_flags_explicit;
4453   target_flags_explicit = ptr->ix86_target_flags_explicit;
4454
4455   /* Recreate the arch feature tests if the arch changed */
4456   if (old_arch != ix86_arch)
4457     {
4458       ix86_arch_mask = 1u << ix86_arch;
4459       for (i = 0; i < X86_ARCH_LAST; ++i)
4460         ix86_arch_features[i]
4461           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
4462     }
4463
4464   /* Recreate the tune optimization tests */
4465   if (old_tune != ix86_tune)
4466     {
4467       ix86_tune_mask = 1u << ix86_tune;
4468       for (i = 0; i < X86_TUNE_LAST; ++i)
4469         ix86_tune_features[i]
4470           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
4471     }
4472 }
4473
4474 /* Print the current options */
4475
4476 static void
4477 ix86_function_specific_print (FILE *file, int indent,
4478                               struct cl_target_option *ptr)
4479 {
4480   char *target_string
4481     = ix86_target_string (ptr->x_ix86_isa_flags, ptr->x_target_flags,
4482                           NULL, NULL, NULL, false);
4483
4484   fprintf (file, "%*sarch = %d (%s)\n",
4485            indent, "",
4486            ptr->arch,
4487            ((ptr->arch < TARGET_CPU_DEFAULT_max)
4488             ? cpu_names[ptr->arch]
4489             : "<unknown>"));
4490
4491   fprintf (file, "%*stune = %d (%s)\n",
4492            indent, "",
4493            ptr->tune,
4494            ((ptr->tune < TARGET_CPU_DEFAULT_max)
4495             ? cpu_names[ptr->tune]
4496             : "<unknown>"));
4497
4498   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
4499            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
4500            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
4501   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
4502
4503   if (target_string)
4504     {
4505       fprintf (file, "%*s%s\n", indent, "", target_string);
4506       free (target_string);
4507     }
4508 }
4509
4510 \f
4511 /* Inner function to process the attribute((target(...))), take an argument and
4512    set the current options from the argument. If we have a list, recursively go
4513    over the list.  */
4514
4515 static bool
4516 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
4517 {
4518   char *next_optstr;
4519   bool ret = true;
4520
4521 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
4522 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
4523 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
4524 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
4525
4526   enum ix86_opt_type
4527   {
4528     ix86_opt_unknown,
4529     ix86_opt_yes,
4530     ix86_opt_no,
4531     ix86_opt_str,
4532     ix86_opt_isa
4533   };
4534
4535   static const struct
4536   {
4537     const char *string;
4538     size_t len;
4539     enum ix86_opt_type type;
4540     int opt;
4541     int mask;
4542   } attrs[] = {
4543     /* isa options */
4544     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
4545     IX86_ATTR_ISA ("abm",       OPT_mabm),
4546     IX86_ATTR_ISA ("bmi",       OPT_mbmi),
4547     IX86_ATTR_ISA ("tbm",       OPT_mtbm),
4548     IX86_ATTR_ISA ("aes",       OPT_maes),
4549     IX86_ATTR_ISA ("avx",       OPT_mavx),
4550     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
4551     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
4552     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
4553     IX86_ATTR_ISA ("sse",       OPT_msse),
4554     IX86_ATTR_ISA ("sse2",      OPT_msse2),
4555     IX86_ATTR_ISA ("sse3",      OPT_msse3),
4556     IX86_ATTR_ISA ("sse4",      OPT_msse4),
4557     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
4558     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
4559     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
4560     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
4561     IX86_ATTR_ISA ("fma4",      OPT_mfma4),
4562     IX86_ATTR_ISA ("xop",       OPT_mxop),
4563     IX86_ATTR_ISA ("lwp",       OPT_mlwp),
4564     IX86_ATTR_ISA ("fsgsbase",  OPT_mfsgsbase),
4565     IX86_ATTR_ISA ("rdrnd",     OPT_mrdrnd),
4566     IX86_ATTR_ISA ("f16c",      OPT_mf16c),
4567
4568     /* string options */
4569     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
4570     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
4571     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
4572
4573     /* flag options */
4574     IX86_ATTR_YES ("cld",
4575                    OPT_mcld,
4576                    MASK_CLD),
4577
4578     IX86_ATTR_NO ("fancy-math-387",
4579                   OPT_mfancy_math_387,
4580                   MASK_NO_FANCY_MATH_387),
4581
4582     IX86_ATTR_YES ("ieee-fp",
4583                    OPT_mieee_fp,
4584                    MASK_IEEE_FP),
4585
4586     IX86_ATTR_YES ("inline-all-stringops",
4587                    OPT_minline_all_stringops,
4588                    MASK_INLINE_ALL_STRINGOPS),
4589
4590     IX86_ATTR_YES ("inline-stringops-dynamically",
4591                    OPT_minline_stringops_dynamically,
4592                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
4593
4594     IX86_ATTR_NO ("align-stringops",
4595                   OPT_mno_align_stringops,
4596                   MASK_NO_ALIGN_STRINGOPS),
4597
4598     IX86_ATTR_YES ("recip",
4599                    OPT_mrecip,
4600                    MASK_RECIP),
4601
4602   };
4603
4604   /* If this is a list, recurse to get the options.  */
4605   if (TREE_CODE (args) == TREE_LIST)
4606     {
4607       bool ret = true;
4608
4609       for (; args; args = TREE_CHAIN (args))
4610         if (TREE_VALUE (args)
4611             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
4612           ret = false;
4613
4614       return ret;
4615     }
4616
4617   else if (TREE_CODE (args) != STRING_CST)
4618     gcc_unreachable ();
4619
4620   /* Handle multiple arguments separated by commas.  */
4621   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
4622
4623   while (next_optstr && *next_optstr != '\0')
4624     {
4625       char *p = next_optstr;
4626       char *orig_p = p;
4627       char *comma = strchr (next_optstr, ',');
4628       const char *opt_string;
4629       size_t len, opt_len;
4630       int opt;
4631       bool opt_set_p;
4632       char ch;
4633       unsigned i;
4634       enum ix86_opt_type type = ix86_opt_unknown;
4635       int mask = 0;
4636
4637       if (comma)
4638         {
4639           *comma = '\0';
4640           len = comma - next_optstr;
4641           next_optstr = comma + 1;
4642         }
4643       else
4644         {
4645           len = strlen (p);
4646           next_optstr = NULL;
4647         }
4648
4649       /* Recognize no-xxx.  */
4650       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
4651         {
4652           opt_set_p = false;
4653           p += 3;
4654           len -= 3;
4655         }
4656       else
4657         opt_set_p = true;
4658
4659       /* Find the option.  */
4660       ch = *p;
4661       opt = N_OPTS;
4662       for (i = 0; i < ARRAY_SIZE (attrs); i++)
4663         {
4664           type = attrs[i].type;
4665           opt_len = attrs[i].len;
4666           if (ch == attrs[i].string[0]
4667               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
4668               && memcmp (p, attrs[i].string, opt_len) == 0)
4669             {
4670               opt = attrs[i].opt;
4671               mask = attrs[i].mask;
4672               opt_string = attrs[i].string;
4673               break;
4674             }
4675         }
4676
4677       /* Process the option.  */
4678       if (opt == N_OPTS)
4679         {
4680           error ("attribute(target(\"%s\")) is unknown", orig_p);
4681           ret = false;
4682         }
4683
4684       else if (type == ix86_opt_isa)
4685         {
4686           struct cl_decoded_option decoded;
4687
4688           generate_option (opt, NULL, opt_set_p, CL_TARGET, &decoded);
4689           ix86_handle_option (&global_options, &global_options_set,
4690                               &decoded, input_location);
4691         }
4692
4693       else if (type == ix86_opt_yes || type == ix86_opt_no)
4694         {
4695           if (type == ix86_opt_no)
4696             opt_set_p = !opt_set_p;
4697
4698           if (opt_set_p)
4699             target_flags |= mask;
4700           else
4701             target_flags &= ~mask;
4702         }
4703
4704       else if (type == ix86_opt_str)
4705         {
4706           if (p_strings[opt])
4707             {
4708               error ("option(\"%s\") was already specified", opt_string);
4709               ret = false;
4710             }
4711           else
4712             p_strings[opt] = xstrdup (p + opt_len);
4713         }
4714
4715       else
4716         gcc_unreachable ();
4717     }
4718
4719   return ret;
4720 }
4721
4722 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
4723
4724 tree
4725 ix86_valid_target_attribute_tree (tree args)
4726 {
4727   const char *orig_arch_string = ix86_arch_string;
4728   const char *orig_tune_string = ix86_tune_string;
4729   const char *orig_fpmath_string = ix86_fpmath_string;
4730   int orig_tune_defaulted = ix86_tune_defaulted;
4731   int orig_arch_specified = ix86_arch_specified;
4732   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
4733   tree t = NULL_TREE;
4734   int i;
4735   struct cl_target_option *def
4736     = TREE_TARGET_OPTION (target_option_default_node);
4737
4738   /* Process each of the options on the chain.  */
4739   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
4740     return NULL_TREE;
4741
4742   /* If the changed options are different from the default, rerun
4743      ix86_option_override_internal, and then save the options away.
4744      The string options are are attribute options, and will be undone
4745      when we copy the save structure.  */
4746   if (ix86_isa_flags != def->x_ix86_isa_flags
4747       || target_flags != def->x_target_flags
4748       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
4749       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
4750       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
4751     {
4752       /* If we are using the default tune= or arch=, undo the string assigned,
4753          and use the default.  */
4754       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
4755         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
4756       else if (!orig_arch_specified)
4757         ix86_arch_string = NULL;
4758
4759       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
4760         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
4761       else if (orig_tune_defaulted)
4762         ix86_tune_string = NULL;
4763
4764       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
4765       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
4766         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
4767       else if (!TARGET_64BIT && TARGET_SSE)
4768         ix86_fpmath_string = "sse,387";
4769
4770       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
4771       ix86_option_override_internal (false);
4772
4773       /* Add any builtin functions with the new isa if any.  */
4774       ix86_add_new_builtins (ix86_isa_flags);
4775
4776       /* Save the current options unless we are validating options for
4777          #pragma.  */
4778       t = build_target_option_node ();
4779
4780       ix86_arch_string = orig_arch_string;
4781       ix86_tune_string = orig_tune_string;
4782       ix86_fpmath_string = orig_fpmath_string;
4783
4784       /* Free up memory allocated to hold the strings */
4785       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
4786         if (option_strings[i])
4787           free (option_strings[i]);
4788     }
4789
4790   return t;
4791 }
4792
4793 /* Hook to validate attribute((target("string"))).  */
4794
4795 static bool
4796 ix86_valid_target_attribute_p (tree fndecl,
4797                                tree ARG_UNUSED (name),
4798                                tree args,
4799                                int ARG_UNUSED (flags))
4800 {
4801   struct cl_target_option cur_target;
4802   bool ret = true;
4803   tree old_optimize = build_optimization_node ();
4804   tree new_target, new_optimize;
4805   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
4806
4807   /* If the function changed the optimization levels as well as setting target
4808      options, start with the optimizations specified.  */
4809   if (func_optimize && func_optimize != old_optimize)
4810     cl_optimization_restore (&global_options,
4811                              TREE_OPTIMIZATION (func_optimize));
4812
4813   /* The target attributes may also change some optimization flags, so update
4814      the optimization options if necessary.  */
4815   cl_target_option_save (&cur_target, &global_options);
4816   new_target = ix86_valid_target_attribute_tree (args);
4817   new_optimize = build_optimization_node ();
4818
4819   if (!new_target)
4820     ret = false;
4821
4822   else if (fndecl)
4823     {
4824       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
4825
4826       if (old_optimize != new_optimize)
4827         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
4828     }
4829
4830   cl_target_option_restore (&global_options, &cur_target);
4831
4832   if (old_optimize != new_optimize)
4833     cl_optimization_restore (&global_options,
4834                              TREE_OPTIMIZATION (old_optimize));
4835
4836   return ret;
4837 }
4838
4839 \f
4840 /* Hook to determine if one function can safely inline another.  */
4841
4842 static bool
4843 ix86_can_inline_p (tree caller, tree callee)
4844 {
4845   bool ret = false;
4846   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
4847   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
4848
4849   /* If callee has no option attributes, then it is ok to inline.  */
4850   if (!callee_tree)
4851     ret = true;
4852
4853   /* If caller has no option attributes, but callee does then it is not ok to
4854      inline.  */
4855   else if (!caller_tree)
4856     ret = false;
4857
4858   else
4859     {
4860       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
4861       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
4862
4863       /* Callee's isa options should a subset of the caller's, i.e. a SSE4 function
4864          can inline a SSE2 function but a SSE2 function can't inline a SSE4
4865          function.  */
4866       if ((caller_opts->x_ix86_isa_flags & callee_opts->x_ix86_isa_flags)
4867           != callee_opts->x_ix86_isa_flags)
4868         ret = false;
4869
4870       /* See if we have the same non-isa options.  */
4871       else if (caller_opts->x_target_flags != callee_opts->x_target_flags)
4872         ret = false;
4873
4874       /* See if arch, tune, etc. are the same.  */
4875       else if (caller_opts->arch != callee_opts->arch)
4876         ret = false;
4877
4878       else if (caller_opts->tune != callee_opts->tune)
4879         ret = false;
4880
4881       else if (caller_opts->fpmath != callee_opts->fpmath)
4882         ret = false;
4883
4884       else if (caller_opts->branch_cost != callee_opts->branch_cost)
4885         ret = false;
4886
4887       else
4888         ret = true;
4889     }
4890
4891   return ret;
4892 }
4893
4894 \f
4895 /* Remember the last target of ix86_set_current_function.  */
4896 static GTY(()) tree ix86_previous_fndecl;
4897
4898 /* Establish appropriate back-end context for processing the function
4899    FNDECL.  The argument might be NULL to indicate processing at top
4900    level, outside of any function scope.  */
4901 static void
4902 ix86_set_current_function (tree fndecl)
4903 {
4904   /* Only change the context if the function changes.  This hook is called
4905      several times in the course of compiling a function, and we don't want to
4906      slow things down too much or call target_reinit when it isn't safe.  */
4907   if (fndecl && fndecl != ix86_previous_fndecl)
4908     {
4909       tree old_tree = (ix86_previous_fndecl
4910                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
4911                        : NULL_TREE);
4912
4913       tree new_tree = (fndecl
4914                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
4915                        : NULL_TREE);
4916
4917       ix86_previous_fndecl = fndecl;
4918       if (old_tree == new_tree)
4919         ;
4920
4921       else if (new_tree)
4922         {
4923           cl_target_option_restore (&global_options,
4924                                     TREE_TARGET_OPTION (new_tree));
4925           target_reinit ();
4926         }
4927
4928       else if (old_tree)
4929         {
4930           struct cl_target_option *def
4931             = TREE_TARGET_OPTION (target_option_current_node);
4932
4933           cl_target_option_restore (&global_options, def);
4934           target_reinit ();
4935         }
4936     }
4937 }
4938
4939 \f
4940 /* Return true if this goes in large data/bss.  */
4941
4942 static bool
4943 ix86_in_large_data_p (tree exp)
4944 {
4945   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
4946     return false;
4947
4948   /* Functions are never large data.  */
4949   if (TREE_CODE (exp) == FUNCTION_DECL)
4950     return false;
4951
4952   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
4953     {
4954       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
4955       if (strcmp (section, ".ldata") == 0
4956           || strcmp (section, ".lbss") == 0)
4957         return true;
4958       return false;
4959     }
4960   else
4961     {
4962       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
4963
4964       /* If this is an incomplete type with size 0, then we can't put it
4965          in data because it might be too big when completed.  */
4966       if (!size || size > ix86_section_threshold)
4967         return true;
4968     }
4969
4970   return false;
4971 }
4972
4973 /* Switch to the appropriate section for output of DECL.
4974    DECL is either a `VAR_DECL' node or a constant of some sort.
4975    RELOC indicates whether forming the initial value of DECL requires
4976    link-time relocations.  */
4977
4978 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
4979         ATTRIBUTE_UNUSED;
4980
4981 static section *
4982 x86_64_elf_select_section (tree decl, int reloc,
4983                            unsigned HOST_WIDE_INT align)
4984 {
4985   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4986       && ix86_in_large_data_p (decl))
4987     {
4988       const char *sname = NULL;
4989       unsigned int flags = SECTION_WRITE;
4990       switch (categorize_decl_for_section (decl, reloc))
4991         {
4992         case SECCAT_DATA:
4993           sname = ".ldata";
4994           break;
4995         case SECCAT_DATA_REL:
4996           sname = ".ldata.rel";
4997           break;
4998         case SECCAT_DATA_REL_LOCAL:
4999           sname = ".ldata.rel.local";
5000           break;
5001         case SECCAT_DATA_REL_RO:
5002           sname = ".ldata.rel.ro";
5003           break;
5004         case SECCAT_DATA_REL_RO_LOCAL:
5005           sname = ".ldata.rel.ro.local";
5006           break;
5007         case SECCAT_BSS:
5008           sname = ".lbss";
5009           flags |= SECTION_BSS;
5010           break;
5011         case SECCAT_RODATA:
5012         case SECCAT_RODATA_MERGE_STR:
5013         case SECCAT_RODATA_MERGE_STR_INIT:
5014         case SECCAT_RODATA_MERGE_CONST:
5015           sname = ".lrodata";
5016           flags = 0;
5017           break;
5018         case SECCAT_SRODATA:
5019         case SECCAT_SDATA:
5020         case SECCAT_SBSS:
5021           gcc_unreachable ();
5022         case SECCAT_TEXT:
5023         case SECCAT_TDATA:
5024         case SECCAT_TBSS:
5025           /* We don't split these for medium model.  Place them into
5026              default sections and hope for best.  */
5027           break;
5028         }
5029       if (sname)
5030         {
5031           /* We might get called with string constants, but get_named_section
5032              doesn't like them as they are not DECLs.  Also, we need to set
5033              flags in that case.  */
5034           if (!DECL_P (decl))
5035             return get_section (sname, flags, NULL);
5036           return get_named_section (decl, sname, reloc);
5037         }
5038     }
5039   return default_elf_select_section (decl, reloc, align);
5040 }
5041
5042 /* Build up a unique section name, expressed as a
5043    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
5044    RELOC indicates whether the initial value of EXP requires
5045    link-time relocations.  */
5046
5047 static void ATTRIBUTE_UNUSED
5048 x86_64_elf_unique_section (tree decl, int reloc)
5049 {
5050   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5051       && ix86_in_large_data_p (decl))
5052     {
5053       const char *prefix = NULL;
5054       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
5055       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
5056
5057       switch (categorize_decl_for_section (decl, reloc))
5058         {
5059         case SECCAT_DATA:
5060         case SECCAT_DATA_REL:
5061         case SECCAT_DATA_REL_LOCAL:
5062         case SECCAT_DATA_REL_RO:
5063         case SECCAT_DATA_REL_RO_LOCAL:
5064           prefix = one_only ? ".ld" : ".ldata";
5065           break;
5066         case SECCAT_BSS:
5067           prefix = one_only ? ".lb" : ".lbss";
5068           break;
5069         case SECCAT_RODATA:
5070         case SECCAT_RODATA_MERGE_STR:
5071         case SECCAT_RODATA_MERGE_STR_INIT:
5072         case SECCAT_RODATA_MERGE_CONST:
5073           prefix = one_only ? ".lr" : ".lrodata";
5074           break;
5075         case SECCAT_SRODATA:
5076         case SECCAT_SDATA:
5077         case SECCAT_SBSS:
5078           gcc_unreachable ();
5079         case SECCAT_TEXT:
5080         case SECCAT_TDATA:
5081         case SECCAT_TBSS:
5082           /* We don't split these for medium model.  Place them into
5083              default sections and hope for best.  */
5084           break;
5085         }
5086       if (prefix)
5087         {
5088           const char *name, *linkonce;
5089           char *string;
5090
5091           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5092           name = targetm.strip_name_encoding (name);
5093
5094           /* If we're using one_only, then there needs to be a .gnu.linkonce
5095              prefix to the section name.  */
5096           linkonce = one_only ? ".gnu.linkonce" : "";
5097
5098           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
5099
5100           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
5101           return;
5102         }
5103     }
5104   default_unique_section (decl, reloc);
5105 }
5106
5107 #ifdef COMMON_ASM_OP
5108 /* This says how to output assembler code to declare an
5109    uninitialized external linkage data object.
5110
5111    For medium model x86-64 we need to use .largecomm opcode for
5112    large objects.  */
5113 void
5114 x86_elf_aligned_common (FILE *file,
5115                         const char *name, unsigned HOST_WIDE_INT size,
5116                         int align)
5117 {
5118   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5119       && size > (unsigned int)ix86_section_threshold)
5120     fputs (".largecomm\t", file);
5121   else
5122     fputs (COMMON_ASM_OP, file);
5123   assemble_name (file, name);
5124   fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
5125            size, align / BITS_PER_UNIT);
5126 }
5127 #endif
5128
5129 /* Utility function for targets to use in implementing
5130    ASM_OUTPUT_ALIGNED_BSS.  */
5131
5132 void
5133 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
5134                         const char *name, unsigned HOST_WIDE_INT size,
5135                         int align)
5136 {
5137   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5138       && size > (unsigned int)ix86_section_threshold)
5139     switch_to_section (get_named_section (decl, ".lbss", 0));
5140   else
5141     switch_to_section (bss_section);
5142   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
5143 #ifdef ASM_DECLARE_OBJECT_NAME
5144   last_assemble_variable_decl = decl;
5145   ASM_DECLARE_OBJECT_NAME (file, name, decl);
5146 #else
5147   /* Standard thing is just output label for the object.  */
5148   ASM_OUTPUT_LABEL (file, name);
5149 #endif /* ASM_DECLARE_OBJECT_NAME */
5150   ASM_OUTPUT_SKIP (file, size ? size : 1);
5151 }
5152 \f
5153 static const struct default_options ix86_option_optimization_table[] =
5154   {
5155     /* Turn off -fschedule-insns by default.  It tends to make the
5156        problem with not enough registers even worse.  */
5157 #ifdef INSN_SCHEDULING
5158     { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
5159 #endif
5160
5161 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
5162     SUBTARGET_OPTIMIZATION_OPTIONS,
5163 #endif
5164     { OPT_LEVELS_NONE, 0, NULL, 0 }
5165   };
5166
5167 /* Implement TARGET_OPTION_INIT_STRUCT.  */
5168
5169 static void
5170 ix86_option_init_struct (struct gcc_options *opts)
5171 {
5172   if (TARGET_MACHO)
5173     /* The Darwin libraries never set errno, so we might as well
5174        avoid calling them when that's the only reason we would.  */
5175     opts->x_flag_errno_math = 0;
5176
5177   opts->x_flag_pcc_struct_return = 2;
5178   opts->x_flag_asynchronous_unwind_tables = 2;
5179   opts->x_flag_vect_cost_model = 1;
5180 }
5181
5182 /* Decide whether we must probe the stack before any space allocation
5183    on this target.  It's essentially TARGET_STACK_PROBE except when
5184    -fstack-check causes the stack to be already probed differently.  */
5185
5186 bool
5187 ix86_target_stack_probe (void)
5188 {
5189   /* Do not probe the stack twice if static stack checking is enabled.  */
5190   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5191     return false;
5192
5193   return TARGET_STACK_PROBE;
5194 }
5195 \f
5196 /* Decide whether we can make a sibling call to a function.  DECL is the
5197    declaration of the function being targeted by the call and EXP is the
5198    CALL_EXPR representing the call.  */
5199
5200 static bool
5201 ix86_function_ok_for_sibcall (tree decl, tree exp)
5202 {
5203   tree type, decl_or_type;
5204   rtx a, b;
5205
5206   /* If we are generating position-independent code, we cannot sibcall
5207      optimize any indirect call, or a direct call to a global function,
5208      as the PLT requires %ebx be live. (Darwin does not have a PLT.)  */
5209   if (!TARGET_MACHO
5210       && !TARGET_64BIT 
5211       && flag_pic 
5212       && (!decl || !targetm.binds_local_p (decl)))
5213     return false;
5214
5215   /* If we need to align the outgoing stack, then sibcalling would
5216      unalign the stack, which may break the called function.  */
5217   if (ix86_minimum_incoming_stack_boundary (true)
5218       < PREFERRED_STACK_BOUNDARY)
5219     return false;
5220
5221   if (decl)
5222     {
5223       decl_or_type = decl;
5224       type = TREE_TYPE (decl);
5225     }
5226   else
5227     {
5228       /* We're looking at the CALL_EXPR, we need the type of the function.  */
5229       type = CALL_EXPR_FN (exp);                /* pointer expression */
5230       type = TREE_TYPE (type);                  /* pointer type */
5231       type = TREE_TYPE (type);                  /* function type */
5232       decl_or_type = type;
5233     }
5234
5235   /* Check that the return value locations are the same.  Like
5236      if we are returning floats on the 80387 register stack, we cannot
5237      make a sibcall from a function that doesn't return a float to a
5238      function that does or, conversely, from a function that does return
5239      a float to a function that doesn't; the necessary stack adjustment
5240      would not be executed.  This is also the place we notice
5241      differences in the return value ABI.  Note that it is ok for one
5242      of the functions to have void return type as long as the return
5243      value of the other is passed in a register.  */
5244   a = ix86_function_value (TREE_TYPE (exp), decl_or_type, false);
5245   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
5246                            cfun->decl, false);
5247   if (STACK_REG_P (a) || STACK_REG_P (b))
5248     {
5249       if (!rtx_equal_p (a, b))
5250         return false;
5251     }
5252   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
5253     {
5254       /* Disable sibcall if we need to generate vzeroupper after
5255          callee returns.  */
5256       if (TARGET_VZEROUPPER
5257           && cfun->machine->callee_return_avx256_p
5258           && !cfun->machine->caller_return_avx256_p)
5259         return false;
5260     }
5261   else if (!rtx_equal_p (a, b))
5262     return false;
5263
5264   if (TARGET_64BIT)
5265     {
5266       /* The SYSV ABI has more call-clobbered registers;
5267          disallow sibcalls from MS to SYSV.  */
5268       if (cfun->machine->call_abi == MS_ABI
5269           && ix86_function_type_abi (type) == SYSV_ABI)
5270         return false;
5271     }
5272   else
5273     {
5274       /* If this call is indirect, we'll need to be able to use a
5275          call-clobbered register for the address of the target function.
5276          Make sure that all such registers are not used for passing
5277          parameters.  Note that DLLIMPORT functions are indirect.  */
5278       if (!decl
5279           || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl)))
5280         {
5281           if (ix86_function_regparm (type, NULL) >= 3)
5282             {
5283               /* ??? Need to count the actual number of registers to be used,
5284                  not the possible number of registers.  Fix later.  */
5285               return false;
5286             }
5287         }
5288     }
5289
5290   /* Otherwise okay.  That also includes certain types of indirect calls.  */
5291   return true;
5292 }
5293
5294 /* Handle "cdecl", "stdcall", "fastcall", "regparm", "thiscall",
5295    and "sseregparm" calling convention attributes;
5296    arguments as in struct attribute_spec.handler.  */
5297
5298 static tree
5299 ix86_handle_cconv_attribute (tree *node, tree name,
5300                                    tree args,
5301                                    int flags ATTRIBUTE_UNUSED,
5302                                    bool *no_add_attrs)
5303 {
5304   if (TREE_CODE (*node) != FUNCTION_TYPE
5305       && TREE_CODE (*node) != METHOD_TYPE
5306       && TREE_CODE (*node) != FIELD_DECL
5307       && TREE_CODE (*node) != TYPE_DECL)
5308     {
5309       warning (OPT_Wattributes, "%qE attribute only applies to functions",
5310                name);
5311       *no_add_attrs = true;
5312       return NULL_TREE;
5313     }
5314
5315   /* Can combine regparm with all attributes but fastcall.  */
5316   if (is_attribute_p ("regparm", name))
5317     {
5318       tree cst;
5319
5320       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5321         {
5322           error ("fastcall and regparm attributes are not compatible");
5323         }
5324
5325       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5326         {
5327           error ("regparam and thiscall attributes are not compatible");
5328         }
5329
5330       cst = TREE_VALUE (args);
5331       if (TREE_CODE (cst) != INTEGER_CST)
5332         {
5333           warning (OPT_Wattributes,
5334                    "%qE attribute requires an integer constant argument",
5335                    name);
5336           *no_add_attrs = true;
5337         }
5338       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
5339         {
5340           warning (OPT_Wattributes, "argument to %qE attribute larger than %d",
5341                    name, REGPARM_MAX);
5342           *no_add_attrs = true;
5343         }
5344
5345       return NULL_TREE;
5346     }
5347
5348   if (TARGET_64BIT)
5349     {
5350       /* Do not warn when emulating the MS ABI.  */
5351       if ((TREE_CODE (*node) != FUNCTION_TYPE
5352            && TREE_CODE (*node) != METHOD_TYPE)
5353           || ix86_function_type_abi (*node) != MS_ABI)
5354         warning (OPT_Wattributes, "%qE attribute ignored",
5355                  name);
5356       *no_add_attrs = true;
5357       return NULL_TREE;
5358     }
5359
5360   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
5361   if (is_attribute_p ("fastcall", name))
5362     {
5363       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5364         {
5365           error ("fastcall and cdecl attributes are not compatible");
5366         }
5367       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5368         {
5369           error ("fastcall and stdcall attributes are not compatible");
5370         }
5371       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
5372         {
5373           error ("fastcall and regparm attributes are not compatible");
5374         }
5375       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5376         {
5377           error ("fastcall and thiscall attributes are not compatible");
5378         }
5379     }
5380
5381   /* Can combine stdcall with fastcall (redundant), regparm and
5382      sseregparm.  */
5383   else if (is_attribute_p ("stdcall", name))
5384     {
5385       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5386         {
5387           error ("stdcall and cdecl attributes are not compatible");
5388         }
5389       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5390         {
5391           error ("stdcall and fastcall attributes are not compatible");
5392         }
5393       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5394         {
5395           error ("stdcall and thiscall attributes are not compatible");
5396         }
5397     }
5398
5399   /* Can combine cdecl with regparm and sseregparm.  */
5400   else if (is_attribute_p ("cdecl", name))
5401     {
5402       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5403         {
5404           error ("stdcall and cdecl attributes are not compatible");
5405         }
5406       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5407         {
5408           error ("fastcall and cdecl attributes are not compatible");
5409         }
5410       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5411         {
5412           error ("cdecl and thiscall attributes are not compatible");
5413         }
5414     }
5415   else if (is_attribute_p ("thiscall", name))
5416     {
5417       if (TREE_CODE (*node) != METHOD_TYPE && pedantic)
5418         warning (OPT_Wattributes, "%qE attribute is used for none class-method",
5419                  name);
5420       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5421         {
5422           error ("stdcall and thiscall attributes are not compatible");
5423         }
5424       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5425         {
5426           error ("fastcall and thiscall attributes are not compatible");
5427         }
5428       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5429         {
5430           error ("cdecl and thiscall attributes are not compatible");
5431         }
5432     }
5433
5434   /* Can combine sseregparm with all attributes.  */
5435
5436   return NULL_TREE;
5437 }
5438
5439 /* This function checks if the method-function has default __thiscall
5440    calling-convention for 32-bit msabi.
5441    It returns true if TYPE is of kind METHOD_TYPE, no stdarg function,
5442    and the MS_ABI 32-bit is used.  Otherwise it returns false.  */
5443
5444 static bool
5445 ix86_is_msabi_thiscall (const_tree type)
5446 {
5447   if (TARGET_64BIT || ix86_function_type_abi (type) != MS_ABI
5448       || TREE_CODE (type) != METHOD_TYPE || stdarg_p (type))
5449     return false;
5450   /* Check for different calling-conventions.  */
5451   if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (type))
5452       || lookup_attribute ("stdcall", TYPE_ATTRIBUTES (type))
5453       || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type))
5454       || lookup_attribute ("regparm", TYPE_ATTRIBUTES (type))
5455       || lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type)))
5456     return false;
5457   return true;
5458 }
5459
5460 /* This function checks if the thiscall attribute is set for the TYPE,
5461    or if it is an method-type with default thiscall convention.
5462    It returns true if function match, otherwise false is returned.  */
5463
5464 static bool
5465 ix86_is_type_thiscall (const_tree type)
5466 {
5467   if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (type))
5468       || ix86_is_msabi_thiscall (type))
5469     return true;
5470   return false;
5471 }
5472
5473 /* Return 0 if the attributes for two types are incompatible, 1 if they
5474    are compatible, and 2 if they are nearly compatible (which causes a
5475    warning to be generated).  */
5476
5477 static int
5478 ix86_comp_type_attributes (const_tree type1, const_tree type2)
5479 {
5480   /* Check for mismatch of non-default calling convention.  */
5481   bool is_thiscall = ix86_is_msabi_thiscall (type1);
5482   const char *const rtdstr = TARGET_RTD ? (is_thiscall ? "thiscall" : "cdecl") : "stdcall";
5483
5484   if (TREE_CODE (type1) != FUNCTION_TYPE
5485       && TREE_CODE (type1) != METHOD_TYPE)
5486     return 1;
5487
5488   /* Check for mismatched fastcall/regparm types.  */
5489   if ((!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
5490        != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
5491       || (ix86_function_regparm (type1, NULL)
5492           != ix86_function_regparm (type2, NULL)))
5493     return 0;
5494
5495   /* Check for mismatched sseregparm types.  */
5496   if (!lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type1))
5497       != !lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type2)))
5498     return 0;
5499
5500   /* Check for mismatched thiscall types.  */
5501   if (is_thiscall && !TARGET_RTD)
5502     {
5503       if (!lookup_attribute ("cdecl", TYPE_ATTRIBUTES (type1))
5504           != !lookup_attribute ("cdecl", TYPE_ATTRIBUTES (type2)))
5505         return 0;
5506     }
5507   else if (!is_thiscall || TARGET_RTD)
5508     {
5509       if (!lookup_attribute ("thiscall", TYPE_ATTRIBUTES (type1))
5510           != !lookup_attribute ("thiscall", TYPE_ATTRIBUTES (type2)))
5511         return 0;
5512     }
5513
5514   /* Check for mismatched return types (cdecl vs stdcall).  */
5515   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
5516       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
5517     return 0;
5518
5519   return 1;
5520 }
5521 \f
5522 /* Return the regparm value for a function with the indicated TYPE and DECL.
5523    DECL may be NULL when calling function indirectly
5524    or considering a libcall.  */
5525
5526 static int
5527 ix86_function_regparm (const_tree type, const_tree decl)
5528 {
5529   tree attr;
5530   int regparm;
5531
5532   if (TARGET_64BIT)
5533     return (ix86_function_type_abi (type) == SYSV_ABI
5534             ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
5535
5536   regparm = ix86_regparm;
5537   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
5538   if (attr)
5539     {
5540       regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
5541       return regparm;
5542     }
5543
5544   if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
5545     return 2;
5546
5547   if (ix86_is_type_thiscall (type))
5548     return 1;
5549
5550   /* Use register calling convention for local functions when possible.  */
5551   if (decl
5552       && TREE_CODE (decl) == FUNCTION_DECL
5553       && optimize
5554       && !(profile_flag && !flag_fentry))
5555     {
5556       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
5557       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE (decl));
5558       if (i && i->local && i->can_change_signature)
5559         {
5560           int local_regparm, globals = 0, regno;
5561
5562           /* Make sure no regparm register is taken by a
5563              fixed register variable.  */
5564           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
5565             if (fixed_regs[local_regparm])
5566               break;
5567
5568           /* We don't want to use regparm(3) for nested functions as
5569              these use a static chain pointer in the third argument.  */
5570           if (local_regparm == 3 && DECL_STATIC_CHAIN (decl))
5571             local_regparm = 2;
5572
5573           /* In 32-bit mode save a register for the split stack.  */
5574           if (!TARGET_64BIT && local_regparm == 3 && flag_split_stack)
5575             local_regparm = 2;
5576
5577           /* Each fixed register usage increases register pressure,
5578              so less registers should be used for argument passing.
5579              This functionality can be overriden by an explicit
5580              regparm value.  */
5581           for (regno = 0; regno <= DI_REG; regno++)
5582             if (fixed_regs[regno])
5583               globals++;
5584
5585           local_regparm
5586             = globals < local_regparm ? local_regparm - globals : 0;
5587
5588           if (local_regparm > regparm)
5589             regparm = local_regparm;
5590         }
5591     }
5592
5593   return regparm;
5594 }
5595
5596 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
5597    DFmode (2) arguments in SSE registers for a function with the
5598    indicated TYPE and DECL.  DECL may be NULL when calling function
5599    indirectly or considering a libcall.  Otherwise return 0.  */
5600
5601 static int
5602 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
5603 {
5604   gcc_assert (!TARGET_64BIT);
5605
5606   /* Use SSE registers to pass SFmode and DFmode arguments if requested
5607      by the sseregparm attribute.  */
5608   if (TARGET_SSEREGPARM
5609       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
5610     {
5611       if (!TARGET_SSE)
5612         {
5613           if (warn)
5614             {
5615               if (decl)
5616                 error ("calling %qD with attribute sseregparm without "
5617                        "SSE/SSE2 enabled", decl);
5618               else
5619                 error ("calling %qT with attribute sseregparm without "
5620                        "SSE/SSE2 enabled", type);
5621             }
5622           return 0;
5623         }
5624
5625       return 2;
5626     }
5627
5628   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
5629      (and DFmode for SSE2) arguments in SSE registers.  */
5630   if (decl && TARGET_SSE_MATH && optimize
5631       && !(profile_flag && !flag_fentry))
5632     {
5633       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
5634       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
5635       if (i && i->local && i->can_change_signature)
5636         return TARGET_SSE2 ? 2 : 1;
5637     }
5638
5639   return 0;
5640 }
5641
5642 /* Return true if EAX is live at the start of the function.  Used by
5643    ix86_expand_prologue to determine if we need special help before
5644    calling allocate_stack_worker.  */
5645
5646 static bool
5647 ix86_eax_live_at_start_p (void)
5648 {
5649   /* Cheat.  Don't bother working forward from ix86_function_regparm
5650      to the function type to whether an actual argument is located in
5651      eax.  Instead just look at cfg info, which is still close enough
5652      to correct at this point.  This gives false positives for broken
5653      functions that might use uninitialized data that happens to be
5654      allocated in eax, but who cares?  */
5655   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
5656 }
5657
5658 static bool
5659 ix86_keep_aggregate_return_pointer (tree fntype)
5660 {
5661   tree attr;
5662
5663   if (!TARGET_64BIT)
5664     {
5665       attr = lookup_attribute ("callee_pop_aggregate_return",
5666                                TYPE_ATTRIBUTES (fntype));
5667       if (attr)
5668         return (TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))) == 0);
5669
5670       /* For 32-bit MS-ABI the default is to keep aggregate
5671          return pointer.  */
5672       if (ix86_function_type_abi (fntype) == MS_ABI)
5673         return true;
5674     }
5675   return KEEP_AGGREGATE_RETURN_POINTER != 0;
5676 }
5677
5678 /* Value is the number of bytes of arguments automatically
5679    popped when returning from a subroutine call.
5680    FUNDECL is the declaration node of the function (as a tree),
5681    FUNTYPE is the data type of the function (as a tree),
5682    or for a library call it is an identifier node for the subroutine name.
5683    SIZE is the number of bytes of arguments passed on the stack.
5684
5685    On the 80386, the RTD insn may be used to pop them if the number
5686      of args is fixed, but if the number is variable then the caller
5687      must pop them all.  RTD can't be used for library calls now
5688      because the library is compiled with the Unix compiler.
5689    Use of RTD is a selectable option, since it is incompatible with
5690    standard Unix calling sequences.  If the option is not selected,
5691    the caller must always pop the args.
5692
5693    The attribute stdcall is equivalent to RTD on a per module basis.  */
5694
5695 static int
5696 ix86_return_pops_args (tree fundecl, tree funtype, int size)
5697 {
5698   int rtd;
5699
5700   /* None of the 64-bit ABIs pop arguments.  */
5701   if (TARGET_64BIT)
5702     return 0;
5703
5704   rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
5705
5706   /* Cdecl functions override -mrtd, and never pop the stack.  */
5707   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype)))
5708     {
5709       /* Stdcall and fastcall functions will pop the stack if not
5710          variable args.  */
5711       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
5712           || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype))
5713           || ix86_is_type_thiscall (funtype))
5714         rtd = 1;
5715
5716       if (rtd && ! stdarg_p (funtype))
5717         return size;
5718     }
5719
5720   /* Lose any fake structure return argument if it is passed on the stack.  */
5721   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
5722       && !ix86_keep_aggregate_return_pointer (funtype))
5723     {
5724       int nregs = ix86_function_regparm (funtype, fundecl);
5725       if (nregs == 0)
5726         return GET_MODE_SIZE (Pmode);
5727     }
5728
5729   return 0;
5730 }
5731 \f
5732 /* Argument support functions.  */
5733
5734 /* Return true when register may be used to pass function parameters.  */
5735 bool
5736 ix86_function_arg_regno_p (int regno)
5737 {
5738   int i;
5739   const int *parm_regs;
5740
5741   if (!TARGET_64BIT)
5742     {
5743       if (TARGET_MACHO)
5744         return (regno < REGPARM_MAX
5745                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
5746       else
5747         return (regno < REGPARM_MAX
5748                 || (TARGET_MMX && MMX_REGNO_P (regno)
5749                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
5750                 || (TARGET_SSE && SSE_REGNO_P (regno)
5751                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
5752     }
5753
5754   if (TARGET_MACHO)
5755     {
5756       if (SSE_REGNO_P (regno) && TARGET_SSE)
5757         return true;
5758     }
5759   else
5760     {
5761       if (TARGET_SSE && SSE_REGNO_P (regno)
5762           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
5763         return true;
5764     }
5765
5766   /* TODO: The function should depend on current function ABI but
5767      builtins.c would need updating then. Therefore we use the
5768      default ABI.  */
5769
5770   /* RAX is used as hidden argument to va_arg functions.  */
5771   if (ix86_abi == SYSV_ABI && regno == AX_REG)
5772     return true;
5773
5774   if (ix86_abi == MS_ABI)
5775     parm_regs = x86_64_ms_abi_int_parameter_registers;
5776   else
5777     parm_regs = x86_64_int_parameter_registers;
5778   for (i = 0; i < (ix86_abi == MS_ABI
5779                    ? X86_64_MS_REGPARM_MAX : X86_64_REGPARM_MAX); i++)
5780     if (regno == parm_regs[i])
5781       return true;
5782   return false;
5783 }
5784
5785 /* Return if we do not know how to pass TYPE solely in registers.  */
5786
5787 static bool
5788 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
5789 {
5790   if (must_pass_in_stack_var_size_or_pad (mode, type))
5791     return true;
5792
5793   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
5794      The layout_type routine is crafty and tries to trick us into passing
5795      currently unsupported vector types on the stack by using TImode.  */
5796   return (!TARGET_64BIT && mode == TImode
5797           && type && TREE_CODE (type) != VECTOR_TYPE);
5798 }
5799
5800 /* It returns the size, in bytes, of the area reserved for arguments passed
5801    in registers for the function represented by fndecl dependent to the used
5802    abi format.  */
5803 int
5804 ix86_reg_parm_stack_space (const_tree fndecl)
5805 {
5806   enum calling_abi call_abi = SYSV_ABI;
5807   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
5808     call_abi = ix86_function_abi (fndecl);
5809   else
5810     call_abi = ix86_function_type_abi (fndecl);
5811   if (TARGET_64BIT && call_abi == MS_ABI)
5812     return 32;
5813   return 0;
5814 }
5815
5816 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
5817    call abi used.  */
5818 enum calling_abi
5819 ix86_function_type_abi (const_tree fntype)
5820 {
5821   if (fntype != NULL)
5822     {
5823       enum calling_abi abi = ix86_abi;
5824       if (abi == SYSV_ABI)
5825         {
5826           if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
5827             abi = MS_ABI;
5828         }
5829       else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
5830         abi = SYSV_ABI;
5831       return abi;
5832     }
5833   return ix86_abi;
5834 }
5835
5836 static bool
5837 ix86_function_ms_hook_prologue (const_tree fn)
5838 {
5839   if (fn && lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fn)))
5840     {
5841       if (decl_function_context (fn) != NULL_TREE)
5842         error_at (DECL_SOURCE_LOCATION (fn),
5843                   "ms_hook_prologue is not compatible with nested function");
5844       else
5845         return true;
5846     }
5847   return false;
5848 }
5849
5850 static enum calling_abi
5851 ix86_function_abi (const_tree fndecl)
5852 {
5853   if (! fndecl)
5854     return ix86_abi;
5855   return ix86_function_type_abi (TREE_TYPE (fndecl));
5856 }
5857
5858 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
5859    call abi used.  */
5860 enum calling_abi
5861 ix86_cfun_abi (void)
5862 {
5863   if (! cfun)
5864     return ix86_abi;
5865   return cfun->machine->call_abi;
5866 }
5867
5868 /* Write the extra assembler code needed to declare a function properly.  */
5869
5870 void
5871 ix86_asm_output_function_label (FILE *asm_out_file, const char *fname,
5872                                 tree decl)
5873 {
5874   bool is_ms_hook = ix86_function_ms_hook_prologue (decl);
5875
5876   if (is_ms_hook)
5877     {
5878       int i, filler_count = (TARGET_64BIT ? 32 : 16);
5879       unsigned int filler_cc = 0xcccccccc;
5880
5881       for (i = 0; i < filler_count; i += 4)
5882         fprintf (asm_out_file, ASM_LONG " %#x\n", filler_cc);
5883     }
5884
5885 #ifdef SUBTARGET_ASM_UNWIND_INIT
5886   SUBTARGET_ASM_UNWIND_INIT (asm_out_file);
5887 #endif
5888
5889   ASM_OUTPUT_LABEL (asm_out_file, fname);
5890
5891   /* Output magic byte marker, if hot-patch attribute is set.  */
5892   if (is_ms_hook)
5893     {
5894       if (TARGET_64BIT)
5895         {
5896           /* leaq [%rsp + 0], %rsp  */
5897           asm_fprintf (asm_out_file, ASM_BYTE
5898                        "0x48, 0x8d, 0xa4, 0x24, 0x00, 0x00, 0x00, 0x00\n");
5899         }
5900       else
5901         {
5902           /* movl.s %edi, %edi
5903              push   %ebp
5904              movl.s %esp, %ebp */
5905           asm_fprintf (asm_out_file, ASM_BYTE
5906                        "0x8b, 0xff, 0x55, 0x8b, 0xec\n");
5907         }
5908     }
5909 }
5910
5911 /* regclass.c  */
5912 extern void init_regs (void);
5913
5914 /* Implementation of call abi switching target hook. Specific to FNDECL
5915    the specific call register sets are set.  See also
5916    ix86_conditional_register_usage for more details.  */
5917 void
5918 ix86_call_abi_override (const_tree fndecl)
5919 {
5920   if (fndecl == NULL_TREE)
5921     cfun->machine->call_abi = ix86_abi;
5922   else
5923     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
5924 }
5925
5926 /* 64-bit MS and SYSV ABI have different set of call used registers.  Avoid
5927    expensive re-initialization of init_regs each time we switch function context
5928    since this is needed only during RTL expansion.  */
5929 static void
5930 ix86_maybe_switch_abi (void)
5931 {
5932   if (TARGET_64BIT &&
5933       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
5934     reinit_regs ();
5935 }
5936
5937 /* Initialize a variable CUM of type CUMULATIVE_ARGS
5938    for a call to a function whose data type is FNTYPE.
5939    For a library call, FNTYPE is 0.  */
5940
5941 void
5942 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
5943                       tree fntype,      /* tree ptr for function decl */
5944                       rtx libname,      /* SYMBOL_REF of library name or 0 */
5945                       tree fndecl,
5946                       int caller)
5947 {
5948   struct cgraph_local_info *i;
5949   tree fnret_type;
5950
5951   memset (cum, 0, sizeof (*cum));
5952
5953   /* Initialize for the current callee.  */
5954   if (caller)
5955     {
5956       cfun->machine->callee_pass_avx256_p = false;
5957       cfun->machine->callee_return_avx256_p = false;
5958     }
5959
5960   if (fndecl)
5961     {
5962       i = cgraph_local_info (fndecl);
5963       cum->call_abi = ix86_function_abi (fndecl);
5964       fnret_type = TREE_TYPE (TREE_TYPE (fndecl));
5965     }
5966   else
5967     {
5968       i = NULL;
5969       cum->call_abi = ix86_function_type_abi (fntype);
5970       if (fntype)
5971         fnret_type = TREE_TYPE (fntype);
5972       else
5973         fnret_type = NULL;
5974     }
5975
5976   if (TARGET_VZEROUPPER && fnret_type)
5977     {
5978       rtx fnret_value = ix86_function_value (fnret_type, fntype,
5979                                              false);
5980       if (function_pass_avx256_p (fnret_value))
5981         {
5982           /* The return value of this function uses 256bit AVX modes.  */
5983           if (caller)
5984             cfun->machine->callee_return_avx256_p = true;
5985           else
5986             cfun->machine->caller_return_avx256_p = true;
5987         }
5988     }
5989
5990   cum->caller = caller;
5991
5992   /* Set up the number of registers to use for passing arguments.  */
5993
5994   if (TARGET_64BIT && cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
5995     sorry ("ms_abi attribute requires -maccumulate-outgoing-args "
5996            "or subtarget optimization implying it");
5997   cum->nregs = ix86_regparm;
5998   if (TARGET_64BIT)
5999     {
6000       cum->nregs = (cum->call_abi == SYSV_ABI
6001                    ? X86_64_REGPARM_MAX
6002                    : X86_64_MS_REGPARM_MAX);
6003     }
6004   if (TARGET_SSE)
6005     {
6006       cum->sse_nregs = SSE_REGPARM_MAX;
6007       if (TARGET_64BIT)
6008         {
6009           cum->sse_nregs = (cum->call_abi == SYSV_ABI
6010                            ? X86_64_SSE_REGPARM_MAX
6011                            : X86_64_MS_SSE_REGPARM_MAX);
6012         }
6013     }
6014   if (TARGET_MMX)
6015     cum->mmx_nregs = MMX_REGPARM_MAX;
6016   cum->warn_avx = true;
6017   cum->warn_sse = true;
6018   cum->warn_mmx = true;
6019
6020   /* Because type might mismatch in between caller and callee, we need to
6021      use actual type of function for local calls.
6022      FIXME: cgraph_analyze can be told to actually record if function uses
6023      va_start so for local functions maybe_vaarg can be made aggressive
6024      helping K&R code.
6025      FIXME: once typesytem is fixed, we won't need this code anymore.  */
6026   if (i && i->local && i->can_change_signature)
6027     fntype = TREE_TYPE (fndecl);
6028   cum->maybe_vaarg = (fntype
6029                       ? (!prototype_p (fntype) || stdarg_p (fntype))
6030                       : !libname);
6031
6032   if (!TARGET_64BIT)
6033     {
6034       /* If there are variable arguments, then we won't pass anything
6035          in registers in 32-bit mode. */
6036       if (stdarg_p (fntype))
6037         {
6038           cum->nregs = 0;
6039           cum->sse_nregs = 0;
6040           cum->mmx_nregs = 0;
6041           cum->warn_avx = 0;
6042           cum->warn_sse = 0;
6043           cum->warn_mmx = 0;
6044           return;
6045         }
6046
6047       /* Use ecx and edx registers if function has fastcall attribute,
6048          else look for regparm information.  */
6049       if (fntype)
6050         {
6051           if (ix86_is_type_thiscall (fntype))
6052             {
6053               cum->nregs = 1;
6054               cum->fastcall = 1; /* Same first register as in fastcall.  */
6055             }
6056           else if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
6057             {
6058               cum->nregs = 2;
6059               cum->fastcall = 1;
6060             }
6061           else
6062             cum->nregs = ix86_function_regparm (fntype, fndecl);
6063         }
6064
6065       /* Set up the number of SSE registers used for passing SFmode
6066          and DFmode arguments.  Warn for mismatching ABI.  */
6067       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
6068     }
6069 }
6070
6071 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
6072    But in the case of vector types, it is some vector mode.
6073
6074    When we have only some of our vector isa extensions enabled, then there
6075    are some modes for which vector_mode_supported_p is false.  For these
6076    modes, the generic vector support in gcc will choose some non-vector mode
6077    in order to implement the type.  By computing the natural mode, we'll
6078    select the proper ABI location for the operand and not depend on whatever
6079    the middle-end decides to do with these vector types.
6080
6081    The midde-end can't deal with the vector types > 16 bytes.  In this
6082    case, we return the original mode and warn ABI change if CUM isn't
6083    NULL.  */
6084
6085 static enum machine_mode
6086 type_natural_mode (const_tree type, const CUMULATIVE_ARGS *cum)
6087 {
6088   enum machine_mode mode = TYPE_MODE (type);
6089
6090   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
6091     {
6092       HOST_WIDE_INT size = int_size_in_bytes (type);
6093       if ((size == 8 || size == 16 || size == 32)
6094           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
6095           && TYPE_VECTOR_SUBPARTS (type) > 1)
6096         {
6097           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
6098
6099           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6100             mode = MIN_MODE_VECTOR_FLOAT;
6101           else
6102             mode = MIN_MODE_VECTOR_INT;
6103
6104           /* Get the mode which has this inner mode and number of units.  */
6105           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
6106             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
6107                 && GET_MODE_INNER (mode) == innermode)
6108               {
6109                 if (size == 32 && !TARGET_AVX)
6110                   {
6111                     static bool warnedavx;
6112
6113                     if (cum
6114                         && !warnedavx
6115                         && cum->warn_avx)
6116                       {
6117                         warnedavx = true;
6118                         warning (0, "AVX vector argument without AVX "
6119                                  "enabled changes the ABI");
6120                       }
6121                     return TYPE_MODE (type);
6122                   }
6123                 else
6124                   return mode;
6125               }
6126
6127           gcc_unreachable ();
6128         }
6129     }
6130
6131   return mode;
6132 }
6133
6134 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
6135    this may not agree with the mode that the type system has chosen for the
6136    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
6137    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
6138
6139 static rtx
6140 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
6141                      unsigned int regno)
6142 {
6143   rtx tmp;
6144
6145   if (orig_mode != BLKmode)
6146     tmp = gen_rtx_REG (orig_mode, regno);
6147   else
6148     {
6149       tmp = gen_rtx_REG (mode, regno);
6150       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
6151       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
6152     }
6153
6154   return tmp;
6155 }
6156
6157 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
6158    of this code is to classify each 8bytes of incoming argument by the register
6159    class and assign registers accordingly.  */
6160
6161 /* Return the union class of CLASS1 and CLASS2.
6162    See the x86-64 PS ABI for details.  */
6163
6164 static enum x86_64_reg_class
6165 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
6166 {
6167   /* Rule #1: If both classes are equal, this is the resulting class.  */
6168   if (class1 == class2)
6169     return class1;
6170
6171   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
6172      the other class.  */
6173   if (class1 == X86_64_NO_CLASS)
6174     return class2;
6175   if (class2 == X86_64_NO_CLASS)
6176     return class1;
6177
6178   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
6179   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
6180     return X86_64_MEMORY_CLASS;
6181
6182   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
6183   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
6184       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
6185     return X86_64_INTEGERSI_CLASS;
6186   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
6187       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
6188     return X86_64_INTEGER_CLASS;
6189
6190   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
6191      MEMORY is used.  */
6192   if (class1 == X86_64_X87_CLASS
6193       || class1 == X86_64_X87UP_CLASS
6194       || class1 == X86_64_COMPLEX_X87_CLASS
6195       || class2 == X86_64_X87_CLASS
6196       || class2 == X86_64_X87UP_CLASS
6197       || class2 == X86_64_COMPLEX_X87_CLASS)
6198     return X86_64_MEMORY_CLASS;
6199
6200   /* Rule #6: Otherwise class SSE is used.  */
6201   return X86_64_SSE_CLASS;
6202 }
6203
6204 /* Classify the argument of type TYPE and mode MODE.
6205    CLASSES will be filled by the register class used to pass each word
6206    of the operand.  The number of words is returned.  In case the parameter
6207    should be passed in memory, 0 is returned. As a special case for zero
6208    sized containers, classes[0] will be NO_CLASS and 1 is returned.
6209
6210    BIT_OFFSET is used internally for handling records and specifies offset
6211    of the offset in bits modulo 256 to avoid overflow cases.
6212
6213    See the x86-64 PS ABI for details.
6214 */
6215
6216 static int
6217 classify_argument (enum machine_mode mode, const_tree type,
6218                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
6219 {
6220   HOST_WIDE_INT bytes =
6221     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
6222   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6223
6224   /* Variable sized entities are always passed/returned in memory.  */
6225   if (bytes < 0)
6226     return 0;
6227
6228   if (mode != VOIDmode
6229       && targetm.calls.must_pass_in_stack (mode, type))
6230     return 0;
6231
6232   if (type && AGGREGATE_TYPE_P (type))
6233     {
6234       int i;
6235       tree field;
6236       enum x86_64_reg_class subclasses[MAX_CLASSES];
6237
6238       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
6239       if (bytes > 32)
6240         return 0;
6241
6242       for (i = 0; i < words; i++)
6243         classes[i] = X86_64_NO_CLASS;
6244
6245       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
6246          signalize memory class, so handle it as special case.  */
6247       if (!words)
6248         {
6249           classes[0] = X86_64_NO_CLASS;
6250           return 1;
6251         }
6252
6253       /* Classify each field of record and merge classes.  */
6254       switch (TREE_CODE (type))
6255         {
6256         case RECORD_TYPE:
6257           /* And now merge the fields of structure.  */
6258           for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6259             {
6260               if (TREE_CODE (field) == FIELD_DECL)
6261                 {
6262                   int num;
6263
6264                   if (TREE_TYPE (field) == error_mark_node)
6265                     continue;
6266
6267                   /* Bitfields are always classified as integer.  Handle them
6268                      early, since later code would consider them to be
6269                      misaligned integers.  */
6270                   if (DECL_BIT_FIELD (field))
6271                     {
6272                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
6273                            i < ((int_bit_position (field) + (bit_offset % 64))
6274                                 + tree_low_cst (DECL_SIZE (field), 0)
6275                                 + 63) / 8 / 8; i++)
6276                         classes[i] =
6277                           merge_classes (X86_64_INTEGER_CLASS,
6278                                          classes[i]);
6279                     }
6280                   else
6281                     {
6282                       int pos;
6283
6284                       type = TREE_TYPE (field);
6285
6286                       /* Flexible array member is ignored.  */
6287                       if (TYPE_MODE (type) == BLKmode
6288                           && TREE_CODE (type) == ARRAY_TYPE
6289                           && TYPE_SIZE (type) == NULL_TREE
6290                           && TYPE_DOMAIN (type) != NULL_TREE
6291                           && (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
6292                               == NULL_TREE))
6293                         {
6294                           static bool warned;
6295
6296                           if (!warned && warn_psabi)
6297                             {
6298                               warned = true;
6299                               inform (input_location,
6300                                       "the ABI of passing struct with"
6301                                       " a flexible array member has"
6302                                       " changed in GCC 4.4");
6303                             }
6304                           continue;
6305                         }
6306                       num = classify_argument (TYPE_MODE (type), type,
6307                                                subclasses,
6308                                                (int_bit_position (field)
6309                                                 + bit_offset) % 256);
6310                       if (!num)
6311                         return 0;
6312                       pos = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
6313                       for (i = 0; i < num && (i + pos) < words; i++)
6314                         classes[i + pos] =
6315                           merge_classes (subclasses[i], classes[i + pos]);
6316                     }
6317                 }
6318             }
6319           break;
6320
6321         case ARRAY_TYPE:
6322           /* Arrays are handled as small records.  */
6323           {
6324             int num;
6325             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
6326                                      TREE_TYPE (type), subclasses, bit_offset);
6327             if (!num)
6328               return 0;
6329
6330             /* The partial classes are now full classes.  */
6331             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
6332               subclasses[0] = X86_64_SSE_CLASS;
6333             if (subclasses[0] == X86_64_INTEGERSI_CLASS
6334                 && !((bit_offset % 64) == 0 && bytes == 4))
6335               subclasses[0] = X86_64_INTEGER_CLASS;
6336
6337             for (i = 0; i < words; i++)
6338               classes[i] = subclasses[i % num];
6339
6340             break;
6341           }
6342         case UNION_TYPE:
6343         case QUAL_UNION_TYPE:
6344           /* Unions are similar to RECORD_TYPE but offset is always 0.
6345              */
6346           for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6347             {
6348               if (TREE_CODE (field) == FIELD_DECL)
6349                 {
6350                   int num;
6351
6352                   if (TREE_TYPE (field) == error_mark_node)
6353                     continue;
6354
6355                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
6356                                            TREE_TYPE (field), subclasses,
6357                                            bit_offset);
6358                   if (!num)
6359                     return 0;
6360                   for (i = 0; i < num; i++)
6361                     classes[i] = merge_classes (subclasses[i], classes[i]);
6362                 }
6363             }
6364           break;
6365
6366         default:
6367           gcc_unreachable ();
6368         }
6369
6370       if (words > 2)
6371         {
6372           /* When size > 16 bytes, if the first one isn't
6373              X86_64_SSE_CLASS or any other ones aren't
6374              X86_64_SSEUP_CLASS, everything should be passed in
6375              memory.  */
6376           if (classes[0] != X86_64_SSE_CLASS)
6377               return 0;
6378
6379           for (i = 1; i < words; i++)
6380             if (classes[i] != X86_64_SSEUP_CLASS)
6381               return 0;
6382         }
6383
6384       /* Final merger cleanup.  */
6385       for (i = 0; i < words; i++)
6386         {
6387           /* If one class is MEMORY, everything should be passed in
6388              memory.  */
6389           if (classes[i] == X86_64_MEMORY_CLASS)
6390             return 0;
6391
6392           /* The X86_64_SSEUP_CLASS should be always preceded by
6393              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
6394           if (classes[i] == X86_64_SSEUP_CLASS
6395               && classes[i - 1] != X86_64_SSE_CLASS
6396               && classes[i - 1] != X86_64_SSEUP_CLASS)
6397             {
6398               /* The first one should never be X86_64_SSEUP_CLASS.  */
6399               gcc_assert (i != 0);
6400               classes[i] = X86_64_SSE_CLASS;
6401             }
6402
6403           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
6404                everything should be passed in memory.  */
6405           if (classes[i] == X86_64_X87UP_CLASS
6406               && (classes[i - 1] != X86_64_X87_CLASS))
6407             {
6408               static bool warned;
6409
6410               /* The first one should never be X86_64_X87UP_CLASS.  */
6411               gcc_assert (i != 0);
6412               if (!warned && warn_psabi)
6413                 {
6414                   warned = true;
6415                   inform (input_location,
6416                           "the ABI of passing union with long double"
6417                           " has changed in GCC 4.4");
6418                 }
6419               return 0;
6420             }
6421         }
6422       return words;
6423     }
6424
6425   /* Compute alignment needed.  We align all types to natural boundaries with
6426      exception of XFmode that is aligned to 64bits.  */
6427   if (mode != VOIDmode && mode != BLKmode)
6428     {
6429       int mode_alignment = GET_MODE_BITSIZE (mode);
6430
6431       if (mode == XFmode)
6432         mode_alignment = 128;
6433       else if (mode == XCmode)
6434         mode_alignment = 256;
6435       if (COMPLEX_MODE_P (mode))
6436         mode_alignment /= 2;
6437       /* Misaligned fields are always returned in memory.  */
6438       if (bit_offset % mode_alignment)
6439         return 0;
6440     }
6441
6442   /* for V1xx modes, just use the base mode */
6443   if (VECTOR_MODE_P (mode) && mode != V1DImode && mode != V1TImode
6444       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
6445     mode = GET_MODE_INNER (mode);
6446
6447   /* Classification of atomic types.  */
6448   switch (mode)
6449     {
6450     case SDmode:
6451     case DDmode:
6452       classes[0] = X86_64_SSE_CLASS;
6453       return 1;
6454     case TDmode:
6455       classes[0] = X86_64_SSE_CLASS;
6456       classes[1] = X86_64_SSEUP_CLASS;
6457       return 2;
6458     case DImode:
6459     case SImode:
6460     case HImode:
6461     case QImode:
6462     case CSImode:
6463     case CHImode:
6464     case CQImode:
6465       {
6466         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
6467
6468         if (size <= 32)
6469           {
6470             classes[0] = X86_64_INTEGERSI_CLASS;
6471             return 1;
6472           }
6473         else if (size <= 64)
6474           {
6475             classes[0] = X86_64_INTEGER_CLASS;
6476             return 1;
6477           }
6478         else if (size <= 64+32)
6479           {
6480             classes[0] = X86_64_INTEGER_CLASS;
6481             classes[1] = X86_64_INTEGERSI_CLASS;
6482             return 2;
6483           }
6484         else if (size <= 64+64)
6485           {
6486             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
6487             return 2;
6488           }
6489         else
6490           gcc_unreachable ();
6491       }
6492     case CDImode:
6493     case TImode:
6494       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
6495       return 2;
6496     case COImode:
6497     case OImode:
6498       /* OImode shouldn't be used directly.  */
6499       gcc_unreachable ();
6500     case CTImode:
6501       return 0;
6502     case SFmode:
6503       if (!(bit_offset % 64))
6504         classes[0] = X86_64_SSESF_CLASS;
6505       else
6506         classes[0] = X86_64_SSE_CLASS;
6507       return 1;
6508     case DFmode:
6509       classes[0] = X86_64_SSEDF_CLASS;
6510       return 1;
6511     case XFmode:
6512       classes[0] = X86_64_X87_CLASS;
6513       classes[1] = X86_64_X87UP_CLASS;
6514       return 2;
6515     case TFmode:
6516       classes[0] = X86_64_SSE_CLASS;
6517       classes[1] = X86_64_SSEUP_CLASS;
6518       return 2;
6519     case SCmode:
6520       classes[0] = X86_64_SSE_CLASS;
6521       if (!(bit_offset % 64))
6522         return 1;
6523       else
6524         {
6525           static bool warned;
6526
6527           if (!warned && warn_psabi)
6528             {
6529               warned = true;
6530               inform (input_location,
6531                       "the ABI of passing structure with complex float"
6532                       " member has changed in GCC 4.4");
6533             }
6534           classes[1] = X86_64_SSESF_CLASS;
6535           return 2;
6536         }
6537     case DCmode:
6538       classes[0] = X86_64_SSEDF_CLASS;
6539       classes[1] = X86_64_SSEDF_CLASS;
6540       return 2;
6541     case XCmode:
6542       classes[0] = X86_64_COMPLEX_X87_CLASS;
6543       return 1;
6544     case TCmode:
6545       /* This modes is larger than 16 bytes.  */
6546       return 0;
6547     case V8SFmode:
6548     case V8SImode:
6549     case V32QImode:
6550     case V16HImode:
6551     case V4DFmode:
6552     case V4DImode:
6553       classes[0] = X86_64_SSE_CLASS;
6554       classes[1] = X86_64_SSEUP_CLASS;
6555       classes[2] = X86_64_SSEUP_CLASS;
6556       classes[3] = X86_64_SSEUP_CLASS;
6557       return 4;
6558     case V4SFmode:
6559     case V4SImode:
6560     case V16QImode:
6561     case V8HImode:
6562     case V2DFmode:
6563     case V2DImode:
6564       classes[0] = X86_64_SSE_CLASS;
6565       classes[1] = X86_64_SSEUP_CLASS;
6566       return 2;
6567     case V1TImode:
6568     case V1DImode:
6569     case V2SFmode:
6570     case V2SImode:
6571     case V4HImode:
6572     case V8QImode:
6573       classes[0] = X86_64_SSE_CLASS;
6574       return 1;
6575     case BLKmode:
6576     case VOIDmode:
6577       return 0;
6578     default:
6579       gcc_assert (VECTOR_MODE_P (mode));
6580
6581       if (bytes > 16)
6582         return 0;
6583
6584       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
6585
6586       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
6587         classes[0] = X86_64_INTEGERSI_CLASS;
6588       else
6589         classes[0] = X86_64_INTEGER_CLASS;
6590       classes[1] = X86_64_INTEGER_CLASS;
6591       return 1 + (bytes > 8);
6592     }
6593 }
6594
6595 /* Examine the argument and return set number of register required in each
6596    class.  Return 0 iff parameter should be passed in memory.  */
6597 static int
6598 examine_argument (enum machine_mode mode, const_tree type, int in_return,
6599                   int *int_nregs, int *sse_nregs)
6600 {
6601   enum x86_64_reg_class regclass[MAX_CLASSES];
6602   int n = classify_argument (mode, type, regclass, 0);
6603
6604   *int_nregs = 0;
6605   *sse_nregs = 0;
6606   if (!n)
6607     return 0;
6608   for (n--; n >= 0; n--)
6609     switch (regclass[n])
6610       {
6611       case X86_64_INTEGER_CLASS:
6612       case X86_64_INTEGERSI_CLASS:
6613         (*int_nregs)++;
6614         break;
6615       case X86_64_SSE_CLASS:
6616       case X86_64_SSESF_CLASS:
6617       case X86_64_SSEDF_CLASS:
6618         (*sse_nregs)++;
6619         break;
6620       case X86_64_NO_CLASS:
6621       case X86_64_SSEUP_CLASS:
6622         break;
6623       case X86_64_X87_CLASS:
6624       case X86_64_X87UP_CLASS:
6625         if (!in_return)
6626           return 0;
6627         break;
6628       case X86_64_COMPLEX_X87_CLASS:
6629         return in_return ? 2 : 0;
6630       case X86_64_MEMORY_CLASS:
6631         gcc_unreachable ();
6632       }
6633   return 1;
6634 }
6635
6636 /* Construct container for the argument used by GCC interface.  See
6637    FUNCTION_ARG for the detailed description.  */
6638
6639 static rtx
6640 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
6641                      const_tree type, int in_return, int nintregs, int nsseregs,
6642                      const int *intreg, int sse_regno)
6643 {
6644   /* The following variables hold the static issued_error state.  */
6645   static bool issued_sse_arg_error;
6646   static bool issued_sse_ret_error;
6647   static bool issued_x87_ret_error;
6648
6649   enum machine_mode tmpmode;
6650   int bytes =
6651     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
6652   enum x86_64_reg_class regclass[MAX_CLASSES];
6653   int n;
6654   int i;
6655   int nexps = 0;
6656   int needed_sseregs, needed_intregs;
6657   rtx exp[MAX_CLASSES];
6658   rtx ret;
6659
6660   n = classify_argument (mode, type, regclass, 0);
6661   if (!n)
6662     return NULL;
6663   if (!examine_argument (mode, type, in_return, &needed_intregs,
6664                          &needed_sseregs))
6665     return NULL;
6666   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
6667     return NULL;
6668
6669   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
6670      some less clueful developer tries to use floating-point anyway.  */
6671   if (needed_sseregs && !TARGET_SSE)
6672     {
6673       if (in_return)
6674         {
6675           if (!issued_sse_ret_error)
6676             {
6677               error ("SSE register return with SSE disabled");
6678               issued_sse_ret_error = true;
6679             }
6680         }
6681       else if (!issued_sse_arg_error)
6682         {
6683           error ("SSE register argument with SSE disabled");
6684           issued_sse_arg_error = true;
6685         }
6686       return NULL;
6687     }
6688
6689   /* Likewise, error if the ABI requires us to return values in the
6690      x87 registers and the user specified -mno-80387.  */
6691   if (!TARGET_80387 && in_return)
6692     for (i = 0; i < n; i++)
6693       if (regclass[i] == X86_64_X87_CLASS
6694           || regclass[i] == X86_64_X87UP_CLASS
6695           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
6696         {
6697           if (!issued_x87_ret_error)
6698             {
6699               error ("x87 register return with x87 disabled");
6700               issued_x87_ret_error = true;
6701             }
6702           return NULL;
6703         }
6704
6705   /* First construct simple cases.  Avoid SCmode, since we want to use
6706      single register to pass this type.  */
6707   if (n == 1 && mode != SCmode)
6708     switch (regclass[0])
6709       {
6710       case X86_64_INTEGER_CLASS:
6711       case X86_64_INTEGERSI_CLASS:
6712         return gen_rtx_REG (mode, intreg[0]);
6713       case X86_64_SSE_CLASS:
6714       case X86_64_SSESF_CLASS:
6715       case X86_64_SSEDF_CLASS:
6716         if (mode != BLKmode)
6717           return gen_reg_or_parallel (mode, orig_mode,
6718                                       SSE_REGNO (sse_regno));
6719         break;
6720       case X86_64_X87_CLASS:
6721       case X86_64_COMPLEX_X87_CLASS:
6722         return gen_rtx_REG (mode, FIRST_STACK_REG);
6723       case X86_64_NO_CLASS:
6724         /* Zero sized array, struct or class.  */
6725         return NULL;
6726       default:
6727         gcc_unreachable ();
6728       }
6729   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
6730       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
6731     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
6732   if (n == 4
6733       && regclass[0] == X86_64_SSE_CLASS
6734       && regclass[1] == X86_64_SSEUP_CLASS
6735       && regclass[2] == X86_64_SSEUP_CLASS
6736       && regclass[3] == X86_64_SSEUP_CLASS
6737       && mode != BLKmode)
6738     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
6739
6740   if (n == 2
6741       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
6742     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
6743   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
6744       && regclass[1] == X86_64_INTEGER_CLASS
6745       && (mode == CDImode || mode == TImode || mode == TFmode)
6746       && intreg[0] + 1 == intreg[1])
6747     return gen_rtx_REG (mode, intreg[0]);
6748
6749   /* Otherwise figure out the entries of the PARALLEL.  */
6750   for (i = 0; i < n; i++)
6751     {
6752       int pos;
6753
6754       switch (regclass[i])
6755         {
6756           case X86_64_NO_CLASS:
6757             break;
6758           case X86_64_INTEGER_CLASS:
6759           case X86_64_INTEGERSI_CLASS:
6760             /* Merge TImodes on aligned occasions here too.  */
6761             if (i * 8 + 8 > bytes)
6762               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
6763             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
6764               tmpmode = SImode;
6765             else
6766               tmpmode = DImode;
6767             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
6768             if (tmpmode == BLKmode)
6769               tmpmode = DImode;
6770             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6771                                                gen_rtx_REG (tmpmode, *intreg),
6772                                                GEN_INT (i*8));
6773             intreg++;
6774             break;
6775           case X86_64_SSESF_CLASS:
6776             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6777                                                gen_rtx_REG (SFmode,
6778                                                             SSE_REGNO (sse_regno)),
6779                                                GEN_INT (i*8));
6780             sse_regno++;
6781             break;
6782           case X86_64_SSEDF_CLASS:
6783             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6784                                                gen_rtx_REG (DFmode,
6785                                                             SSE_REGNO (sse_regno)),
6786                                                GEN_INT (i*8));
6787             sse_regno++;
6788             break;
6789           case X86_64_SSE_CLASS:
6790             pos = i;
6791             switch (n)
6792               {
6793               case 1:
6794                 tmpmode = DImode;
6795                 break;
6796               case 2:
6797                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
6798                   {
6799                     tmpmode = TImode;
6800                     i++;
6801                   }
6802                 else
6803                   tmpmode = DImode;
6804                 break;
6805               case 4:
6806                 gcc_assert (i == 0
6807                             && regclass[1] == X86_64_SSEUP_CLASS
6808                             && regclass[2] == X86_64_SSEUP_CLASS
6809                             && regclass[3] == X86_64_SSEUP_CLASS);
6810                 tmpmode = OImode;
6811                 i += 3;
6812                 break;
6813               default:
6814                 gcc_unreachable ();
6815               }
6816             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6817                                                gen_rtx_REG (tmpmode,
6818                                                             SSE_REGNO (sse_regno)),
6819                                                GEN_INT (pos*8));
6820             sse_regno++;
6821             break;
6822           default:
6823             gcc_unreachable ();
6824         }
6825     }
6826
6827   /* Empty aligned struct, union or class.  */
6828   if (nexps == 0)
6829     return NULL;
6830
6831   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
6832   for (i = 0; i < nexps; i++)
6833     XVECEXP (ret, 0, i) = exp [i];
6834   return ret;
6835 }
6836
6837 /* Update the data in CUM to advance over an argument of mode MODE
6838    and data type TYPE.  (TYPE is null for libcalls where that information
6839    may not be available.)  */
6840
6841 static void
6842 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6843                          const_tree type, HOST_WIDE_INT bytes,
6844                          HOST_WIDE_INT words)
6845 {
6846   switch (mode)
6847     {
6848     default:
6849       break;
6850
6851     case BLKmode:
6852       if (bytes < 0)
6853         break;
6854       /* FALLTHRU */
6855
6856     case DImode:
6857     case SImode:
6858     case HImode:
6859     case QImode:
6860       cum->words += words;
6861       cum->nregs -= words;
6862       cum->regno += words;
6863
6864       if (cum->nregs <= 0)
6865         {
6866           cum->nregs = 0;
6867           cum->regno = 0;
6868         }
6869       break;
6870
6871     case OImode:
6872       /* OImode shouldn't be used directly.  */
6873       gcc_unreachable ();
6874
6875     case DFmode:
6876       if (cum->float_in_sse < 2)
6877         break;
6878     case SFmode:
6879       if (cum->float_in_sse < 1)
6880         break;
6881       /* FALLTHRU */
6882
6883     case V8SFmode:
6884     case V8SImode:
6885     case V32QImode:
6886     case V16HImode:
6887     case V4DFmode:
6888     case V4DImode:
6889     case TImode:
6890     case V16QImode:
6891     case V8HImode:
6892     case V4SImode:
6893     case V2DImode:
6894     case V4SFmode:
6895     case V2DFmode:
6896       if (!type || !AGGREGATE_TYPE_P (type))
6897         {
6898           cum->sse_words += words;
6899           cum->sse_nregs -= 1;
6900           cum->sse_regno += 1;
6901           if (cum->sse_nregs <= 0)
6902             {
6903               cum->sse_nregs = 0;
6904               cum->sse_regno = 0;
6905             }
6906         }
6907       break;
6908
6909     case V8QImode:
6910     case V4HImode:
6911     case V2SImode:
6912     case V2SFmode:
6913     case V1TImode:
6914     case V1DImode:
6915       if (!type || !AGGREGATE_TYPE_P (type))
6916         {
6917           cum->mmx_words += words;
6918           cum->mmx_nregs -= 1;
6919           cum->mmx_regno += 1;
6920           if (cum->mmx_nregs <= 0)
6921             {
6922               cum->mmx_nregs = 0;
6923               cum->mmx_regno = 0;
6924             }
6925         }
6926       break;
6927     }
6928 }
6929
6930 static void
6931 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6932                          const_tree type, HOST_WIDE_INT words, bool named)
6933 {
6934   int int_nregs, sse_nregs;
6935
6936   /* Unnamed 256bit vector mode parameters are passed on stack.  */
6937   if (!named && VALID_AVX256_REG_MODE (mode))
6938     return;
6939
6940   if (examine_argument (mode, type, 0, &int_nregs, &sse_nregs)
6941       && sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
6942     {
6943       cum->nregs -= int_nregs;
6944       cum->sse_nregs -= sse_nregs;
6945       cum->regno += int_nregs;
6946       cum->sse_regno += sse_nregs;
6947     }
6948   else
6949     {
6950       int align = ix86_function_arg_boundary (mode, type) / BITS_PER_WORD;
6951       cum->words = (cum->words + align - 1) & ~(align - 1);
6952       cum->words += words;
6953     }
6954 }
6955
6956 static void
6957 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
6958                             HOST_WIDE_INT words)
6959 {
6960   /* Otherwise, this should be passed indirect.  */
6961   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
6962
6963   cum->words += words;
6964   if (cum->nregs > 0)
6965     {
6966       cum->nregs -= 1;
6967       cum->regno += 1;
6968     }
6969 }
6970
6971 /* Update the data in CUM to advance over an argument of mode MODE and
6972    data type TYPE.  (TYPE is null for libcalls where that information
6973    may not be available.)  */
6974
6975 static void
6976 ix86_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6977                            const_tree type, bool named)
6978 {
6979   HOST_WIDE_INT bytes, words;
6980
6981   if (mode == BLKmode)
6982     bytes = int_size_in_bytes (type);
6983   else
6984     bytes = GET_MODE_SIZE (mode);
6985   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6986
6987   if (type)
6988     mode = type_natural_mode (type, NULL);
6989
6990   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
6991     function_arg_advance_ms_64 (cum, bytes, words);
6992   else if (TARGET_64BIT)
6993     function_arg_advance_64 (cum, mode, type, words, named);
6994   else
6995     function_arg_advance_32 (cum, mode, type, bytes, words);
6996 }
6997
6998 /* Define where to put the arguments to a function.
6999    Value is zero to push the argument on the stack,
7000    or a hard register in which to store the argument.
7001
7002    MODE is the argument's machine mode.
7003    TYPE is the data type of the argument (as a tree).
7004     This is null for libcalls where that information may
7005     not be available.
7006    CUM is a variable of type CUMULATIVE_ARGS which gives info about
7007     the preceding args and about the function being called.
7008    NAMED is nonzero if this argument is a named parameter
7009     (otherwise it is an extra parameter matching an ellipsis).  */
7010
7011 static rtx
7012 function_arg_32 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
7013                  enum machine_mode orig_mode, const_tree type,
7014                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
7015 {
7016   static bool warnedsse, warnedmmx;
7017
7018   /* Avoid the AL settings for the Unix64 ABI.  */
7019   if (mode == VOIDmode)
7020     return constm1_rtx;
7021
7022   switch (mode)
7023     {
7024     default:
7025       break;
7026
7027     case BLKmode:
7028       if (bytes < 0)
7029         break;
7030       /* FALLTHRU */
7031     case DImode:
7032     case SImode:
7033     case HImode:
7034     case QImode:
7035       if (words <= cum->nregs)
7036         {
7037           int regno = cum->regno;
7038
7039           /* Fastcall allocates the first two DWORD (SImode) or
7040             smaller arguments to ECX and EDX if it isn't an
7041             aggregate type .  */
7042           if (cum->fastcall)
7043             {
7044               if (mode == BLKmode
7045                   || mode == DImode
7046                   || (type && AGGREGATE_TYPE_P (type)))
7047                 break;
7048
7049               /* ECX not EAX is the first allocated register.  */
7050               if (regno == AX_REG)
7051                 regno = CX_REG;
7052             }
7053           return gen_rtx_REG (mode, regno);
7054         }
7055       break;
7056
7057     case DFmode:
7058       if (cum->float_in_sse < 2)
7059         break;
7060     case SFmode:
7061       if (cum->float_in_sse < 1)
7062         break;
7063       /* FALLTHRU */
7064     case TImode:
7065       /* In 32bit, we pass TImode in xmm registers.  */
7066     case V16QImode:
7067     case V8HImode:
7068     case V4SImode:
7069     case V2DImode:
7070     case V4SFmode:
7071     case V2DFmode:
7072       if (!type || !AGGREGATE_TYPE_P (type))
7073         {
7074           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
7075             {
7076               warnedsse = true;
7077               warning (0, "SSE vector argument without SSE enabled "
7078                        "changes the ABI");
7079             }
7080           if (cum->sse_nregs)
7081             return gen_reg_or_parallel (mode, orig_mode,
7082                                         cum->sse_regno + FIRST_SSE_REG);
7083         }
7084       break;
7085
7086     case OImode:
7087       /* OImode shouldn't be used directly.  */
7088       gcc_unreachable ();
7089
7090     case V8SFmode:
7091     case V8SImode:
7092     case V32QImode:
7093     case V16HImode:
7094     case V4DFmode:
7095     case V4DImode:
7096       if (!type || !AGGREGATE_TYPE_P (type))
7097         {
7098           if (cum->sse_nregs)
7099             return gen_reg_or_parallel (mode, orig_mode,
7100                                         cum->sse_regno + FIRST_SSE_REG);
7101         }
7102       break;
7103
7104     case V8QImode:
7105     case V4HImode:
7106     case V2SImode:
7107     case V2SFmode:
7108     case V1TImode:
7109     case V1DImode:
7110       if (!type || !AGGREGATE_TYPE_P (type))
7111         {
7112           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
7113             {
7114               warnedmmx = true;
7115               warning (0, "MMX vector argument without MMX enabled "
7116                        "changes the ABI");
7117             }
7118           if (cum->mmx_nregs)
7119             return gen_reg_or_parallel (mode, orig_mode,
7120                                         cum->mmx_regno + FIRST_MMX_REG);
7121         }
7122       break;
7123     }
7124
7125   return NULL_RTX;
7126 }
7127
7128 static rtx
7129 function_arg_64 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
7130                  enum machine_mode orig_mode, const_tree type, bool named)
7131 {
7132   /* Handle a hidden AL argument containing number of registers
7133      for varargs x86-64 functions.  */
7134   if (mode == VOIDmode)
7135     return GEN_INT (cum->maybe_vaarg
7136                     ? (cum->sse_nregs < 0
7137                        ? X86_64_SSE_REGPARM_MAX
7138                        : cum->sse_regno)
7139                     : -1);
7140
7141   switch (mode)
7142     {
7143     default:
7144       break;
7145
7146     case V8SFmode:
7147     case V8SImode:
7148     case V32QImode:
7149     case V16HImode:
7150     case V4DFmode:
7151     case V4DImode:
7152       /* Unnamed 256bit vector mode parameters are passed on stack.  */
7153       if (!named)
7154         return NULL;
7155       break;
7156     }
7157
7158   return construct_container (mode, orig_mode, type, 0, cum->nregs,
7159                               cum->sse_nregs,
7160                               &x86_64_int_parameter_registers [cum->regno],
7161                               cum->sse_regno);
7162 }
7163
7164 static rtx
7165 function_arg_ms_64 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
7166                     enum machine_mode orig_mode, bool named,
7167                     HOST_WIDE_INT bytes)
7168 {
7169   unsigned int regno;
7170
7171   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
7172      We use value of -2 to specify that current function call is MSABI.  */
7173   if (mode == VOIDmode)
7174     return GEN_INT (-2);
7175
7176   /* If we've run out of registers, it goes on the stack.  */
7177   if (cum->nregs == 0)
7178     return NULL_RTX;
7179
7180   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
7181
7182   /* Only floating point modes are passed in anything but integer regs.  */
7183   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
7184     {
7185       if (named)
7186         regno = cum->regno + FIRST_SSE_REG;
7187       else
7188         {
7189           rtx t1, t2;
7190
7191           /* Unnamed floating parameters are passed in both the
7192              SSE and integer registers.  */
7193           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
7194           t2 = gen_rtx_REG (mode, regno);
7195           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
7196           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
7197           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
7198         }
7199     }
7200   /* Handle aggregated types passed in register.  */
7201   if (orig_mode == BLKmode)
7202     {
7203       if (bytes > 0 && bytes <= 8)
7204         mode = (bytes > 4 ? DImode : SImode);
7205       if (mode == BLKmode)
7206         mode = DImode;
7207     }
7208
7209   return gen_reg_or_parallel (mode, orig_mode, regno);
7210 }
7211
7212 /* Return where to put the arguments to a function.
7213    Return zero to push the argument on the stack, or a hard register in which to store the argument.
7214
7215    MODE is the argument's machine mode.  TYPE is the data type of the
7216    argument.  It is null for libcalls where that information may not be
7217    available.  CUM gives information about the preceding args and about
7218    the function being called.  NAMED is nonzero if this argument is a
7219    named parameter (otherwise it is an extra parameter matching an
7220    ellipsis).  */
7221
7222 static rtx
7223 ix86_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
7224                    const_tree type, bool named)
7225 {
7226   enum machine_mode mode = omode;
7227   HOST_WIDE_INT bytes, words;
7228   rtx arg;
7229
7230   if (mode == BLKmode)
7231     bytes = int_size_in_bytes (type);
7232   else
7233     bytes = GET_MODE_SIZE (mode);
7234   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7235
7236   /* To simplify the code below, represent vector types with a vector mode
7237      even if MMX/SSE are not active.  */
7238   if (type && TREE_CODE (type) == VECTOR_TYPE)
7239     mode = type_natural_mode (type, cum);
7240
7241   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
7242     arg = function_arg_ms_64 (cum, mode, omode, named, bytes);
7243   else if (TARGET_64BIT)
7244     arg = function_arg_64 (cum, mode, omode, type, named);
7245   else
7246     arg = function_arg_32 (cum, mode, omode, type, bytes, words);
7247
7248   if (TARGET_VZEROUPPER && function_pass_avx256_p (arg))
7249     {
7250       /* This argument uses 256bit AVX modes.  */
7251       if (cum->caller)
7252         cfun->machine->callee_pass_avx256_p = true;
7253       else
7254         cfun->machine->caller_pass_avx256_p = true;
7255     }
7256
7257   return arg;
7258 }
7259
7260 /* A C expression that indicates when an argument must be passed by
7261    reference.  If nonzero for an argument, a copy of that argument is
7262    made in memory and a pointer to the argument is passed instead of
7263    the argument itself.  The pointer is passed in whatever way is
7264    appropriate for passing a pointer to that type.  */
7265
7266 static bool
7267 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
7268                         enum machine_mode mode ATTRIBUTE_UNUSED,
7269                         const_tree type, bool named ATTRIBUTE_UNUSED)
7270 {
7271   /* See Windows x64 Software Convention.  */
7272   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
7273     {
7274       int msize = (int) GET_MODE_SIZE (mode);
7275       if (type)
7276         {
7277           /* Arrays are passed by reference.  */
7278           if (TREE_CODE (type) == ARRAY_TYPE)
7279             return true;
7280
7281           if (AGGREGATE_TYPE_P (type))
7282             {
7283               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
7284                  are passed by reference.  */
7285               msize = int_size_in_bytes (type);
7286             }
7287         }
7288
7289       /* __m128 is passed by reference.  */
7290       switch (msize) {
7291       case 1: case 2: case 4: case 8:
7292         break;
7293       default:
7294         return true;
7295       }
7296     }
7297   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
7298     return 1;
7299
7300   return 0;
7301 }
7302
7303 /* Return true when TYPE should be 128bit aligned for 32bit argument
7304    passing ABI.  XXX: This function is obsolete and is only used for
7305    checking psABI compatibility with previous versions of GCC.  */
7306
7307 static bool
7308 ix86_compat_aligned_value_p (const_tree type)
7309 {
7310   enum machine_mode mode = TYPE_MODE (type);
7311   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
7312        || mode == TDmode
7313        || mode == TFmode
7314        || mode == TCmode)
7315       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
7316     return true;
7317   if (TYPE_ALIGN (type) < 128)
7318     return false;
7319
7320   if (AGGREGATE_TYPE_P (type))
7321     {
7322       /* Walk the aggregates recursively.  */
7323       switch (TREE_CODE (type))
7324         {
7325         case RECORD_TYPE:
7326         case UNION_TYPE:
7327         case QUAL_UNION_TYPE:
7328           {
7329             tree field;
7330
7331             /* Walk all the structure fields.  */
7332             for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
7333               {
7334                 if (TREE_CODE (field) == FIELD_DECL
7335                     && ix86_compat_aligned_value_p (TREE_TYPE (field)))
7336                   return true;
7337               }
7338             break;
7339           }
7340
7341         case ARRAY_TYPE:
7342           /* Just for use if some languages passes arrays by value.  */
7343           if (ix86_compat_aligned_value_p (TREE_TYPE (type)))
7344             return true;
7345           break;
7346
7347         default:
7348           gcc_unreachable ();
7349         }
7350     }
7351   return false;
7352 }
7353
7354 /* Return the alignment boundary for MODE and TYPE with alignment ALIGN.
7355    XXX: This function is obsolete and is only used for checking psABI
7356    compatibility with previous versions of GCC.  */
7357
7358 static unsigned int
7359 ix86_compat_function_arg_boundary (enum machine_mode mode,
7360                                    const_tree type, unsigned int align)
7361 {
7362   /* In 32bit, only _Decimal128 and __float128 are aligned to their
7363      natural boundaries.  */
7364   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
7365     {
7366       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
7367          make an exception for SSE modes since these require 128bit
7368          alignment.
7369
7370          The handling here differs from field_alignment.  ICC aligns MMX
7371          arguments to 4 byte boundaries, while structure fields are aligned
7372          to 8 byte boundaries.  */
7373       if (!type)
7374         {
7375           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
7376             align = PARM_BOUNDARY;
7377         }
7378       else
7379         {
7380           if (!ix86_compat_aligned_value_p (type))
7381             align = PARM_BOUNDARY;
7382         }
7383     }
7384   if (align > BIGGEST_ALIGNMENT)
7385     align = BIGGEST_ALIGNMENT;
7386   return align;
7387 }
7388
7389 /* Return true when TYPE should be 128bit aligned for 32bit argument
7390    passing ABI.  */
7391
7392 static bool
7393 ix86_contains_aligned_value_p (const_tree type)
7394 {
7395   enum machine_mode mode = TYPE_MODE (type);
7396
7397   if (mode == XFmode || mode == XCmode)
7398     return false;
7399
7400   if (TYPE_ALIGN (type) < 128)
7401     return false;
7402
7403   if (AGGREGATE_TYPE_P (type))
7404     {
7405       /* Walk the aggregates recursively.  */
7406       switch (TREE_CODE (type))
7407         {
7408         case RECORD_TYPE:
7409         case UNION_TYPE:
7410         case QUAL_UNION_TYPE:
7411           {
7412             tree field;
7413
7414             /* Walk all the structure fields.  */
7415             for (field = TYPE_FIELDS (type);
7416                  field;
7417                  field = DECL_CHAIN (field))
7418               {
7419                 if (TREE_CODE (field) == FIELD_DECL
7420                     && ix86_contains_aligned_value_p (TREE_TYPE (field)))
7421                   return true;
7422               }
7423             break;
7424           }
7425
7426         case ARRAY_TYPE:
7427           /* Just for use if some languages passes arrays by value.  */
7428           if (ix86_contains_aligned_value_p (TREE_TYPE (type)))
7429             return true;
7430           break;
7431
7432         default:
7433           gcc_unreachable ();
7434         }
7435     }
7436   else
7437     return TYPE_ALIGN (type) >= 128;
7438
7439   return false;
7440 }
7441
7442 /* Gives the alignment boundary, in bits, of an argument with the
7443    specified mode and type.  */
7444
7445 static unsigned int
7446 ix86_function_arg_boundary (enum machine_mode mode, const_tree type)
7447 {
7448   unsigned int align;
7449   if (type)
7450     {
7451       /* Since the main variant type is used for call, we convert it to
7452          the main variant type.  */
7453       type = TYPE_MAIN_VARIANT (type);
7454       align = TYPE_ALIGN (type);
7455     }
7456   else
7457     align = GET_MODE_ALIGNMENT (mode);
7458   if (align < PARM_BOUNDARY)
7459     align = PARM_BOUNDARY;
7460   else
7461     {
7462       static bool warned;
7463       unsigned int saved_align = align;
7464
7465       if (!TARGET_64BIT)
7466         {
7467           /* i386 ABI defines XFmode arguments to be 4 byte aligned.  */
7468           if (!type)
7469             {
7470               if (mode == XFmode || mode == XCmode)
7471                 align = PARM_BOUNDARY;
7472             }
7473           else if (!ix86_contains_aligned_value_p (type))
7474             align = PARM_BOUNDARY;
7475
7476           if (align < 128)
7477             align = PARM_BOUNDARY;
7478         }
7479
7480       if (warn_psabi
7481           && !warned
7482           && align != ix86_compat_function_arg_boundary (mode, type,
7483                                                          saved_align))
7484         {
7485           warned = true;
7486           inform (input_location,
7487                   "The ABI for passing parameters with %d-byte"
7488                   " alignment has changed in GCC 4.6",
7489                   align / BITS_PER_UNIT);
7490         }
7491     }
7492
7493   return align;
7494 }
7495
7496 /* Return true if N is a possible register number of function value.  */
7497
7498 static bool
7499 ix86_function_value_regno_p (const unsigned int regno)
7500 {
7501   switch (regno)
7502     {
7503     case 0:
7504       return true;
7505
7506     case FIRST_FLOAT_REG:
7507       /* TODO: The function should depend on current function ABI but
7508        builtins.c would need updating then. Therefore we use the
7509        default ABI.  */
7510       if (TARGET_64BIT && ix86_abi == MS_ABI)
7511         return false;
7512       return TARGET_FLOAT_RETURNS_IN_80387;
7513
7514     case FIRST_SSE_REG:
7515       return TARGET_SSE;
7516
7517     case FIRST_MMX_REG:
7518       if (TARGET_MACHO || TARGET_64BIT)
7519         return false;
7520       return TARGET_MMX;
7521     }
7522
7523   return false;
7524 }
7525
7526 /* Define how to find the value returned by a function.
7527    VALTYPE is the data type of the value (as a tree).
7528    If the precise function being called is known, FUNC is its FUNCTION_DECL;
7529    otherwise, FUNC is 0.  */
7530
7531 static rtx
7532 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
7533                    const_tree fntype, const_tree fn)
7534 {
7535   unsigned int regno;
7536
7537   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
7538      we normally prevent this case when mmx is not available.  However
7539      some ABIs may require the result to be returned like DImode.  */
7540   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
7541     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
7542
7543   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
7544      we prevent this case when sse is not available.  However some ABIs
7545      may require the result to be returned like integer TImode.  */
7546   else if (mode == TImode
7547            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
7548     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
7549
7550   /* 32-byte vector modes in %ymm0.   */
7551   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
7552     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
7553
7554   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
7555   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
7556     regno = FIRST_FLOAT_REG;
7557   else
7558     /* Most things go in %eax.  */
7559     regno = AX_REG;
7560
7561   /* Override FP return register with %xmm0 for local functions when
7562      SSE math is enabled or for functions with sseregparm attribute.  */
7563   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
7564     {
7565       int sse_level = ix86_function_sseregparm (fntype, fn, false);
7566       if ((sse_level >= 1 && mode == SFmode)
7567           || (sse_level == 2 && mode == DFmode))
7568         regno = FIRST_SSE_REG;
7569     }
7570
7571   /* OImode shouldn't be used directly.  */
7572   gcc_assert (mode != OImode);
7573
7574   return gen_rtx_REG (orig_mode, regno);
7575 }
7576
7577 static rtx
7578 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
7579                    const_tree valtype)
7580 {
7581   rtx ret;
7582
7583   /* Handle libcalls, which don't provide a type node.  */
7584   if (valtype == NULL)
7585     {
7586       switch (mode)
7587         {
7588         case SFmode:
7589         case SCmode:
7590         case DFmode:
7591         case DCmode:
7592         case TFmode:
7593         case SDmode:
7594         case DDmode:
7595         case TDmode:
7596           return gen_rtx_REG (mode, FIRST_SSE_REG);
7597         case XFmode:
7598         case XCmode:
7599           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
7600         case TCmode:
7601           return NULL;
7602         default:
7603           return gen_rtx_REG (mode, AX_REG);
7604         }
7605     }
7606
7607   ret = construct_container (mode, orig_mode, valtype, 1,
7608                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
7609                              x86_64_int_return_registers, 0);
7610
7611   /* For zero sized structures, construct_container returns NULL, but we
7612      need to keep rest of compiler happy by returning meaningful value.  */
7613   if (!ret)
7614     ret = gen_rtx_REG (orig_mode, AX_REG);
7615
7616   return ret;
7617 }
7618
7619 static rtx
7620 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
7621 {
7622   unsigned int regno = AX_REG;
7623
7624   if (TARGET_SSE)
7625     {
7626       switch (GET_MODE_SIZE (mode))
7627         {
7628         case 16:
7629           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
7630              && !COMPLEX_MODE_P (mode))
7631             regno = FIRST_SSE_REG;
7632           break;
7633         case 8:
7634         case 4:
7635           if (mode == SFmode || mode == DFmode)
7636             regno = FIRST_SSE_REG;
7637           break;
7638         default:
7639           break;
7640         }
7641     }
7642   return gen_rtx_REG (orig_mode, regno);
7643 }
7644
7645 static rtx
7646 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
7647                        enum machine_mode orig_mode, enum machine_mode mode)
7648 {
7649   const_tree fn, fntype;
7650
7651   fn = NULL_TREE;
7652   if (fntype_or_decl && DECL_P (fntype_or_decl))
7653     fn = fntype_or_decl;
7654   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
7655
7656   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
7657     return function_value_ms_64 (orig_mode, mode);
7658   else if (TARGET_64BIT)
7659     return function_value_64 (orig_mode, mode, valtype);
7660   else
7661     return function_value_32 (orig_mode, mode, fntype, fn);
7662 }
7663
7664 static rtx
7665 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
7666                      bool outgoing ATTRIBUTE_UNUSED)
7667 {
7668   enum machine_mode mode, orig_mode;
7669
7670   orig_mode = TYPE_MODE (valtype);
7671   mode = type_natural_mode (valtype, NULL);
7672   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
7673 }
7674
7675 rtx
7676 ix86_libcall_value (enum machine_mode mode)
7677 {
7678   return ix86_function_value_1 (NULL, NULL, mode, mode);
7679 }
7680
7681 /* Return true iff type is returned in memory.  */
7682
7683 static bool ATTRIBUTE_UNUSED
7684 return_in_memory_32 (const_tree type, enum machine_mode mode)
7685 {
7686   HOST_WIDE_INT size;
7687
7688   if (mode == BLKmode)
7689     return true;
7690
7691   size = int_size_in_bytes (type);
7692
7693   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
7694     return false;
7695
7696   if (VECTOR_MODE_P (mode) || mode == TImode)
7697     {
7698       /* User-created vectors small enough to fit in EAX.  */
7699       if (size < 8)
7700         return false;
7701
7702       /* MMX/3dNow values are returned in MM0,
7703          except when it doesn't exits or the ABI prescribes otherwise.  */
7704       if (size == 8)
7705         return !TARGET_MMX || TARGET_VECT8_RETURNS;
7706
7707       /* SSE values are returned in XMM0, except when it doesn't exist.  */
7708       if (size == 16)
7709         return !TARGET_SSE;
7710
7711       /* AVX values are returned in YMM0, except when it doesn't exist.  */
7712       if (size == 32)
7713         return !TARGET_AVX;
7714     }
7715
7716   if (mode == XFmode)
7717     return false;
7718
7719   if (size > 12)
7720     return true;
7721
7722   /* OImode shouldn't be used directly.  */
7723   gcc_assert (mode != OImode);
7724
7725   return false;
7726 }
7727
7728 static bool ATTRIBUTE_UNUSED
7729 return_in_memory_64 (const_tree type, enum machine_mode mode)
7730 {
7731   int needed_intregs, needed_sseregs;
7732   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
7733 }
7734
7735 static bool ATTRIBUTE_UNUSED
7736 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
7737 {
7738   HOST_WIDE_INT size = int_size_in_bytes (type);
7739
7740   /* __m128 is returned in xmm0.  */
7741   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
7742       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
7743     return false;
7744
7745   /* Otherwise, the size must be exactly in [1248]. */
7746   return size != 1 && size != 2 && size != 4 && size != 8;
7747 }
7748
7749 static bool
7750 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7751 {
7752 #ifdef SUBTARGET_RETURN_IN_MEMORY
7753   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
7754 #else
7755   const enum machine_mode mode = type_natural_mode (type, NULL);
7756
7757   if (TARGET_64BIT)
7758     {
7759       if (ix86_function_type_abi (fntype) == MS_ABI)
7760         return return_in_memory_ms_64 (type, mode);
7761       else
7762         return return_in_memory_64 (type, mode);
7763     }
7764   else
7765     return return_in_memory_32 (type, mode);
7766 #endif
7767 }
7768
7769 /* When returning SSE vector types, we have a choice of either
7770      (1) being abi incompatible with a -march switch, or
7771      (2) generating an error.
7772    Given no good solution, I think the safest thing is one warning.
7773    The user won't be able to use -Werror, but....
7774
7775    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
7776    called in response to actually generating a caller or callee that
7777    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
7778    via aggregate_value_p for general type probing from tree-ssa.  */
7779
7780 static rtx
7781 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
7782 {
7783   static bool warnedsse, warnedmmx;
7784
7785   if (!TARGET_64BIT && type)
7786     {
7787       /* Look at the return type of the function, not the function type.  */
7788       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
7789
7790       if (!TARGET_SSE && !warnedsse)
7791         {
7792           if (mode == TImode
7793               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
7794             {
7795               warnedsse = true;
7796               warning (0, "SSE vector return without SSE enabled "
7797                        "changes the ABI");
7798             }
7799         }
7800
7801       if (!TARGET_MMX && !warnedmmx)
7802         {
7803           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
7804             {
7805               warnedmmx = true;
7806               warning (0, "MMX vector return without MMX enabled "
7807                        "changes the ABI");
7808             }
7809         }
7810     }
7811
7812   return NULL;
7813 }
7814
7815 \f
7816 /* Create the va_list data type.  */
7817
7818 /* Returns the calling convention specific va_list date type.
7819    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
7820
7821 static tree
7822 ix86_build_builtin_va_list_abi (enum calling_abi abi)
7823 {
7824   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
7825
7826   /* For i386 we use plain pointer to argument area.  */
7827   if (!TARGET_64BIT || abi == MS_ABI)
7828     return build_pointer_type (char_type_node);
7829
7830   record = lang_hooks.types.make_type (RECORD_TYPE);
7831   type_decl = build_decl (BUILTINS_LOCATION,
7832                           TYPE_DECL, get_identifier ("__va_list_tag"), record);
7833
7834   f_gpr = build_decl (BUILTINS_LOCATION,
7835                       FIELD_DECL, get_identifier ("gp_offset"),
7836                       unsigned_type_node);
7837   f_fpr = build_decl (BUILTINS_LOCATION,
7838                       FIELD_DECL, get_identifier ("fp_offset"),
7839                       unsigned_type_node);
7840   f_ovf = build_decl (BUILTINS_LOCATION,
7841                       FIELD_DECL, get_identifier ("overflow_arg_area"),
7842                       ptr_type_node);
7843   f_sav = build_decl (BUILTINS_LOCATION,
7844                       FIELD_DECL, get_identifier ("reg_save_area"),
7845                       ptr_type_node);
7846
7847   va_list_gpr_counter_field = f_gpr;
7848   va_list_fpr_counter_field = f_fpr;
7849
7850   DECL_FIELD_CONTEXT (f_gpr) = record;
7851   DECL_FIELD_CONTEXT (f_fpr) = record;
7852   DECL_FIELD_CONTEXT (f_ovf) = record;
7853   DECL_FIELD_CONTEXT (f_sav) = record;
7854
7855   TYPE_STUB_DECL (record) = type_decl;
7856   TYPE_NAME (record) = type_decl;
7857   TYPE_FIELDS (record) = f_gpr;
7858   DECL_CHAIN (f_gpr) = f_fpr;
7859   DECL_CHAIN (f_fpr) = f_ovf;
7860   DECL_CHAIN (f_ovf) = f_sav;
7861
7862   layout_type (record);
7863
7864   /* The correct type is an array type of one element.  */
7865   return build_array_type (record, build_index_type (size_zero_node));
7866 }
7867
7868 /* Setup the builtin va_list data type and for 64-bit the additional
7869    calling convention specific va_list data types.  */
7870
7871 static tree
7872 ix86_build_builtin_va_list (void)
7873 {
7874   tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
7875
7876   /* Initialize abi specific va_list builtin types.  */
7877   if (TARGET_64BIT)
7878     {
7879       tree t;
7880       if (ix86_abi == MS_ABI)
7881         {
7882           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
7883           if (TREE_CODE (t) != RECORD_TYPE)
7884             t = build_variant_type_copy (t);
7885           sysv_va_list_type_node = t;
7886         }
7887       else
7888         {
7889           t = ret;
7890           if (TREE_CODE (t) != RECORD_TYPE)
7891             t = build_variant_type_copy (t);
7892           sysv_va_list_type_node = t;
7893         }
7894       if (ix86_abi != MS_ABI)
7895         {
7896           t = ix86_build_builtin_va_list_abi (MS_ABI);
7897           if (TREE_CODE (t) != RECORD_TYPE)
7898             t = build_variant_type_copy (t);
7899           ms_va_list_type_node = t;
7900         }
7901       else
7902         {
7903           t = ret;
7904           if (TREE_CODE (t) != RECORD_TYPE)
7905             t = build_variant_type_copy (t);
7906           ms_va_list_type_node = t;
7907         }
7908     }
7909
7910   return ret;
7911 }
7912
7913 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
7914
7915 static void
7916 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
7917 {
7918   rtx save_area, mem;
7919   alias_set_type set;
7920   int i, max;
7921
7922   /* GPR size of varargs save area.  */
7923   if (cfun->va_list_gpr_size)
7924     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
7925   else
7926     ix86_varargs_gpr_size = 0;
7927
7928   /* FPR size of varargs save area.  We don't need it if we don't pass
7929      anything in SSE registers.  */
7930   if (TARGET_SSE && cfun->va_list_fpr_size)
7931     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
7932   else
7933     ix86_varargs_fpr_size = 0;
7934
7935   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
7936     return;
7937
7938   save_area = frame_pointer_rtx;
7939   set = get_varargs_alias_set ();
7940
7941   max = cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
7942   if (max > X86_64_REGPARM_MAX)
7943     max = X86_64_REGPARM_MAX;
7944
7945   for (i = cum->regno; i < max; i++)
7946     {
7947       mem = gen_rtx_MEM (Pmode,
7948                          plus_constant (save_area, i * UNITS_PER_WORD));
7949       MEM_NOTRAP_P (mem) = 1;
7950       set_mem_alias_set (mem, set);
7951       emit_move_insn (mem, gen_rtx_REG (Pmode,
7952                                         x86_64_int_parameter_registers[i]));
7953     }
7954
7955   if (ix86_varargs_fpr_size)
7956     {
7957       enum machine_mode smode;
7958       rtx label, test;
7959
7960       /* Now emit code to save SSE registers.  The AX parameter contains number
7961          of SSE parameter registers used to call this function, though all we
7962          actually check here is the zero/non-zero status.  */
7963
7964       label = gen_label_rtx ();
7965       test = gen_rtx_EQ (VOIDmode, gen_rtx_REG (QImode, AX_REG), const0_rtx);
7966       emit_jump_insn (gen_cbranchqi4 (test, XEXP (test, 0), XEXP (test, 1),
7967                                       label));
7968
7969       /* ??? If !TARGET_SSE_TYPELESS_STORES, would we perform better if
7970          we used movdqa (i.e. TImode) instead?  Perhaps even better would
7971          be if we could determine the real mode of the data, via a hook
7972          into pass_stdarg.  Ignore all that for now.  */
7973       smode = V4SFmode;
7974       if (crtl->stack_alignment_needed < GET_MODE_ALIGNMENT (smode))
7975         crtl->stack_alignment_needed = GET_MODE_ALIGNMENT (smode);
7976
7977       max = cum->sse_regno + cfun->va_list_fpr_size / 16;
7978       if (max > X86_64_SSE_REGPARM_MAX)
7979         max = X86_64_SSE_REGPARM_MAX;
7980
7981       for (i = cum->sse_regno; i < max; ++i)
7982         {
7983           mem = plus_constant (save_area, i * 16 + ix86_varargs_gpr_size);
7984           mem = gen_rtx_MEM (smode, mem);
7985           MEM_NOTRAP_P (mem) = 1;
7986           set_mem_alias_set (mem, set);
7987           set_mem_align (mem, GET_MODE_ALIGNMENT (smode));
7988
7989           emit_move_insn (mem, gen_rtx_REG (smode, SSE_REGNO (i)));
7990         }
7991
7992       emit_label (label);
7993     }
7994 }
7995
7996 static void
7997 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
7998 {
7999   alias_set_type set = get_varargs_alias_set ();
8000   int i;
8001
8002   for (i = cum->regno; i < X86_64_MS_REGPARM_MAX; i++)
8003     {
8004       rtx reg, mem;
8005
8006       mem = gen_rtx_MEM (Pmode,
8007                          plus_constant (virtual_incoming_args_rtx,
8008                                         i * UNITS_PER_WORD));
8009       MEM_NOTRAP_P (mem) = 1;
8010       set_mem_alias_set (mem, set);
8011
8012       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
8013       emit_move_insn (mem, reg);
8014     }
8015 }
8016
8017 static void
8018 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8019                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
8020                              int no_rtl)
8021 {
8022   CUMULATIVE_ARGS next_cum;
8023   tree fntype;
8024
8025   /* This argument doesn't appear to be used anymore.  Which is good,
8026      because the old code here didn't suppress rtl generation.  */
8027   gcc_assert (!no_rtl);
8028
8029   if (!TARGET_64BIT)
8030     return;
8031
8032   fntype = TREE_TYPE (current_function_decl);
8033
8034   /* For varargs, we do not want to skip the dummy va_dcl argument.
8035      For stdargs, we do want to skip the last named argument.  */
8036   next_cum = *cum;
8037   if (stdarg_p (fntype))
8038     ix86_function_arg_advance (&next_cum, mode, type, true);
8039
8040   if (cum->call_abi == MS_ABI)
8041     setup_incoming_varargs_ms_64 (&next_cum);
8042   else
8043     setup_incoming_varargs_64 (&next_cum);
8044 }
8045
8046 /* Checks if TYPE is of kind va_list char *.  */
8047
8048 static bool
8049 is_va_list_char_pointer (tree type)
8050 {
8051   tree canonic;
8052
8053   /* For 32-bit it is always true.  */
8054   if (!TARGET_64BIT)
8055     return true;
8056   canonic = ix86_canonical_va_list_type (type);
8057   return (canonic == ms_va_list_type_node
8058           || (ix86_abi == MS_ABI && canonic == va_list_type_node));
8059 }
8060
8061 /* Implement va_start.  */
8062
8063 static void
8064 ix86_va_start (tree valist, rtx nextarg)
8065 {
8066   HOST_WIDE_INT words, n_gpr, n_fpr;
8067   tree f_gpr, f_fpr, f_ovf, f_sav;
8068   tree gpr, fpr, ovf, sav, t;
8069   tree type;
8070   rtx ovf_rtx;
8071
8072   if (flag_split_stack
8073       && cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8074     {
8075       unsigned int scratch_regno;
8076
8077       /* When we are splitting the stack, we can't refer to the stack
8078          arguments using internal_arg_pointer, because they may be on
8079          the old stack.  The split stack prologue will arrange to
8080          leave a pointer to the old stack arguments in a scratch
8081          register, which we here copy to a pseudo-register.  The split
8082          stack prologue can't set the pseudo-register directly because
8083          it (the prologue) runs before any registers have been saved.  */
8084
8085       scratch_regno = split_stack_prologue_scratch_regno ();
8086       if (scratch_regno != INVALID_REGNUM)
8087         {
8088           rtx reg, seq;
8089
8090           reg = gen_reg_rtx (Pmode);
8091           cfun->machine->split_stack_varargs_pointer = reg;
8092
8093           start_sequence ();
8094           emit_move_insn (reg, gen_rtx_REG (Pmode, scratch_regno));
8095           seq = get_insns ();
8096           end_sequence ();
8097
8098           push_topmost_sequence ();
8099           emit_insn_after (seq, entry_of_function ());
8100           pop_topmost_sequence ();
8101         }
8102     }
8103
8104   /* Only 64bit target needs something special.  */
8105   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
8106     {
8107       if (cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8108         std_expand_builtin_va_start (valist, nextarg);
8109       else
8110         {
8111           rtx va_r, next;
8112
8113           va_r = expand_expr (valist, NULL_RTX, VOIDmode, EXPAND_WRITE);
8114           next = expand_binop (ptr_mode, add_optab,
8115                                cfun->machine->split_stack_varargs_pointer,
8116                                crtl->args.arg_offset_rtx,
8117                                NULL_RTX, 0, OPTAB_LIB_WIDEN);
8118           convert_move (va_r, next, 0);
8119         }
8120       return;
8121     }
8122
8123   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
8124   f_fpr = DECL_CHAIN (f_gpr);
8125   f_ovf = DECL_CHAIN (f_fpr);
8126   f_sav = DECL_CHAIN (f_ovf);
8127
8128   valist = build_simple_mem_ref (valist);
8129   TREE_TYPE (valist) = TREE_TYPE (sysv_va_list_type_node);
8130   /* The following should be folded into the MEM_REF offset.  */
8131   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), unshare_expr (valist),
8132                 f_gpr, NULL_TREE);
8133   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
8134                 f_fpr, NULL_TREE);
8135   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
8136                 f_ovf, NULL_TREE);
8137   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
8138                 f_sav, NULL_TREE);
8139
8140   /* Count number of gp and fp argument registers used.  */
8141   words = crtl->args.info.words;
8142   n_gpr = crtl->args.info.regno;
8143   n_fpr = crtl->args.info.sse_regno;
8144
8145   if (cfun->va_list_gpr_size)
8146     {
8147       type = TREE_TYPE (gpr);
8148       t = build2 (MODIFY_EXPR, type,
8149                   gpr, build_int_cst (type, n_gpr * 8));
8150       TREE_SIDE_EFFECTS (t) = 1;
8151       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8152     }
8153
8154   if (TARGET_SSE && cfun->va_list_fpr_size)
8155     {
8156       type = TREE_TYPE (fpr);
8157       t = build2 (MODIFY_EXPR, type, fpr,
8158                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
8159       TREE_SIDE_EFFECTS (t) = 1;
8160       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8161     }
8162
8163   /* Find the overflow area.  */
8164   type = TREE_TYPE (ovf);
8165   if (cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8166     ovf_rtx = crtl->args.internal_arg_pointer;
8167   else
8168     ovf_rtx = cfun->machine->split_stack_varargs_pointer;
8169   t = make_tree (type, ovf_rtx);
8170   if (words != 0)
8171     t = build2 (POINTER_PLUS_EXPR, type, t,
8172                 size_int (words * UNITS_PER_WORD));
8173   t = build2 (MODIFY_EXPR, type, ovf, t);
8174   TREE_SIDE_EFFECTS (t) = 1;
8175   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8176
8177   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
8178     {
8179       /* Find the register save area.
8180          Prologue of the function save it right above stack frame.  */
8181       type = TREE_TYPE (sav);
8182       t = make_tree (type, frame_pointer_rtx);
8183       if (!ix86_varargs_gpr_size)
8184         t = build2 (POINTER_PLUS_EXPR, type, t,
8185                     size_int (-8 * X86_64_REGPARM_MAX));
8186       t = build2 (MODIFY_EXPR, type, sav, t);
8187       TREE_SIDE_EFFECTS (t) = 1;
8188       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8189     }
8190 }
8191
8192 /* Implement va_arg.  */
8193
8194 static tree
8195 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
8196                       gimple_seq *post_p)
8197 {
8198   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
8199   tree f_gpr, f_fpr, f_ovf, f_sav;
8200   tree gpr, fpr, ovf, sav, t;
8201   int size, rsize;
8202   tree lab_false, lab_over = NULL_TREE;
8203   tree addr, t2;
8204   rtx container;
8205   int indirect_p = 0;
8206   tree ptrtype;
8207   enum machine_mode nat_mode;
8208   unsigned int arg_boundary;
8209
8210   /* Only 64bit target needs something special.  */
8211   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
8212     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
8213
8214   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
8215   f_fpr = DECL_CHAIN (f_gpr);
8216   f_ovf = DECL_CHAIN (f_fpr);
8217   f_sav = DECL_CHAIN (f_ovf);
8218
8219   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
8220                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
8221   valist = build_va_arg_indirect_ref (valist);
8222   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
8223   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
8224   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
8225
8226   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
8227   if (indirect_p)
8228     type = build_pointer_type (type);
8229   size = int_size_in_bytes (type);
8230   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8231
8232   nat_mode = type_natural_mode (type, NULL);
8233   switch (nat_mode)
8234     {
8235     case V8SFmode:
8236     case V8SImode:
8237     case V32QImode:
8238     case V16HImode:
8239     case V4DFmode:
8240     case V4DImode:
8241       /* Unnamed 256bit vector mode parameters are passed on stack.  */
8242       if (!TARGET_64BIT_MS_ABI)
8243         {
8244           container = NULL;
8245           break;
8246         }
8247
8248     default:
8249       container = construct_container (nat_mode, TYPE_MODE (type),
8250                                        type, 0, X86_64_REGPARM_MAX,
8251                                        X86_64_SSE_REGPARM_MAX, intreg,
8252                                        0);
8253       break;
8254     }
8255
8256   /* Pull the value out of the saved registers.  */
8257
8258   addr = create_tmp_var (ptr_type_node, "addr");
8259
8260   if (container)
8261     {
8262       int needed_intregs, needed_sseregs;
8263       bool need_temp;
8264       tree int_addr, sse_addr;
8265
8266       lab_false = create_artificial_label (UNKNOWN_LOCATION);
8267       lab_over = create_artificial_label (UNKNOWN_LOCATION);
8268
8269       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
8270
8271       need_temp = (!REG_P (container)
8272                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
8273                        || TYPE_ALIGN (type) > 128));
8274
8275       /* In case we are passing structure, verify that it is consecutive block
8276          on the register save area.  If not we need to do moves.  */
8277       if (!need_temp && !REG_P (container))
8278         {
8279           /* Verify that all registers are strictly consecutive  */
8280           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
8281             {
8282               int i;
8283
8284               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
8285                 {
8286                   rtx slot = XVECEXP (container, 0, i);
8287                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
8288                       || INTVAL (XEXP (slot, 1)) != i * 16)
8289                     need_temp = 1;
8290                 }
8291             }
8292           else
8293             {
8294               int i;
8295
8296               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
8297                 {
8298                   rtx slot = XVECEXP (container, 0, i);
8299                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
8300                       || INTVAL (XEXP (slot, 1)) != i * 8)
8301                     need_temp = 1;
8302                 }
8303             }
8304         }
8305       if (!need_temp)
8306         {
8307           int_addr = addr;
8308           sse_addr = addr;
8309         }
8310       else
8311         {
8312           int_addr = create_tmp_var (ptr_type_node, "int_addr");
8313           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
8314         }
8315
8316       /* First ensure that we fit completely in registers.  */
8317       if (needed_intregs)
8318         {
8319           t = build_int_cst (TREE_TYPE (gpr),
8320                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
8321           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
8322           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
8323           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
8324           gimplify_and_add (t, pre_p);
8325         }
8326       if (needed_sseregs)
8327         {
8328           t = build_int_cst (TREE_TYPE (fpr),
8329                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
8330                              + X86_64_REGPARM_MAX * 8);
8331           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
8332           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
8333           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
8334           gimplify_and_add (t, pre_p);
8335         }
8336
8337       /* Compute index to start of area used for integer regs.  */
8338       if (needed_intregs)
8339         {
8340           /* int_addr = gpr + sav; */
8341           t = fold_convert (sizetype, gpr);
8342           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
8343           gimplify_assign (int_addr, t, pre_p);
8344         }
8345       if (needed_sseregs)
8346         {
8347           /* sse_addr = fpr + sav; */
8348           t = fold_convert (sizetype, fpr);
8349           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
8350           gimplify_assign (sse_addr, t, pre_p);
8351         }
8352       if (need_temp)
8353         {
8354           int i, prev_size = 0;
8355           tree temp = create_tmp_var (type, "va_arg_tmp");
8356
8357           /* addr = &temp; */
8358           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
8359           gimplify_assign (addr, t, pre_p);
8360
8361           for (i = 0; i < XVECLEN (container, 0); i++)
8362             {
8363               rtx slot = XVECEXP (container, 0, i);
8364               rtx reg = XEXP (slot, 0);
8365               enum machine_mode mode = GET_MODE (reg);
8366               tree piece_type;
8367               tree addr_type;
8368               tree daddr_type;
8369               tree src_addr, src;
8370               int src_offset;
8371               tree dest_addr, dest;
8372               int cur_size = GET_MODE_SIZE (mode);
8373
8374               gcc_assert (prev_size <= INTVAL (XEXP (slot, 1)));
8375               prev_size = INTVAL (XEXP (slot, 1));
8376               if (prev_size + cur_size > size)
8377                 {
8378                   cur_size = size - prev_size;
8379                   mode = mode_for_size (cur_size * BITS_PER_UNIT, MODE_INT, 1);
8380                   if (mode == BLKmode)
8381                     mode = QImode;
8382                 }
8383               piece_type = lang_hooks.types.type_for_mode (mode, 1);
8384               if (mode == GET_MODE (reg))
8385                 addr_type = build_pointer_type (piece_type);
8386               else
8387                 addr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
8388                                                          true);
8389               daddr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
8390                                                         true);
8391
8392               if (SSE_REGNO_P (REGNO (reg)))
8393                 {
8394                   src_addr = sse_addr;
8395                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
8396                 }
8397               else
8398                 {
8399                   src_addr = int_addr;
8400                   src_offset = REGNO (reg) * 8;
8401                 }
8402               src_addr = fold_convert (addr_type, src_addr);
8403               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
8404                                       size_int (src_offset));
8405
8406               dest_addr = fold_convert (daddr_type, addr);
8407               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
8408                                        size_int (prev_size));
8409               if (cur_size == GET_MODE_SIZE (mode))
8410                 {
8411                   src = build_va_arg_indirect_ref (src_addr);
8412                   dest = build_va_arg_indirect_ref (dest_addr);
8413
8414                   gimplify_assign (dest, src, pre_p);
8415                 }
8416               else
8417                 {
8418                   tree copy
8419                     = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
8420                                        3, dest_addr, src_addr,
8421                                        size_int (cur_size));
8422                   gimplify_and_add (copy, pre_p);
8423                 }
8424               prev_size += cur_size;
8425             }
8426         }
8427
8428       if (needed_intregs)
8429         {
8430           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
8431                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
8432           gimplify_assign (gpr, t, pre_p);
8433         }
8434
8435       if (needed_sseregs)
8436         {
8437           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
8438                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
8439           gimplify_assign (fpr, t, pre_p);
8440         }
8441
8442       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
8443
8444       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
8445     }
8446
8447   /* ... otherwise out of the overflow area.  */
8448
8449   /* When we align parameter on stack for caller, if the parameter
8450      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
8451      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
8452      here with caller.  */
8453   arg_boundary = ix86_function_arg_boundary (VOIDmode, type);
8454   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
8455     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
8456
8457   /* Care for on-stack alignment if needed.  */
8458   if (arg_boundary <= 64 || size == 0)
8459     t = ovf;
8460  else
8461     {
8462       HOST_WIDE_INT align = arg_boundary / 8;
8463       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
8464                   size_int (align - 1));
8465       t = fold_convert (sizetype, t);
8466       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
8467                   size_int (-align));
8468       t = fold_convert (TREE_TYPE (ovf), t);
8469     }
8470
8471   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
8472   gimplify_assign (addr, t, pre_p);
8473
8474   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
8475               size_int (rsize * UNITS_PER_WORD));
8476   gimplify_assign (unshare_expr (ovf), t, pre_p);
8477
8478   if (container)
8479     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
8480
8481   ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
8482   addr = fold_convert (ptrtype, addr);
8483
8484   if (indirect_p)
8485     addr = build_va_arg_indirect_ref (addr);
8486   return build_va_arg_indirect_ref (addr);
8487 }
8488 \f
8489 /* Return true if OPNUM's MEM should be matched
8490    in movabs* patterns.  */
8491
8492 bool
8493 ix86_check_movabs (rtx insn, int opnum)
8494 {
8495   rtx set, mem;
8496
8497   set = PATTERN (insn);
8498   if (GET_CODE (set) == PARALLEL)
8499     set = XVECEXP (set, 0, 0);
8500   gcc_assert (GET_CODE (set) == SET);
8501   mem = XEXP (set, opnum);
8502   while (GET_CODE (mem) == SUBREG)
8503     mem = SUBREG_REG (mem);
8504   gcc_assert (MEM_P (mem));
8505   return volatile_ok || !MEM_VOLATILE_P (mem);
8506 }
8507 \f
8508 /* Initialize the table of extra 80387 mathematical constants.  */
8509
8510 static void
8511 init_ext_80387_constants (void)
8512 {
8513   static const char * cst[5] =
8514   {
8515     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
8516     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
8517     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
8518     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
8519     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
8520   };
8521   int i;
8522
8523   for (i = 0; i < 5; i++)
8524     {
8525       real_from_string (&ext_80387_constants_table[i], cst[i]);
8526       /* Ensure each constant is rounded to XFmode precision.  */
8527       real_convert (&ext_80387_constants_table[i],
8528                     XFmode, &ext_80387_constants_table[i]);
8529     }
8530
8531   ext_80387_constants_init = 1;
8532 }
8533
8534 /* Return non-zero if the constant is something that
8535    can be loaded with a special instruction.  */
8536
8537 int
8538 standard_80387_constant_p (rtx x)
8539 {
8540   enum machine_mode mode = GET_MODE (x);
8541
8542   REAL_VALUE_TYPE r;
8543
8544   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
8545     return -1;
8546
8547   if (x == CONST0_RTX (mode))
8548     return 1;
8549   if (x == CONST1_RTX (mode))
8550     return 2;
8551
8552   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
8553
8554   /* For XFmode constants, try to find a special 80387 instruction when
8555      optimizing for size or on those CPUs that benefit from them.  */
8556   if (mode == XFmode
8557       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
8558     {
8559       int i;
8560
8561       if (! ext_80387_constants_init)
8562         init_ext_80387_constants ();
8563
8564       for (i = 0; i < 5; i++)
8565         if (real_identical (&r, &ext_80387_constants_table[i]))
8566           return i + 3;
8567     }
8568
8569   /* Load of the constant -0.0 or -1.0 will be split as
8570      fldz;fchs or fld1;fchs sequence.  */
8571   if (real_isnegzero (&r))
8572     return 8;
8573   if (real_identical (&r, &dconstm1))
8574     return 9;
8575
8576   return 0;
8577 }
8578
8579 /* Return the opcode of the special instruction to be used to load
8580    the constant X.  */
8581
8582 const char *
8583 standard_80387_constant_opcode (rtx x)
8584 {
8585   switch (standard_80387_constant_p (x))
8586     {
8587     case 1:
8588       return "fldz";
8589     case 2:
8590       return "fld1";
8591     case 3:
8592       return "fldlg2";
8593     case 4:
8594       return "fldln2";
8595     case 5:
8596       return "fldl2e";
8597     case 6:
8598       return "fldl2t";
8599     case 7:
8600       return "fldpi";
8601     case 8:
8602     case 9:
8603       return "#";
8604     default:
8605       gcc_unreachable ();
8606     }
8607 }
8608
8609 /* Return the CONST_DOUBLE representing the 80387 constant that is
8610    loaded by the specified special instruction.  The argument IDX
8611    matches the return value from standard_80387_constant_p.  */
8612
8613 rtx
8614 standard_80387_constant_rtx (int idx)
8615 {
8616   int i;
8617
8618   if (! ext_80387_constants_init)
8619     init_ext_80387_constants ();
8620
8621   switch (idx)
8622     {
8623     case 3:
8624     case 4:
8625     case 5:
8626     case 6:
8627     case 7:
8628       i = idx - 3;
8629       break;
8630
8631     default:
8632       gcc_unreachable ();
8633     }
8634
8635   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
8636                                        XFmode);
8637 }
8638
8639 /* Return 1 if X is all 0s and 2 if x is all 1s
8640    in supported SSE vector mode.  */
8641
8642 int
8643 standard_sse_constant_p (rtx x)
8644 {
8645   enum machine_mode mode = GET_MODE (x);
8646
8647   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
8648     return 1;
8649   if (vector_all_ones_operand (x, mode))
8650     switch (mode)
8651       {
8652       case V16QImode:
8653       case V8HImode:
8654       case V4SImode:
8655       case V2DImode:
8656         if (TARGET_SSE2)
8657           return 2;
8658       default:
8659         break;
8660       }
8661
8662   return 0;
8663 }
8664
8665 /* Return the opcode of the special instruction to be used to load
8666    the constant X.  */
8667
8668 const char *
8669 standard_sse_constant_opcode (rtx insn, rtx x)
8670 {
8671   switch (standard_sse_constant_p (x))
8672     {
8673     case 1:
8674       switch (get_attr_mode (insn))
8675         {
8676         case MODE_V4SF:
8677           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8678         case MODE_V2DF:
8679           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8680             return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8681           else
8682             return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
8683         case MODE_TI:
8684           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8685             return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8686           else
8687             return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
8688         case MODE_V8SF:
8689           return "vxorps\t%x0, %x0, %x0";
8690         case MODE_V4DF:
8691           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8692             return "vxorps\t%x0, %x0, %x0";
8693           else
8694             return "vxorpd\t%x0, %x0, %x0";
8695         case MODE_OI:
8696           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8697             return "vxorps\t%x0, %x0, %x0";
8698           else
8699             return "vpxor\t%x0, %x0, %x0";
8700         default:
8701           break;
8702         }
8703     case 2:
8704       return TARGET_AVX ? "vpcmpeqd\t%0, %0, %0" : "pcmpeqd\t%0, %0";
8705     default:
8706       break;
8707     }
8708   gcc_unreachable ();
8709 }
8710
8711 /* Returns true if OP contains a symbol reference */
8712
8713 bool
8714 symbolic_reference_mentioned_p (rtx op)
8715 {
8716   const char *fmt;
8717   int i;
8718
8719   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
8720     return true;
8721
8722   fmt = GET_RTX_FORMAT (GET_CODE (op));
8723   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
8724     {
8725       if (fmt[i] == 'E')
8726         {
8727           int j;
8728
8729           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
8730             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
8731               return true;
8732         }
8733
8734       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
8735         return true;
8736     }
8737
8738   return false;
8739 }
8740
8741 /* Return true if it is appropriate to emit `ret' instructions in the
8742    body of a function.  Do this only if the epilogue is simple, needing a
8743    couple of insns.  Prior to reloading, we can't tell how many registers
8744    must be saved, so return false then.  Return false if there is no frame
8745    marker to de-allocate.  */
8746
8747 bool
8748 ix86_can_use_return_insn_p (void)
8749 {
8750   struct ix86_frame frame;
8751
8752   if (! reload_completed || frame_pointer_needed)
8753     return 0;
8754
8755   /* Don't allow more than 32k pop, since that's all we can do
8756      with one instruction.  */
8757   if (crtl->args.pops_args && crtl->args.size >= 32768)
8758     return 0;
8759
8760   ix86_compute_frame_layout (&frame);
8761   return (frame.stack_pointer_offset == UNITS_PER_WORD
8762           && (frame.nregs + frame.nsseregs) == 0);
8763 }
8764 \f
8765 /* Value should be nonzero if functions must have frame pointers.
8766    Zero means the frame pointer need not be set up (and parms may
8767    be accessed via the stack pointer) in functions that seem suitable.  */
8768
8769 static bool
8770 ix86_frame_pointer_required (void)
8771 {
8772   /* If we accessed previous frames, then the generated code expects
8773      to be able to access the saved ebp value in our frame.  */
8774   if (cfun->machine->accesses_prev_frame)
8775     return true;
8776
8777   /* Several x86 os'es need a frame pointer for other reasons,
8778      usually pertaining to setjmp.  */
8779   if (SUBTARGET_FRAME_POINTER_REQUIRED)
8780     return true;
8781
8782   /* In ix86_option_override_internal, TARGET_OMIT_LEAF_FRAME_POINTER
8783      turns off the frame pointer by default.  Turn it back on now if
8784      we've not got a leaf function.  */
8785   if (TARGET_OMIT_LEAF_FRAME_POINTER
8786       && (!current_function_is_leaf
8787           || ix86_current_function_calls_tls_descriptor))
8788     return true;
8789
8790   if (crtl->profile && !flag_fentry)
8791     return true;
8792
8793   return false;
8794 }
8795
8796 /* Record that the current function accesses previous call frames.  */
8797
8798 void
8799 ix86_setup_frame_addresses (void)
8800 {
8801   cfun->machine->accesses_prev_frame = 1;
8802 }
8803 \f
8804 #ifndef USE_HIDDEN_LINKONCE
8805 # if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
8806 #  define USE_HIDDEN_LINKONCE 1
8807 # else
8808 #  define USE_HIDDEN_LINKONCE 0
8809 # endif
8810 #endif
8811
8812 static int pic_labels_used;
8813
8814 /* Fills in the label name that should be used for a pc thunk for
8815    the given register.  */
8816
8817 static void
8818 get_pc_thunk_name (char name[32], unsigned int regno)
8819 {
8820   gcc_assert (!TARGET_64BIT);
8821
8822   if (USE_HIDDEN_LINKONCE)
8823     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
8824   else
8825     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
8826 }
8827
8828
8829 /* This function generates code for -fpic that loads %ebx with
8830    the return address of the caller and then returns.  */
8831
8832 static void
8833 ix86_code_end (void)
8834 {
8835   rtx xops[2];
8836   int regno;
8837
8838   for (regno = AX_REG; regno <= SP_REG; regno++)
8839     {
8840       char name[32];
8841       tree decl;
8842
8843       if (!(pic_labels_used & (1 << regno)))
8844         continue;
8845
8846       get_pc_thunk_name (name, regno);
8847
8848       decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
8849                          get_identifier (name),
8850                          build_function_type (void_type_node, void_list_node));
8851       DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
8852                                        NULL_TREE, void_type_node);
8853       TREE_PUBLIC (decl) = 1;
8854       TREE_STATIC (decl) = 1;
8855
8856 #if TARGET_MACHO
8857       if (TARGET_MACHO)
8858         {
8859           switch_to_section (darwin_sections[text_coal_section]);
8860           fputs ("\t.weak_definition\t", asm_out_file);
8861           assemble_name (asm_out_file, name);
8862           fputs ("\n\t.private_extern\t", asm_out_file);
8863           assemble_name (asm_out_file, name);
8864           putc ('\n', asm_out_file);
8865           ASM_OUTPUT_LABEL (asm_out_file, name);
8866           DECL_WEAK (decl) = 1;
8867         }
8868       else
8869 #endif
8870       if (USE_HIDDEN_LINKONCE)
8871         {
8872           DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
8873
8874           targetm.asm_out.unique_section (decl, 0);
8875           switch_to_section (get_named_section (decl, NULL, 0));
8876
8877           targetm.asm_out.globalize_label (asm_out_file, name);
8878           fputs ("\t.hidden\t", asm_out_file);
8879           assemble_name (asm_out_file, name);
8880           putc ('\n', asm_out_file);
8881           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
8882         }
8883       else
8884         {
8885           switch_to_section (text_section);
8886           ASM_OUTPUT_LABEL (asm_out_file, name);
8887         }
8888
8889       DECL_INITIAL (decl) = make_node (BLOCK);
8890       current_function_decl = decl;
8891       init_function_start (decl);
8892       first_function_block_is_cold = false;
8893       /* Make sure unwind info is emitted for the thunk if needed.  */
8894       final_start_function (emit_barrier (), asm_out_file, 1);
8895
8896       /* Pad stack IP move with 4 instructions (two NOPs count
8897          as one instruction).  */
8898       if (TARGET_PAD_SHORT_FUNCTION)
8899         {
8900           int i = 8;
8901
8902           while (i--)
8903             fputs ("\tnop\n", asm_out_file);
8904         }
8905
8906       xops[0] = gen_rtx_REG (Pmode, regno);
8907       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
8908       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
8909       fputs ("\tret\n", asm_out_file);
8910       final_end_function ();
8911       init_insn_lengths ();
8912       free_after_compilation (cfun);
8913       set_cfun (NULL);
8914       current_function_decl = NULL;
8915     }
8916
8917   if (flag_split_stack)
8918     file_end_indicate_split_stack ();
8919 }
8920
8921 /* Emit code for the SET_GOT patterns.  */
8922
8923 const char *
8924 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
8925 {
8926   rtx xops[3];
8927
8928   xops[0] = dest;
8929
8930   if (TARGET_VXWORKS_RTP && flag_pic)
8931     {
8932       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
8933       xops[2] = gen_rtx_MEM (Pmode,
8934                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
8935       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
8936
8937       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
8938          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
8939          an unadorned address.  */
8940       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
8941       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
8942       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
8943       return "";
8944     }
8945
8946   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
8947
8948   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
8949     {
8950       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
8951
8952       if (!flag_pic)
8953         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
8954       else
8955         {
8956           output_asm_insn ("call\t%a2", xops);
8957 #ifdef DWARF2_UNWIND_INFO
8958           /* The call to next label acts as a push.  */
8959           if (dwarf2out_do_frame ())
8960             {
8961               rtx insn;
8962               start_sequence ();
8963               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8964                                              gen_rtx_PLUS (Pmode,
8965                                                            stack_pointer_rtx,
8966                                                            GEN_INT (-4))));
8967               RTX_FRAME_RELATED_P (insn) = 1;
8968               dwarf2out_frame_debug (insn, true);
8969               end_sequence ();
8970             }
8971 #endif
8972         }
8973
8974 #if TARGET_MACHO
8975       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
8976          is what will be referenced by the Mach-O PIC subsystem.  */
8977       if (!label)
8978         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
8979 #endif
8980
8981       targetm.asm_out.internal_label (asm_out_file, "L",
8982                                       CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
8983
8984       if (flag_pic)
8985         {
8986           output_asm_insn ("pop%z0\t%0", xops);
8987 #ifdef DWARF2_UNWIND_INFO
8988           /* The pop is a pop and clobbers dest, but doesn't restore it
8989              for unwind info purposes.  */
8990           if (dwarf2out_do_frame ())
8991             {
8992               rtx insn;
8993               start_sequence ();
8994               insn = emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
8995               dwarf2out_frame_debug (insn, true);
8996               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8997                                              gen_rtx_PLUS (Pmode,
8998                                                            stack_pointer_rtx,
8999                                                            GEN_INT (4))));
9000               RTX_FRAME_RELATED_P (insn) = 1;
9001               dwarf2out_frame_debug (insn, true);
9002               end_sequence ();
9003             }
9004 #endif
9005         }
9006     }
9007   else
9008     {
9009       char name[32];
9010       get_pc_thunk_name (name, REGNO (dest));
9011       pic_labels_used |= 1 << REGNO (dest);
9012
9013 #ifdef DWARF2_UNWIND_INFO
9014       /* Ensure all queued register saves are flushed before the
9015          call.  */
9016       if (dwarf2out_do_frame ())
9017         dwarf2out_flush_queued_reg_saves ();
9018 #endif
9019       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
9020       xops[2] = gen_rtx_MEM (QImode, xops[2]);
9021       output_asm_insn ("call\t%X2", xops);
9022       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
9023          is what will be referenced by the Mach-O PIC subsystem.  */
9024 #if TARGET_MACHO
9025       if (!label)
9026         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
9027       else
9028         targetm.asm_out.internal_label (asm_out_file, "L",
9029                                            CODE_LABEL_NUMBER (label));
9030 #endif
9031     }
9032
9033   if (TARGET_MACHO)
9034     return "";
9035
9036   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
9037     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
9038   else
9039     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
9040
9041   return "";
9042 }
9043
9044 /* Generate an "push" pattern for input ARG.  */
9045
9046 static rtx
9047 gen_push (rtx arg)
9048 {
9049   struct machine_function *m = cfun->machine;
9050
9051   if (m->fs.cfa_reg == stack_pointer_rtx)
9052     m->fs.cfa_offset += UNITS_PER_WORD;
9053   m->fs.sp_offset += UNITS_PER_WORD;
9054
9055   return gen_rtx_SET (VOIDmode,
9056                       gen_rtx_MEM (Pmode,
9057                                    gen_rtx_PRE_DEC (Pmode,
9058                                                     stack_pointer_rtx)),
9059                       arg);
9060 }
9061
9062 /* Generate an "pop" pattern for input ARG.  */
9063
9064 static rtx
9065 gen_pop (rtx arg)
9066 {
9067   return gen_rtx_SET (VOIDmode,
9068                       arg,
9069                       gen_rtx_MEM (Pmode,
9070                                    gen_rtx_POST_INC (Pmode,
9071                                                      stack_pointer_rtx)));
9072 }
9073
9074 /* Return >= 0 if there is an unused call-clobbered register available
9075    for the entire function.  */
9076
9077 static unsigned int
9078 ix86_select_alt_pic_regnum (void)
9079 {
9080   if (current_function_is_leaf
9081       && !crtl->profile
9082       && !ix86_current_function_calls_tls_descriptor)
9083     {
9084       int i, drap;
9085       /* Can't use the same register for both PIC and DRAP.  */
9086       if (crtl->drap_reg)
9087         drap = REGNO (crtl->drap_reg);
9088       else
9089         drap = -1;
9090       for (i = 2; i >= 0; --i)
9091         if (i != drap && !df_regs_ever_live_p (i))
9092           return i;
9093     }
9094
9095   return INVALID_REGNUM;
9096 }
9097
9098 /* Return 1 if we need to save REGNO.  */
9099 static int
9100 ix86_save_reg (unsigned int regno, int maybe_eh_return)
9101 {
9102   if (pic_offset_table_rtx
9103       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
9104       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
9105           || crtl->profile
9106           || crtl->calls_eh_return
9107           || crtl->uses_const_pool))
9108     {
9109       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
9110         return 0;
9111       return 1;
9112     }
9113
9114   if (crtl->calls_eh_return && maybe_eh_return)
9115     {
9116       unsigned i;
9117       for (i = 0; ; i++)
9118         {
9119           unsigned test = EH_RETURN_DATA_REGNO (i);
9120           if (test == INVALID_REGNUM)
9121             break;
9122           if (test == regno)
9123             return 1;
9124         }
9125     }
9126
9127   if (crtl->drap_reg && regno == REGNO (crtl->drap_reg))
9128     return 1;
9129
9130   return (df_regs_ever_live_p (regno)
9131           && !call_used_regs[regno]
9132           && !fixed_regs[regno]
9133           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
9134 }
9135
9136 /* Return number of saved general prupose registers.  */
9137
9138 static int
9139 ix86_nsaved_regs (void)
9140 {
9141   int nregs = 0;
9142   int regno;
9143
9144   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9145     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9146       nregs ++;
9147   return nregs;
9148 }
9149
9150 /* Return number of saved SSE registrers.  */
9151
9152 static int
9153 ix86_nsaved_sseregs (void)
9154 {
9155   int nregs = 0;
9156   int regno;
9157
9158   if (!TARGET_64BIT_MS_ABI)
9159     return 0;
9160   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9161     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9162       nregs ++;
9163   return nregs;
9164 }
9165
9166 /* Given FROM and TO register numbers, say whether this elimination is
9167    allowed.  If stack alignment is needed, we can only replace argument
9168    pointer with hard frame pointer, or replace frame pointer with stack
9169    pointer.  Otherwise, frame pointer elimination is automatically
9170    handled and all other eliminations are valid.  */
9171
9172 static bool
9173 ix86_can_eliminate (const int from, const int to)
9174 {
9175   if (stack_realign_fp)
9176     return ((from == ARG_POINTER_REGNUM
9177              && to == HARD_FRAME_POINTER_REGNUM)
9178             || (from == FRAME_POINTER_REGNUM
9179                 && to == STACK_POINTER_REGNUM));
9180   else
9181     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : true;
9182 }
9183
9184 /* Return the offset between two registers, one to be eliminated, and the other
9185    its replacement, at the start of a routine.  */
9186
9187 HOST_WIDE_INT
9188 ix86_initial_elimination_offset (int from, int to)
9189 {
9190   struct ix86_frame frame;
9191   ix86_compute_frame_layout (&frame);
9192
9193   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
9194     return frame.hard_frame_pointer_offset;
9195   else if (from == FRAME_POINTER_REGNUM
9196            && to == HARD_FRAME_POINTER_REGNUM)
9197     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
9198   else
9199     {
9200       gcc_assert (to == STACK_POINTER_REGNUM);
9201
9202       if (from == ARG_POINTER_REGNUM)
9203         return frame.stack_pointer_offset;
9204
9205       gcc_assert (from == FRAME_POINTER_REGNUM);
9206       return frame.stack_pointer_offset - frame.frame_pointer_offset;
9207     }
9208 }
9209
9210 /* In a dynamically-aligned function, we can't know the offset from
9211    stack pointer to frame pointer, so we must ensure that setjmp
9212    eliminates fp against the hard fp (%ebp) rather than trying to
9213    index from %esp up to the top of the frame across a gap that is
9214    of unknown (at compile-time) size.  */
9215 static rtx
9216 ix86_builtin_setjmp_frame_value (void)
9217 {
9218   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
9219 }
9220
9221 /* On the x86 -fsplit-stack and -fstack-protector both use the same
9222    field in the TCB, so they can not be used together.  */
9223
9224 static bool
9225 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
9226                            struct gcc_options *opts ATTRIBUTE_UNUSED)
9227 {
9228   bool ret = true;
9229
9230 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
9231   if (report)
9232     error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
9233   ret = false;
9234 #else
9235   if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
9236     {
9237       if (report)
9238         error ("%<-fsplit-stack%> requires "
9239                "assembler support for CFI directives");
9240       ret = false;
9241     }
9242 #endif
9243
9244   return ret;
9245 }
9246
9247 /* When using -fsplit-stack, the allocation routines set a field in
9248    the TCB to the bottom of the stack plus this much space, measured
9249    in bytes.  */
9250
9251 #define SPLIT_STACK_AVAILABLE 256
9252
9253 /* Fill structure ix86_frame about frame of currently computed function.  */
9254
9255 static void
9256 ix86_compute_frame_layout (struct ix86_frame *frame)
9257 {
9258   unsigned int stack_alignment_needed;
9259   HOST_WIDE_INT offset;
9260   unsigned int preferred_alignment;
9261   HOST_WIDE_INT size = get_frame_size ();
9262   HOST_WIDE_INT to_allocate;
9263
9264   frame->nregs = ix86_nsaved_regs ();
9265   frame->nsseregs = ix86_nsaved_sseregs ();
9266
9267   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
9268   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
9269
9270   /* 64-bit MS ABI seem to require stack alignment to be always 16 except for
9271      function prologues and leaf.  */
9272   if ((TARGET_64BIT_MS_ABI && preferred_alignment < 16)
9273       && (!current_function_is_leaf || cfun->calls_alloca != 0
9274           || ix86_current_function_calls_tls_descriptor))
9275     {
9276       preferred_alignment = 16;
9277       stack_alignment_needed = 16;
9278       crtl->preferred_stack_boundary = 128;
9279       crtl->stack_alignment_needed = 128;
9280     }
9281
9282   gcc_assert (!size || stack_alignment_needed);
9283   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
9284   gcc_assert (preferred_alignment <= stack_alignment_needed);
9285
9286   /* For SEH we have to limit the amount of code movement into the prologue.
9287      At present we do this via a BLOCKAGE, at which point there's very little
9288      scheduling that can be done, which means that there's very little point
9289      in doing anything except PUSHs.  */
9290   if (TARGET_SEH)
9291     cfun->machine->use_fast_prologue_epilogue = false;
9292
9293   /* During reload iteration the amount of registers saved can change.
9294      Recompute the value as needed.  Do not recompute when amount of registers
9295      didn't change as reload does multiple calls to the function and does not
9296      expect the decision to change within single iteration.  */
9297   else if (!optimize_function_for_size_p (cfun)
9298            && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
9299     {
9300       int count = frame->nregs;
9301       struct cgraph_node *node = cgraph_node (current_function_decl);
9302
9303       cfun->machine->use_fast_prologue_epilogue_nregs = count;
9304
9305       /* The fast prologue uses move instead of push to save registers.  This
9306          is significantly longer, but also executes faster as modern hardware
9307          can execute the moves in parallel, but can't do that for push/pop.
9308
9309          Be careful about choosing what prologue to emit:  When function takes
9310          many instructions to execute we may use slow version as well as in
9311          case function is known to be outside hot spot (this is known with
9312          feedback only).  Weight the size of function by number of registers
9313          to save as it is cheap to use one or two push instructions but very
9314          slow to use many of them.  */
9315       if (count)
9316         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
9317       if (node->frequency < NODE_FREQUENCY_NORMAL
9318           || (flag_branch_probabilities
9319               && node->frequency < NODE_FREQUENCY_HOT))
9320         cfun->machine->use_fast_prologue_epilogue = false;
9321       else
9322         cfun->machine->use_fast_prologue_epilogue
9323            = !expensive_function_p (count);
9324     }
9325   if (TARGET_PROLOGUE_USING_MOVE
9326       && cfun->machine->use_fast_prologue_epilogue)
9327     frame->save_regs_using_mov = true;
9328   else
9329     frame->save_regs_using_mov = false;
9330
9331   /* If static stack checking is enabled and done with probes, the registers
9332      need to be saved before allocating the frame.  */
9333   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
9334     frame->save_regs_using_mov = false;
9335
9336   /* Skip return address.  */
9337   offset = UNITS_PER_WORD;
9338
9339   /* Skip pushed static chain.  */
9340   if (ix86_static_chain_on_stack)
9341     offset += UNITS_PER_WORD;
9342
9343   /* Skip saved base pointer.  */
9344   if (frame_pointer_needed)
9345     offset += UNITS_PER_WORD;
9346   frame->hfp_save_offset = offset;
9347
9348   /* The traditional frame pointer location is at the top of the frame.  */
9349   frame->hard_frame_pointer_offset = offset;
9350
9351   /* Register save area */
9352   offset += frame->nregs * UNITS_PER_WORD;
9353   frame->reg_save_offset = offset;
9354
9355   /* Align and set SSE register save area.  */
9356   if (frame->nsseregs)
9357     {
9358       /* The only ABI that has saved SSE registers (Win64) also has a
9359          16-byte aligned default stack, and thus we don't need to be
9360          within the re-aligned local stack frame to save them.  */
9361       gcc_assert (INCOMING_STACK_BOUNDARY >= 128);
9362       offset = (offset + 16 - 1) & -16;
9363       offset += frame->nsseregs * 16;
9364     }
9365   frame->sse_reg_save_offset = offset;
9366
9367   /* The re-aligned stack starts here.  Values before this point are not
9368      directly comparable with values below this point.  In order to make
9369      sure that no value happens to be the same before and after, force
9370      the alignment computation below to add a non-zero value.  */
9371   if (stack_realign_fp)
9372     offset = (offset + stack_alignment_needed) & -stack_alignment_needed;
9373
9374   /* Va-arg area */
9375   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
9376   offset += frame->va_arg_size;
9377
9378   /* Align start of frame for local function.  */
9379   if (stack_realign_fp
9380       || offset != frame->sse_reg_save_offset
9381       || size != 0
9382       || !current_function_is_leaf
9383       || cfun->calls_alloca
9384       || ix86_current_function_calls_tls_descriptor)
9385     offset = (offset + stack_alignment_needed - 1) & -stack_alignment_needed;
9386
9387   /* Frame pointer points here.  */
9388   frame->frame_pointer_offset = offset;
9389
9390   offset += size;
9391
9392   /* Add outgoing arguments area.  Can be skipped if we eliminated
9393      all the function calls as dead code.
9394      Skipping is however impossible when function calls alloca.  Alloca
9395      expander assumes that last crtl->outgoing_args_size
9396      of stack frame are unused.  */
9397   if (ACCUMULATE_OUTGOING_ARGS
9398       && (!current_function_is_leaf || cfun->calls_alloca
9399           || ix86_current_function_calls_tls_descriptor))
9400     {
9401       offset += crtl->outgoing_args_size;
9402       frame->outgoing_arguments_size = crtl->outgoing_args_size;
9403     }
9404   else
9405     frame->outgoing_arguments_size = 0;
9406
9407   /* Align stack boundary.  Only needed if we're calling another function
9408      or using alloca.  */
9409   if (!current_function_is_leaf || cfun->calls_alloca
9410       || ix86_current_function_calls_tls_descriptor)
9411     offset = (offset + preferred_alignment - 1) & -preferred_alignment;
9412
9413   /* We've reached end of stack frame.  */
9414   frame->stack_pointer_offset = offset;
9415
9416   /* Size prologue needs to allocate.  */
9417   to_allocate = offset - frame->sse_reg_save_offset;
9418
9419   if ((!to_allocate && frame->nregs <= 1)
9420       || (TARGET_64BIT && to_allocate >= (HOST_WIDE_INT) 0x80000000))
9421     frame->save_regs_using_mov = false;
9422
9423   if (ix86_using_red_zone ()
9424       && current_function_sp_is_unchanging
9425       && current_function_is_leaf
9426       && !ix86_current_function_calls_tls_descriptor)
9427     {
9428       frame->red_zone_size = to_allocate;
9429       if (frame->save_regs_using_mov)
9430         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
9431       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
9432         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
9433     }
9434   else
9435     frame->red_zone_size = 0;
9436   frame->stack_pointer_offset -= frame->red_zone_size;
9437
9438   /* The SEH frame pointer location is near the bottom of the frame.
9439      This is enforced by the fact that the difference between the
9440      stack pointer and the frame pointer is limited to 240 bytes in
9441      the unwind data structure.  */
9442   if (TARGET_SEH)
9443     {
9444       HOST_WIDE_INT diff;
9445
9446       /* If we can leave the frame pointer where it is, do so.  */
9447       diff = frame->stack_pointer_offset - frame->hard_frame_pointer_offset;
9448       if (diff > 240 || (diff & 15) != 0)
9449         {
9450           /* Ideally we'd determine what portion of the local stack frame
9451              (within the constraint of the lowest 240) is most heavily used.
9452              But without that complication, simply bias the frame pointer
9453              by 128 bytes so as to maximize the amount of the local stack
9454              frame that is addressable with 8-bit offsets.  */
9455           frame->hard_frame_pointer_offset = frame->stack_pointer_offset - 128;
9456         }
9457     }
9458 }
9459
9460 /* This is semi-inlined memory_address_length, but simplified
9461    since we know that we're always dealing with reg+offset, and
9462    to avoid having to create and discard all that rtl.  */
9463
9464 static inline int
9465 choose_baseaddr_len (unsigned int regno, HOST_WIDE_INT offset)
9466 {
9467   int len = 4;
9468
9469   if (offset == 0)
9470     {
9471       /* EBP and R13 cannot be encoded without an offset.  */
9472       len = (regno == BP_REG || regno == R13_REG);
9473     }
9474   else if (IN_RANGE (offset, -128, 127))
9475     len = 1;
9476
9477   /* ESP and R12 must be encoded with a SIB byte.  */
9478   if (regno == SP_REG || regno == R12_REG)
9479     len++;
9480
9481   return len;
9482 }
9483   
9484 /* Return an RTX that points to CFA_OFFSET within the stack frame.
9485    The valid base registers are taken from CFUN->MACHINE->FS.  */
9486
9487 static rtx
9488 choose_baseaddr (HOST_WIDE_INT cfa_offset)
9489 {
9490   const struct machine_function *m = cfun->machine;
9491   rtx base_reg = NULL;
9492   HOST_WIDE_INT base_offset = 0;
9493
9494   if (m->use_fast_prologue_epilogue)
9495     {
9496       /* Choose the base register most likely to allow the most scheduling
9497          opportunities.  Generally FP is valid througout the function,
9498          while DRAP must be reloaded within the epilogue.  But choose either
9499          over the SP due to increased encoding size.  */
9500
9501       if (m->fs.fp_valid)
9502         {
9503           base_reg = hard_frame_pointer_rtx;
9504           base_offset = m->fs.fp_offset - cfa_offset;
9505         }
9506       else if (m->fs.drap_valid)
9507         {
9508           base_reg = crtl->drap_reg;
9509           base_offset = 0 - cfa_offset;
9510         }
9511       else if (m->fs.sp_valid)
9512         {
9513           base_reg = stack_pointer_rtx;
9514           base_offset = m->fs.sp_offset - cfa_offset;
9515         }
9516     }
9517   else
9518     {
9519       HOST_WIDE_INT toffset;
9520       int len = 16, tlen;
9521
9522       /* Choose the base register with the smallest address encoding.
9523          With a tie, choose FP > DRAP > SP.  */
9524       if (m->fs.sp_valid)
9525         {
9526           base_reg = stack_pointer_rtx;
9527           base_offset = m->fs.sp_offset - cfa_offset;
9528           len = choose_baseaddr_len (STACK_POINTER_REGNUM, base_offset);
9529         }
9530       if (m->fs.drap_valid)
9531         {
9532           toffset = 0 - cfa_offset;
9533           tlen = choose_baseaddr_len (REGNO (crtl->drap_reg), toffset);
9534           if (tlen <= len)
9535             {
9536               base_reg = crtl->drap_reg;
9537               base_offset = toffset;
9538               len = tlen;
9539             }
9540         }
9541       if (m->fs.fp_valid)
9542         {
9543           toffset = m->fs.fp_offset - cfa_offset;
9544           tlen = choose_baseaddr_len (HARD_FRAME_POINTER_REGNUM, toffset);
9545           if (tlen <= len)
9546             {
9547               base_reg = hard_frame_pointer_rtx;
9548               base_offset = toffset;
9549               len = tlen;
9550             }
9551         }
9552     }
9553   gcc_assert (base_reg != NULL);
9554
9555   return plus_constant (base_reg, base_offset);
9556 }
9557
9558 /* Emit code to save registers in the prologue.  */
9559
9560 static void
9561 ix86_emit_save_regs (void)
9562 {
9563   unsigned int regno;
9564   rtx insn;
9565
9566   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
9567     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9568       {
9569         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
9570         RTX_FRAME_RELATED_P (insn) = 1;
9571       }
9572 }
9573
9574 /* Emit a single register save at CFA - CFA_OFFSET.  */
9575
9576 static void
9577 ix86_emit_save_reg_using_mov (enum machine_mode mode, unsigned int regno,
9578                               HOST_WIDE_INT cfa_offset)
9579 {
9580   struct machine_function *m = cfun->machine;
9581   rtx reg = gen_rtx_REG (mode, regno);
9582   rtx mem, addr, base, insn;
9583
9584   addr = choose_baseaddr (cfa_offset);
9585   mem = gen_frame_mem (mode, addr);
9586
9587   /* For SSE saves, we need to indicate the 128-bit alignment.  */
9588   set_mem_align (mem, GET_MODE_ALIGNMENT (mode));
9589
9590   insn = emit_move_insn (mem, reg);
9591   RTX_FRAME_RELATED_P (insn) = 1;
9592
9593   base = addr;
9594   if (GET_CODE (base) == PLUS)
9595     base = XEXP (base, 0);
9596   gcc_checking_assert (REG_P (base));
9597
9598   /* When saving registers into a re-aligned local stack frame, avoid
9599      any tricky guessing by dwarf2out.  */
9600   if (m->fs.realigned)
9601     {
9602       gcc_checking_assert (stack_realign_drap);
9603
9604       if (regno == REGNO (crtl->drap_reg))
9605         {
9606           /* A bit of a hack.  We force the DRAP register to be saved in
9607              the re-aligned stack frame, which provides us with a copy
9608              of the CFA that will last past the prologue.  Install it.  */
9609           gcc_checking_assert (cfun->machine->fs.fp_valid);
9610           addr = plus_constant (hard_frame_pointer_rtx,
9611                                 cfun->machine->fs.fp_offset - cfa_offset);
9612           mem = gen_rtx_MEM (mode, addr);
9613           add_reg_note (insn, REG_CFA_DEF_CFA, mem);
9614         }
9615       else
9616         {
9617           /* The frame pointer is a stable reference within the
9618              aligned frame.  Use it.  */
9619           gcc_checking_assert (cfun->machine->fs.fp_valid);
9620           addr = plus_constant (hard_frame_pointer_rtx,
9621                                 cfun->machine->fs.fp_offset - cfa_offset);
9622           mem = gen_rtx_MEM (mode, addr);
9623           add_reg_note (insn, REG_CFA_EXPRESSION,
9624                         gen_rtx_SET (VOIDmode, mem, reg));
9625         }
9626     }
9627
9628   /* The memory may not be relative to the current CFA register,
9629      which means that we may need to generate a new pattern for
9630      use by the unwind info.  */
9631   else if (base != m->fs.cfa_reg)
9632     {
9633       addr = plus_constant (m->fs.cfa_reg, m->fs.cfa_offset - cfa_offset);
9634       mem = gen_rtx_MEM (mode, addr);
9635       add_reg_note (insn, REG_CFA_OFFSET, gen_rtx_SET (VOIDmode, mem, reg));
9636     }
9637 }
9638
9639 /* Emit code to save registers using MOV insns.
9640    First register is stored at CFA - CFA_OFFSET.  */
9641 static void
9642 ix86_emit_save_regs_using_mov (HOST_WIDE_INT cfa_offset)
9643 {
9644   unsigned int regno;
9645
9646   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9647     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9648       {
9649         ix86_emit_save_reg_using_mov (Pmode, regno, cfa_offset);
9650         cfa_offset -= UNITS_PER_WORD;
9651       }
9652 }
9653
9654 /* Emit code to save SSE registers using MOV insns.
9655    First register is stored at CFA - CFA_OFFSET.  */
9656 static void
9657 ix86_emit_save_sse_regs_using_mov (HOST_WIDE_INT cfa_offset)
9658 {
9659   unsigned int regno;
9660
9661   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9662     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9663       {
9664         ix86_emit_save_reg_using_mov (V4SFmode, regno, cfa_offset);
9665         cfa_offset -= 16;
9666       }
9667 }
9668
9669 static GTY(()) rtx queued_cfa_restores;
9670
9671 /* Add a REG_CFA_RESTORE REG note to INSN or queue them until next stack
9672    manipulation insn.  The value is on the stack at CFA - CFA_OFFSET.
9673    Don't add the note if the previously saved value will be left untouched
9674    within stack red-zone till return, as unwinders can find the same value
9675    in the register and on the stack.  */
9676
9677 static void
9678 ix86_add_cfa_restore_note (rtx insn, rtx reg, HOST_WIDE_INT cfa_offset)
9679 {
9680   if (cfa_offset <= cfun->machine->fs.red_zone_offset)
9681     return;
9682
9683   if (insn)
9684     {
9685       add_reg_note (insn, REG_CFA_RESTORE, reg);
9686       RTX_FRAME_RELATED_P (insn) = 1;
9687     }
9688   else
9689     queued_cfa_restores
9690       = alloc_reg_note (REG_CFA_RESTORE, reg, queued_cfa_restores);
9691 }
9692
9693 /* Add queued REG_CFA_RESTORE notes if any to INSN.  */
9694
9695 static void
9696 ix86_add_queued_cfa_restore_notes (rtx insn)
9697 {
9698   rtx last;
9699   if (!queued_cfa_restores)
9700     return;
9701   for (last = queued_cfa_restores; XEXP (last, 1); last = XEXP (last, 1))
9702     ;
9703   XEXP (last, 1) = REG_NOTES (insn);
9704   REG_NOTES (insn) = queued_cfa_restores;
9705   queued_cfa_restores = NULL_RTX;
9706   RTX_FRAME_RELATED_P (insn) = 1;
9707 }
9708
9709 /* Expand prologue or epilogue stack adjustment.
9710    The pattern exist to put a dependency on all ebp-based memory accesses.
9711    STYLE should be negative if instructions should be marked as frame related,
9712    zero if %r11 register is live and cannot be freely used and positive
9713    otherwise.  */
9714
9715 static void
9716 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
9717                            int style, bool set_cfa)
9718 {
9719   struct machine_function *m = cfun->machine;
9720   rtx insn;
9721   bool add_frame_related_expr = false;
9722
9723   if (! TARGET_64BIT)
9724     insn = gen_pro_epilogue_adjust_stack_si_add (dest, src, offset);
9725   else if (x86_64_immediate_operand (offset, DImode))
9726     insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, offset);
9727   else
9728     {
9729       rtx tmp;
9730       /* r11 is used by indirect sibcall return as well, set before the
9731          epilogue and used after the epilogue.  */
9732       if (style)
9733         tmp = gen_rtx_REG (DImode, R11_REG);
9734       else
9735         {
9736           gcc_assert (src != hard_frame_pointer_rtx
9737                       && dest != hard_frame_pointer_rtx);
9738           tmp = hard_frame_pointer_rtx;
9739         }
9740       insn = emit_insn (gen_rtx_SET (DImode, tmp, offset));
9741       if (style < 0)
9742         add_frame_related_expr = true;
9743
9744       insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, tmp);
9745     }
9746
9747   insn = emit_insn (insn);
9748   if (style >= 0)
9749     ix86_add_queued_cfa_restore_notes (insn);
9750
9751   if (set_cfa)
9752     {
9753       rtx r;
9754
9755       gcc_assert (m->fs.cfa_reg == src);
9756       m->fs.cfa_offset += INTVAL (offset);
9757       m->fs.cfa_reg = dest;
9758
9759       r = gen_rtx_PLUS (Pmode, src, offset);
9760       r = gen_rtx_SET (VOIDmode, dest, r);
9761       add_reg_note (insn, REG_CFA_ADJUST_CFA, r);
9762       RTX_FRAME_RELATED_P (insn) = 1;
9763     }
9764   else if (style < 0)
9765     {
9766       RTX_FRAME_RELATED_P (insn) = 1;
9767       if (add_frame_related_expr)
9768         {
9769           rtx r = gen_rtx_PLUS (Pmode, src, offset);
9770           r = gen_rtx_SET (VOIDmode, dest, r);
9771           add_reg_note (insn, REG_FRAME_RELATED_EXPR, r);
9772         }
9773     }
9774
9775   if (dest == stack_pointer_rtx)
9776     {
9777       HOST_WIDE_INT ooffset = m->fs.sp_offset;
9778       bool valid = m->fs.sp_valid;
9779
9780       if (src == hard_frame_pointer_rtx)
9781         {
9782           valid = m->fs.fp_valid;
9783           ooffset = m->fs.fp_offset;
9784         }
9785       else if (src == crtl->drap_reg)
9786         {
9787           valid = m->fs.drap_valid;
9788           ooffset = 0;
9789         }
9790       else
9791         {
9792           /* Else there are two possibilities: SP itself, which we set
9793              up as the default above.  Or EH_RETURN_STACKADJ_RTX, which is
9794              taken care of this by hand along the eh_return path.  */
9795           gcc_checking_assert (src == stack_pointer_rtx
9796                                || offset == const0_rtx);
9797         }
9798
9799       m->fs.sp_offset = ooffset - INTVAL (offset);
9800       m->fs.sp_valid = valid;
9801     }
9802 }
9803
9804 /* Find an available register to be used as dynamic realign argument
9805    pointer regsiter.  Such a register will be written in prologue and
9806    used in begin of body, so it must not be
9807         1. parameter passing register.
9808         2. GOT pointer.
9809    We reuse static-chain register if it is available.  Otherwise, we
9810    use DI for i386 and R13 for x86-64.  We chose R13 since it has
9811    shorter encoding.
9812
9813    Return: the regno of chosen register.  */
9814
9815 static unsigned int
9816 find_drap_reg (void)
9817 {
9818   tree decl = cfun->decl;
9819
9820   if (TARGET_64BIT)
9821     {
9822       /* Use R13 for nested function or function need static chain.
9823          Since function with tail call may use any caller-saved
9824          registers in epilogue, DRAP must not use caller-saved
9825          register in such case.  */
9826       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
9827         return R13_REG;
9828
9829       return R10_REG;
9830     }
9831   else
9832     {
9833       /* Use DI for nested function or function need static chain.
9834          Since function with tail call may use any caller-saved
9835          registers in epilogue, DRAP must not use caller-saved
9836          register in such case.  */
9837       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
9838         return DI_REG;
9839
9840       /* Reuse static chain register if it isn't used for parameter
9841          passing.  */
9842       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2
9843           && !lookup_attribute ("fastcall",
9844                                 TYPE_ATTRIBUTES (TREE_TYPE (decl)))
9845           && !ix86_is_type_thiscall (TREE_TYPE (decl)))
9846         return CX_REG;
9847       else
9848         return DI_REG;
9849     }
9850 }
9851
9852 /* Return minimum incoming stack alignment.  */
9853
9854 static unsigned int
9855 ix86_minimum_incoming_stack_boundary (bool sibcall)
9856 {
9857   unsigned int incoming_stack_boundary;
9858
9859   /* Prefer the one specified at command line. */
9860   if (ix86_user_incoming_stack_boundary)
9861     incoming_stack_boundary = ix86_user_incoming_stack_boundary;
9862   /* In 32bit, use MIN_STACK_BOUNDARY for incoming stack boundary
9863      if -mstackrealign is used, it isn't used for sibcall check and
9864      estimated stack alignment is 128bit.  */
9865   else if (!sibcall
9866            && !TARGET_64BIT
9867            && ix86_force_align_arg_pointer
9868            && crtl->stack_alignment_estimated == 128)
9869     incoming_stack_boundary = MIN_STACK_BOUNDARY;
9870   else
9871     incoming_stack_boundary = ix86_default_incoming_stack_boundary;
9872
9873   /* Incoming stack alignment can be changed on individual functions
9874      via force_align_arg_pointer attribute.  We use the smallest
9875      incoming stack boundary.  */
9876   if (incoming_stack_boundary > MIN_STACK_BOUNDARY
9877       && lookup_attribute (ix86_force_align_arg_pointer_string,
9878                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
9879     incoming_stack_boundary = MIN_STACK_BOUNDARY;
9880
9881   /* The incoming stack frame has to be aligned at least at
9882      parm_stack_boundary.  */
9883   if (incoming_stack_boundary < crtl->parm_stack_boundary)
9884     incoming_stack_boundary = crtl->parm_stack_boundary;
9885
9886   /* Stack at entrance of main is aligned by runtime.  We use the
9887      smallest incoming stack boundary. */
9888   if (incoming_stack_boundary > MAIN_STACK_BOUNDARY
9889       && DECL_NAME (current_function_decl)
9890       && MAIN_NAME_P (DECL_NAME (current_function_decl))
9891       && DECL_FILE_SCOPE_P (current_function_decl))
9892     incoming_stack_boundary = MAIN_STACK_BOUNDARY;
9893
9894   return incoming_stack_boundary;
9895 }
9896
9897 /* Update incoming stack boundary and estimated stack alignment.  */
9898
9899 static void
9900 ix86_update_stack_boundary (void)
9901 {
9902   ix86_incoming_stack_boundary
9903     = ix86_minimum_incoming_stack_boundary (false);
9904
9905   /* x86_64 vararg needs 16byte stack alignment for register save
9906      area.  */
9907   if (TARGET_64BIT
9908       && cfun->stdarg
9909       && crtl->stack_alignment_estimated < 128)
9910     crtl->stack_alignment_estimated = 128;
9911 }
9912
9913 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
9914    needed or an rtx for DRAP otherwise.  */
9915
9916 static rtx
9917 ix86_get_drap_rtx (void)
9918 {
9919   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
9920     crtl->need_drap = true;
9921
9922   if (stack_realign_drap)
9923     {
9924       /* Assign DRAP to vDRAP and returns vDRAP */
9925       unsigned int regno = find_drap_reg ();
9926       rtx drap_vreg;
9927       rtx arg_ptr;
9928       rtx seq, insn;
9929
9930       arg_ptr = gen_rtx_REG (Pmode, regno);
9931       crtl->drap_reg = arg_ptr;
9932
9933       start_sequence ();
9934       drap_vreg = copy_to_reg (arg_ptr);
9935       seq = get_insns ();
9936       end_sequence ();
9937
9938       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
9939       if (!optimize)
9940         {
9941           add_reg_note (insn, REG_CFA_SET_VDRAP, drap_vreg);
9942           RTX_FRAME_RELATED_P (insn) = 1;
9943         }
9944       return drap_vreg;
9945     }
9946   else
9947     return NULL;
9948 }
9949
9950 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
9951
9952 static rtx
9953 ix86_internal_arg_pointer (void)
9954 {
9955   return virtual_incoming_args_rtx;
9956 }
9957
9958 struct scratch_reg {
9959   rtx reg;
9960   bool saved;
9961 };
9962
9963 /* Return a short-lived scratch register for use on function entry.
9964    In 32-bit mode, it is valid only after the registers are saved
9965    in the prologue.  This register must be released by means of
9966    release_scratch_register_on_entry once it is dead.  */
9967
9968 static void
9969 get_scratch_register_on_entry (struct scratch_reg *sr)
9970 {
9971   int regno;
9972
9973   sr->saved = false;
9974
9975   if (TARGET_64BIT)
9976     {
9977       /* We always use R11 in 64-bit mode.  */
9978       regno = R11_REG;
9979     }
9980   else
9981     {
9982       tree decl = current_function_decl, fntype = TREE_TYPE (decl);
9983       bool fastcall_p
9984         = lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)) != NULL_TREE;
9985       bool static_chain_p = DECL_STATIC_CHAIN (decl);
9986       int regparm = ix86_function_regparm (fntype, decl);
9987       int drap_regno
9988         = crtl->drap_reg ? REGNO (crtl->drap_reg) : INVALID_REGNUM;
9989
9990       /* 'fastcall' sets regparm to 2, uses ecx/edx for arguments and eax
9991           for the static chain register.  */
9992       if ((regparm < 1 || (fastcall_p && !static_chain_p))
9993           && drap_regno != AX_REG)
9994         regno = AX_REG;
9995       else if (regparm < 2 && drap_regno != DX_REG)
9996         regno = DX_REG;
9997       /* ecx is the static chain register.  */
9998       else if (regparm < 3 && !fastcall_p && !static_chain_p
9999                && drap_regno != CX_REG)
10000         regno = CX_REG;
10001       else if (ix86_save_reg (BX_REG, true))
10002         regno = BX_REG;
10003       /* esi is the static chain register.  */
10004       else if (!(regparm == 3 && static_chain_p)
10005                && ix86_save_reg (SI_REG, true))
10006         regno = SI_REG;
10007       else if (ix86_save_reg (DI_REG, true))
10008         regno = DI_REG;
10009       else
10010         {
10011           regno = (drap_regno == AX_REG ? DX_REG : AX_REG);
10012           sr->saved = true;
10013         }
10014     }
10015
10016   sr->reg = gen_rtx_REG (Pmode, regno);
10017   if (sr->saved)
10018     {
10019       rtx insn = emit_insn (gen_push (sr->reg));
10020       RTX_FRAME_RELATED_P (insn) = 1;
10021     }
10022 }
10023
10024 /* Release a scratch register obtained from the preceding function.  */
10025
10026 static void
10027 release_scratch_register_on_entry (struct scratch_reg *sr)
10028 {
10029   if (sr->saved)
10030     {
10031       rtx x, insn = emit_insn (gen_pop (sr->reg));
10032
10033       /* The RTX_FRAME_RELATED_P mechanism doesn't know about pop.  */
10034       RTX_FRAME_RELATED_P (insn) = 1;
10035       x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (UNITS_PER_WORD));
10036       x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x);
10037       add_reg_note (insn, REG_FRAME_RELATED_EXPR, x);
10038     }
10039 }
10040
10041 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
10042
10043 /* Emit code to adjust the stack pointer by SIZE bytes while probing it.  */
10044
10045 static void
10046 ix86_adjust_stack_and_probe (const HOST_WIDE_INT size)
10047 {
10048   /* We skip the probe for the first interval + a small dope of 4 words and
10049      probe that many bytes past the specified size to maintain a protection
10050      area at the botton of the stack.  */
10051   const int dope = 4 * UNITS_PER_WORD;
10052   rtx size_rtx = GEN_INT (size), last;
10053
10054   /* See if we have a constant small number of probes to generate.  If so,
10055      that's the easy case.  The run-time loop is made up of 11 insns in the
10056      generic case while the compile-time loop is made up of 3+2*(n-1) insns
10057      for n # of intervals.  */
10058   if (size <= 5 * PROBE_INTERVAL)
10059     {
10060       HOST_WIDE_INT i, adjust;
10061       bool first_probe = true;
10062
10063       /* Adjust SP and probe at PROBE_INTERVAL + N * PROBE_INTERVAL for
10064          values of N from 1 until it exceeds SIZE.  If only one probe is
10065          needed, this will not generate any code.  Then adjust and probe
10066          to PROBE_INTERVAL + SIZE.  */
10067       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
10068         {
10069           if (first_probe)
10070             {
10071               adjust = 2 * PROBE_INTERVAL + dope;
10072               first_probe = false;
10073             }
10074           else
10075             adjust = PROBE_INTERVAL;
10076
10077           emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10078                                   plus_constant (stack_pointer_rtx, -adjust)));
10079           emit_stack_probe (stack_pointer_rtx);
10080         }
10081
10082       if (first_probe)
10083         adjust = size + PROBE_INTERVAL + dope;
10084       else
10085         adjust = size + PROBE_INTERVAL - i;
10086
10087       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10088                               plus_constant (stack_pointer_rtx, -adjust)));
10089       emit_stack_probe (stack_pointer_rtx);
10090
10091       /* Adjust back to account for the additional first interval.  */
10092       last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10093                                      plus_constant (stack_pointer_rtx,
10094                                                     PROBE_INTERVAL + dope)));
10095     }
10096
10097   /* Otherwise, do the same as above, but in a loop.  Note that we must be
10098      extra careful with variables wrapping around because we might be at
10099      the very top (or the very bottom) of the address space and we have
10100      to be able to handle this case properly; in particular, we use an
10101      equality test for the loop condition.  */
10102   else
10103     {
10104       HOST_WIDE_INT rounded_size;
10105       struct scratch_reg sr;
10106
10107       get_scratch_register_on_entry (&sr);
10108
10109
10110       /* Step 1: round SIZE to the previous multiple of the interval.  */
10111
10112       rounded_size = size & -PROBE_INTERVAL;
10113
10114
10115       /* Step 2: compute initial and final value of the loop counter.  */
10116
10117       /* SP = SP_0 + PROBE_INTERVAL.  */
10118       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10119                               plus_constant (stack_pointer_rtx,
10120                                              - (PROBE_INTERVAL + dope))));
10121
10122       /* LAST_ADDR = SP_0 + PROBE_INTERVAL + ROUNDED_SIZE.  */
10123       emit_move_insn (sr.reg, GEN_INT (-rounded_size));
10124       emit_insn (gen_rtx_SET (VOIDmode, sr.reg,
10125                               gen_rtx_PLUS (Pmode, sr.reg,
10126                                             stack_pointer_rtx)));
10127
10128
10129       /* Step 3: the loop
10130
10131          while (SP != LAST_ADDR)
10132            {
10133              SP = SP + PROBE_INTERVAL
10134              probe at SP
10135            }
10136
10137          adjusts SP and probes to PROBE_INTERVAL + N * PROBE_INTERVAL for
10138          values of N from 1 until it is equal to ROUNDED_SIZE.  */
10139
10140       emit_insn (ix86_gen_adjust_stack_and_probe (sr.reg, sr.reg, size_rtx));
10141
10142
10143       /* Step 4: adjust SP and probe at PROBE_INTERVAL + SIZE if we cannot
10144          assert at compile-time that SIZE is equal to ROUNDED_SIZE.  */
10145
10146       if (size != rounded_size)
10147         {
10148           emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10149                                   plus_constant (stack_pointer_rtx,
10150                                                  rounded_size - size)));
10151           emit_stack_probe (stack_pointer_rtx);
10152         }
10153
10154       /* Adjust back to account for the additional first interval.  */
10155       last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10156                                      plus_constant (stack_pointer_rtx,
10157                                                     PROBE_INTERVAL + dope)));
10158
10159       release_scratch_register_on_entry (&sr);
10160     }
10161
10162   gcc_assert (cfun->machine->fs.cfa_reg != stack_pointer_rtx);
10163
10164   /* Even if the stack pointer isn't the CFA register, we need to correctly
10165      describe the adjustments made to it, in particular differentiate the
10166      frame-related ones from the frame-unrelated ones.  */
10167   if (size > 0)
10168     {
10169       rtx expr = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2));
10170       XVECEXP (expr, 0, 0)
10171         = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10172                        plus_constant (stack_pointer_rtx, -size));
10173       XVECEXP (expr, 0, 1)
10174         = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10175                        plus_constant (stack_pointer_rtx,
10176                                       PROBE_INTERVAL + dope + size));
10177       add_reg_note (last, REG_FRAME_RELATED_EXPR, expr);
10178       RTX_FRAME_RELATED_P (last) = 1;
10179
10180       cfun->machine->fs.sp_offset += size;
10181     }
10182
10183   /* Make sure nothing is scheduled before we are done.  */
10184   emit_insn (gen_blockage ());
10185 }
10186
10187 /* Adjust the stack pointer up to REG while probing it.  */
10188
10189 const char *
10190 output_adjust_stack_and_probe (rtx reg)
10191 {
10192   static int labelno = 0;
10193   char loop_lab[32], end_lab[32];
10194   rtx xops[2];
10195
10196   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
10197   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
10198
10199   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
10200
10201   /* Jump to END_LAB if SP == LAST_ADDR.  */
10202   xops[0] = stack_pointer_rtx;
10203   xops[1] = reg;
10204   output_asm_insn ("cmp%z0\t{%1, %0|%0, %1}", xops);
10205   fputs ("\tje\t", asm_out_file);
10206   assemble_name_raw (asm_out_file, end_lab);
10207   fputc ('\n', asm_out_file);
10208
10209   /* SP = SP + PROBE_INTERVAL.  */
10210   xops[1] = GEN_INT (PROBE_INTERVAL);
10211   output_asm_insn ("sub%z0\t{%1, %0|%0, %1}", xops);
10212
10213   /* Probe at SP.  */
10214   xops[1] = const0_rtx;
10215   output_asm_insn ("or%z0\t{%1, (%0)|DWORD PTR [%0], %1}", xops);
10216
10217   fprintf (asm_out_file, "\tjmp\t");
10218   assemble_name_raw (asm_out_file, loop_lab);
10219   fputc ('\n', asm_out_file);
10220
10221   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
10222
10223   return "";
10224 }
10225
10226 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
10227    inclusive.  These are offsets from the current stack pointer.  */
10228
10229 static void
10230 ix86_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
10231 {
10232   /* See if we have a constant small number of probes to generate.  If so,
10233      that's the easy case.  The run-time loop is made up of 7 insns in the
10234      generic case while the compile-time loop is made up of n insns for n #
10235      of intervals.  */
10236   if (size <= 7 * PROBE_INTERVAL)
10237     {
10238       HOST_WIDE_INT i;
10239
10240       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
10241          it exceeds SIZE.  If only one probe is needed, this will not
10242          generate any code.  Then probe at FIRST + SIZE.  */
10243       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
10244         emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
10245
10246       emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
10247     }
10248
10249   /* Otherwise, do the same as above, but in a loop.  Note that we must be
10250      extra careful with variables wrapping around because we might be at
10251      the very top (or the very bottom) of the address space and we have
10252      to be able to handle this case properly; in particular, we use an
10253      equality test for the loop condition.  */
10254   else
10255     {
10256       HOST_WIDE_INT rounded_size, last;
10257       struct scratch_reg sr;
10258
10259       get_scratch_register_on_entry (&sr);
10260
10261
10262       /* Step 1: round SIZE to the previous multiple of the interval.  */
10263
10264       rounded_size = size & -PROBE_INTERVAL;
10265
10266
10267       /* Step 2: compute initial and final value of the loop counter.  */
10268
10269       /* TEST_OFFSET = FIRST.  */
10270       emit_move_insn (sr.reg, GEN_INT (-first));
10271
10272       /* LAST_OFFSET = FIRST + ROUNDED_SIZE.  */
10273       last = first + rounded_size;
10274
10275
10276       /* Step 3: the loop
10277
10278          while (TEST_ADDR != LAST_ADDR)
10279            {
10280              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
10281              probe at TEST_ADDR
10282            }
10283
10284          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
10285          until it is equal to ROUNDED_SIZE.  */
10286
10287       emit_insn (ix86_gen_probe_stack_range (sr.reg, sr.reg, GEN_INT (-last)));
10288
10289
10290       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
10291          that SIZE is equal to ROUNDED_SIZE.  */
10292
10293       if (size != rounded_size)
10294         emit_stack_probe (plus_constant (gen_rtx_PLUS (Pmode,
10295                                                        stack_pointer_rtx,
10296                                                        sr.reg),
10297                                          rounded_size - size));
10298
10299       release_scratch_register_on_entry (&sr);
10300     }
10301
10302   /* Make sure nothing is scheduled before we are done.  */
10303   emit_insn (gen_blockage ());
10304 }
10305
10306 /* Probe a range of stack addresses from REG to END, inclusive.  These are
10307    offsets from the current stack pointer.  */
10308
10309 const char *
10310 output_probe_stack_range (rtx reg, rtx end)
10311 {
10312   static int labelno = 0;
10313   char loop_lab[32], end_lab[32];
10314   rtx xops[3];
10315
10316   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
10317   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
10318
10319   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
10320
10321   /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
10322   xops[0] = reg;
10323   xops[1] = end;
10324   output_asm_insn ("cmp%z0\t{%1, %0|%0, %1}", xops);
10325   fputs ("\tje\t", asm_out_file);
10326   assemble_name_raw (asm_out_file, end_lab);
10327   fputc ('\n', asm_out_file);
10328
10329   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
10330   xops[1] = GEN_INT (PROBE_INTERVAL);
10331   output_asm_insn ("sub%z0\t{%1, %0|%0, %1}", xops);
10332
10333   /* Probe at TEST_ADDR.  */
10334   xops[0] = stack_pointer_rtx;
10335   xops[1] = reg;
10336   xops[2] = const0_rtx;
10337   output_asm_insn ("or%z0\t{%2, (%0,%1)|DWORD PTR [%0+%1], %2}", xops);
10338
10339   fprintf (asm_out_file, "\tjmp\t");
10340   assemble_name_raw (asm_out_file, loop_lab);
10341   fputc ('\n', asm_out_file);
10342
10343   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
10344
10345   return "";
10346 }
10347
10348 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
10349    to be generated in correct form.  */
10350 static void
10351 ix86_finalize_stack_realign_flags (void)
10352 {
10353   /* Check if stack realign is really needed after reload, and
10354      stores result in cfun */
10355   unsigned int incoming_stack_boundary
10356     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
10357        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
10358   unsigned int stack_realign = (incoming_stack_boundary
10359                                 < (current_function_is_leaf
10360                                    ? crtl->max_used_stack_slot_alignment
10361                                    : crtl->stack_alignment_needed));
10362
10363   if (crtl->stack_realign_finalized)
10364     {
10365       /* After stack_realign_needed is finalized, we can't no longer
10366          change it.  */
10367       gcc_assert (crtl->stack_realign_needed == stack_realign);
10368     }
10369   else
10370     {
10371       crtl->stack_realign_needed = stack_realign;
10372       crtl->stack_realign_finalized = true;
10373     }
10374 }
10375
10376 /* Expand the prologue into a bunch of separate insns.  */
10377
10378 void
10379 ix86_expand_prologue (void)
10380 {
10381   struct machine_function *m = cfun->machine;
10382   rtx insn, t;
10383   bool pic_reg_used;
10384   struct ix86_frame frame;
10385   HOST_WIDE_INT allocate;
10386   bool int_registers_saved;
10387
10388   ix86_finalize_stack_realign_flags ();
10389
10390   /* DRAP should not coexist with stack_realign_fp */
10391   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
10392
10393   memset (&m->fs, 0, sizeof (m->fs));
10394
10395   /* Initialize CFA state for before the prologue.  */
10396   m->fs.cfa_reg = stack_pointer_rtx;
10397   m->fs.cfa_offset = INCOMING_FRAME_SP_OFFSET;
10398
10399   /* Track SP offset to the CFA.  We continue tracking this after we've
10400      swapped the CFA register away from SP.  In the case of re-alignment
10401      this is fudged; we're interested to offsets within the local frame.  */
10402   m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
10403   m->fs.sp_valid = true;
10404
10405   ix86_compute_frame_layout (&frame);
10406
10407   if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
10408     {
10409       /* We should have already generated an error for any use of
10410          ms_hook on a nested function.  */
10411       gcc_checking_assert (!ix86_static_chain_on_stack);
10412
10413       /* Check if profiling is active and we shall use profiling before
10414          prologue variant. If so sorry.  */
10415       if (crtl->profile && flag_fentry != 0)
10416         sorry ("ms_hook_prologue attribute isn%'t compatible "
10417                "with -mfentry for 32-bit");
10418
10419       /* In ix86_asm_output_function_label we emitted:
10420          8b ff     movl.s %edi,%edi
10421          55        push   %ebp
10422          8b ec     movl.s %esp,%ebp
10423
10424          This matches the hookable function prologue in Win32 API
10425          functions in Microsoft Windows XP Service Pack 2 and newer.
10426          Wine uses this to enable Windows apps to hook the Win32 API
10427          functions provided by Wine.
10428
10429          What that means is that we've already set up the frame pointer.  */
10430
10431       if (frame_pointer_needed
10432           && !(crtl->drap_reg && crtl->stack_realign_needed))
10433         {
10434           rtx push, mov;
10435
10436           /* We've decided to use the frame pointer already set up.
10437              Describe this to the unwinder by pretending that both
10438              push and mov insns happen right here.
10439
10440              Putting the unwind info here at the end of the ms_hook
10441              is done so that we can make absolutely certain we get
10442              the required byte sequence at the start of the function,
10443              rather than relying on an assembler that can produce
10444              the exact encoding required.
10445
10446              However it does mean (in the unpatched case) that we have
10447              a 1 insn window where the asynchronous unwind info is
10448              incorrect.  However, if we placed the unwind info at
10449              its correct location we would have incorrect unwind info
10450              in the patched case.  Which is probably all moot since
10451              I don't expect Wine generates dwarf2 unwind info for the
10452              system libraries that use this feature.  */
10453
10454           insn = emit_insn (gen_blockage ());
10455
10456           push = gen_push (hard_frame_pointer_rtx);
10457           mov = gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
10458                              stack_pointer_rtx);
10459           RTX_FRAME_RELATED_P (push) = 1;
10460           RTX_FRAME_RELATED_P (mov) = 1;
10461
10462           RTX_FRAME_RELATED_P (insn) = 1;
10463           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
10464                         gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, push, mov)));
10465
10466           /* Note that gen_push incremented m->fs.cfa_offset, even
10467              though we didn't emit the push insn here.  */
10468           m->fs.cfa_reg = hard_frame_pointer_rtx;
10469           m->fs.fp_offset = m->fs.cfa_offset;
10470           m->fs.fp_valid = true;
10471         }
10472       else
10473         {
10474           /* The frame pointer is not needed so pop %ebp again.
10475              This leaves us with a pristine state.  */
10476           emit_insn (gen_pop (hard_frame_pointer_rtx));
10477         }
10478     }
10479
10480   /* The first insn of a function that accepts its static chain on the
10481      stack is to push the register that would be filled in by a direct
10482      call.  This insn will be skipped by the trampoline.  */
10483   else if (ix86_static_chain_on_stack)
10484     {
10485       insn = emit_insn (gen_push (ix86_static_chain (cfun->decl, false)));
10486       emit_insn (gen_blockage ());
10487
10488       /* We don't want to interpret this push insn as a register save,
10489          only as a stack adjustment.  The real copy of the register as
10490          a save will be done later, if needed.  */
10491       t = plus_constant (stack_pointer_rtx, -UNITS_PER_WORD);
10492       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
10493       add_reg_note (insn, REG_CFA_ADJUST_CFA, t);
10494       RTX_FRAME_RELATED_P (insn) = 1;
10495     }
10496
10497   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
10498      of DRAP is needed and stack realignment is really needed after reload */
10499   if (stack_realign_drap)
10500     {
10501       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
10502
10503       /* Only need to push parameter pointer reg if it is caller saved.  */
10504       if (!call_used_regs[REGNO (crtl->drap_reg)])
10505         {
10506           /* Push arg pointer reg */
10507           insn = emit_insn (gen_push (crtl->drap_reg));
10508           RTX_FRAME_RELATED_P (insn) = 1;
10509         }
10510
10511       /* Grab the argument pointer.  */
10512       t = plus_constant (stack_pointer_rtx, m->fs.sp_offset);
10513       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, t));
10514       RTX_FRAME_RELATED_P (insn) = 1;
10515       m->fs.cfa_reg = crtl->drap_reg;
10516       m->fs.cfa_offset = 0;
10517
10518       /* Align the stack.  */
10519       insn = emit_insn (ix86_gen_andsp (stack_pointer_rtx,
10520                                         stack_pointer_rtx,
10521                                         GEN_INT (-align_bytes)));
10522       RTX_FRAME_RELATED_P (insn) = 1;
10523
10524       /* Replicate the return address on the stack so that return
10525          address can be reached via (argp - 1) slot.  This is needed
10526          to implement macro RETURN_ADDR_RTX and intrinsic function
10527          expand_builtin_return_addr etc.  */
10528       t = plus_constant (crtl->drap_reg, -UNITS_PER_WORD);
10529       t = gen_frame_mem (Pmode, t);
10530       insn = emit_insn (gen_push (t));
10531       RTX_FRAME_RELATED_P (insn) = 1;
10532
10533       /* For the purposes of frame and register save area addressing,
10534          we've started over with a new frame.  */
10535       m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
10536       m->fs.realigned = true;
10537     }
10538
10539   if (frame_pointer_needed && !m->fs.fp_valid)
10540     {
10541       /* Note: AT&T enter does NOT have reversed args.  Enter is probably
10542          slower on all targets.  Also sdb doesn't like it.  */
10543       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
10544       RTX_FRAME_RELATED_P (insn) = 1;
10545
10546       if (m->fs.sp_offset == frame.hard_frame_pointer_offset)
10547         {
10548           insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
10549           RTX_FRAME_RELATED_P (insn) = 1;
10550
10551           if (m->fs.cfa_reg == stack_pointer_rtx)
10552             m->fs.cfa_reg = hard_frame_pointer_rtx;
10553           m->fs.fp_offset = m->fs.sp_offset;
10554           m->fs.fp_valid = true;
10555         }
10556     }
10557
10558   int_registers_saved = (frame.nregs == 0);
10559
10560   if (!int_registers_saved)
10561     {
10562       /* If saving registers via PUSH, do so now.  */
10563       if (!frame.save_regs_using_mov)
10564         {
10565           ix86_emit_save_regs ();
10566           int_registers_saved = true;
10567           gcc_assert (m->fs.sp_offset == frame.reg_save_offset);
10568         }
10569
10570       /* When using red zone we may start register saving before allocating
10571          the stack frame saving one cycle of the prologue.  However, avoid
10572          doing this if we have to probe the stack; at least on x86_64 the
10573          stack probe can turn into a call that clobbers a red zone location. */
10574       else if (ix86_using_red_zone ()
10575                && (! TARGET_STACK_PROBE
10576                    || frame.stack_pointer_offset < CHECK_STACK_LIMIT))
10577         {
10578           ix86_emit_save_regs_using_mov (frame.reg_save_offset);
10579           int_registers_saved = true;
10580         }
10581     }
10582
10583   if (stack_realign_fp)
10584     {
10585       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
10586       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
10587
10588       /* The computation of the size of the re-aligned stack frame means
10589          that we must allocate the size of the register save area before
10590          performing the actual alignment.  Otherwise we cannot guarantee
10591          that there's enough storage above the realignment point.  */
10592       if (m->fs.sp_offset != frame.sse_reg_save_offset)
10593         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
10594                                    GEN_INT (m->fs.sp_offset
10595                                             - frame.sse_reg_save_offset),
10596                                    -1, false);
10597
10598       /* Align the stack.  */
10599       insn = emit_insn (ix86_gen_andsp (stack_pointer_rtx,
10600                                         stack_pointer_rtx,
10601                                         GEN_INT (-align_bytes)));
10602
10603       /* For the purposes of register save area addressing, the stack
10604          pointer is no longer valid.  As for the value of sp_offset,
10605          see ix86_compute_frame_layout, which we need to match in order
10606          to pass verification of stack_pointer_offset at the end.  */
10607       m->fs.sp_offset = (m->fs.sp_offset + align_bytes) & -align_bytes;
10608       m->fs.sp_valid = false;
10609     }
10610
10611   allocate = frame.stack_pointer_offset - m->fs.sp_offset;
10612
10613   if (flag_stack_usage)
10614     {
10615       /* We start to count from ARG_POINTER.  */
10616       HOST_WIDE_INT stack_size = frame.stack_pointer_offset;
10617
10618       /* If it was realigned, take into account the fake frame.  */
10619       if (stack_realign_drap)
10620         {
10621           if (ix86_static_chain_on_stack)
10622             stack_size += UNITS_PER_WORD;
10623
10624           if (!call_used_regs[REGNO (crtl->drap_reg)])
10625             stack_size += UNITS_PER_WORD;
10626
10627           /* This over-estimates by 1 minimal-stack-alignment-unit but
10628              mitigates that by counting in the new return address slot.  */
10629           current_function_dynamic_stack_size
10630             += crtl->stack_alignment_needed / BITS_PER_UNIT;
10631         }
10632
10633       current_function_static_stack_size = stack_size;
10634     }
10635
10636   /* The stack has already been decremented by the instruction calling us
10637      so we need to probe unconditionally to preserve the protection area.  */
10638   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
10639     {
10640       /* We expect the registers to be saved when probes are used.  */
10641       gcc_assert (int_registers_saved);
10642
10643       if (STACK_CHECK_MOVING_SP)
10644         {
10645           ix86_adjust_stack_and_probe (allocate);
10646           allocate = 0;
10647         }
10648       else
10649         {
10650           HOST_WIDE_INT size = allocate;
10651
10652           if (TARGET_64BIT && size >= (HOST_WIDE_INT) 0x80000000)
10653             size = 0x80000000 - STACK_CHECK_PROTECT - 1;
10654
10655           if (TARGET_STACK_PROBE)
10656             ix86_emit_probe_stack_range (0, size + STACK_CHECK_PROTECT);
10657           else
10658             ix86_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
10659         }
10660     }
10661
10662   if (allocate == 0)
10663     ;
10664   else if (!ix86_target_stack_probe ()
10665            || frame.stack_pointer_offset < CHECK_STACK_LIMIT)
10666     {
10667       pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
10668                                  GEN_INT (-allocate), -1,
10669                                  m->fs.cfa_reg == stack_pointer_rtx);
10670     }
10671   else
10672     {
10673       rtx eax = gen_rtx_REG (Pmode, AX_REG);
10674       rtx r10 = NULL;
10675       rtx (*adjust_stack_insn)(rtx, rtx, rtx);
10676
10677       bool eax_live = false;
10678       bool r10_live = false;
10679
10680       if (TARGET_64BIT)
10681         r10_live = (DECL_STATIC_CHAIN (current_function_decl) != 0);
10682       if (!TARGET_64BIT_MS_ABI)
10683         eax_live = ix86_eax_live_at_start_p ();
10684
10685       if (eax_live)
10686         {
10687           emit_insn (gen_push (eax));
10688           allocate -= UNITS_PER_WORD;
10689         }
10690       if (r10_live)
10691         {
10692           r10 = gen_rtx_REG (Pmode, R10_REG);
10693           emit_insn (gen_push (r10));
10694           allocate -= UNITS_PER_WORD;
10695         }
10696
10697       emit_move_insn (eax, GEN_INT (allocate));
10698       emit_insn (ix86_gen_allocate_stack_worker (eax, eax));
10699
10700       /* Use the fact that AX still contains ALLOCATE.  */
10701       adjust_stack_insn = (TARGET_64BIT
10702                            ? gen_pro_epilogue_adjust_stack_di_sub
10703                            : gen_pro_epilogue_adjust_stack_si_sub);
10704
10705       insn = emit_insn (adjust_stack_insn (stack_pointer_rtx,
10706                                            stack_pointer_rtx, eax));
10707
10708       /* Note that SEH directives need to continue tracking the stack
10709          pointer even after the frame pointer has been set up.  */
10710       if (m->fs.cfa_reg == stack_pointer_rtx || TARGET_SEH)
10711         {
10712           if (m->fs.cfa_reg == stack_pointer_rtx)
10713             m->fs.cfa_offset += allocate;
10714
10715           RTX_FRAME_RELATED_P (insn) = 1;
10716           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
10717                         gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10718                                      plus_constant (stack_pointer_rtx,
10719                                                     -allocate)));
10720         }
10721       m->fs.sp_offset += allocate;
10722
10723       if (r10_live && eax_live)
10724         {
10725           t = choose_baseaddr (m->fs.sp_offset - allocate);
10726           emit_move_insn (r10, gen_frame_mem (Pmode, t));
10727           t = choose_baseaddr (m->fs.sp_offset - allocate - UNITS_PER_WORD);
10728           emit_move_insn (eax, gen_frame_mem (Pmode, t));
10729         }
10730       else if (eax_live || r10_live)
10731         {
10732           t = choose_baseaddr (m->fs.sp_offset - allocate);
10733           emit_move_insn ((eax_live ? eax : r10), gen_frame_mem (Pmode, t));
10734         }
10735     }
10736   gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset);
10737
10738   /* If we havn't already set up the frame pointer, do so now.  */
10739   if (frame_pointer_needed && !m->fs.fp_valid)
10740     {
10741       insn = ix86_gen_add3 (hard_frame_pointer_rtx, stack_pointer_rtx,
10742                             GEN_INT (frame.stack_pointer_offset
10743                                      - frame.hard_frame_pointer_offset));
10744       insn = emit_insn (insn);
10745       RTX_FRAME_RELATED_P (insn) = 1;
10746       add_reg_note (insn, REG_CFA_ADJUST_CFA, NULL);
10747
10748       if (m->fs.cfa_reg == stack_pointer_rtx)
10749         m->fs.cfa_reg = hard_frame_pointer_rtx;
10750       m->fs.fp_offset = frame.hard_frame_pointer_offset;
10751       m->fs.fp_valid = true;
10752     }
10753
10754   if (!int_registers_saved)
10755     ix86_emit_save_regs_using_mov (frame.reg_save_offset);
10756   if (frame.nsseregs)
10757     ix86_emit_save_sse_regs_using_mov (frame.sse_reg_save_offset);
10758
10759   pic_reg_used = false;
10760   if (pic_offset_table_rtx
10761       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
10762           || crtl->profile))
10763     {
10764       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
10765
10766       if (alt_pic_reg_used != INVALID_REGNUM)
10767         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
10768
10769       pic_reg_used = true;
10770     }
10771
10772   if (pic_reg_used)
10773     {
10774       if (TARGET_64BIT)
10775         {
10776           if (ix86_cmodel == CM_LARGE_PIC)
10777             {
10778               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
10779               rtx label = gen_label_rtx ();
10780               emit_label (label);
10781               LABEL_PRESERVE_P (label) = 1;
10782               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
10783               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
10784               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
10785               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
10786                                             pic_offset_table_rtx, tmp_reg));
10787             }
10788           else
10789             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
10790         }
10791       else
10792         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
10793     }
10794
10795   /* In the pic_reg_used case, make sure that the got load isn't deleted
10796      when mcount needs it.  Blockage to avoid call movement across mcount
10797      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
10798      note.  */
10799   if (crtl->profile && !flag_fentry && pic_reg_used)
10800     emit_insn (gen_prologue_use (pic_offset_table_rtx));
10801
10802   if (crtl->drap_reg && !crtl->stack_realign_needed)
10803     {
10804       /* vDRAP is setup but after reload it turns out stack realign
10805          isn't necessary, here we will emit prologue to setup DRAP
10806          without stack realign adjustment */
10807       t = choose_baseaddr (0);
10808       emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, t));
10809     }
10810
10811   /* Prevent instructions from being scheduled into register save push
10812      sequence when access to the redzone area is done through frame pointer.
10813      The offset between the frame pointer and the stack pointer is calculated
10814      relative to the value of the stack pointer at the end of the function
10815      prologue, and moving instructions that access redzone area via frame
10816      pointer inside push sequence violates this assumption.  */
10817   if (frame_pointer_needed && frame.red_zone_size)
10818     emit_insn (gen_memory_blockage ());
10819
10820   /* Emit cld instruction if stringops are used in the function.  */
10821   if (TARGET_CLD && ix86_current_function_needs_cld)
10822     emit_insn (gen_cld ());
10823
10824   /* SEH requires that the prologue end within 256 bytes of the start of
10825      the function.  Prevent instruction schedules that would extend that.  */
10826   if (TARGET_SEH)
10827     emit_insn (gen_blockage ());
10828 }
10829
10830 /* Emit code to restore REG using a POP insn.  */
10831
10832 static void
10833 ix86_emit_restore_reg_using_pop (rtx reg)
10834 {
10835   struct machine_function *m = cfun->machine;
10836   rtx insn = emit_insn (gen_pop (reg));
10837
10838   ix86_add_cfa_restore_note (insn, reg, m->fs.sp_offset);
10839   m->fs.sp_offset -= UNITS_PER_WORD;
10840
10841   if (m->fs.cfa_reg == crtl->drap_reg
10842       && REGNO (reg) == REGNO (crtl->drap_reg))
10843     {
10844       /* Previously we'd represented the CFA as an expression
10845          like *(%ebp - 8).  We've just popped that value from
10846          the stack, which means we need to reset the CFA to
10847          the drap register.  This will remain until we restore
10848          the stack pointer.  */
10849       add_reg_note (insn, REG_CFA_DEF_CFA, reg);
10850       RTX_FRAME_RELATED_P (insn) = 1;
10851
10852       /* This means that the DRAP register is valid for addressing too.  */
10853       m->fs.drap_valid = true;
10854       return;
10855     }
10856
10857   if (m->fs.cfa_reg == stack_pointer_rtx)
10858     {
10859       rtx x = plus_constant (stack_pointer_rtx, UNITS_PER_WORD);
10860       x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x);
10861       add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
10862       RTX_FRAME_RELATED_P (insn) = 1;
10863
10864       m->fs.cfa_offset -= UNITS_PER_WORD;
10865     }
10866
10867   /* When the frame pointer is the CFA, and we pop it, we are
10868      swapping back to the stack pointer as the CFA.  This happens
10869      for stack frames that don't allocate other data, so we assume
10870      the stack pointer is now pointing at the return address, i.e.
10871      the function entry state, which makes the offset be 1 word.  */
10872   if (reg == hard_frame_pointer_rtx)
10873     {
10874       m->fs.fp_valid = false;
10875       if (m->fs.cfa_reg == hard_frame_pointer_rtx)
10876         {
10877           m->fs.cfa_reg = stack_pointer_rtx;
10878           m->fs.cfa_offset -= UNITS_PER_WORD;
10879
10880           add_reg_note (insn, REG_CFA_DEF_CFA,
10881                         gen_rtx_PLUS (Pmode, stack_pointer_rtx,
10882                                       GEN_INT (m->fs.cfa_offset)));
10883           RTX_FRAME_RELATED_P (insn) = 1;
10884         }
10885     }
10886 }
10887
10888 /* Emit code to restore saved registers using POP insns.  */
10889
10890 static void
10891 ix86_emit_restore_regs_using_pop (void)
10892 {
10893   unsigned int regno;
10894
10895   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10896     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
10897       ix86_emit_restore_reg_using_pop (gen_rtx_REG (Pmode, regno));
10898 }
10899
10900 /* Emit code and notes for the LEAVE instruction.  */
10901
10902 static void
10903 ix86_emit_leave (void)
10904 {
10905   struct machine_function *m = cfun->machine;
10906   rtx insn = emit_insn (ix86_gen_leave ());
10907
10908   ix86_add_queued_cfa_restore_notes (insn);
10909
10910   gcc_assert (m->fs.fp_valid);
10911   m->fs.sp_valid = true;
10912   m->fs.sp_offset = m->fs.fp_offset - UNITS_PER_WORD;
10913   m->fs.fp_valid = false;
10914
10915   if (m->fs.cfa_reg == hard_frame_pointer_rtx)
10916     {
10917       m->fs.cfa_reg = stack_pointer_rtx;
10918       m->fs.cfa_offset = m->fs.sp_offset;
10919
10920       add_reg_note (insn, REG_CFA_DEF_CFA,
10921                     plus_constant (stack_pointer_rtx, m->fs.sp_offset));
10922       RTX_FRAME_RELATED_P (insn) = 1;
10923       ix86_add_cfa_restore_note (insn, hard_frame_pointer_rtx,
10924                                  m->fs.fp_offset);
10925     }
10926 }
10927
10928 /* Emit code to restore saved registers using MOV insns.
10929    First register is restored from CFA - CFA_OFFSET.  */
10930 static void
10931 ix86_emit_restore_regs_using_mov (HOST_WIDE_INT cfa_offset,
10932                                   int maybe_eh_return)
10933 {
10934   struct machine_function *m = cfun->machine;
10935   unsigned int regno;
10936
10937   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10938     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
10939       {
10940         rtx reg = gen_rtx_REG (Pmode, regno);
10941         rtx insn, mem;
10942         
10943         mem = choose_baseaddr (cfa_offset);
10944         mem = gen_frame_mem (Pmode, mem);
10945         insn = emit_move_insn (reg, mem);
10946
10947         if (m->fs.cfa_reg == crtl->drap_reg && regno == REGNO (crtl->drap_reg))
10948           {
10949             /* Previously we'd represented the CFA as an expression
10950                like *(%ebp - 8).  We've just popped that value from
10951                the stack, which means we need to reset the CFA to
10952                the drap register.  This will remain until we restore
10953                the stack pointer.  */
10954             add_reg_note (insn, REG_CFA_DEF_CFA, reg);
10955             RTX_FRAME_RELATED_P (insn) = 1;
10956
10957             /* This means that the DRAP register is valid for addressing.  */
10958             m->fs.drap_valid = true;
10959           }
10960         else
10961           ix86_add_cfa_restore_note (NULL_RTX, reg, cfa_offset);
10962
10963         cfa_offset -= UNITS_PER_WORD;
10964       }
10965 }
10966
10967 /* Emit code to restore saved registers using MOV insns.
10968    First register is restored from CFA - CFA_OFFSET.  */
10969 static void
10970 ix86_emit_restore_sse_regs_using_mov (HOST_WIDE_INT cfa_offset,
10971                                       int maybe_eh_return)
10972 {
10973   unsigned int regno;
10974
10975   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10976     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
10977       {
10978         rtx reg = gen_rtx_REG (V4SFmode, regno);
10979         rtx mem;
10980
10981         mem = choose_baseaddr (cfa_offset);
10982         mem = gen_rtx_MEM (V4SFmode, mem);
10983         set_mem_align (mem, 128);
10984         emit_move_insn (reg, mem);
10985
10986         ix86_add_cfa_restore_note (NULL_RTX, reg, cfa_offset);
10987
10988         cfa_offset -= 16;
10989       }
10990 }
10991
10992 /* Restore function stack, frame, and registers.  */
10993
10994 void
10995 ix86_expand_epilogue (int style)
10996 {
10997   struct machine_function *m = cfun->machine;
10998   struct machine_frame_state frame_state_save = m->fs;
10999   struct ix86_frame frame;
11000   bool restore_regs_via_mov;
11001   bool using_drap;
11002
11003   ix86_finalize_stack_realign_flags ();
11004   ix86_compute_frame_layout (&frame);
11005
11006   m->fs.sp_valid = (!frame_pointer_needed
11007                     || (current_function_sp_is_unchanging
11008                         && !stack_realign_fp));
11009   gcc_assert (!m->fs.sp_valid
11010               || m->fs.sp_offset == frame.stack_pointer_offset);
11011
11012   /* The FP must be valid if the frame pointer is present.  */
11013   gcc_assert (frame_pointer_needed == m->fs.fp_valid);
11014   gcc_assert (!m->fs.fp_valid
11015               || m->fs.fp_offset == frame.hard_frame_pointer_offset);
11016
11017   /* We must have *some* valid pointer to the stack frame.  */
11018   gcc_assert (m->fs.sp_valid || m->fs.fp_valid);
11019
11020   /* The DRAP is never valid at this point.  */
11021   gcc_assert (!m->fs.drap_valid);
11022
11023   /* See the comment about red zone and frame
11024      pointer usage in ix86_expand_prologue.  */
11025   if (frame_pointer_needed && frame.red_zone_size)
11026     emit_insn (gen_memory_blockage ());
11027
11028   using_drap = crtl->drap_reg && crtl->stack_realign_needed;
11029   gcc_assert (!using_drap || m->fs.cfa_reg == crtl->drap_reg);
11030
11031   /* Determine the CFA offset of the end of the red-zone.  */
11032   m->fs.red_zone_offset = 0;
11033   if (ix86_using_red_zone () && crtl->args.pops_args < 65536)
11034     {
11035       /* The red-zone begins below the return address.  */
11036       m->fs.red_zone_offset = RED_ZONE_SIZE + UNITS_PER_WORD;
11037
11038       /* When the register save area is in the aligned portion of
11039          the stack, determine the maximum runtime displacement that
11040          matches up with the aligned frame.  */
11041       if (stack_realign_drap)
11042         m->fs.red_zone_offset -= (crtl->stack_alignment_needed / BITS_PER_UNIT
11043                                   + UNITS_PER_WORD);
11044     }
11045
11046   /* Special care must be taken for the normal return case of a function
11047      using eh_return: the eax and edx registers are marked as saved, but
11048      not restored along this path.  Adjust the save location to match.  */
11049   if (crtl->calls_eh_return && style != 2)
11050     frame.reg_save_offset -= 2 * UNITS_PER_WORD;
11051
11052   /* EH_RETURN requires the use of moves to function properly.  */
11053   if (crtl->calls_eh_return)
11054     restore_regs_via_mov = true;
11055   /* SEH requires the use of pops to identify the epilogue.  */
11056   else if (TARGET_SEH)
11057     restore_regs_via_mov = false;
11058   /* If we're only restoring one register and sp is not valid then
11059      using a move instruction to restore the register since it's
11060      less work than reloading sp and popping the register.  */
11061   else if (!m->fs.sp_valid && frame.nregs <= 1)
11062     restore_regs_via_mov = true;
11063   else if (TARGET_EPILOGUE_USING_MOVE
11064            && cfun->machine->use_fast_prologue_epilogue
11065            && (frame.nregs > 1
11066                || m->fs.sp_offset != frame.reg_save_offset))
11067     restore_regs_via_mov = true;
11068   else if (frame_pointer_needed
11069            && !frame.nregs
11070            && m->fs.sp_offset != frame.reg_save_offset)
11071     restore_regs_via_mov = true;
11072   else if (frame_pointer_needed
11073            && TARGET_USE_LEAVE
11074            && cfun->machine->use_fast_prologue_epilogue
11075            && frame.nregs == 1)
11076     restore_regs_via_mov = true;
11077   else
11078     restore_regs_via_mov = false;
11079
11080   if (restore_regs_via_mov || frame.nsseregs)
11081     {
11082       /* Ensure that the entire register save area is addressable via
11083          the stack pointer, if we will restore via sp.  */
11084       if (TARGET_64BIT
11085           && m->fs.sp_offset > 0x7fffffff
11086           && !(m->fs.fp_valid || m->fs.drap_valid)
11087           && (frame.nsseregs + frame.nregs) != 0)
11088         {
11089           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11090                                      GEN_INT (m->fs.sp_offset
11091                                               - frame.sse_reg_save_offset),
11092                                      style,
11093                                      m->fs.cfa_reg == stack_pointer_rtx);
11094         }
11095     }
11096
11097   /* If there are any SSE registers to restore, then we have to do it
11098      via moves, since there's obviously no pop for SSE regs.  */
11099   if (frame.nsseregs)
11100     ix86_emit_restore_sse_regs_using_mov (frame.sse_reg_save_offset,
11101                                           style == 2);
11102
11103   if (restore_regs_via_mov)
11104     {
11105       rtx t;
11106
11107       if (frame.nregs)
11108         ix86_emit_restore_regs_using_mov (frame.reg_save_offset, style == 2);
11109
11110       /* eh_return epilogues need %ecx added to the stack pointer.  */
11111       if (style == 2)
11112         {
11113           rtx insn, sa = EH_RETURN_STACKADJ_RTX;
11114
11115           /* Stack align doesn't work with eh_return.  */
11116           gcc_assert (!stack_realign_drap);
11117           /* Neither does regparm nested functions.  */
11118           gcc_assert (!ix86_static_chain_on_stack);
11119
11120           if (frame_pointer_needed)
11121             {
11122               t = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
11123               t = plus_constant (t, m->fs.fp_offset - UNITS_PER_WORD);
11124               emit_insn (gen_rtx_SET (VOIDmode, sa, t));
11125
11126               t = gen_frame_mem (Pmode, hard_frame_pointer_rtx);
11127               insn = emit_move_insn (hard_frame_pointer_rtx, t);
11128
11129               /* Note that we use SA as a temporary CFA, as the return
11130                  address is at the proper place relative to it.  We
11131                  pretend this happens at the FP restore insn because
11132                  prior to this insn the FP would be stored at the wrong
11133                  offset relative to SA, and after this insn we have no
11134                  other reasonable register to use for the CFA.  We don't
11135                  bother resetting the CFA to the SP for the duration of
11136                  the return insn.  */
11137               add_reg_note (insn, REG_CFA_DEF_CFA,
11138                             plus_constant (sa, UNITS_PER_WORD));
11139               ix86_add_queued_cfa_restore_notes (insn);
11140               add_reg_note (insn, REG_CFA_RESTORE, hard_frame_pointer_rtx);
11141               RTX_FRAME_RELATED_P (insn) = 1;
11142
11143               m->fs.cfa_reg = sa;
11144               m->fs.cfa_offset = UNITS_PER_WORD;
11145               m->fs.fp_valid = false;
11146
11147               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
11148                                          const0_rtx, style, false);
11149             }
11150           else
11151             {
11152               t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
11153               t = plus_constant (t, m->fs.sp_offset - UNITS_PER_WORD);
11154               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, t));
11155               ix86_add_queued_cfa_restore_notes (insn);
11156
11157               gcc_assert (m->fs.cfa_reg == stack_pointer_rtx);
11158               if (m->fs.cfa_offset != UNITS_PER_WORD)
11159                 {
11160                   m->fs.cfa_offset = UNITS_PER_WORD;
11161                   add_reg_note (insn, REG_CFA_DEF_CFA,
11162                                 plus_constant (stack_pointer_rtx,
11163                                                UNITS_PER_WORD));
11164                   RTX_FRAME_RELATED_P (insn) = 1;
11165                 }
11166             }
11167           m->fs.sp_offset = UNITS_PER_WORD;
11168           m->fs.sp_valid = true;
11169         }
11170     }
11171   else
11172     {
11173       /* SEH requires that the function end with (1) a stack adjustment
11174          if necessary, (2) a sequence of pops, and (3) a return or
11175          jump instruction.  Prevent insns from the function body from
11176          being scheduled into this sequence.  */
11177       if (TARGET_SEH)
11178         {
11179           /* Prevent a catch region from being adjacent to the standard
11180              epilogue sequence.  Unfortuantely crtl->uses_eh_lsda nor
11181              several other flags that would be interesting to test are
11182              not yet set up.  */
11183           if (flag_non_call_exceptions)
11184             emit_insn (gen_nops (const1_rtx));
11185           else
11186             emit_insn (gen_blockage ());
11187         }
11188
11189       /* First step is to deallocate the stack frame so that we can
11190          pop the registers.  */
11191       if (!m->fs.sp_valid)
11192         {
11193           pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,
11194                                      GEN_INT (m->fs.fp_offset
11195                                               - frame.reg_save_offset),
11196                                      style, false);
11197         }
11198       else if (m->fs.sp_offset != frame.reg_save_offset)
11199         {
11200           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11201                                      GEN_INT (m->fs.sp_offset
11202                                               - frame.reg_save_offset),
11203                                      style,
11204                                      m->fs.cfa_reg == stack_pointer_rtx);
11205         }
11206
11207       ix86_emit_restore_regs_using_pop ();
11208     }
11209
11210   /* If we used a stack pointer and haven't already got rid of it,
11211      then do so now.  */
11212   if (m->fs.fp_valid)
11213     {
11214       /* If the stack pointer is valid and pointing at the frame
11215          pointer store address, then we only need a pop.  */
11216       if (m->fs.sp_valid && m->fs.sp_offset == frame.hfp_save_offset)
11217         ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx);
11218       /* Leave results in shorter dependency chains on CPUs that are
11219          able to grok it fast.  */
11220       else if (TARGET_USE_LEAVE
11221                || optimize_function_for_size_p (cfun)
11222                || !cfun->machine->use_fast_prologue_epilogue)
11223         ix86_emit_leave ();
11224       else
11225         {
11226           pro_epilogue_adjust_stack (stack_pointer_rtx,
11227                                      hard_frame_pointer_rtx,
11228                                      const0_rtx, style, !using_drap);
11229           ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx);
11230         }
11231     }
11232
11233   if (using_drap)
11234     {
11235       int param_ptr_offset = UNITS_PER_WORD;
11236       rtx insn;
11237
11238       gcc_assert (stack_realign_drap);
11239
11240       if (ix86_static_chain_on_stack)
11241         param_ptr_offset += UNITS_PER_WORD;
11242       if (!call_used_regs[REGNO (crtl->drap_reg)])
11243         param_ptr_offset += UNITS_PER_WORD;
11244
11245       insn = emit_insn (gen_rtx_SET
11246                         (VOIDmode, stack_pointer_rtx,
11247                          gen_rtx_PLUS (Pmode,
11248                                        crtl->drap_reg,
11249                                        GEN_INT (-param_ptr_offset))));
11250       m->fs.cfa_reg = stack_pointer_rtx;
11251       m->fs.cfa_offset = param_ptr_offset;
11252       m->fs.sp_offset = param_ptr_offset;
11253       m->fs.realigned = false;
11254
11255       add_reg_note (insn, REG_CFA_DEF_CFA,
11256                     gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11257                                   GEN_INT (param_ptr_offset)));
11258       RTX_FRAME_RELATED_P (insn) = 1;
11259
11260       if (!call_used_regs[REGNO (crtl->drap_reg)])
11261         ix86_emit_restore_reg_using_pop (crtl->drap_reg);
11262     }
11263
11264   /* At this point the stack pointer must be valid, and we must have
11265      restored all of the registers.  We may not have deallocated the
11266      entire stack frame.  We've delayed this until now because it may
11267      be possible to merge the local stack deallocation with the
11268      deallocation forced by ix86_static_chain_on_stack.   */
11269   gcc_assert (m->fs.sp_valid);
11270   gcc_assert (!m->fs.fp_valid);
11271   gcc_assert (!m->fs.realigned);
11272   if (m->fs.sp_offset != UNITS_PER_WORD)
11273     {
11274       pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11275                                  GEN_INT (m->fs.sp_offset - UNITS_PER_WORD),
11276                                  style, true);
11277     }
11278
11279   /* Sibcall epilogues don't want a return instruction.  */
11280   if (style == 0)
11281     {
11282       m->fs = frame_state_save;
11283       return;
11284     }
11285
11286   /* Emit vzeroupper if needed.  */
11287   if (TARGET_VZEROUPPER
11288       && !TREE_THIS_VOLATILE (cfun->decl)
11289       && !cfun->machine->caller_return_avx256_p)
11290     emit_insn (gen_avx_vzeroupper (GEN_INT (call_no_avx256))); 
11291
11292   if (crtl->args.pops_args && crtl->args.size)
11293     {
11294       rtx popc = GEN_INT (crtl->args.pops_args);
11295
11296       /* i386 can only pop 64K bytes.  If asked to pop more, pop return
11297          address, do explicit add, and jump indirectly to the caller.  */
11298
11299       if (crtl->args.pops_args >= 65536)
11300         {
11301           rtx ecx = gen_rtx_REG (SImode, CX_REG);
11302           rtx insn;
11303
11304           /* There is no "pascal" calling convention in any 64bit ABI.  */
11305           gcc_assert (!TARGET_64BIT);
11306
11307           insn = emit_insn (gen_pop (ecx));
11308           m->fs.cfa_offset -= UNITS_PER_WORD;
11309           m->fs.sp_offset -= UNITS_PER_WORD;
11310
11311           add_reg_note (insn, REG_CFA_ADJUST_CFA,
11312                         copy_rtx (XVECEXP (PATTERN (insn), 0, 1)));
11313           add_reg_note (insn, REG_CFA_REGISTER,
11314                         gen_rtx_SET (VOIDmode, ecx, pc_rtx));
11315           RTX_FRAME_RELATED_P (insn) = 1;
11316
11317           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11318                                      popc, -1, true);
11319           emit_jump_insn (gen_return_indirect_internal (ecx));
11320         }
11321       else
11322         emit_jump_insn (gen_return_pop_internal (popc));
11323     }
11324   else
11325     emit_jump_insn (gen_return_internal ());
11326
11327   /* Restore the state back to the state from the prologue,
11328      so that it's correct for the next epilogue.  */
11329   m->fs = frame_state_save;
11330 }
11331
11332 /* Reset from the function's potential modifications.  */
11333
11334 static void
11335 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
11336                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
11337 {
11338   if (pic_offset_table_rtx)
11339     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
11340 #if TARGET_MACHO
11341   /* Mach-O doesn't support labels at the end of objects, so if
11342      it looks like we might want one, insert a NOP.  */
11343   {
11344     rtx insn = get_last_insn ();
11345     while (insn
11346            && NOTE_P (insn)
11347            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
11348       insn = PREV_INSN (insn);
11349     if (insn
11350         && (LABEL_P (insn)
11351             || (NOTE_P (insn)
11352                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
11353       fputs ("\tnop\n", file);
11354   }
11355 #endif
11356
11357 }
11358
11359 /* Return a scratch register to use in the split stack prologue.  The
11360    split stack prologue is used for -fsplit-stack.  It is the first
11361    instructions in the function, even before the regular prologue.
11362    The scratch register can be any caller-saved register which is not
11363    used for parameters or for the static chain.  */
11364
11365 static unsigned int
11366 split_stack_prologue_scratch_regno (void)
11367 {
11368   if (TARGET_64BIT)
11369     return R11_REG;
11370   else
11371     {
11372       bool is_fastcall;
11373       int regparm;
11374
11375       is_fastcall = (lookup_attribute ("fastcall",
11376                                        TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl)))
11377                      != NULL);
11378       regparm = ix86_function_regparm (TREE_TYPE (cfun->decl), cfun->decl);
11379
11380       if (is_fastcall)
11381         {
11382           if (DECL_STATIC_CHAIN (cfun->decl))
11383             {
11384               sorry ("-fsplit-stack does not support fastcall with "
11385                      "nested function");
11386               return INVALID_REGNUM;
11387             }
11388           return AX_REG;
11389         }
11390       else if (regparm < 3)
11391         {
11392           if (!DECL_STATIC_CHAIN (cfun->decl))
11393             return CX_REG;
11394           else
11395             {
11396               if (regparm >= 2)
11397                 {
11398                   sorry ("-fsplit-stack does not support 2 register "
11399                          " parameters for a nested function");
11400                   return INVALID_REGNUM;
11401                 }
11402               return DX_REG;
11403             }
11404         }
11405       else
11406         {
11407           /* FIXME: We could make this work by pushing a register
11408              around the addition and comparison.  */
11409           sorry ("-fsplit-stack does not support 3 register parameters");
11410           return INVALID_REGNUM;
11411         }
11412     }
11413 }
11414
11415 /* A SYMBOL_REF for the function which allocates new stackspace for
11416    -fsplit-stack.  */
11417
11418 static GTY(()) rtx split_stack_fn;
11419
11420 /* A SYMBOL_REF for the more stack function when using the large
11421    model.  */
11422
11423 static GTY(()) rtx split_stack_fn_large;
11424
11425 /* Handle -fsplit-stack.  These are the first instructions in the
11426    function, even before the regular prologue.  */
11427
11428 void
11429 ix86_expand_split_stack_prologue (void)
11430 {
11431   struct ix86_frame frame;
11432   HOST_WIDE_INT allocate;
11433   unsigned HOST_WIDE_INT args_size;
11434   rtx label, limit, current, jump_insn, allocate_rtx, call_insn, call_fusage;
11435   rtx scratch_reg = NULL_RTX;
11436   rtx varargs_label = NULL_RTX;
11437   rtx fn;
11438
11439   gcc_assert (flag_split_stack && reload_completed);
11440
11441   ix86_finalize_stack_realign_flags ();
11442   ix86_compute_frame_layout (&frame);
11443   allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;
11444
11445   /* This is the label we will branch to if we have enough stack
11446      space.  We expect the basic block reordering pass to reverse this
11447      branch if optimizing, so that we branch in the unlikely case.  */
11448   label = gen_label_rtx ();
11449
11450   /* We need to compare the stack pointer minus the frame size with
11451      the stack boundary in the TCB.  The stack boundary always gives
11452      us SPLIT_STACK_AVAILABLE bytes, so if we need less than that we
11453      can compare directly.  Otherwise we need to do an addition.  */
11454
11455   limit = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
11456                           UNSPEC_STACK_CHECK);
11457   limit = gen_rtx_CONST (Pmode, limit);
11458   limit = gen_rtx_MEM (Pmode, limit);
11459   if (allocate < SPLIT_STACK_AVAILABLE)
11460     current = stack_pointer_rtx;
11461   else
11462     {
11463       unsigned int scratch_regno;
11464       rtx offset;
11465
11466       /* We need a scratch register to hold the stack pointer minus
11467          the required frame size.  Since this is the very start of the
11468          function, the scratch register can be any caller-saved
11469          register which is not used for parameters.  */
11470       offset = GEN_INT (- allocate);
11471       scratch_regno = split_stack_prologue_scratch_regno ();
11472       if (scratch_regno == INVALID_REGNUM)
11473         return;
11474       scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
11475       if (!TARGET_64BIT || x86_64_immediate_operand (offset, Pmode))
11476         {
11477           /* We don't use ix86_gen_add3 in this case because it will
11478              want to split to lea, but when not optimizing the insn
11479              will not be split after this point.  */
11480           emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11481                                   gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11482                                                 offset)));
11483         }
11484       else
11485         {
11486           emit_move_insn (scratch_reg, offset);
11487           emit_insn (gen_adddi3 (scratch_reg, scratch_reg,
11488                                  stack_pointer_rtx));
11489         }
11490       current = scratch_reg;
11491     }
11492
11493   ix86_expand_branch (GEU, current, limit, label);
11494   jump_insn = get_last_insn ();
11495   JUMP_LABEL (jump_insn) = label;
11496
11497   /* Mark the jump as very likely to be taken.  */
11498   add_reg_note (jump_insn, REG_BR_PROB,
11499                 GEN_INT (REG_BR_PROB_BASE - REG_BR_PROB_BASE / 100));
11500
11501   if (split_stack_fn == NULL_RTX)
11502     split_stack_fn = gen_rtx_SYMBOL_REF (Pmode, "__morestack");
11503   fn = split_stack_fn;
11504
11505   /* Get more stack space.  We pass in the desired stack space and the
11506      size of the arguments to copy to the new stack.  In 32-bit mode
11507      we push the parameters; __morestack will return on a new stack
11508      anyhow.  In 64-bit mode we pass the parameters in r10 and
11509      r11.  */
11510   allocate_rtx = GEN_INT (allocate);
11511   args_size = crtl->args.size >= 0 ? crtl->args.size : 0;
11512   call_fusage = NULL_RTX;
11513   if (TARGET_64BIT)
11514     {
11515       rtx reg10, reg11;
11516
11517       reg10 = gen_rtx_REG (Pmode, R10_REG);
11518       reg11 = gen_rtx_REG (Pmode, R11_REG);
11519
11520       /* If this function uses a static chain, it will be in %r10.
11521          Preserve it across the call to __morestack.  */
11522       if (DECL_STATIC_CHAIN (cfun->decl))
11523         {
11524           rtx rax;
11525
11526           rax = gen_rtx_REG (Pmode, AX_REG);
11527           emit_move_insn (rax, reg10);
11528           use_reg (&call_fusage, rax);
11529         }
11530
11531       if (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
11532         {
11533           HOST_WIDE_INT argval;
11534
11535           /* When using the large model we need to load the address
11536              into a register, and we've run out of registers.  So we
11537              switch to a different calling convention, and we call a
11538              different function: __morestack_large.  We pass the
11539              argument size in the upper 32 bits of r10 and pass the
11540              frame size in the lower 32 bits.  */
11541           gcc_assert ((allocate & (HOST_WIDE_INT) 0xffffffff) == allocate);
11542           gcc_assert ((args_size & 0xffffffff) == args_size);
11543
11544           if (split_stack_fn_large == NULL_RTX)
11545             split_stack_fn_large =
11546               gen_rtx_SYMBOL_REF (Pmode, "__morestack_large_model");
11547
11548           if (ix86_cmodel == CM_LARGE_PIC)
11549             {
11550               rtx label, x;
11551
11552               label = gen_label_rtx ();
11553               emit_label (label);
11554               LABEL_PRESERVE_P (label) = 1;
11555               emit_insn (gen_set_rip_rex64 (reg10, label));
11556               emit_insn (gen_set_got_offset_rex64 (reg11, label));
11557               emit_insn (gen_adddi3 (reg10, reg10, reg11));
11558               x = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, split_stack_fn_large),
11559                                   UNSPEC_GOT);
11560               x = gen_rtx_CONST (Pmode, x);
11561               emit_move_insn (reg11, x);
11562               x = gen_rtx_PLUS (Pmode, reg10, reg11);
11563               x = gen_const_mem (Pmode, x);
11564               emit_move_insn (reg11, x);
11565             }
11566           else
11567             emit_move_insn (reg11, split_stack_fn_large);
11568
11569           fn = reg11;
11570
11571           argval = ((args_size << 16) << 16) + allocate;
11572           emit_move_insn (reg10, GEN_INT (argval));
11573         }
11574       else
11575         {
11576           emit_move_insn (reg10, allocate_rtx);
11577           emit_move_insn (reg11, GEN_INT (args_size));
11578           use_reg (&call_fusage, reg11);
11579         }
11580
11581       use_reg (&call_fusage, reg10);
11582     }
11583   else
11584     {
11585       emit_insn (gen_push (GEN_INT (args_size)));
11586       emit_insn (gen_push (allocate_rtx));
11587     }
11588   call_insn = ix86_expand_call (NULL_RTX, gen_rtx_MEM (QImode, fn),
11589                                 GEN_INT (UNITS_PER_WORD), constm1_rtx,
11590                                 NULL_RTX, 0);
11591   add_function_usage_to (call_insn, call_fusage);
11592
11593   /* In order to make call/return prediction work right, we now need
11594      to execute a return instruction.  See
11595      libgcc/config/i386/morestack.S for the details on how this works.
11596
11597      For flow purposes gcc must not see this as a return
11598      instruction--we need control flow to continue at the subsequent
11599      label.  Therefore, we use an unspec.  */
11600   gcc_assert (crtl->args.pops_args < 65536);
11601   emit_insn (gen_split_stack_return (GEN_INT (crtl->args.pops_args)));
11602
11603   /* If we are in 64-bit mode and this function uses a static chain,
11604      we saved %r10 in %rax before calling _morestack.  */
11605   if (TARGET_64BIT && DECL_STATIC_CHAIN (cfun->decl))
11606     emit_move_insn (gen_rtx_REG (Pmode, R10_REG),
11607                     gen_rtx_REG (Pmode, AX_REG));
11608
11609   /* If this function calls va_start, we need to store a pointer to
11610      the arguments on the old stack, because they may not have been
11611      all copied to the new stack.  At this point the old stack can be
11612      found at the frame pointer value used by __morestack, because
11613      __morestack has set that up before calling back to us.  Here we
11614      store that pointer in a scratch register, and in
11615      ix86_expand_prologue we store the scratch register in a stack
11616      slot.  */
11617   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11618     {
11619       unsigned int scratch_regno;
11620       rtx frame_reg;
11621       int words;
11622
11623       scratch_regno = split_stack_prologue_scratch_regno ();
11624       scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
11625       frame_reg = gen_rtx_REG (Pmode, BP_REG);
11626
11627       /* 64-bit:
11628          fp -> old fp value
11629                return address within this function
11630                return address of caller of this function
11631                stack arguments
11632          So we add three words to get to the stack arguments.
11633
11634          32-bit:
11635          fp -> old fp value
11636                return address within this function
11637                first argument to __morestack
11638                second argument to __morestack
11639                return address of caller of this function
11640                stack arguments
11641          So we add five words to get to the stack arguments.
11642       */
11643       words = TARGET_64BIT ? 3 : 5;
11644       emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11645                               gen_rtx_PLUS (Pmode, frame_reg,
11646                                             GEN_INT (words * UNITS_PER_WORD))));
11647
11648       varargs_label = gen_label_rtx ();
11649       emit_jump_insn (gen_jump (varargs_label));
11650       JUMP_LABEL (get_last_insn ()) = varargs_label;
11651
11652       emit_barrier ();
11653     }
11654
11655   emit_label (label);
11656   LABEL_NUSES (label) = 1;
11657
11658   /* If this function calls va_start, we now have to set the scratch
11659      register for the case where we do not call __morestack.  In this
11660      case we need to set it based on the stack pointer.  */
11661   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11662     {
11663       emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11664                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11665                                             GEN_INT (UNITS_PER_WORD))));
11666
11667       emit_label (varargs_label);
11668       LABEL_NUSES (varargs_label) = 1;
11669     }
11670 }
11671
11672 /* We may have to tell the dataflow pass that the split stack prologue
11673    is initializing a scratch register.  */
11674
11675 static void
11676 ix86_live_on_entry (bitmap regs)
11677 {
11678   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11679     {
11680       gcc_assert (flag_split_stack);
11681       bitmap_set_bit (regs, split_stack_prologue_scratch_regno ());
11682     }
11683 }
11684 \f
11685 /* Extract the parts of an RTL expression that is a valid memory address
11686    for an instruction.  Return 0 if the structure of the address is
11687    grossly off.  Return -1 if the address contains ASHIFT, so it is not
11688    strictly valid, but still used for computing length of lea instruction.  */
11689
11690 int
11691 ix86_decompose_address (rtx addr, struct ix86_address *out)
11692 {
11693   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
11694   rtx base_reg, index_reg;
11695   HOST_WIDE_INT scale = 1;
11696   rtx scale_rtx = NULL_RTX;
11697   rtx tmp;
11698   int retval = 1;
11699   enum ix86_address_seg seg = SEG_DEFAULT;
11700
11701   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
11702     base = addr;
11703   else if (GET_CODE (addr) == PLUS)
11704     {
11705       rtx addends[4], op;
11706       int n = 0, i;
11707
11708       op = addr;
11709       do
11710         {
11711           if (n >= 4)
11712             return 0;
11713           addends[n++] = XEXP (op, 1);
11714           op = XEXP (op, 0);
11715         }
11716       while (GET_CODE (op) == PLUS);
11717       if (n >= 4)
11718         return 0;
11719       addends[n] = op;
11720
11721       for (i = n; i >= 0; --i)
11722         {
11723           op = addends[i];
11724           switch (GET_CODE (op))
11725             {
11726             case MULT:
11727               if (index)
11728                 return 0;
11729               index = XEXP (op, 0);
11730               scale_rtx = XEXP (op, 1);
11731               break;
11732
11733             case ASHIFT:
11734               if (index)
11735                 return 0;
11736               index = XEXP (op, 0);
11737               tmp = XEXP (op, 1);
11738               if (!CONST_INT_P (tmp))
11739                 return 0;
11740               scale = INTVAL (tmp);
11741               if ((unsigned HOST_WIDE_INT) scale > 3)
11742                 return 0;
11743               scale = 1 << scale;
11744               break;
11745
11746             case UNSPEC:
11747               if (XINT (op, 1) == UNSPEC_TP
11748                   && TARGET_TLS_DIRECT_SEG_REFS
11749                   && seg == SEG_DEFAULT)
11750                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
11751               else
11752                 return 0;
11753               break;
11754
11755             case REG:
11756             case SUBREG:
11757               if (!base)
11758                 base = op;
11759               else if (!index)
11760                 index = op;
11761               else
11762                 return 0;
11763               break;
11764
11765             case CONST:
11766             case CONST_INT:
11767             case SYMBOL_REF:
11768             case LABEL_REF:
11769               if (disp)
11770                 return 0;
11771               disp = op;
11772               break;
11773
11774             default:
11775               return 0;
11776             }
11777         }
11778     }
11779   else if (GET_CODE (addr) == MULT)
11780     {
11781       index = XEXP (addr, 0);           /* index*scale */
11782       scale_rtx = XEXP (addr, 1);
11783     }
11784   else if (GET_CODE (addr) == ASHIFT)
11785     {
11786       /* We're called for lea too, which implements ashift on occasion.  */
11787       index = XEXP (addr, 0);
11788       tmp = XEXP (addr, 1);
11789       if (!CONST_INT_P (tmp))
11790         return 0;
11791       scale = INTVAL (tmp);
11792       if ((unsigned HOST_WIDE_INT) scale > 3)
11793         return 0;
11794       scale = 1 << scale;
11795       retval = -1;
11796     }
11797   else
11798     disp = addr;                        /* displacement */
11799
11800   /* Extract the integral value of scale.  */
11801   if (scale_rtx)
11802     {
11803       if (!CONST_INT_P (scale_rtx))
11804         return 0;
11805       scale = INTVAL (scale_rtx);
11806     }
11807
11808   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
11809   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
11810
11811   /* Avoid useless 0 displacement.  */
11812   if (disp == const0_rtx && (base || index))
11813     disp = NULL_RTX;
11814
11815   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
11816   if (base_reg && index_reg && scale == 1
11817       && (index_reg == arg_pointer_rtx
11818           || index_reg == frame_pointer_rtx
11819           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
11820     {
11821       rtx tmp;
11822       tmp = base, base = index, index = tmp;
11823       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
11824     }
11825
11826   /* Special case: %ebp cannot be encoded as a base without a displacement.
11827      Similarly %r13.  */
11828   if (!disp
11829       && base_reg
11830       && (base_reg == hard_frame_pointer_rtx
11831           || base_reg == frame_pointer_rtx
11832           || base_reg == arg_pointer_rtx
11833           || (REG_P (base_reg)
11834               && (REGNO (base_reg) == HARD_FRAME_POINTER_REGNUM
11835                   || REGNO (base_reg) == R13_REG))))
11836     disp = const0_rtx;
11837
11838   /* Special case: on K6, [%esi] makes the instruction vector decoded.
11839      Avoid this by transforming to [%esi+0].
11840      Reload calls address legitimization without cfun defined, so we need
11841      to test cfun for being non-NULL. */
11842   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
11843       && base_reg && !index_reg && !disp
11844       && REG_P (base_reg) && REGNO (base_reg) == SI_REG)
11845     disp = const0_rtx;
11846
11847   /* Special case: encode reg+reg instead of reg*2.  */
11848   if (!base && index && scale == 2)
11849     base = index, base_reg = index_reg, scale = 1;
11850
11851   /* Special case: scaling cannot be encoded without base or displacement.  */
11852   if (!base && !disp && index && scale != 1)
11853     disp = const0_rtx;
11854
11855   out->base = base;
11856   out->index = index;
11857   out->disp = disp;
11858   out->scale = scale;
11859   out->seg = seg;
11860
11861   return retval;
11862 }
11863 \f
11864 /* Return cost of the memory address x.
11865    For i386, it is better to use a complex address than let gcc copy
11866    the address into a reg and make a new pseudo.  But not if the address
11867    requires to two regs - that would mean more pseudos with longer
11868    lifetimes.  */
11869 static int
11870 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
11871 {
11872   struct ix86_address parts;
11873   int cost = 1;
11874   int ok = ix86_decompose_address (x, &parts);
11875
11876   gcc_assert (ok);
11877
11878   if (parts.base && GET_CODE (parts.base) == SUBREG)
11879     parts.base = SUBREG_REG (parts.base);
11880   if (parts.index && GET_CODE (parts.index) == SUBREG)
11881     parts.index = SUBREG_REG (parts.index);
11882
11883   /* Attempt to minimize number of registers in the address.  */
11884   if ((parts.base
11885        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
11886       || (parts.index
11887           && (!REG_P (parts.index)
11888               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
11889     cost++;
11890
11891   if (parts.base
11892       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
11893       && parts.index
11894       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
11895       && parts.base != parts.index)
11896     cost++;
11897
11898   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
11899      since it's predecode logic can't detect the length of instructions
11900      and it degenerates to vector decoded.  Increase cost of such
11901      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
11902      to split such addresses or even refuse such addresses at all.
11903
11904      Following addressing modes are affected:
11905       [base+scale*index]
11906       [scale*index+disp]
11907       [base+index]
11908
11909      The first and last case  may be avoidable by explicitly coding the zero in
11910      memory address, but I don't have AMD-K6 machine handy to check this
11911      theory.  */
11912
11913   if (TARGET_K6
11914       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
11915           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
11916           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
11917     cost += 10;
11918
11919   return cost;
11920 }
11921 \f
11922 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
11923    this is used for to form addresses to local data when -fPIC is in
11924    use.  */
11925
11926 static bool
11927 darwin_local_data_pic (rtx disp)
11928 {
11929   return (GET_CODE (disp) == UNSPEC
11930           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
11931 }
11932
11933 /* Determine if a given RTX is a valid constant.  We already know this
11934    satisfies CONSTANT_P.  */
11935
11936 bool
11937 legitimate_constant_p (rtx x)
11938 {
11939   switch (GET_CODE (x))
11940     {
11941     case CONST:
11942       x = XEXP (x, 0);
11943
11944       if (GET_CODE (x) == PLUS)
11945         {
11946           if (!CONST_INT_P (XEXP (x, 1)))
11947             return false;
11948           x = XEXP (x, 0);
11949         }
11950
11951       if (TARGET_MACHO && darwin_local_data_pic (x))
11952         return true;
11953
11954       /* Only some unspecs are valid as "constants".  */
11955       if (GET_CODE (x) == UNSPEC)
11956         switch (XINT (x, 1))
11957           {
11958           case UNSPEC_GOT:
11959           case UNSPEC_GOTOFF:
11960           case UNSPEC_PLTOFF:
11961             return TARGET_64BIT;
11962           case UNSPEC_TPOFF:
11963           case UNSPEC_NTPOFF:
11964             x = XVECEXP (x, 0, 0);
11965             return (GET_CODE (x) == SYMBOL_REF
11966                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
11967           case UNSPEC_DTPOFF:
11968             x = XVECEXP (x, 0, 0);
11969             return (GET_CODE (x) == SYMBOL_REF
11970                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
11971           default:
11972             return false;
11973           }
11974
11975       /* We must have drilled down to a symbol.  */
11976       if (GET_CODE (x) == LABEL_REF)
11977         return true;
11978       if (GET_CODE (x) != SYMBOL_REF)
11979         return false;
11980       /* FALLTHRU */
11981
11982     case SYMBOL_REF:
11983       /* TLS symbols are never valid.  */
11984       if (SYMBOL_REF_TLS_MODEL (x))
11985         return false;
11986
11987       /* DLLIMPORT symbols are never valid.  */
11988       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
11989           && SYMBOL_REF_DLLIMPORT_P (x))
11990         return false;
11991
11992 #if TARGET_MACHO
11993       /* mdynamic-no-pic */
11994       if (MACHO_DYNAMIC_NO_PIC_P)
11995         return machopic_symbol_defined_p (x);
11996 #endif
11997       break;
11998
11999     case CONST_DOUBLE:
12000       if (GET_MODE (x) == TImode
12001           && x != CONST0_RTX (TImode)
12002           && !TARGET_64BIT)
12003         return false;
12004       break;
12005
12006     case CONST_VECTOR:
12007       if (!standard_sse_constant_p (x))
12008         return false;
12009
12010     default:
12011       break;
12012     }
12013
12014   /* Otherwise we handle everything else in the move patterns.  */
12015   return true;
12016 }
12017
12018 /* Determine if it's legal to put X into the constant pool.  This
12019    is not possible for the address of thread-local symbols, which
12020    is checked above.  */
12021
12022 static bool
12023 ix86_cannot_force_const_mem (rtx x)
12024 {
12025   /* We can always put integral constants and vectors in memory.  */
12026   switch (GET_CODE (x))
12027     {
12028     case CONST_INT:
12029     case CONST_DOUBLE:
12030     case CONST_VECTOR:
12031       return false;
12032
12033     default:
12034       break;
12035     }
12036   return !legitimate_constant_p (x);
12037 }
12038
12039
12040 /* Nonzero if the constant value X is a legitimate general operand
12041    when generating PIC code.  It is given that flag_pic is on and
12042    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
12043
12044 bool
12045 legitimate_pic_operand_p (rtx x)
12046 {
12047   rtx inner;
12048
12049   switch (GET_CODE (x))
12050     {
12051     case CONST:
12052       inner = XEXP (x, 0);
12053       if (GET_CODE (inner) == PLUS
12054           && CONST_INT_P (XEXP (inner, 1)))
12055         inner = XEXP (inner, 0);
12056
12057       /* Only some unspecs are valid as "constants".  */
12058       if (GET_CODE (inner) == UNSPEC)
12059         switch (XINT (inner, 1))
12060           {
12061           case UNSPEC_GOT:
12062           case UNSPEC_GOTOFF:
12063           case UNSPEC_PLTOFF:
12064             return TARGET_64BIT;
12065           case UNSPEC_TPOFF:
12066             x = XVECEXP (inner, 0, 0);
12067             return (GET_CODE (x) == SYMBOL_REF
12068                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
12069           case UNSPEC_MACHOPIC_OFFSET:
12070             return legitimate_pic_address_disp_p (x);
12071           default:
12072             return false;
12073           }
12074       /* FALLTHRU */
12075
12076     case SYMBOL_REF:
12077     case LABEL_REF:
12078       return legitimate_pic_address_disp_p (x);
12079
12080     default:
12081       return true;
12082     }
12083 }
12084
12085 /* Determine if a given CONST RTX is a valid memory displacement
12086    in PIC mode.  */
12087
12088 bool
12089 legitimate_pic_address_disp_p (rtx disp)
12090 {
12091   bool saw_plus;
12092
12093   /* In 64bit mode we can allow direct addresses of symbols and labels
12094      when they are not dynamic symbols.  */
12095   if (TARGET_64BIT)
12096     {
12097       rtx op0 = disp, op1;
12098
12099       switch (GET_CODE (disp))
12100         {
12101         case LABEL_REF:
12102           return true;
12103
12104         case CONST:
12105           if (GET_CODE (XEXP (disp, 0)) != PLUS)
12106             break;
12107           op0 = XEXP (XEXP (disp, 0), 0);
12108           op1 = XEXP (XEXP (disp, 0), 1);
12109           if (!CONST_INT_P (op1)
12110               || INTVAL (op1) >= 16*1024*1024
12111               || INTVAL (op1) < -16*1024*1024)
12112             break;
12113           if (GET_CODE (op0) == LABEL_REF)
12114             return true;
12115           if (GET_CODE (op0) != SYMBOL_REF)
12116             break;
12117           /* FALLTHRU */
12118
12119         case SYMBOL_REF:
12120           /* TLS references should always be enclosed in UNSPEC.  */
12121           if (SYMBOL_REF_TLS_MODEL (op0))
12122             return false;
12123           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
12124               && ix86_cmodel != CM_LARGE_PIC)
12125             return true;
12126           break;
12127
12128         default:
12129           break;
12130         }
12131     }
12132   if (GET_CODE (disp) != CONST)
12133     return false;
12134   disp = XEXP (disp, 0);
12135
12136   if (TARGET_64BIT)
12137     {
12138       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
12139          of GOT tables.  We should not need these anyway.  */
12140       if (GET_CODE (disp) != UNSPEC
12141           || (XINT (disp, 1) != UNSPEC_GOTPCREL
12142               && XINT (disp, 1) != UNSPEC_GOTOFF
12143               && XINT (disp, 1) != UNSPEC_PCREL
12144               && XINT (disp, 1) != UNSPEC_PLTOFF))
12145         return false;
12146
12147       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
12148           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
12149         return false;
12150       return true;
12151     }
12152
12153   saw_plus = false;
12154   if (GET_CODE (disp) == PLUS)
12155     {
12156       if (!CONST_INT_P (XEXP (disp, 1)))
12157         return false;
12158       disp = XEXP (disp, 0);
12159       saw_plus = true;
12160     }
12161
12162   if (TARGET_MACHO && darwin_local_data_pic (disp))
12163     return true;
12164
12165   if (GET_CODE (disp) != UNSPEC)
12166     return false;
12167
12168   switch (XINT (disp, 1))
12169     {
12170     case UNSPEC_GOT:
12171       if (saw_plus)
12172         return false;
12173       /* We need to check for both symbols and labels because VxWorks loads
12174          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
12175          details.  */
12176       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
12177               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
12178     case UNSPEC_GOTOFF:
12179       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
12180          While ABI specify also 32bit relocation but we don't produce it in
12181          small PIC model at all.  */
12182       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
12183            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
12184           && !TARGET_64BIT)
12185         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
12186       return false;
12187     case UNSPEC_GOTTPOFF:
12188     case UNSPEC_GOTNTPOFF:
12189     case UNSPEC_INDNTPOFF:
12190       if (saw_plus)
12191         return false;
12192       disp = XVECEXP (disp, 0, 0);
12193       return (GET_CODE (disp) == SYMBOL_REF
12194               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
12195     case UNSPEC_NTPOFF:
12196       disp = XVECEXP (disp, 0, 0);
12197       return (GET_CODE (disp) == SYMBOL_REF
12198               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
12199     case UNSPEC_DTPOFF:
12200       disp = XVECEXP (disp, 0, 0);
12201       return (GET_CODE (disp) == SYMBOL_REF
12202               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
12203     }
12204
12205   return false;
12206 }
12207
12208 /* Recognizes RTL expressions that are valid memory addresses for an
12209    instruction.  The MODE argument is the machine mode for the MEM
12210    expression that wants to use this address.
12211
12212    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
12213    convert common non-canonical forms to canonical form so that they will
12214    be recognized.  */
12215
12216 static bool
12217 ix86_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
12218                            rtx addr, bool strict)
12219 {
12220   struct ix86_address parts;
12221   rtx base, index, disp;
12222   HOST_WIDE_INT scale;
12223
12224   if (ix86_decompose_address (addr, &parts) <= 0)
12225     /* Decomposition failed.  */
12226     return false;
12227
12228   base = parts.base;
12229   index = parts.index;
12230   disp = parts.disp;
12231   scale = parts.scale;
12232
12233   /* Validate base register.
12234
12235      Don't allow SUBREG's that span more than a word here.  It can lead to spill
12236      failures when the base is one word out of a two word structure, which is
12237      represented internally as a DImode int.  */
12238
12239   if (base)
12240     {
12241       rtx reg;
12242
12243       if (REG_P (base))
12244         reg = base;
12245       else if (GET_CODE (base) == SUBREG
12246                && REG_P (SUBREG_REG (base))
12247                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
12248                   <= UNITS_PER_WORD)
12249         reg = SUBREG_REG (base);
12250       else
12251         /* Base is not a register.  */
12252         return false;
12253
12254       if (GET_MODE (base) != Pmode)
12255         /* Base is not in Pmode.  */
12256         return false;
12257
12258       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
12259           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
12260         /* Base is not valid.  */
12261         return false;
12262     }
12263
12264   /* Validate index register.
12265
12266      Don't allow SUBREG's that span more than a word here -- same as above.  */
12267
12268   if (index)
12269     {
12270       rtx reg;
12271
12272       if (REG_P (index))
12273         reg = index;
12274       else if (GET_CODE (index) == SUBREG
12275                && REG_P (SUBREG_REG (index))
12276                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
12277                   <= UNITS_PER_WORD)
12278         reg = SUBREG_REG (index);
12279       else
12280         /* Index is not a register.  */
12281         return false;
12282
12283       if (GET_MODE (index) != Pmode)
12284         /* Index is not in Pmode.  */
12285         return false;
12286
12287       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
12288           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
12289         /* Index is not valid.  */
12290         return false;
12291     }
12292
12293   /* Validate scale factor.  */
12294   if (scale != 1)
12295     {
12296       if (!index)
12297         /* Scale without index.  */
12298         return false;
12299
12300       if (scale != 2 && scale != 4 && scale != 8)
12301         /* Scale is not a valid multiplier.  */
12302         return false;
12303     }
12304
12305   /* Validate displacement.  */
12306   if (disp)
12307     {
12308       if (GET_CODE (disp) == CONST
12309           && GET_CODE (XEXP (disp, 0)) == UNSPEC
12310           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
12311         switch (XINT (XEXP (disp, 0), 1))
12312           {
12313           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
12314              used.  While ABI specify also 32bit relocations, we don't produce
12315              them at all and use IP relative instead.  */
12316           case UNSPEC_GOT:
12317           case UNSPEC_GOTOFF:
12318             gcc_assert (flag_pic);
12319             if (!TARGET_64BIT)
12320               goto is_legitimate_pic;
12321
12322             /* 64bit address unspec.  */
12323             return false;
12324
12325           case UNSPEC_GOTPCREL:
12326           case UNSPEC_PCREL:
12327             gcc_assert (flag_pic);
12328             goto is_legitimate_pic;
12329
12330           case UNSPEC_GOTTPOFF:
12331           case UNSPEC_GOTNTPOFF:
12332           case UNSPEC_INDNTPOFF:
12333           case UNSPEC_NTPOFF:
12334           case UNSPEC_DTPOFF:
12335             break;
12336
12337           case UNSPEC_STACK_CHECK:
12338             gcc_assert (flag_split_stack);
12339             break;
12340
12341           default:
12342             /* Invalid address unspec.  */
12343             return false;
12344           }
12345
12346       else if (SYMBOLIC_CONST (disp)
12347                && (flag_pic
12348                    || (TARGET_MACHO
12349 #if TARGET_MACHO
12350                        && MACHOPIC_INDIRECT
12351                        && !machopic_operand_p (disp)
12352 #endif
12353                )))
12354         {
12355
12356         is_legitimate_pic:
12357           if (TARGET_64BIT && (index || base))
12358             {
12359               /* foo@dtpoff(%rX) is ok.  */
12360               if (GET_CODE (disp) != CONST
12361                   || GET_CODE (XEXP (disp, 0)) != PLUS
12362                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
12363                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
12364                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
12365                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
12366                 /* Non-constant pic memory reference.  */
12367                 return false;
12368             }
12369           else if ((!TARGET_MACHO || flag_pic)
12370                     && ! legitimate_pic_address_disp_p (disp))
12371             /* Displacement is an invalid pic construct.  */
12372             return false;
12373 #if TARGET_MACHO
12374           else if (MACHO_DYNAMIC_NO_PIC_P && !legitimate_constant_p (disp))
12375             /* displacment must be referenced via non_lazy_pointer */
12376             return false;
12377 #endif
12378
12379           /* This code used to verify that a symbolic pic displacement
12380              includes the pic_offset_table_rtx register.
12381
12382              While this is good idea, unfortunately these constructs may
12383              be created by "adds using lea" optimization for incorrect
12384              code like:
12385
12386              int a;
12387              int foo(int i)
12388                {
12389                  return *(&a+i);
12390                }
12391
12392              This code is nonsensical, but results in addressing
12393              GOT table with pic_offset_table_rtx base.  We can't
12394              just refuse it easily, since it gets matched by
12395              "addsi3" pattern, that later gets split to lea in the
12396              case output register differs from input.  While this
12397              can be handled by separate addsi pattern for this case
12398              that never results in lea, this seems to be easier and
12399              correct fix for crash to disable this test.  */
12400         }
12401       else if (GET_CODE (disp) != LABEL_REF
12402                && !CONST_INT_P (disp)
12403                && (GET_CODE (disp) != CONST
12404                    || !legitimate_constant_p (disp))
12405                && (GET_CODE (disp) != SYMBOL_REF
12406                    || !legitimate_constant_p (disp)))
12407         /* Displacement is not constant.  */
12408         return false;
12409       else if (TARGET_64BIT
12410                && !x86_64_immediate_operand (disp, VOIDmode))
12411         /* Displacement is out of range.  */
12412         return false;
12413     }
12414
12415   /* Everything looks valid.  */
12416   return true;
12417 }
12418
12419 /* Determine if a given RTX is a valid constant address.  */
12420
12421 bool
12422 constant_address_p (rtx x)
12423 {
12424   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
12425 }
12426 \f
12427 /* Return a unique alias set for the GOT.  */
12428
12429 static alias_set_type
12430 ix86_GOT_alias_set (void)
12431 {
12432   static alias_set_type set = -1;
12433   if (set == -1)
12434     set = new_alias_set ();
12435   return set;
12436 }
12437
12438 /* Return a legitimate reference for ORIG (an address) using the
12439    register REG.  If REG is 0, a new pseudo is generated.
12440
12441    There are two types of references that must be handled:
12442
12443    1. Global data references must load the address from the GOT, via
12444       the PIC reg.  An insn is emitted to do this load, and the reg is
12445       returned.
12446
12447    2. Static data references, constant pool addresses, and code labels
12448       compute the address as an offset from the GOT, whose base is in
12449       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
12450       differentiate them from global data objects.  The returned
12451       address is the PIC reg + an unspec constant.
12452
12453    TARGET_LEGITIMATE_ADDRESS_P rejects symbolic references unless the PIC
12454    reg also appears in the address.  */
12455
12456 static rtx
12457 legitimize_pic_address (rtx orig, rtx reg)
12458 {
12459   rtx addr = orig;
12460   rtx new_rtx = orig;
12461   rtx base;
12462
12463 #if TARGET_MACHO
12464   if (TARGET_MACHO && !TARGET_64BIT)
12465     {
12466       if (reg == 0)
12467         reg = gen_reg_rtx (Pmode);
12468       /* Use the generic Mach-O PIC machinery.  */
12469       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
12470     }
12471 #endif
12472
12473   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
12474     new_rtx = addr;
12475   else if (TARGET_64BIT
12476            && ix86_cmodel != CM_SMALL_PIC
12477            && gotoff_operand (addr, Pmode))
12478     {
12479       rtx tmpreg;
12480       /* This symbol may be referenced via a displacement from the PIC
12481          base address (@GOTOFF).  */
12482
12483       if (reload_in_progress)
12484         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12485       if (GET_CODE (addr) == CONST)
12486         addr = XEXP (addr, 0);
12487       if (GET_CODE (addr) == PLUS)
12488           {
12489             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
12490                                       UNSPEC_GOTOFF);
12491             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
12492           }
12493         else
12494           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
12495       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12496       if (!reg)
12497         tmpreg = gen_reg_rtx (Pmode);
12498       else
12499         tmpreg = reg;
12500       emit_move_insn (tmpreg, new_rtx);
12501
12502       if (reg != 0)
12503         {
12504           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
12505                                          tmpreg, 1, OPTAB_DIRECT);
12506           new_rtx = reg;
12507         }
12508       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
12509     }
12510   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
12511     {
12512       /* This symbol may be referenced via a displacement from the PIC
12513          base address (@GOTOFF).  */
12514
12515       if (reload_in_progress)
12516         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12517       if (GET_CODE (addr) == CONST)
12518         addr = XEXP (addr, 0);
12519       if (GET_CODE (addr) == PLUS)
12520           {
12521             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
12522                                       UNSPEC_GOTOFF);
12523             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
12524           }
12525         else
12526           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
12527       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12528       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12529
12530       if (reg != 0)
12531         {
12532           emit_move_insn (reg, new_rtx);
12533           new_rtx = reg;
12534         }
12535     }
12536   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
12537            /* We can't use @GOTOFF for text labels on VxWorks;
12538               see gotoff_operand.  */
12539            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
12540     {
12541       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
12542         {
12543           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
12544             return legitimize_dllimport_symbol (addr, true);
12545           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
12546               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
12547               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
12548             {
12549               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
12550               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
12551             }
12552         }
12553
12554       /* For x64 PE-COFF there is no GOT table.  So we use address
12555          directly.  */
12556       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
12557       {
12558           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_PCREL);
12559           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12560
12561           if (reg == 0)
12562             reg = gen_reg_rtx (Pmode);
12563           emit_move_insn (reg, new_rtx);
12564           new_rtx = reg;
12565       }
12566       else if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
12567         {
12568           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
12569           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12570           new_rtx = gen_const_mem (Pmode, new_rtx);
12571           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
12572
12573           if (reg == 0)
12574             reg = gen_reg_rtx (Pmode);
12575           /* Use directly gen_movsi, otherwise the address is loaded
12576              into register for CSE.  We don't want to CSE this addresses,
12577              instead we CSE addresses from the GOT table, so skip this.  */
12578           emit_insn (gen_movsi (reg, new_rtx));
12579           new_rtx = reg;
12580         }
12581       else
12582         {
12583           /* This symbol must be referenced via a load from the
12584              Global Offset Table (@GOT).  */
12585
12586           if (reload_in_progress)
12587             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12588           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
12589           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12590           if (TARGET_64BIT)
12591             new_rtx = force_reg (Pmode, new_rtx);
12592           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12593           new_rtx = gen_const_mem (Pmode, new_rtx);
12594           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
12595
12596           if (reg == 0)
12597             reg = gen_reg_rtx (Pmode);
12598           emit_move_insn (reg, new_rtx);
12599           new_rtx = reg;
12600         }
12601     }
12602   else
12603     {
12604       if (CONST_INT_P (addr)
12605           && !x86_64_immediate_operand (addr, VOIDmode))
12606         {
12607           if (reg)
12608             {
12609               emit_move_insn (reg, addr);
12610               new_rtx = reg;
12611             }
12612           else
12613             new_rtx = force_reg (Pmode, addr);
12614         }
12615       else if (GET_CODE (addr) == CONST)
12616         {
12617           addr = XEXP (addr, 0);
12618
12619           /* We must match stuff we generate before.  Assume the only
12620              unspecs that can get here are ours.  Not that we could do
12621              anything with them anyway....  */
12622           if (GET_CODE (addr) == UNSPEC
12623               || (GET_CODE (addr) == PLUS
12624                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
12625             return orig;
12626           gcc_assert (GET_CODE (addr) == PLUS);
12627         }
12628       if (GET_CODE (addr) == PLUS)
12629         {
12630           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
12631
12632           /* Check first to see if this is a constant offset from a @GOTOFF
12633              symbol reference.  */
12634           if (gotoff_operand (op0, Pmode)
12635               && CONST_INT_P (op1))
12636             {
12637               if (!TARGET_64BIT)
12638                 {
12639                   if (reload_in_progress)
12640                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12641                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
12642                                             UNSPEC_GOTOFF);
12643                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
12644                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12645                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12646
12647                   if (reg != 0)
12648                     {
12649                       emit_move_insn (reg, new_rtx);
12650                       new_rtx = reg;
12651                     }
12652                 }
12653               else
12654                 {
12655                   if (INTVAL (op1) < -16*1024*1024
12656                       || INTVAL (op1) >= 16*1024*1024)
12657                     {
12658                       if (!x86_64_immediate_operand (op1, Pmode))
12659                         op1 = force_reg (Pmode, op1);
12660                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
12661                     }
12662                 }
12663             }
12664           else
12665             {
12666               base = legitimize_pic_address (XEXP (addr, 0), reg);
12667               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
12668                                                  base == reg ? NULL_RTX : reg);
12669
12670               if (CONST_INT_P (new_rtx))
12671                 new_rtx = plus_constant (base, INTVAL (new_rtx));
12672               else
12673                 {
12674                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
12675                     {
12676                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
12677                       new_rtx = XEXP (new_rtx, 1);
12678                     }
12679                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
12680                 }
12681             }
12682         }
12683     }
12684   return new_rtx;
12685 }
12686 \f
12687 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
12688
12689 static rtx
12690 get_thread_pointer (int to_reg)
12691 {
12692   rtx tp, reg, insn;
12693
12694   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
12695   if (!to_reg)
12696     return tp;
12697
12698   reg = gen_reg_rtx (Pmode);
12699   insn = gen_rtx_SET (VOIDmode, reg, tp);
12700   insn = emit_insn (insn);
12701
12702   return reg;
12703 }
12704
12705 /* A subroutine of ix86_legitimize_address and ix86_expand_move.  FOR_MOV is
12706    false if we expect this to be used for a memory address and true if
12707    we expect to load the address into a register.  */
12708
12709 static rtx
12710 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
12711 {
12712   rtx dest, base, off, pic, tp;
12713   int type;
12714
12715   switch (model)
12716     {
12717     case TLS_MODEL_GLOBAL_DYNAMIC:
12718       dest = gen_reg_rtx (Pmode);
12719       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
12720
12721       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
12722         {
12723           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
12724
12725           start_sequence ();
12726           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
12727           insns = get_insns ();
12728           end_sequence ();
12729
12730           RTL_CONST_CALL_P (insns) = 1;
12731           emit_libcall_block (insns, dest, rax, x);
12732         }
12733       else if (TARGET_64BIT && TARGET_GNU2_TLS)
12734         emit_insn (gen_tls_global_dynamic_64 (dest, x));
12735       else
12736         emit_insn (gen_tls_global_dynamic_32 (dest, x));
12737
12738       if (TARGET_GNU2_TLS)
12739         {
12740           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
12741
12742           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
12743         }
12744       break;
12745
12746     case TLS_MODEL_LOCAL_DYNAMIC:
12747       base = gen_reg_rtx (Pmode);
12748       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
12749
12750       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
12751         {
12752           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
12753
12754           start_sequence ();
12755           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
12756           insns = get_insns ();
12757           end_sequence ();
12758
12759           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
12760           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
12761           RTL_CONST_CALL_P (insns) = 1;
12762           emit_libcall_block (insns, base, rax, note);
12763         }
12764       else if (TARGET_64BIT && TARGET_GNU2_TLS)
12765         emit_insn (gen_tls_local_dynamic_base_64 (base));
12766       else
12767         emit_insn (gen_tls_local_dynamic_base_32 (base));
12768
12769       if (TARGET_GNU2_TLS)
12770         {
12771           rtx x = ix86_tls_module_base ();
12772
12773           set_unique_reg_note (get_last_insn (), REG_EQUIV,
12774                                gen_rtx_MINUS (Pmode, x, tp));
12775         }
12776
12777       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
12778       off = gen_rtx_CONST (Pmode, off);
12779
12780       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
12781
12782       if (TARGET_GNU2_TLS)
12783         {
12784           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
12785
12786           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
12787         }
12788
12789       break;
12790
12791     case TLS_MODEL_INITIAL_EXEC:
12792       if (TARGET_64BIT)
12793         {
12794           if (TARGET_SUN_TLS)
12795             {
12796               /* The Sun linker took the AMD64 TLS spec literally
12797                  and can only handle %rax as destination of the
12798                  initial executable code sequence.  */
12799
12800               dest = gen_reg_rtx (Pmode);
12801               emit_insn (gen_tls_initial_exec_64_sun (dest, x));
12802               return dest;
12803             }
12804
12805           pic = NULL;
12806           type = UNSPEC_GOTNTPOFF;
12807         }
12808       else if (flag_pic)
12809         {
12810           if (reload_in_progress)
12811             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12812           pic = pic_offset_table_rtx;
12813           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
12814         }
12815       else if (!TARGET_ANY_GNU_TLS)
12816         {
12817           pic = gen_reg_rtx (Pmode);
12818           emit_insn (gen_set_got (pic));
12819           type = UNSPEC_GOTTPOFF;
12820         }
12821       else
12822         {
12823           pic = NULL;
12824           type = UNSPEC_INDNTPOFF;
12825         }
12826
12827       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
12828       off = gen_rtx_CONST (Pmode, off);
12829       if (pic)
12830         off = gen_rtx_PLUS (Pmode, pic, off);
12831       off = gen_const_mem (Pmode, off);
12832       set_mem_alias_set (off, ix86_GOT_alias_set ());
12833
12834       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12835         {
12836           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
12837           off = force_reg (Pmode, off);
12838           return gen_rtx_PLUS (Pmode, base, off);
12839         }
12840       else
12841         {
12842           base = get_thread_pointer (true);
12843           dest = gen_reg_rtx (Pmode);
12844           emit_insn (gen_subsi3 (dest, base, off));
12845         }
12846       break;
12847
12848     case TLS_MODEL_LOCAL_EXEC:
12849       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
12850                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12851                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
12852       off = gen_rtx_CONST (Pmode, off);
12853
12854       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12855         {
12856           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
12857           return gen_rtx_PLUS (Pmode, base, off);
12858         }
12859       else
12860         {
12861           base = get_thread_pointer (true);
12862           dest = gen_reg_rtx (Pmode);
12863           emit_insn (gen_subsi3 (dest, base, off));
12864         }
12865       break;
12866
12867     default:
12868       gcc_unreachable ();
12869     }
12870
12871   return dest;
12872 }
12873
12874 /* Create or return the unique __imp_DECL dllimport symbol corresponding
12875    to symbol DECL.  */
12876
12877 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
12878   htab_t dllimport_map;
12879
12880 static tree
12881 get_dllimport_decl (tree decl)
12882 {
12883   struct tree_map *h, in;
12884   void **loc;
12885   const char *name;
12886   const char *prefix;
12887   size_t namelen, prefixlen;
12888   char *imp_name;
12889   tree to;
12890   rtx rtl;
12891
12892   if (!dllimport_map)
12893     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
12894
12895   in.hash = htab_hash_pointer (decl);
12896   in.base.from = decl;
12897   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
12898   h = (struct tree_map *) *loc;
12899   if (h)
12900     return h->to;
12901
12902   *loc = h = ggc_alloc_tree_map ();
12903   h->hash = in.hash;
12904   h->base.from = decl;
12905   h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
12906                            VAR_DECL, NULL, ptr_type_node);
12907   DECL_ARTIFICIAL (to) = 1;
12908   DECL_IGNORED_P (to) = 1;
12909   DECL_EXTERNAL (to) = 1;
12910   TREE_READONLY (to) = 1;
12911
12912   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
12913   name = targetm.strip_name_encoding (name);
12914   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
12915     ? "*__imp_" : "*__imp__";
12916   namelen = strlen (name);
12917   prefixlen = strlen (prefix);
12918   imp_name = (char *) alloca (namelen + prefixlen + 1);
12919   memcpy (imp_name, prefix, prefixlen);
12920   memcpy (imp_name + prefixlen, name, namelen + 1);
12921
12922   name = ggc_alloc_string (imp_name, namelen + prefixlen);
12923   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
12924   SET_SYMBOL_REF_DECL (rtl, to);
12925   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
12926
12927   rtl = gen_const_mem (Pmode, rtl);
12928   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
12929
12930   SET_DECL_RTL (to, rtl);
12931   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
12932
12933   return to;
12934 }
12935
12936 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
12937    true if we require the result be a register.  */
12938
12939 static rtx
12940 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
12941 {
12942   tree imp_decl;
12943   rtx x;
12944
12945   gcc_assert (SYMBOL_REF_DECL (symbol));
12946   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
12947
12948   x = DECL_RTL (imp_decl);
12949   if (want_reg)
12950     x = force_reg (Pmode, x);
12951   return x;
12952 }
12953
12954 /* Try machine-dependent ways of modifying an illegitimate address
12955    to be legitimate.  If we find one, return the new, valid address.
12956    This macro is used in only one place: `memory_address' in explow.c.
12957
12958    OLDX is the address as it was before break_out_memory_refs was called.
12959    In some cases it is useful to look at this to decide what needs to be done.
12960
12961    It is always safe for this macro to do nothing.  It exists to recognize
12962    opportunities to optimize the output.
12963
12964    For the 80386, we handle X+REG by loading X into a register R and
12965    using R+REG.  R will go in a general reg and indexing will be used.
12966    However, if REG is a broken-out memory address or multiplication,
12967    nothing needs to be done because REG can certainly go in a general reg.
12968
12969    When -fpic is used, special handling is needed for symbolic references.
12970    See comments by legitimize_pic_address in i386.c for details.  */
12971
12972 static rtx
12973 ix86_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
12974                          enum machine_mode mode)
12975 {
12976   int changed = 0;
12977   unsigned log;
12978
12979   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
12980   if (log)
12981     return legitimize_tls_address (x, (enum tls_model) log, false);
12982   if (GET_CODE (x) == CONST
12983       && GET_CODE (XEXP (x, 0)) == PLUS
12984       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
12985       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
12986     {
12987       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
12988                                       (enum tls_model) log, false);
12989       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
12990     }
12991
12992   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
12993     {
12994       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
12995         return legitimize_dllimport_symbol (x, true);
12996       if (GET_CODE (x) == CONST
12997           && GET_CODE (XEXP (x, 0)) == PLUS
12998           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
12999           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
13000         {
13001           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
13002           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
13003         }
13004     }
13005
13006   if (flag_pic && SYMBOLIC_CONST (x))
13007     return legitimize_pic_address (x, 0);
13008
13009 #if TARGET_MACHO
13010   if (MACHO_DYNAMIC_NO_PIC_P && SYMBOLIC_CONST (x))
13011     return machopic_indirect_data_reference (x, 0);
13012 #endif
13013
13014   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
13015   if (GET_CODE (x) == ASHIFT
13016       && CONST_INT_P (XEXP (x, 1))
13017       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
13018     {
13019       changed = 1;
13020       log = INTVAL (XEXP (x, 1));
13021       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
13022                         GEN_INT (1 << log));
13023     }
13024
13025   if (GET_CODE (x) == PLUS)
13026     {
13027       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
13028
13029       if (GET_CODE (XEXP (x, 0)) == ASHIFT
13030           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
13031           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
13032         {
13033           changed = 1;
13034           log = INTVAL (XEXP (XEXP (x, 0), 1));
13035           XEXP (x, 0) = gen_rtx_MULT (Pmode,
13036                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
13037                                       GEN_INT (1 << log));
13038         }
13039
13040       if (GET_CODE (XEXP (x, 1)) == ASHIFT
13041           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
13042           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
13043         {
13044           changed = 1;
13045           log = INTVAL (XEXP (XEXP (x, 1), 1));
13046           XEXP (x, 1) = gen_rtx_MULT (Pmode,
13047                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
13048                                       GEN_INT (1 << log));
13049         }
13050
13051       /* Put multiply first if it isn't already.  */
13052       if (GET_CODE (XEXP (x, 1)) == MULT)
13053         {
13054           rtx tmp = XEXP (x, 0);
13055           XEXP (x, 0) = XEXP (x, 1);
13056           XEXP (x, 1) = tmp;
13057           changed = 1;
13058         }
13059
13060       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
13061          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
13062          created by virtual register instantiation, register elimination, and
13063          similar optimizations.  */
13064       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
13065         {
13066           changed = 1;
13067           x = gen_rtx_PLUS (Pmode,
13068                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
13069                                           XEXP (XEXP (x, 1), 0)),
13070                             XEXP (XEXP (x, 1), 1));
13071         }
13072
13073       /* Canonicalize
13074          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
13075          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
13076       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
13077                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
13078                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
13079                && CONSTANT_P (XEXP (x, 1)))
13080         {
13081           rtx constant;
13082           rtx other = NULL_RTX;
13083
13084           if (CONST_INT_P (XEXP (x, 1)))
13085             {
13086               constant = XEXP (x, 1);
13087               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
13088             }
13089           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
13090             {
13091               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
13092               other = XEXP (x, 1);
13093             }
13094           else
13095             constant = 0;
13096
13097           if (constant)
13098             {
13099               changed = 1;
13100               x = gen_rtx_PLUS (Pmode,
13101                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
13102                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
13103                                 plus_constant (other, INTVAL (constant)));
13104             }
13105         }
13106
13107       if (changed && ix86_legitimate_address_p (mode, x, false))
13108         return x;
13109
13110       if (GET_CODE (XEXP (x, 0)) == MULT)
13111         {
13112           changed = 1;
13113           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
13114         }
13115
13116       if (GET_CODE (XEXP (x, 1)) == MULT)
13117         {
13118           changed = 1;
13119           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
13120         }
13121
13122       if (changed
13123           && REG_P (XEXP (x, 1))
13124           && REG_P (XEXP (x, 0)))
13125         return x;
13126
13127       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
13128         {
13129           changed = 1;
13130           x = legitimize_pic_address (x, 0);
13131         }
13132
13133       if (changed && ix86_legitimate_address_p (mode, x, false))
13134         return x;
13135
13136       if (REG_P (XEXP (x, 0)))
13137         {
13138           rtx temp = gen_reg_rtx (Pmode);
13139           rtx val  = force_operand (XEXP (x, 1), temp);
13140           if (val != temp)
13141             emit_move_insn (temp, val);
13142
13143           XEXP (x, 1) = temp;
13144           return x;
13145         }
13146
13147       else if (REG_P (XEXP (x, 1)))
13148         {
13149           rtx temp = gen_reg_rtx (Pmode);
13150           rtx val  = force_operand (XEXP (x, 0), temp);
13151           if (val != temp)
13152             emit_move_insn (temp, val);
13153
13154           XEXP (x, 0) = temp;
13155           return x;
13156         }
13157     }
13158
13159   return x;
13160 }
13161 \f
13162 /* Print an integer constant expression in assembler syntax.  Addition
13163    and subtraction are the only arithmetic that may appear in these
13164    expressions.  FILE is the stdio stream to write to, X is the rtx, and
13165    CODE is the operand print code from the output string.  */
13166
13167 static void
13168 output_pic_addr_const (FILE *file, rtx x, int code)
13169 {
13170   char buf[256];
13171
13172   switch (GET_CODE (x))
13173     {
13174     case PC:
13175       gcc_assert (flag_pic);
13176       putc ('.', file);
13177       break;
13178
13179     case SYMBOL_REF:
13180       if (TARGET_64BIT || ! TARGET_MACHO_BRANCH_ISLANDS)
13181         output_addr_const (file, x);
13182       else
13183         {
13184           const char *name = XSTR (x, 0);
13185
13186           /* Mark the decl as referenced so that cgraph will
13187              output the function.  */
13188           if (SYMBOL_REF_DECL (x))
13189             mark_decl_referenced (SYMBOL_REF_DECL (x));
13190
13191 #if TARGET_MACHO
13192           if (MACHOPIC_INDIRECT
13193               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
13194             name = machopic_indirection_name (x, /*stub_p=*/true);
13195 #endif
13196           assemble_name (file, name);
13197         }
13198       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
13199           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
13200         fputs ("@PLT", file);
13201       break;
13202
13203     case LABEL_REF:
13204       x = XEXP (x, 0);
13205       /* FALLTHRU */
13206     case CODE_LABEL:
13207       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
13208       assemble_name (asm_out_file, buf);
13209       break;
13210
13211     case CONST_INT:
13212       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
13213       break;
13214
13215     case CONST:
13216       /* This used to output parentheses around the expression,
13217          but that does not work on the 386 (either ATT or BSD assembler).  */
13218       output_pic_addr_const (file, XEXP (x, 0), code);
13219       break;
13220
13221     case CONST_DOUBLE:
13222       if (GET_MODE (x) == VOIDmode)
13223         {
13224           /* We can use %d if the number is <32 bits and positive.  */
13225           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
13226             fprintf (file, "0x%lx%08lx",
13227                      (unsigned long) CONST_DOUBLE_HIGH (x),
13228                      (unsigned long) CONST_DOUBLE_LOW (x));
13229           else
13230             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
13231         }
13232       else
13233         /* We can't handle floating point constants;
13234            TARGET_PRINT_OPERAND must handle them.  */
13235         output_operand_lossage ("floating constant misused");
13236       break;
13237
13238     case PLUS:
13239       /* Some assemblers need integer constants to appear first.  */
13240       if (CONST_INT_P (XEXP (x, 0)))
13241         {
13242           output_pic_addr_const (file, XEXP (x, 0), code);
13243           putc ('+', file);
13244           output_pic_addr_const (file, XEXP (x, 1), code);
13245         }
13246       else
13247         {
13248           gcc_assert (CONST_INT_P (XEXP (x, 1)));
13249           output_pic_addr_const (file, XEXP (x, 1), code);
13250           putc ('+', file);
13251           output_pic_addr_const (file, XEXP (x, 0), code);
13252         }
13253       break;
13254
13255     case MINUS:
13256       if (!TARGET_MACHO)
13257         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
13258       output_pic_addr_const (file, XEXP (x, 0), code);
13259       putc ('-', file);
13260       output_pic_addr_const (file, XEXP (x, 1), code);
13261       if (!TARGET_MACHO)
13262         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
13263       break;
13264
13265      case UNSPEC:
13266        if (XINT (x, 1) == UNSPEC_STACK_CHECK)
13267          {
13268            bool f = i386_asm_output_addr_const_extra (file, x);
13269            gcc_assert (f);
13270            break;
13271          }
13272
13273        gcc_assert (XVECLEN (x, 0) == 1);
13274        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
13275        switch (XINT (x, 1))
13276         {
13277         case UNSPEC_GOT:
13278           fputs ("@GOT", file);
13279           break;
13280         case UNSPEC_GOTOFF:
13281           fputs ("@GOTOFF", file);
13282           break;
13283         case UNSPEC_PLTOFF:
13284           fputs ("@PLTOFF", file);
13285           break;
13286         case UNSPEC_PCREL:
13287           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13288                  "(%rip)" : "[rip]", file);
13289           break;
13290         case UNSPEC_GOTPCREL:
13291           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13292                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
13293           break;
13294         case UNSPEC_GOTTPOFF:
13295           /* FIXME: This might be @TPOFF in Sun ld too.  */
13296           fputs ("@gottpoff", file);
13297           break;
13298         case UNSPEC_TPOFF:
13299           fputs ("@tpoff", file);
13300           break;
13301         case UNSPEC_NTPOFF:
13302           if (TARGET_64BIT)
13303             fputs ("@tpoff", file);
13304           else
13305             fputs ("@ntpoff", file);
13306           break;
13307         case UNSPEC_DTPOFF:
13308           fputs ("@dtpoff", file);
13309           break;
13310         case UNSPEC_GOTNTPOFF:
13311           if (TARGET_64BIT)
13312             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13313                    "@gottpoff(%rip)": "@gottpoff[rip]", file);
13314           else
13315             fputs ("@gotntpoff", file);
13316           break;
13317         case UNSPEC_INDNTPOFF:
13318           fputs ("@indntpoff", file);
13319           break;
13320 #if TARGET_MACHO
13321         case UNSPEC_MACHOPIC_OFFSET:
13322           putc ('-', file);
13323           machopic_output_function_base_name (file);
13324           break;
13325 #endif
13326         default:
13327           output_operand_lossage ("invalid UNSPEC as operand");
13328           break;
13329         }
13330        break;
13331
13332     default:
13333       output_operand_lossage ("invalid expression as operand");
13334     }
13335 }
13336
13337 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
13338    We need to emit DTP-relative relocations.  */
13339
13340 static void ATTRIBUTE_UNUSED
13341 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
13342 {
13343   fputs (ASM_LONG, file);
13344   output_addr_const (file, x);
13345   fputs ("@dtpoff", file);
13346   switch (size)
13347     {
13348     case 4:
13349       break;
13350     case 8:
13351       fputs (", 0", file);
13352       break;
13353     default:
13354       gcc_unreachable ();
13355    }
13356 }
13357
13358 /* Return true if X is a representation of the PIC register.  This copes
13359    with calls from ix86_find_base_term, where the register might have
13360    been replaced by a cselib value.  */
13361
13362 static bool
13363 ix86_pic_register_p (rtx x)
13364 {
13365   if (GET_CODE (x) == VALUE && CSELIB_VAL_PTR (x))
13366     return (pic_offset_table_rtx
13367             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
13368   else
13369     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
13370 }
13371
13372 /* Helper function for ix86_delegitimize_address.
13373    Attempt to delegitimize TLS local-exec accesses.  */
13374
13375 static rtx
13376 ix86_delegitimize_tls_address (rtx orig_x)
13377 {
13378   rtx x = orig_x, unspec;
13379   struct ix86_address addr;
13380
13381   if (!TARGET_TLS_DIRECT_SEG_REFS)
13382     return orig_x;
13383   if (MEM_P (x))
13384     x = XEXP (x, 0);
13385   if (GET_CODE (x) != PLUS || GET_MODE (x) != Pmode)
13386     return orig_x;
13387   if (ix86_decompose_address (x, &addr) == 0
13388       || addr.seg != (TARGET_64BIT ? SEG_FS : SEG_GS)
13389       || addr.disp == NULL_RTX
13390       || GET_CODE (addr.disp) != CONST)
13391     return orig_x;
13392   unspec = XEXP (addr.disp, 0);
13393   if (GET_CODE (unspec) == PLUS && CONST_INT_P (XEXP (unspec, 1)))
13394     unspec = XEXP (unspec, 0);
13395   if (GET_CODE (unspec) != UNSPEC || XINT (unspec, 1) != UNSPEC_NTPOFF)
13396     return orig_x;
13397   x = XVECEXP (unspec, 0, 0);
13398   gcc_assert (GET_CODE (x) == SYMBOL_REF);
13399   if (unspec != XEXP (addr.disp, 0))
13400     x = gen_rtx_PLUS (Pmode, x, XEXP (XEXP (addr.disp, 0), 1));
13401   if (addr.index)
13402     {
13403       rtx idx = addr.index;
13404       if (addr.scale != 1)
13405         idx = gen_rtx_MULT (Pmode, idx, GEN_INT (addr.scale));
13406       x = gen_rtx_PLUS (Pmode, idx, x);
13407     }
13408   if (addr.base)
13409     x = gen_rtx_PLUS (Pmode, addr.base, x);
13410   if (MEM_P (orig_x))
13411     x = replace_equiv_address_nv (orig_x, x);
13412   return x;
13413 }
13414
13415 /* In the name of slightly smaller debug output, and to cater to
13416    general assembler lossage, recognize PIC+GOTOFF and turn it back
13417    into a direct symbol reference.
13418
13419    On Darwin, this is necessary to avoid a crash, because Darwin
13420    has a different PIC label for each routine but the DWARF debugging
13421    information is not associated with any particular routine, so it's
13422    necessary to remove references to the PIC label from RTL stored by
13423    the DWARF output code.  */
13424
13425 static rtx
13426 ix86_delegitimize_address (rtx x)
13427 {
13428   rtx orig_x = delegitimize_mem_from_attrs (x);
13429   /* addend is NULL or some rtx if x is something+GOTOFF where
13430      something doesn't include the PIC register.  */
13431   rtx addend = NULL_RTX;
13432   /* reg_addend is NULL or a multiple of some register.  */
13433   rtx reg_addend = NULL_RTX;
13434   /* const_addend is NULL or a const_int.  */
13435   rtx const_addend = NULL_RTX;
13436   /* This is the result, or NULL.  */
13437   rtx result = NULL_RTX;
13438
13439   x = orig_x;
13440
13441   if (MEM_P (x))
13442     x = XEXP (x, 0);
13443
13444   if (TARGET_64BIT)
13445     {
13446       if (GET_CODE (x) != CONST
13447           || GET_CODE (XEXP (x, 0)) != UNSPEC
13448           || (XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
13449               && XINT (XEXP (x, 0), 1) != UNSPEC_PCREL)
13450           || !MEM_P (orig_x))
13451         return ix86_delegitimize_tls_address (orig_x);
13452       x = XVECEXP (XEXP (x, 0), 0, 0);
13453       if (GET_MODE (orig_x) != Pmode)
13454         {
13455           x = simplify_gen_subreg (GET_MODE (orig_x), x, Pmode, 0);
13456           if (x == NULL_RTX)
13457             return orig_x;
13458         }
13459       return x;
13460     }
13461
13462   if (GET_CODE (x) != PLUS
13463       || GET_CODE (XEXP (x, 1)) != CONST)
13464     return ix86_delegitimize_tls_address (orig_x);
13465
13466   if (ix86_pic_register_p (XEXP (x, 0)))
13467     /* %ebx + GOT/GOTOFF */
13468     ;
13469   else if (GET_CODE (XEXP (x, 0)) == PLUS)
13470     {
13471       /* %ebx + %reg * scale + GOT/GOTOFF */
13472       reg_addend = XEXP (x, 0);
13473       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
13474         reg_addend = XEXP (reg_addend, 1);
13475       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
13476         reg_addend = XEXP (reg_addend, 0);
13477       else
13478         {
13479           reg_addend = NULL_RTX;
13480           addend = XEXP (x, 0);
13481         }
13482     }
13483   else
13484     addend = XEXP (x, 0);
13485
13486   x = XEXP (XEXP (x, 1), 0);
13487   if (GET_CODE (x) == PLUS
13488       && CONST_INT_P (XEXP (x, 1)))
13489     {
13490       const_addend = XEXP (x, 1);
13491       x = XEXP (x, 0);
13492     }
13493
13494   if (GET_CODE (x) == UNSPEC
13495       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x) && !addend)
13496           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
13497     result = XVECEXP (x, 0, 0);
13498
13499   if (TARGET_MACHO && darwin_local_data_pic (x)
13500       && !MEM_P (orig_x))
13501     result = XVECEXP (x, 0, 0);
13502
13503   if (! result)
13504     return ix86_delegitimize_tls_address (orig_x);
13505
13506   if (const_addend)
13507     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
13508   if (reg_addend)
13509     result = gen_rtx_PLUS (Pmode, reg_addend, result);
13510   if (addend)
13511     {
13512       /* If the rest of original X doesn't involve the PIC register, add
13513          addend and subtract pic_offset_table_rtx.  This can happen e.g.
13514          for code like:
13515          leal (%ebx, %ecx, 4), %ecx
13516          ...
13517          movl foo@GOTOFF(%ecx), %edx
13518          in which case we return (%ecx - %ebx) + foo.  */
13519       if (pic_offset_table_rtx)
13520         result = gen_rtx_PLUS (Pmode, gen_rtx_MINUS (Pmode, copy_rtx (addend),
13521                                                      pic_offset_table_rtx),
13522                                result);
13523       else
13524         return orig_x;
13525     }
13526   if (GET_MODE (orig_x) != Pmode && MEM_P (orig_x))
13527     {
13528       result = simplify_gen_subreg (GET_MODE (orig_x), result, Pmode, 0);
13529       if (result == NULL_RTX)
13530         return orig_x;
13531     }
13532   return result;
13533 }
13534
13535 /* If X is a machine specific address (i.e. a symbol or label being
13536    referenced as a displacement from the GOT implemented using an
13537    UNSPEC), then return the base term.  Otherwise return X.  */
13538
13539 rtx
13540 ix86_find_base_term (rtx x)
13541 {
13542   rtx term;
13543
13544   if (TARGET_64BIT)
13545     {
13546       if (GET_CODE (x) != CONST)
13547         return x;
13548       term = XEXP (x, 0);
13549       if (GET_CODE (term) == PLUS
13550           && (CONST_INT_P (XEXP (term, 1))
13551               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
13552         term = XEXP (term, 0);
13553       if (GET_CODE (term) != UNSPEC
13554           || (XINT (term, 1) != UNSPEC_GOTPCREL
13555               && XINT (term, 1) != UNSPEC_PCREL))
13556         return x;
13557
13558       return XVECEXP (term, 0, 0);
13559     }
13560
13561   return ix86_delegitimize_address (x);
13562 }
13563 \f
13564 static void
13565 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
13566                     int fp, FILE *file)
13567 {
13568   const char *suffix;
13569
13570   if (mode == CCFPmode || mode == CCFPUmode)
13571     {
13572       code = ix86_fp_compare_code_to_integer (code);
13573       mode = CCmode;
13574     }
13575   if (reverse)
13576     code = reverse_condition (code);
13577
13578   switch (code)
13579     {
13580     case EQ:
13581       switch (mode)
13582         {
13583         case CCAmode:
13584           suffix = "a";
13585           break;
13586
13587         case CCCmode:
13588           suffix = "c";
13589           break;
13590
13591         case CCOmode:
13592           suffix = "o";
13593           break;
13594
13595         case CCSmode:
13596           suffix = "s";
13597           break;
13598
13599         default:
13600           suffix = "e";
13601         }
13602       break;
13603     case NE:
13604       switch (mode)
13605         {
13606         case CCAmode:
13607           suffix = "na";
13608           break;
13609
13610         case CCCmode:
13611           suffix = "nc";
13612           break;
13613
13614         case CCOmode:
13615           suffix = "no";
13616           break;
13617
13618         case CCSmode:
13619           suffix = "ns";
13620           break;
13621
13622         default:
13623           suffix = "ne";
13624         }
13625       break;
13626     case GT:
13627       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
13628       suffix = "g";
13629       break;
13630     case GTU:
13631       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
13632          Those same assemblers have the same but opposite lossage on cmov.  */
13633       if (mode == CCmode)
13634         suffix = fp ? "nbe" : "a";
13635       else if (mode == CCCmode)
13636         suffix = "b";
13637       else
13638         gcc_unreachable ();
13639       break;
13640     case LT:
13641       switch (mode)
13642         {
13643         case CCNOmode:
13644         case CCGOCmode:
13645           suffix = "s";
13646           break;
13647
13648         case CCmode:
13649         case CCGCmode:
13650           suffix = "l";
13651           break;
13652
13653         default:
13654           gcc_unreachable ();
13655         }
13656       break;
13657     case LTU:
13658       gcc_assert (mode == CCmode || mode == CCCmode);
13659       suffix = "b";
13660       break;
13661     case GE:
13662       switch (mode)
13663         {
13664         case CCNOmode:
13665         case CCGOCmode:
13666           suffix = "ns";
13667           break;
13668
13669         case CCmode:
13670         case CCGCmode:
13671           suffix = "ge";
13672           break;
13673
13674         default:
13675           gcc_unreachable ();
13676         }
13677       break;
13678     case GEU:
13679       /* ??? As above.  */
13680       gcc_assert (mode == CCmode || mode == CCCmode);
13681       suffix = fp ? "nb" : "ae";
13682       break;
13683     case LE:
13684       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
13685       suffix = "le";
13686       break;
13687     case LEU:
13688       /* ??? As above.  */
13689       if (mode == CCmode)
13690         suffix = "be";
13691       else if (mode == CCCmode)
13692         suffix = fp ? "nb" : "ae";
13693       else
13694         gcc_unreachable ();
13695       break;
13696     case UNORDERED:
13697       suffix = fp ? "u" : "p";
13698       break;
13699     case ORDERED:
13700       suffix = fp ? "nu" : "np";
13701       break;
13702     default:
13703       gcc_unreachable ();
13704     }
13705   fputs (suffix, file);
13706 }
13707
13708 /* Print the name of register X to FILE based on its machine mode and number.
13709    If CODE is 'w', pretend the mode is HImode.
13710    If CODE is 'b', pretend the mode is QImode.
13711    If CODE is 'k', pretend the mode is SImode.
13712    If CODE is 'q', pretend the mode is DImode.
13713    If CODE is 'x', pretend the mode is V4SFmode.
13714    If CODE is 't', pretend the mode is V8SFmode.
13715    If CODE is 'h', pretend the reg is the 'high' byte register.
13716    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
13717    If CODE is 'd', duplicate the operand for AVX instruction.
13718  */
13719
13720 void
13721 print_reg (rtx x, int code, FILE *file)
13722 {
13723   const char *reg;
13724   bool duplicated = code == 'd' && TARGET_AVX;
13725
13726   gcc_assert (x == pc_rtx
13727               || (REGNO (x) != ARG_POINTER_REGNUM
13728                   && REGNO (x) != FRAME_POINTER_REGNUM
13729                   && REGNO (x) != FLAGS_REG
13730                   && REGNO (x) != FPSR_REG
13731                   && REGNO (x) != FPCR_REG));
13732
13733   if (ASSEMBLER_DIALECT == ASM_ATT)
13734     putc ('%', file);
13735
13736   if (x == pc_rtx)
13737     {
13738       gcc_assert (TARGET_64BIT);
13739       fputs ("rip", file);
13740       return;
13741     }
13742
13743   if (code == 'w' || MMX_REG_P (x))
13744     code = 2;
13745   else if (code == 'b')
13746     code = 1;
13747   else if (code == 'k')
13748     code = 4;
13749   else if (code == 'q')
13750     code = 8;
13751   else if (code == 'y')
13752     code = 3;
13753   else if (code == 'h')
13754     code = 0;
13755   else if (code == 'x')
13756     code = 16;
13757   else if (code == 't')
13758     code = 32;
13759   else
13760     code = GET_MODE_SIZE (GET_MODE (x));
13761
13762   /* Irritatingly, AMD extended registers use different naming convention
13763      from the normal registers.  */
13764   if (REX_INT_REG_P (x))
13765     {
13766       gcc_assert (TARGET_64BIT);
13767       switch (code)
13768         {
13769           case 0:
13770             error ("extended registers have no high halves");
13771             break;
13772           case 1:
13773             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
13774             break;
13775           case 2:
13776             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
13777             break;
13778           case 4:
13779             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
13780             break;
13781           case 8:
13782             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
13783             break;
13784           default:
13785             error ("unsupported operand size for extended register");
13786             break;
13787         }
13788       return;
13789     }
13790
13791   reg = NULL;
13792   switch (code)
13793     {
13794     case 3:
13795       if (STACK_TOP_P (x))
13796         {
13797           reg = "st(0)";
13798           break;
13799         }
13800       /* FALLTHRU */
13801     case 8:
13802     case 4:
13803     case 12:
13804       if (! ANY_FP_REG_P (x))
13805         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
13806       /* FALLTHRU */
13807     case 16:
13808     case 2:
13809     normal:
13810       reg = hi_reg_name[REGNO (x)];
13811       break;
13812     case 1:
13813       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
13814         goto normal;
13815       reg = qi_reg_name[REGNO (x)];
13816       break;
13817     case 0:
13818       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
13819         goto normal;
13820       reg = qi_high_reg_name[REGNO (x)];
13821       break;
13822     case 32:
13823       if (SSE_REG_P (x))
13824         {
13825           gcc_assert (!duplicated);
13826           putc ('y', file);
13827           fputs (hi_reg_name[REGNO (x)] + 1, file);
13828           return;
13829         }
13830       break;
13831     default:
13832       gcc_unreachable ();
13833     }
13834
13835   fputs (reg, file);
13836   if (duplicated)
13837     {
13838       if (ASSEMBLER_DIALECT == ASM_ATT)
13839         fprintf (file, ", %%%s", reg);
13840       else
13841         fprintf (file, ", %s", reg);
13842     }
13843 }
13844
13845 /* Locate some local-dynamic symbol still in use by this function
13846    so that we can print its name in some tls_local_dynamic_base
13847    pattern.  */
13848
13849 static int
13850 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
13851 {
13852   rtx x = *px;
13853
13854   if (GET_CODE (x) == SYMBOL_REF
13855       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
13856     {
13857       cfun->machine->some_ld_name = XSTR (x, 0);
13858       return 1;
13859     }
13860
13861   return 0;
13862 }
13863
13864 static const char *
13865 get_some_local_dynamic_name (void)
13866 {
13867   rtx insn;
13868
13869   if (cfun->machine->some_ld_name)
13870     return cfun->machine->some_ld_name;
13871
13872   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
13873     if (NONDEBUG_INSN_P (insn)
13874         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
13875       return cfun->machine->some_ld_name;
13876
13877   return NULL;
13878 }
13879
13880 /* Meaning of CODE:
13881    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
13882    C -- print opcode suffix for set/cmov insn.
13883    c -- like C, but print reversed condition
13884    F,f -- likewise, but for floating-point.
13885    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
13886         otherwise nothing
13887    R -- print the prefix for register names.
13888    z -- print the opcode suffix for the size of the current operand.
13889    Z -- likewise, with special suffixes for x87 instructions.
13890    * -- print a star (in certain assembler syntax)
13891    A -- print an absolute memory reference.
13892    w -- print the operand as if it's a "word" (HImode) even if it isn't.
13893    s -- print a shift double count, followed by the assemblers argument
13894         delimiter.
13895    b -- print the QImode name of the register for the indicated operand.
13896         %b0 would print %al if operands[0] is reg 0.
13897    w --  likewise, print the HImode name of the register.
13898    k --  likewise, print the SImode name of the register.
13899    q --  likewise, print the DImode name of the register.
13900    x --  likewise, print the V4SFmode name of the register.
13901    t --  likewise, print the V8SFmode name of the register.
13902    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
13903    y -- print "st(0)" instead of "st" as a register.
13904    d -- print duplicated register operand for AVX instruction.
13905    D -- print condition for SSE cmp instruction.
13906    P -- if PIC, print an @PLT suffix.
13907    X -- don't print any sort of PIC '@' suffix for a symbol.
13908    & -- print some in-use local-dynamic symbol name.
13909    H -- print a memory address offset by 8; used for sse high-parts
13910    Y -- print condition for XOP pcom* instruction.
13911    + -- print a branch hint as 'cs' or 'ds' prefix
13912    ; -- print a semicolon (after prefixes due to bug in older gas).
13913    @ -- print a segment register of thread base pointer load
13914  */
13915
13916 void
13917 ix86_print_operand (FILE *file, rtx x, int code)
13918 {
13919   if (code)
13920     {
13921       switch (code)
13922         {
13923         case '*':
13924           if (ASSEMBLER_DIALECT == ASM_ATT)
13925             putc ('*', file);
13926           return;
13927
13928         case '&':
13929           {
13930             const char *name = get_some_local_dynamic_name ();
13931             if (name == NULL)
13932               output_operand_lossage ("'%%&' used without any "
13933                                       "local dynamic TLS references");
13934             else
13935               assemble_name (file, name);
13936             return;
13937           }
13938
13939         case 'A':
13940           switch (ASSEMBLER_DIALECT)
13941             {
13942             case ASM_ATT:
13943               putc ('*', file);
13944               break;
13945
13946             case ASM_INTEL:
13947               /* Intel syntax. For absolute addresses, registers should not
13948                  be surrounded by braces.  */
13949               if (!REG_P (x))
13950                 {
13951                   putc ('[', file);
13952                   ix86_print_operand (file, x, 0);
13953                   putc (']', file);
13954                   return;
13955                 }
13956               break;
13957
13958             default:
13959               gcc_unreachable ();
13960             }
13961
13962           ix86_print_operand (file, x, 0);
13963           return;
13964
13965
13966         case 'L':
13967           if (ASSEMBLER_DIALECT == ASM_ATT)
13968             putc ('l', file);
13969           return;
13970
13971         case 'W':
13972           if (ASSEMBLER_DIALECT == ASM_ATT)
13973             putc ('w', file);
13974           return;
13975
13976         case 'B':
13977           if (ASSEMBLER_DIALECT == ASM_ATT)
13978             putc ('b', file);
13979           return;
13980
13981         case 'Q':
13982           if (ASSEMBLER_DIALECT == ASM_ATT)
13983             putc ('l', file);
13984           return;
13985
13986         case 'S':
13987           if (ASSEMBLER_DIALECT == ASM_ATT)
13988             putc ('s', file);
13989           return;
13990
13991         case 'T':
13992           if (ASSEMBLER_DIALECT == ASM_ATT)
13993             putc ('t', file);
13994           return;
13995
13996         case 'z':
13997           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
13998             {
13999               /* Opcodes don't get size suffixes if using Intel opcodes.  */
14000               if (ASSEMBLER_DIALECT == ASM_INTEL)
14001                 return;
14002
14003               switch (GET_MODE_SIZE (GET_MODE (x)))
14004                 {
14005                 case 1:
14006                   putc ('b', file);
14007                   return;
14008
14009                 case 2:
14010                   putc ('w', file);
14011                   return;
14012
14013                 case 4:
14014                   putc ('l', file);
14015                   return;
14016
14017                 case 8:
14018                   putc ('q', file);
14019                   return;
14020
14021                 default:
14022                   output_operand_lossage
14023                     ("invalid operand size for operand code '%c'", code);
14024                   return;
14025                 }
14026             }
14027
14028           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
14029             warning
14030               (0, "non-integer operand used with operand code '%c'", code);
14031           /* FALLTHRU */
14032
14033         case 'Z':
14034           /* 387 opcodes don't get size suffixes if using Intel opcodes.  */
14035           if (ASSEMBLER_DIALECT == ASM_INTEL)
14036             return;
14037
14038           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
14039             {
14040               switch (GET_MODE_SIZE (GET_MODE (x)))
14041                 {
14042                 case 2:
14043 #ifdef HAVE_AS_IX86_FILDS
14044                   putc ('s', file);
14045 #endif
14046                   return;
14047
14048                 case 4:
14049                   putc ('l', file);
14050                   return;
14051
14052                 case 8:
14053 #ifdef HAVE_AS_IX86_FILDQ
14054                   putc ('q', file);
14055 #else
14056                   fputs ("ll", file);
14057 #endif
14058                   return;
14059
14060                 default:
14061                   break;
14062                 }
14063             }
14064           else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
14065             {
14066               /* 387 opcodes don't get size suffixes
14067                  if the operands are registers.  */
14068               if (STACK_REG_P (x))
14069                 return;
14070
14071               switch (GET_MODE_SIZE (GET_MODE (x)))
14072                 {
14073                 case 4:
14074                   putc ('s', file);
14075                   return;
14076
14077                 case 8:
14078                   putc ('l', file);
14079                   return;
14080
14081                 case 12:
14082                 case 16:
14083                   putc ('t', file);
14084                   return;
14085
14086                 default:
14087                   break;
14088                 }
14089             }
14090           else
14091             {
14092               output_operand_lossage
14093                 ("invalid operand type used with operand code '%c'", code);
14094               return;
14095             }
14096
14097           output_operand_lossage
14098             ("invalid operand size for operand code '%c'", code);
14099           return;
14100
14101         case 'd':
14102         case 'b':
14103         case 'w':
14104         case 'k':
14105         case 'q':
14106         case 'h':
14107         case 't':
14108         case 'y':
14109         case 'x':
14110         case 'X':
14111         case 'P':
14112           break;
14113
14114         case 's':
14115           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
14116             {
14117               ix86_print_operand (file, x, 0);
14118               fputs (", ", file);
14119             }
14120           return;
14121
14122         case 'D':
14123           /* Little bit of braindamage here.  The SSE compare instructions
14124              does use completely different names for the comparisons that the
14125              fp conditional moves.  */
14126           if (TARGET_AVX)
14127             {
14128               switch (GET_CODE (x))
14129                 {
14130                 case EQ:
14131                   fputs ("eq", file);
14132                   break;
14133                 case UNEQ:
14134                   fputs ("eq_us", file);
14135                   break;
14136                 case LT:
14137                   fputs ("lt", file);
14138                   break;
14139                 case UNLT:
14140                   fputs ("nge", file);
14141                   break;
14142                 case LE:
14143                   fputs ("le", file);
14144                   break;
14145                 case UNLE:
14146                   fputs ("ngt", file);
14147                   break;
14148                 case UNORDERED:
14149                   fputs ("unord", file);
14150                   break;
14151                 case NE:
14152                   fputs ("neq", file);
14153                   break;
14154                 case LTGT:
14155                   fputs ("neq_oq", file);
14156                   break;
14157                 case GE:
14158                   fputs ("ge", file);
14159                   break;
14160                 case UNGE:
14161                   fputs ("nlt", file);
14162                   break;
14163                 case GT:
14164                   fputs ("gt", file);
14165                   break;
14166                 case UNGT:
14167                   fputs ("nle", file);
14168                   break;
14169                 case ORDERED:
14170                   fputs ("ord", file);
14171                   break;
14172                 default:
14173                   output_operand_lossage ("operand is not a condition code, "
14174                                           "invalid operand code 'D'");
14175                   return;
14176                 }
14177             }
14178           else
14179             {
14180               switch (GET_CODE (x))
14181                 {
14182                 case EQ:
14183                 case UNEQ:
14184                   fputs ("eq", file);
14185                   break;
14186                 case LT:
14187                 case UNLT:
14188                   fputs ("lt", file);
14189                   break;
14190                 case LE:
14191                 case UNLE:
14192                   fputs ("le", file);
14193                   break;
14194                 case UNORDERED:
14195                   fputs ("unord", file);
14196                   break;
14197                 case NE:
14198                 case LTGT:
14199                   fputs ("neq", file);
14200                   break;
14201                 case UNGE:
14202                 case GE:
14203                   fputs ("nlt", file);
14204                   break;
14205                 case UNGT:
14206                 case GT:
14207                   fputs ("nle", file);
14208                   break;
14209                 case ORDERED:
14210                   fputs ("ord", file);
14211                   break;
14212                 default:
14213                   output_operand_lossage ("operand is not a condition code, "
14214                                           "invalid operand code 'D'");
14215                   return;
14216                 }
14217             }
14218           return;
14219         case 'O':
14220 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14221           if (ASSEMBLER_DIALECT == ASM_ATT)
14222             {
14223               switch (GET_MODE (x))
14224                 {
14225                 case HImode: putc ('w', file); break;
14226                 case SImode:
14227                 case SFmode: putc ('l', file); break;
14228                 case DImode:
14229                 case DFmode: putc ('q', file); break;
14230                 default: gcc_unreachable ();
14231                 }
14232               putc ('.', file);
14233             }
14234 #endif
14235           return;
14236         case 'C':
14237           if (!COMPARISON_P (x))
14238             {
14239               output_operand_lossage ("operand is neither a constant nor a "
14240                                       "condition code, invalid operand code "
14241                                       "'C'");
14242               return;
14243             }
14244           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
14245           return;
14246         case 'F':
14247           if (!COMPARISON_P (x))
14248             {
14249               output_operand_lossage ("operand is neither a constant nor a "
14250                                       "condition code, invalid operand code "
14251                                       "'F'");
14252               return;
14253             }
14254 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14255           if (ASSEMBLER_DIALECT == ASM_ATT)
14256             putc ('.', file);
14257 #endif
14258           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
14259           return;
14260
14261           /* Like above, but reverse condition */
14262         case 'c':
14263           /* Check to see if argument to %c is really a constant
14264              and not a condition code which needs to be reversed.  */
14265           if (!COMPARISON_P (x))
14266             {
14267               output_operand_lossage ("operand is neither a constant nor a "
14268                                       "condition code, invalid operand "
14269                                       "code 'c'");
14270               return;
14271             }
14272           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
14273           return;
14274         case 'f':
14275           if (!COMPARISON_P (x))
14276             {
14277               output_operand_lossage ("operand is neither a constant nor a "
14278                                       "condition code, invalid operand "
14279                                       "code 'f'");
14280               return;
14281             }
14282 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14283           if (ASSEMBLER_DIALECT == ASM_ATT)
14284             putc ('.', file);
14285 #endif
14286           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
14287           return;
14288
14289         case 'H':
14290           /* It doesn't actually matter what mode we use here, as we're
14291              only going to use this for printing.  */
14292           x = adjust_address_nv (x, DImode, 8);
14293           break;
14294
14295         case '+':
14296           {
14297             rtx x;
14298
14299             if (!optimize
14300                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
14301               return;
14302
14303             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
14304             if (x)
14305               {
14306                 int pred_val = INTVAL (XEXP (x, 0));
14307
14308                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
14309                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
14310                   {
14311                     int taken = pred_val > REG_BR_PROB_BASE / 2;
14312                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
14313
14314                     /* Emit hints only in the case default branch prediction
14315                        heuristics would fail.  */
14316                     if (taken != cputaken)
14317                       {
14318                         /* We use 3e (DS) prefix for taken branches and
14319                            2e (CS) prefix for not taken branches.  */
14320                         if (taken)
14321                           fputs ("ds ; ", file);
14322                         else
14323                           fputs ("cs ; ", file);
14324                       }
14325                   }
14326               }
14327             return;
14328           }
14329
14330         case 'Y':
14331           switch (GET_CODE (x))
14332             {
14333             case NE:
14334               fputs ("neq", file);
14335               break;
14336             case EQ:
14337               fputs ("eq", file);
14338               break;
14339             case GE:
14340             case GEU:
14341               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
14342               break;
14343             case GT:
14344             case GTU:
14345               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
14346               break;
14347             case LE:
14348             case LEU:
14349               fputs ("le", file);
14350               break;
14351             case LT:
14352             case LTU:
14353               fputs ("lt", file);
14354               break;
14355             case UNORDERED:
14356               fputs ("unord", file);
14357               break;
14358             case ORDERED:
14359               fputs ("ord", file);
14360               break;
14361             case UNEQ:
14362               fputs ("ueq", file);
14363               break;
14364             case UNGE:
14365               fputs ("nlt", file);
14366               break;
14367             case UNGT:
14368               fputs ("nle", file);
14369               break;
14370             case UNLE:
14371               fputs ("ule", file);
14372               break;
14373             case UNLT:
14374               fputs ("ult", file);
14375               break;
14376             case LTGT:
14377               fputs ("une", file);
14378               break;
14379             default:
14380               output_operand_lossage ("operand is not a condition code, "
14381                                       "invalid operand code 'Y'");
14382               return;
14383             }
14384           return;
14385
14386         case ';':
14387 #ifndef HAVE_AS_IX86_REP_LOCK_PREFIX
14388           putc (';', file);
14389 #endif
14390           return;
14391
14392         case '@':
14393           if (ASSEMBLER_DIALECT == ASM_ATT)
14394             putc ('%', file);
14395
14396           /* The kernel uses a different segment register for performance
14397              reasons; a system call would not have to trash the userspace
14398              segment register, which would be expensive.  */
14399           if (TARGET_64BIT && ix86_cmodel != CM_KERNEL)
14400             fputs ("fs", file);
14401           else
14402             fputs ("gs", file);
14403           return;
14404
14405         default:
14406             output_operand_lossage ("invalid operand code '%c'", code);
14407         }
14408     }
14409
14410   if (REG_P (x))
14411     print_reg (x, code, file);
14412
14413   else if (MEM_P (x))
14414     {
14415       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
14416       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
14417           && GET_MODE (x) != BLKmode)
14418         {
14419           const char * size;
14420           switch (GET_MODE_SIZE (GET_MODE (x)))
14421             {
14422             case 1: size = "BYTE"; break;
14423             case 2: size = "WORD"; break;
14424             case 4: size = "DWORD"; break;
14425             case 8: size = "QWORD"; break;
14426             case 12: size = "TBYTE"; break;
14427             case 16:
14428               if (GET_MODE (x) == XFmode)
14429                 size = "TBYTE";
14430               else
14431                 size = "XMMWORD";
14432               break;
14433             case 32: size = "YMMWORD"; break;
14434             default:
14435               gcc_unreachable ();
14436             }
14437
14438           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
14439           if (code == 'b')
14440             size = "BYTE";
14441           else if (code == 'w')
14442             size = "WORD";
14443           else if (code == 'k')
14444             size = "DWORD";
14445
14446           fputs (size, file);
14447           fputs (" PTR ", file);
14448         }
14449
14450       x = XEXP (x, 0);
14451       /* Avoid (%rip) for call operands.  */
14452       if (CONSTANT_ADDRESS_P (x) && code == 'P'
14453           && !CONST_INT_P (x))
14454         output_addr_const (file, x);
14455       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
14456         output_operand_lossage ("invalid constraints for operand");
14457       else
14458         output_address (x);
14459     }
14460
14461   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
14462     {
14463       REAL_VALUE_TYPE r;
14464       long l;
14465
14466       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
14467       REAL_VALUE_TO_TARGET_SINGLE (r, l);
14468
14469       if (ASSEMBLER_DIALECT == ASM_ATT)
14470         putc ('$', file);
14471       /* Sign extend 32bit SFmode immediate to 8 bytes.  */
14472       if (code == 'q')
14473         fprintf (file, "0x%08llx", (unsigned long long) (int) l);
14474       else
14475         fprintf (file, "0x%08x", (unsigned int) l);
14476     }
14477
14478   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
14479     {
14480       REAL_VALUE_TYPE r;
14481       long l[2];
14482
14483       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
14484       REAL_VALUE_TO_TARGET_DOUBLE (r, l);
14485
14486       if (ASSEMBLER_DIALECT == ASM_ATT)
14487         putc ('$', file);
14488       fprintf (file, "0x%lx%08lx", l[1] & 0xffffffff, l[0] & 0xffffffff);
14489     }
14490
14491   /* These float cases don't actually occur as immediate operands.  */
14492   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == XFmode)
14493     {
14494       char dstr[30];
14495
14496       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
14497       fputs (dstr, file);
14498     }
14499
14500   else
14501     {
14502       /* We have patterns that allow zero sets of memory, for instance.
14503          In 64-bit mode, we should probably support all 8-byte vectors,
14504          since we can in fact encode that into an immediate.  */
14505       if (GET_CODE (x) == CONST_VECTOR)
14506         {
14507           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
14508           x = const0_rtx;
14509         }
14510
14511       if (code != 'P')
14512         {
14513           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
14514             {
14515               if (ASSEMBLER_DIALECT == ASM_ATT)
14516                 putc ('$', file);
14517             }
14518           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
14519                    || GET_CODE (x) == LABEL_REF)
14520             {
14521               if (ASSEMBLER_DIALECT == ASM_ATT)
14522                 putc ('$', file);
14523               else
14524                 fputs ("OFFSET FLAT:", file);
14525             }
14526         }
14527       if (CONST_INT_P (x))
14528         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
14529       else if (flag_pic || MACHOPIC_INDIRECT)
14530         output_pic_addr_const (file, x, code);
14531       else
14532         output_addr_const (file, x);
14533     }
14534 }
14535
14536 static bool
14537 ix86_print_operand_punct_valid_p (unsigned char code)
14538 {
14539   return (code == '@' || code == '*' || code == '+'
14540           || code == '&' || code == ';');
14541 }
14542 \f
14543 /* Print a memory operand whose address is ADDR.  */
14544
14545 static void
14546 ix86_print_operand_address (FILE *file, rtx addr)
14547 {
14548   struct ix86_address parts;
14549   rtx base, index, disp;
14550   int scale;
14551   int ok = ix86_decompose_address (addr, &parts);
14552
14553   gcc_assert (ok);
14554
14555   base = parts.base;
14556   index = parts.index;
14557   disp = parts.disp;
14558   scale = parts.scale;
14559
14560   switch (parts.seg)
14561     {
14562     case SEG_DEFAULT:
14563       break;
14564     case SEG_FS:
14565     case SEG_GS:
14566       if (ASSEMBLER_DIALECT == ASM_ATT)
14567         putc ('%', file);
14568       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
14569       break;
14570     default:
14571       gcc_unreachable ();
14572     }
14573
14574   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
14575   if (TARGET_64BIT && !base && !index)
14576     {
14577       rtx symbol = disp;
14578
14579       if (GET_CODE (disp) == CONST
14580           && GET_CODE (XEXP (disp, 0)) == PLUS
14581           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
14582         symbol = XEXP (XEXP (disp, 0), 0);
14583
14584       if (GET_CODE (symbol) == LABEL_REF
14585           || (GET_CODE (symbol) == SYMBOL_REF
14586               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
14587         base = pc_rtx;
14588     }
14589   if (!base && !index)
14590     {
14591       /* Displacement only requires special attention.  */
14592
14593       if (CONST_INT_P (disp))
14594         {
14595           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
14596             fputs ("ds:", file);
14597           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
14598         }
14599       else if (flag_pic)
14600         output_pic_addr_const (file, disp, 0);
14601       else
14602         output_addr_const (file, disp);
14603     }
14604   else
14605     {
14606       if (ASSEMBLER_DIALECT == ASM_ATT)
14607         {
14608           if (disp)
14609             {
14610               if (flag_pic)
14611                 output_pic_addr_const (file, disp, 0);
14612               else if (GET_CODE (disp) == LABEL_REF)
14613                 output_asm_label (disp);
14614               else
14615                 output_addr_const (file, disp);
14616             }
14617
14618           putc ('(', file);
14619           if (base)
14620             print_reg (base, 0, file);
14621           if (index)
14622             {
14623               putc (',', file);
14624               print_reg (index, 0, file);
14625               if (scale != 1)
14626                 fprintf (file, ",%d", scale);
14627             }
14628           putc (')', file);
14629         }
14630       else
14631         {
14632           rtx offset = NULL_RTX;
14633
14634           if (disp)
14635             {
14636               /* Pull out the offset of a symbol; print any symbol itself.  */
14637               if (GET_CODE (disp) == CONST
14638                   && GET_CODE (XEXP (disp, 0)) == PLUS
14639                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
14640                 {
14641                   offset = XEXP (XEXP (disp, 0), 1);
14642                   disp = gen_rtx_CONST (VOIDmode,
14643                                         XEXP (XEXP (disp, 0), 0));
14644                 }
14645
14646               if (flag_pic)
14647                 output_pic_addr_const (file, disp, 0);
14648               else if (GET_CODE (disp) == LABEL_REF)
14649                 output_asm_label (disp);
14650               else if (CONST_INT_P (disp))
14651                 offset = disp;
14652               else
14653                 output_addr_const (file, disp);
14654             }
14655
14656           putc ('[', file);
14657           if (base)
14658             {
14659               print_reg (base, 0, file);
14660               if (offset)
14661                 {
14662                   if (INTVAL (offset) >= 0)
14663                     putc ('+', file);
14664                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
14665                 }
14666             }
14667           else if (offset)
14668             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
14669           else
14670             putc ('0', file);
14671
14672           if (index)
14673             {
14674               putc ('+', file);
14675               print_reg (index, 0, file);
14676               if (scale != 1)
14677                 fprintf (file, "*%d", scale);
14678             }
14679           putc (']', file);
14680         }
14681     }
14682 }
14683
14684 /* Implementation of TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
14685
14686 static bool
14687 i386_asm_output_addr_const_extra (FILE *file, rtx x)
14688 {
14689   rtx op;
14690
14691   if (GET_CODE (x) != UNSPEC)
14692     return false;
14693
14694   op = XVECEXP (x, 0, 0);
14695   switch (XINT (x, 1))
14696     {
14697     case UNSPEC_GOTTPOFF:
14698       output_addr_const (file, op);
14699       /* FIXME: This might be @TPOFF in Sun ld.  */
14700       fputs ("@gottpoff", file);
14701       break;
14702     case UNSPEC_TPOFF:
14703       output_addr_const (file, op);
14704       fputs ("@tpoff", file);
14705       break;
14706     case UNSPEC_NTPOFF:
14707       output_addr_const (file, op);
14708       if (TARGET_64BIT)
14709         fputs ("@tpoff", file);
14710       else
14711         fputs ("@ntpoff", file);
14712       break;
14713     case UNSPEC_DTPOFF:
14714       output_addr_const (file, op);
14715       fputs ("@dtpoff", file);
14716       break;
14717     case UNSPEC_GOTNTPOFF:
14718       output_addr_const (file, op);
14719       if (TARGET_64BIT)
14720         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
14721                "@gottpoff(%rip)" : "@gottpoff[rip]", file);
14722       else
14723         fputs ("@gotntpoff", file);
14724       break;
14725     case UNSPEC_INDNTPOFF:
14726       output_addr_const (file, op);
14727       fputs ("@indntpoff", file);
14728       break;
14729 #if TARGET_MACHO
14730     case UNSPEC_MACHOPIC_OFFSET:
14731       output_addr_const (file, op);
14732       putc ('-', file);
14733       machopic_output_function_base_name (file);
14734       break;
14735 #endif
14736
14737     case UNSPEC_STACK_CHECK:
14738       {
14739         int offset;
14740
14741         gcc_assert (flag_split_stack);
14742
14743 #ifdef TARGET_THREAD_SPLIT_STACK_OFFSET
14744         offset = TARGET_THREAD_SPLIT_STACK_OFFSET;
14745 #else
14746         gcc_unreachable ();
14747 #endif
14748
14749         fprintf (file, "%s:%d", TARGET_64BIT ? "%fs" : "%gs", offset);
14750       }
14751       break;
14752
14753     default:
14754       return false;
14755     }
14756
14757   return true;
14758 }
14759 \f
14760 /* Split one or more double-mode RTL references into pairs of half-mode
14761    references.  The RTL can be REG, offsettable MEM, integer constant, or
14762    CONST_DOUBLE.  "operands" is a pointer to an array of double-mode RTLs to
14763    split and "num" is its length.  lo_half and hi_half are output arrays
14764    that parallel "operands".  */
14765
14766 void
14767 split_double_mode (enum machine_mode mode, rtx operands[],
14768                    int num, rtx lo_half[], rtx hi_half[])
14769 {
14770   enum machine_mode half_mode;
14771   unsigned int byte;
14772
14773   switch (mode)
14774     {
14775     case TImode:
14776       half_mode = DImode;
14777       break;
14778     case DImode:
14779       half_mode = SImode;
14780       break;
14781     default:
14782       gcc_unreachable ();
14783     }
14784
14785   byte = GET_MODE_SIZE (half_mode);
14786
14787   while (num--)
14788     {
14789       rtx op = operands[num];
14790
14791       /* simplify_subreg refuse to split volatile memory addresses,
14792          but we still have to handle it.  */
14793       if (MEM_P (op))
14794         {
14795           lo_half[num] = adjust_address (op, half_mode, 0);
14796           hi_half[num] = adjust_address (op, half_mode, byte);
14797         }
14798       else
14799         {
14800           lo_half[num] = simplify_gen_subreg (half_mode, op,
14801                                               GET_MODE (op) == VOIDmode
14802                                               ? mode : GET_MODE (op), 0);
14803           hi_half[num] = simplify_gen_subreg (half_mode, op,
14804                                               GET_MODE (op) == VOIDmode
14805                                               ? mode : GET_MODE (op), byte);
14806         }
14807     }
14808 }
14809 \f
14810 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
14811    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
14812    is the expression of the binary operation.  The output may either be
14813    emitted here, or returned to the caller, like all output_* functions.
14814
14815    There is no guarantee that the operands are the same mode, as they
14816    might be within FLOAT or FLOAT_EXTEND expressions.  */
14817
14818 #ifndef SYSV386_COMPAT
14819 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
14820    wants to fix the assemblers because that causes incompatibility
14821    with gcc.  No-one wants to fix gcc because that causes
14822    incompatibility with assemblers...  You can use the option of
14823    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
14824 #define SYSV386_COMPAT 1
14825 #endif
14826
14827 const char *
14828 output_387_binary_op (rtx insn, rtx *operands)
14829 {
14830   static char buf[40];
14831   const char *p;
14832   const char *ssep;
14833   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
14834
14835 #ifdef ENABLE_CHECKING
14836   /* Even if we do not want to check the inputs, this documents input
14837      constraints.  Which helps in understanding the following code.  */
14838   if (STACK_REG_P (operands[0])
14839       && ((REG_P (operands[1])
14840            && REGNO (operands[0]) == REGNO (operands[1])
14841            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
14842           || (REG_P (operands[2])
14843               && REGNO (operands[0]) == REGNO (operands[2])
14844               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
14845       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
14846     ; /* ok */
14847   else
14848     gcc_assert (is_sse);
14849 #endif
14850
14851   switch (GET_CODE (operands[3]))
14852     {
14853     case PLUS:
14854       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14855           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14856         p = "fiadd";
14857       else
14858         p = "fadd";
14859       ssep = "vadd";
14860       break;
14861
14862     case MINUS:
14863       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14864           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14865         p = "fisub";
14866       else
14867         p = "fsub";
14868       ssep = "vsub";
14869       break;
14870
14871     case MULT:
14872       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14873           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14874         p = "fimul";
14875       else
14876         p = "fmul";
14877       ssep = "vmul";
14878       break;
14879
14880     case DIV:
14881       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14882           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14883         p = "fidiv";
14884       else
14885         p = "fdiv";
14886       ssep = "vdiv";
14887       break;
14888
14889     default:
14890       gcc_unreachable ();
14891     }
14892
14893   if (is_sse)
14894    {
14895      if (TARGET_AVX)
14896        {
14897          strcpy (buf, ssep);
14898          if (GET_MODE (operands[0]) == SFmode)
14899            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
14900          else
14901            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
14902        }
14903      else
14904        {
14905          strcpy (buf, ssep + 1);
14906          if (GET_MODE (operands[0]) == SFmode)
14907            strcat (buf, "ss\t{%2, %0|%0, %2}");
14908          else
14909            strcat (buf, "sd\t{%2, %0|%0, %2}");
14910        }
14911       return buf;
14912    }
14913   strcpy (buf, p);
14914
14915   switch (GET_CODE (operands[3]))
14916     {
14917     case MULT:
14918     case PLUS:
14919       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
14920         {
14921           rtx temp = operands[2];
14922           operands[2] = operands[1];
14923           operands[1] = temp;
14924         }
14925
14926       /* know operands[0] == operands[1].  */
14927
14928       if (MEM_P (operands[2]))
14929         {
14930           p = "%Z2\t%2";
14931           break;
14932         }
14933
14934       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
14935         {
14936           if (STACK_TOP_P (operands[0]))
14937             /* How is it that we are storing to a dead operand[2]?
14938                Well, presumably operands[1] is dead too.  We can't
14939                store the result to st(0) as st(0) gets popped on this
14940                instruction.  Instead store to operands[2] (which I
14941                think has to be st(1)).  st(1) will be popped later.
14942                gcc <= 2.8.1 didn't have this check and generated
14943                assembly code that the Unixware assembler rejected.  */
14944             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
14945           else
14946             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
14947           break;
14948         }
14949
14950       if (STACK_TOP_P (operands[0]))
14951         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
14952       else
14953         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
14954       break;
14955
14956     case MINUS:
14957     case DIV:
14958       if (MEM_P (operands[1]))
14959         {
14960           p = "r%Z1\t%1";
14961           break;
14962         }
14963
14964       if (MEM_P (operands[2]))
14965         {
14966           p = "%Z2\t%2";
14967           break;
14968         }
14969
14970       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
14971         {
14972 #if SYSV386_COMPAT
14973           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
14974              derived assemblers, confusingly reverse the direction of
14975              the operation for fsub{r} and fdiv{r} when the
14976              destination register is not st(0).  The Intel assembler
14977              doesn't have this brain damage.  Read !SYSV386_COMPAT to
14978              figure out what the hardware really does.  */
14979           if (STACK_TOP_P (operands[0]))
14980             p = "{p\t%0, %2|rp\t%2, %0}";
14981           else
14982             p = "{rp\t%2, %0|p\t%0, %2}";
14983 #else
14984           if (STACK_TOP_P (operands[0]))
14985             /* As above for fmul/fadd, we can't store to st(0).  */
14986             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
14987           else
14988             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
14989 #endif
14990           break;
14991         }
14992
14993       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
14994         {
14995 #if SYSV386_COMPAT
14996           if (STACK_TOP_P (operands[0]))
14997             p = "{rp\t%0, %1|p\t%1, %0}";
14998           else
14999             p = "{p\t%1, %0|rp\t%0, %1}";
15000 #else
15001           if (STACK_TOP_P (operands[0]))
15002             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
15003           else
15004             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
15005 #endif
15006           break;
15007         }
15008
15009       if (STACK_TOP_P (operands[0]))
15010         {
15011           if (STACK_TOP_P (operands[1]))
15012             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
15013           else
15014             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
15015           break;
15016         }
15017       else if (STACK_TOP_P (operands[1]))
15018         {
15019 #if SYSV386_COMPAT
15020           p = "{\t%1, %0|r\t%0, %1}";
15021 #else
15022           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
15023 #endif
15024         }
15025       else
15026         {
15027 #if SYSV386_COMPAT
15028           p = "{r\t%2, %0|\t%0, %2}";
15029 #else
15030           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
15031 #endif
15032         }
15033       break;
15034
15035     default:
15036       gcc_unreachable ();
15037     }
15038
15039   strcat (buf, p);
15040   return buf;
15041 }
15042
15043 /* Return needed mode for entity in optimize_mode_switching pass.  */
15044
15045 int
15046 ix86_mode_needed (int entity, rtx insn)
15047 {
15048   enum attr_i387_cw mode;
15049
15050   /* The mode UNINITIALIZED is used to store control word after a
15051      function call or ASM pattern.  The mode ANY specify that function
15052      has no requirements on the control word and make no changes in the
15053      bits we are interested in.  */
15054
15055   if (CALL_P (insn)
15056       || (NONJUMP_INSN_P (insn)
15057           && (asm_noperands (PATTERN (insn)) >= 0
15058               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
15059     return I387_CW_UNINITIALIZED;
15060
15061   if (recog_memoized (insn) < 0)
15062     return I387_CW_ANY;
15063
15064   mode = get_attr_i387_cw (insn);
15065
15066   switch (entity)
15067     {
15068     case I387_TRUNC:
15069       if (mode == I387_CW_TRUNC)
15070         return mode;
15071       break;
15072
15073     case I387_FLOOR:
15074       if (mode == I387_CW_FLOOR)
15075         return mode;
15076       break;
15077
15078     case I387_CEIL:
15079       if (mode == I387_CW_CEIL)
15080         return mode;
15081       break;
15082
15083     case I387_MASK_PM:
15084       if (mode == I387_CW_MASK_PM)
15085         return mode;
15086       break;
15087
15088     default:
15089       gcc_unreachable ();
15090     }
15091
15092   return I387_CW_ANY;
15093 }
15094
15095 /* Output code to initialize control word copies used by trunc?f?i and
15096    rounding patterns.  CURRENT_MODE is set to current control word,
15097    while NEW_MODE is set to new control word.  */
15098
15099 void
15100 emit_i387_cw_initialization (int mode)
15101 {
15102   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
15103   rtx new_mode;
15104
15105   enum ix86_stack_slot slot;
15106
15107   rtx reg = gen_reg_rtx (HImode);
15108
15109   emit_insn (gen_x86_fnstcw_1 (stored_mode));
15110   emit_move_insn (reg, copy_rtx (stored_mode));
15111
15112   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
15113       || optimize_function_for_size_p (cfun))
15114     {
15115       switch (mode)
15116         {
15117         case I387_CW_TRUNC:
15118           /* round toward zero (truncate) */
15119           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
15120           slot = SLOT_CW_TRUNC;
15121           break;
15122
15123         case I387_CW_FLOOR:
15124           /* round down toward -oo */
15125           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
15126           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
15127           slot = SLOT_CW_FLOOR;
15128           break;
15129
15130         case I387_CW_CEIL:
15131           /* round up toward +oo */
15132           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
15133           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
15134           slot = SLOT_CW_CEIL;
15135           break;
15136
15137         case I387_CW_MASK_PM:
15138           /* mask precision exception for nearbyint() */
15139           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
15140           slot = SLOT_CW_MASK_PM;
15141           break;
15142
15143         default:
15144           gcc_unreachable ();
15145         }
15146     }
15147   else
15148     {
15149       switch (mode)
15150         {
15151         case I387_CW_TRUNC:
15152           /* round toward zero (truncate) */
15153           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
15154           slot = SLOT_CW_TRUNC;
15155           break;
15156
15157         case I387_CW_FLOOR:
15158           /* round down toward -oo */
15159           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
15160           slot = SLOT_CW_FLOOR;
15161           break;
15162
15163         case I387_CW_CEIL:
15164           /* round up toward +oo */
15165           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
15166           slot = SLOT_CW_CEIL;
15167           break;
15168
15169         case I387_CW_MASK_PM:
15170           /* mask precision exception for nearbyint() */
15171           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
15172           slot = SLOT_CW_MASK_PM;
15173           break;
15174
15175         default:
15176           gcc_unreachable ();
15177         }
15178     }
15179
15180   gcc_assert (slot < MAX_386_STACK_LOCALS);
15181
15182   new_mode = assign_386_stack_local (HImode, slot);
15183   emit_move_insn (new_mode, reg);
15184 }
15185
15186 /* Output code for INSN to convert a float to a signed int.  OPERANDS
15187    are the insn operands.  The output may be [HSD]Imode and the input
15188    operand may be [SDX]Fmode.  */
15189
15190 const char *
15191 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
15192 {
15193   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
15194   int dimode_p = GET_MODE (operands[0]) == DImode;
15195   int round_mode = get_attr_i387_cw (insn);
15196
15197   /* Jump through a hoop or two for DImode, since the hardware has no
15198      non-popping instruction.  We used to do this a different way, but
15199      that was somewhat fragile and broke with post-reload splitters.  */
15200   if ((dimode_p || fisttp) && !stack_top_dies)
15201     output_asm_insn ("fld\t%y1", operands);
15202
15203   gcc_assert (STACK_TOP_P (operands[1]));
15204   gcc_assert (MEM_P (operands[0]));
15205   gcc_assert (GET_MODE (operands[1]) != TFmode);
15206
15207   if (fisttp)
15208       output_asm_insn ("fisttp%Z0\t%0", operands);
15209   else
15210     {
15211       if (round_mode != I387_CW_ANY)
15212         output_asm_insn ("fldcw\t%3", operands);
15213       if (stack_top_dies || dimode_p)
15214         output_asm_insn ("fistp%Z0\t%0", operands);
15215       else
15216         output_asm_insn ("fist%Z0\t%0", operands);
15217       if (round_mode != I387_CW_ANY)
15218         output_asm_insn ("fldcw\t%2", operands);
15219     }
15220
15221   return "";
15222 }
15223
15224 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
15225    have the values zero or one, indicates the ffreep insn's operand
15226    from the OPERANDS array.  */
15227
15228 static const char *
15229 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
15230 {
15231   if (TARGET_USE_FFREEP)
15232 #ifdef HAVE_AS_IX86_FFREEP
15233     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
15234 #else
15235     {
15236       static char retval[32];
15237       int regno = REGNO (operands[opno]);
15238
15239       gcc_assert (FP_REGNO_P (regno));
15240
15241       regno -= FIRST_STACK_REG;
15242
15243       snprintf (retval, sizeof (retval), ASM_SHORT "0xc%ddf", regno);
15244       return retval;
15245     }
15246 #endif
15247
15248   return opno ? "fstp\t%y1" : "fstp\t%y0";
15249 }
15250
15251
15252 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
15253    should be used.  UNORDERED_P is true when fucom should be used.  */
15254
15255 const char *
15256 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
15257 {
15258   int stack_top_dies;
15259   rtx cmp_op0, cmp_op1;
15260   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
15261
15262   if (eflags_p)
15263     {
15264       cmp_op0 = operands[0];
15265       cmp_op1 = operands[1];
15266     }
15267   else
15268     {
15269       cmp_op0 = operands[1];
15270       cmp_op1 = operands[2];
15271     }
15272
15273   if (is_sse)
15274     {
15275       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
15276       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
15277       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
15278       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
15279
15280       if (GET_MODE (operands[0]) == SFmode)
15281         if (unordered_p)
15282           return &ucomiss[TARGET_AVX ? 0 : 1];
15283         else
15284           return &comiss[TARGET_AVX ? 0 : 1];
15285       else
15286         if (unordered_p)
15287           return &ucomisd[TARGET_AVX ? 0 : 1];
15288         else
15289           return &comisd[TARGET_AVX ? 0 : 1];
15290     }
15291
15292   gcc_assert (STACK_TOP_P (cmp_op0));
15293
15294   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
15295
15296   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
15297     {
15298       if (stack_top_dies)
15299         {
15300           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
15301           return output_387_ffreep (operands, 1);
15302         }
15303       else
15304         return "ftst\n\tfnstsw\t%0";
15305     }
15306
15307   if (STACK_REG_P (cmp_op1)
15308       && stack_top_dies
15309       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
15310       && REGNO (cmp_op1) != FIRST_STACK_REG)
15311     {
15312       /* If both the top of the 387 stack dies, and the other operand
15313          is also a stack register that dies, then this must be a
15314          `fcompp' float compare */
15315
15316       if (eflags_p)
15317         {
15318           /* There is no double popping fcomi variant.  Fortunately,
15319              eflags is immune from the fstp's cc clobbering.  */
15320           if (unordered_p)
15321             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
15322           else
15323             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
15324           return output_387_ffreep (operands, 0);
15325         }
15326       else
15327         {
15328           if (unordered_p)
15329             return "fucompp\n\tfnstsw\t%0";
15330           else
15331             return "fcompp\n\tfnstsw\t%0";
15332         }
15333     }
15334   else
15335     {
15336       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
15337
15338       static const char * const alt[16] =
15339       {
15340         "fcom%Z2\t%y2\n\tfnstsw\t%0",
15341         "fcomp%Z2\t%y2\n\tfnstsw\t%0",
15342         "fucom%Z2\t%y2\n\tfnstsw\t%0",
15343         "fucomp%Z2\t%y2\n\tfnstsw\t%0",
15344
15345         "ficom%Z2\t%y2\n\tfnstsw\t%0",
15346         "ficomp%Z2\t%y2\n\tfnstsw\t%0",
15347         NULL,
15348         NULL,
15349
15350         "fcomi\t{%y1, %0|%0, %y1}",
15351         "fcomip\t{%y1, %0|%0, %y1}",
15352         "fucomi\t{%y1, %0|%0, %y1}",
15353         "fucomip\t{%y1, %0|%0, %y1}",
15354
15355         NULL,
15356         NULL,
15357         NULL,
15358         NULL
15359       };
15360
15361       int mask;
15362       const char *ret;
15363
15364       mask  = eflags_p << 3;
15365       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
15366       mask |= unordered_p << 1;
15367       mask |= stack_top_dies;
15368
15369       gcc_assert (mask < 16);
15370       ret = alt[mask];
15371       gcc_assert (ret);
15372
15373       return ret;
15374     }
15375 }
15376
15377 void
15378 ix86_output_addr_vec_elt (FILE *file, int value)
15379 {
15380   const char *directive = ASM_LONG;
15381
15382 #ifdef ASM_QUAD
15383   if (TARGET_64BIT)
15384     directive = ASM_QUAD;
15385 #else
15386   gcc_assert (!TARGET_64BIT);
15387 #endif
15388
15389   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
15390 }
15391
15392 void
15393 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
15394 {
15395   const char *directive = ASM_LONG;
15396
15397 #ifdef ASM_QUAD
15398   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
15399     directive = ASM_QUAD;
15400 #else
15401   gcc_assert (!TARGET_64BIT);
15402 #endif
15403   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
15404   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
15405     fprintf (file, "%s%s%d-%s%d\n",
15406              directive, LPREFIX, value, LPREFIX, rel);
15407   else if (HAVE_AS_GOTOFF_IN_DATA)
15408     fprintf (file, ASM_LONG "%s%d@GOTOFF\n", LPREFIX, value);
15409 #if TARGET_MACHO
15410   else if (TARGET_MACHO)
15411     {
15412       fprintf (file, ASM_LONG "%s%d-", LPREFIX, value);
15413       machopic_output_function_base_name (file);
15414       putc ('\n', file);
15415     }
15416 #endif
15417   else
15418     asm_fprintf (file, ASM_LONG "%U%s+[.-%s%d]\n",
15419                  GOT_SYMBOL_NAME, LPREFIX, value);
15420 }
15421 \f
15422 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
15423    for the target.  */
15424
15425 void
15426 ix86_expand_clear (rtx dest)
15427 {
15428   rtx tmp;
15429
15430   /* We play register width games, which are only valid after reload.  */
15431   gcc_assert (reload_completed);
15432
15433   /* Avoid HImode and its attendant prefix byte.  */
15434   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
15435     dest = gen_rtx_REG (SImode, REGNO (dest));
15436   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
15437
15438   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
15439   if (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ())
15440     {
15441       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
15442       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
15443     }
15444
15445   emit_insn (tmp);
15446 }
15447
15448 /* X is an unchanging MEM.  If it is a constant pool reference, return
15449    the constant pool rtx, else NULL.  */
15450
15451 rtx
15452 maybe_get_pool_constant (rtx x)
15453 {
15454   x = ix86_delegitimize_address (XEXP (x, 0));
15455
15456   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
15457     return get_pool_constant (x);
15458
15459   return NULL_RTX;
15460 }
15461
15462 void
15463 ix86_expand_move (enum machine_mode mode, rtx operands[])
15464 {
15465   rtx op0, op1;
15466   enum tls_model model;
15467
15468   op0 = operands[0];
15469   op1 = operands[1];
15470
15471   if (GET_CODE (op1) == SYMBOL_REF)
15472     {
15473       model = SYMBOL_REF_TLS_MODEL (op1);
15474       if (model)
15475         {
15476           op1 = legitimize_tls_address (op1, model, true);
15477           op1 = force_operand (op1, op0);
15478           if (op1 == op0)
15479             return;
15480         }
15481       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
15482                && SYMBOL_REF_DLLIMPORT_P (op1))
15483         op1 = legitimize_dllimport_symbol (op1, false);
15484     }
15485   else if (GET_CODE (op1) == CONST
15486            && GET_CODE (XEXP (op1, 0)) == PLUS
15487            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
15488     {
15489       rtx addend = XEXP (XEXP (op1, 0), 1);
15490       rtx symbol = XEXP (XEXP (op1, 0), 0);
15491       rtx tmp = NULL;
15492
15493       model = SYMBOL_REF_TLS_MODEL (symbol);
15494       if (model)
15495         tmp = legitimize_tls_address (symbol, model, true);
15496       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
15497                && SYMBOL_REF_DLLIMPORT_P (symbol))
15498         tmp = legitimize_dllimport_symbol (symbol, true);
15499
15500       if (tmp)
15501         {
15502           tmp = force_operand (tmp, NULL);
15503           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
15504                                      op0, 1, OPTAB_DIRECT);
15505           if (tmp == op0)
15506             return;
15507         }
15508     }
15509
15510   if ((flag_pic || MACHOPIC_INDIRECT) 
15511        && mode == Pmode && symbolic_operand (op1, Pmode))
15512     {
15513       if (TARGET_MACHO && !TARGET_64BIT)
15514         {
15515 #if TARGET_MACHO
15516           /* dynamic-no-pic */
15517           if (MACHOPIC_INDIRECT)
15518             {
15519               rtx temp = ((reload_in_progress
15520                            || ((op0 && REG_P (op0))
15521                                && mode == Pmode))
15522                           ? op0 : gen_reg_rtx (Pmode));
15523               op1 = machopic_indirect_data_reference (op1, temp);
15524               if (MACHOPIC_PURE)
15525                 op1 = machopic_legitimize_pic_address (op1, mode,
15526                                                        temp == op1 ? 0 : temp);
15527             }
15528           if (op0 != op1 && GET_CODE (op0) != MEM)
15529             {
15530               rtx insn = gen_rtx_SET (VOIDmode, op0, op1);
15531               emit_insn (insn);
15532               return;
15533             }
15534           if (GET_CODE (op0) == MEM)
15535             op1 = force_reg (Pmode, op1);
15536           else
15537             {
15538               rtx temp = op0;
15539               if (GET_CODE (temp) != REG)
15540                 temp = gen_reg_rtx (Pmode);
15541               temp = legitimize_pic_address (op1, temp);
15542               if (temp == op0)
15543             return;
15544               op1 = temp;
15545             }
15546       /* dynamic-no-pic */
15547 #endif
15548         }
15549       else
15550         {
15551           if (MEM_P (op0))
15552             op1 = force_reg (Pmode, op1);
15553           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
15554             {
15555               rtx reg = can_create_pseudo_p () ? NULL_RTX : op0;
15556               op1 = legitimize_pic_address (op1, reg);
15557               if (op0 == op1)
15558                 return;
15559             }
15560         }
15561     }
15562   else
15563     {
15564       if (MEM_P (op0)
15565           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
15566               || !push_operand (op0, mode))
15567           && MEM_P (op1))
15568         op1 = force_reg (mode, op1);
15569
15570       if (push_operand (op0, mode)
15571           && ! general_no_elim_operand (op1, mode))
15572         op1 = copy_to_mode_reg (mode, op1);
15573
15574       /* Force large constants in 64bit compilation into register
15575          to get them CSEed.  */
15576       if (can_create_pseudo_p ()
15577           && (mode == DImode) && TARGET_64BIT
15578           && immediate_operand (op1, mode)
15579           && !x86_64_zext_immediate_operand (op1, VOIDmode)
15580           && !register_operand (op0, mode)
15581           && optimize)
15582         op1 = copy_to_mode_reg (mode, op1);
15583
15584       if (can_create_pseudo_p ()
15585           && FLOAT_MODE_P (mode)
15586           && GET_CODE (op1) == CONST_DOUBLE)
15587         {
15588           /* If we are loading a floating point constant to a register,
15589              force the value to memory now, since we'll get better code
15590              out the back end.  */
15591
15592           op1 = validize_mem (force_const_mem (mode, op1));
15593           if (!register_operand (op0, mode))
15594             {
15595               rtx temp = gen_reg_rtx (mode);
15596               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
15597               emit_move_insn (op0, temp);
15598               return;
15599             }
15600         }
15601     }
15602
15603   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
15604 }
15605
15606 void
15607 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
15608 {
15609   rtx op0 = operands[0], op1 = operands[1];
15610   unsigned int align = GET_MODE_ALIGNMENT (mode);
15611
15612   /* Force constants other than zero into memory.  We do not know how
15613      the instructions used to build constants modify the upper 64 bits
15614      of the register, once we have that information we may be able
15615      to handle some of them more efficiently.  */
15616   if (can_create_pseudo_p ()
15617       && register_operand (op0, mode)
15618       && (CONSTANT_P (op1)
15619           || (GET_CODE (op1) == SUBREG
15620               && CONSTANT_P (SUBREG_REG (op1))))
15621       && !standard_sse_constant_p (op1))
15622     op1 = validize_mem (force_const_mem (mode, op1));
15623
15624   /* We need to check memory alignment for SSE mode since attribute
15625      can make operands unaligned.  */
15626   if (can_create_pseudo_p ()
15627       && SSE_REG_MODE_P (mode)
15628       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
15629           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
15630     {
15631       rtx tmp[2];
15632
15633       /* ix86_expand_vector_move_misalign() does not like constants ... */
15634       if (CONSTANT_P (op1)
15635           || (GET_CODE (op1) == SUBREG
15636               && CONSTANT_P (SUBREG_REG (op1))))
15637         op1 = validize_mem (force_const_mem (mode, op1));
15638
15639       /* ... nor both arguments in memory.  */
15640       if (!register_operand (op0, mode)
15641           && !register_operand (op1, mode))
15642         op1 = force_reg (mode, op1);
15643
15644       tmp[0] = op0; tmp[1] = op1;
15645       ix86_expand_vector_move_misalign (mode, tmp);
15646       return;
15647     }
15648
15649   /* Make operand1 a register if it isn't already.  */
15650   if (can_create_pseudo_p ()
15651       && !register_operand (op0, mode)
15652       && !register_operand (op1, mode))
15653     {
15654       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
15655       return;
15656     }
15657
15658   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
15659 }
15660
15661 /* Split 32-byte AVX unaligned load and store if needed.  */
15662
15663 static void
15664 ix86_avx256_split_vector_move_misalign (rtx op0, rtx op1)
15665 {
15666   rtx m;
15667   rtx (*extract) (rtx, rtx, rtx);
15668   rtx (*move_unaligned) (rtx, rtx);
15669   enum machine_mode mode;
15670
15671   switch (GET_MODE (op0))
15672     {
15673     default:
15674       gcc_unreachable ();
15675     case V32QImode:
15676       extract = gen_avx_vextractf128v32qi;
15677       move_unaligned = gen_avx_movdqu256;
15678       mode = V16QImode;
15679       break;
15680     case V8SFmode:
15681       extract = gen_avx_vextractf128v8sf;
15682       move_unaligned = gen_avx_movups256;
15683       mode = V4SFmode;
15684       break;
15685     case V4DFmode:
15686       extract = gen_avx_vextractf128v4df;
15687       move_unaligned = gen_avx_movupd256;
15688       mode = V2DFmode;
15689       break;
15690     }
15691
15692   if (MEM_P (op1) && TARGET_AVX256_SPLIT_UNALIGNED_LOAD)
15693     {
15694       rtx r = gen_reg_rtx (mode);
15695       m = adjust_address (op1, mode, 0);
15696       emit_move_insn (r, m);
15697       m = adjust_address (op1, mode, 16);
15698       r = gen_rtx_VEC_CONCAT (GET_MODE (op0), r, m);
15699       emit_move_insn (op0, r);
15700     }
15701   else if (MEM_P (op0) && TARGET_AVX256_SPLIT_UNALIGNED_STORE)
15702     {
15703       m = adjust_address (op0, mode, 0);
15704       emit_insn (extract (m, op1, const0_rtx));
15705       m = adjust_address (op0, mode, 16);
15706       emit_insn (extract (m, op1, const1_rtx));
15707     }
15708   else
15709     emit_insn (move_unaligned (op0, op1));
15710 }
15711
15712 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
15713    straight to ix86_expand_vector_move.  */
15714 /* Code generation for scalar reg-reg moves of single and double precision data:
15715      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
15716        movaps reg, reg
15717      else
15718        movss reg, reg
15719      if (x86_sse_partial_reg_dependency == true)
15720        movapd reg, reg
15721      else
15722        movsd reg, reg
15723
15724    Code generation for scalar loads of double precision data:
15725      if (x86_sse_split_regs == true)
15726        movlpd mem, reg      (gas syntax)
15727      else
15728        movsd mem, reg
15729
15730    Code generation for unaligned packed loads of single precision data
15731    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
15732      if (x86_sse_unaligned_move_optimal)
15733        movups mem, reg
15734
15735      if (x86_sse_partial_reg_dependency == true)
15736        {
15737          xorps  reg, reg
15738          movlps mem, reg
15739          movhps mem+8, reg
15740        }
15741      else
15742        {
15743          movlps mem, reg
15744          movhps mem+8, reg
15745        }
15746
15747    Code generation for unaligned packed loads of double precision data
15748    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
15749      if (x86_sse_unaligned_move_optimal)
15750        movupd mem, reg
15751
15752      if (x86_sse_split_regs == true)
15753        {
15754          movlpd mem, reg
15755          movhpd mem+8, reg
15756        }
15757      else
15758        {
15759          movsd  mem, reg
15760          movhpd mem+8, reg
15761        }
15762  */
15763
15764 void
15765 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
15766 {
15767   rtx op0, op1, m;
15768
15769   op0 = operands[0];
15770   op1 = operands[1];
15771
15772   if (TARGET_AVX)
15773     {
15774       switch (GET_MODE_CLASS (mode))
15775         {
15776         case MODE_VECTOR_INT:
15777         case MODE_INT:
15778           switch (GET_MODE_SIZE (mode))
15779             {
15780             case 16:
15781               /*  If we're optimizing for size, movups is the smallest.  */
15782               if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15783                 {
15784                   op0 = gen_lowpart (V4SFmode, op0);
15785                   op1 = gen_lowpart (V4SFmode, op1);
15786                   emit_insn (gen_avx_movups (op0, op1));
15787                   return;
15788                 }
15789               op0 = gen_lowpart (V16QImode, op0);
15790               op1 = gen_lowpart (V16QImode, op1);
15791               emit_insn (gen_avx_movdqu (op0, op1));
15792               break;
15793             case 32:
15794               op0 = gen_lowpart (V32QImode, op0);
15795               op1 = gen_lowpart (V32QImode, op1);
15796               ix86_avx256_split_vector_move_misalign (op0, op1);
15797               break;
15798             default:
15799               gcc_unreachable ();
15800             }
15801           break;
15802         case MODE_VECTOR_FLOAT:
15803           op0 = gen_lowpart (mode, op0);
15804           op1 = gen_lowpart (mode, op1);
15805
15806           switch (mode)
15807             {
15808             case V4SFmode:
15809               emit_insn (gen_avx_movups (op0, op1));
15810               break;
15811             case V8SFmode:
15812               ix86_avx256_split_vector_move_misalign (op0, op1);
15813               break;
15814             case V2DFmode:
15815               if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15816                 {
15817                   op0 = gen_lowpart (V4SFmode, op0);
15818                   op1 = gen_lowpart (V4SFmode, op1);
15819                   emit_insn (gen_avx_movups (op0, op1));
15820                   return;
15821                 }
15822               emit_insn (gen_avx_movupd (op0, op1));
15823               break;
15824             case V4DFmode:
15825               ix86_avx256_split_vector_move_misalign (op0, op1);
15826               break;
15827             default:
15828               gcc_unreachable ();
15829             }
15830           break;
15831
15832         default:
15833           gcc_unreachable ();
15834         }
15835
15836       return;
15837     }
15838
15839   if (MEM_P (op1))
15840     {
15841       /* If we're optimizing for size, movups is the smallest.  */
15842       if (optimize_insn_for_size_p ()
15843           || TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15844         {
15845           op0 = gen_lowpart (V4SFmode, op0);
15846           op1 = gen_lowpart (V4SFmode, op1);
15847           emit_insn (gen_sse_movups (op0, op1));
15848           return;
15849         }
15850
15851       /* ??? If we have typed data, then it would appear that using
15852          movdqu is the only way to get unaligned data loaded with
15853          integer type.  */
15854       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
15855         {
15856           op0 = gen_lowpart (V16QImode, op0);
15857           op1 = gen_lowpart (V16QImode, op1);
15858           emit_insn (gen_sse2_movdqu (op0, op1));
15859           return;
15860         }
15861
15862       if (TARGET_SSE2 && mode == V2DFmode)
15863         {
15864           rtx zero;
15865
15866           if (TARGET_SSE_UNALIGNED_LOAD_OPTIMAL)
15867             {
15868               op0 = gen_lowpart (V2DFmode, op0);
15869               op1 = gen_lowpart (V2DFmode, op1);
15870               emit_insn (gen_sse2_movupd (op0, op1));
15871               return;
15872             }
15873
15874           /* When SSE registers are split into halves, we can avoid
15875              writing to the top half twice.  */
15876           if (TARGET_SSE_SPLIT_REGS)
15877             {
15878               emit_clobber (op0);
15879               zero = op0;
15880             }
15881           else
15882             {
15883               /* ??? Not sure about the best option for the Intel chips.
15884                  The following would seem to satisfy; the register is
15885                  entirely cleared, breaking the dependency chain.  We
15886                  then store to the upper half, with a dependency depth
15887                  of one.  A rumor has it that Intel recommends two movsd
15888                  followed by an unpacklpd, but this is unconfirmed.  And
15889                  given that the dependency depth of the unpacklpd would
15890                  still be one, I'm not sure why this would be better.  */
15891               zero = CONST0_RTX (V2DFmode);
15892             }
15893
15894           m = adjust_address (op1, DFmode, 0);
15895           emit_insn (gen_sse2_loadlpd (op0, zero, m));
15896           m = adjust_address (op1, DFmode, 8);
15897           emit_insn (gen_sse2_loadhpd (op0, op0, m));
15898         }
15899       else
15900         {
15901           if (TARGET_SSE_UNALIGNED_LOAD_OPTIMAL)
15902             {
15903               op0 = gen_lowpart (V4SFmode, op0);
15904               op1 = gen_lowpart (V4SFmode, op1);
15905               emit_insn (gen_sse_movups (op0, op1));
15906               return;
15907             }
15908
15909           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
15910             emit_move_insn (op0, CONST0_RTX (mode));
15911           else
15912             emit_clobber (op0);
15913
15914           if (mode != V4SFmode)
15915             op0 = gen_lowpart (V4SFmode, op0);
15916           m = adjust_address (op1, V2SFmode, 0);
15917           emit_insn (gen_sse_loadlps (op0, op0, m));
15918           m = adjust_address (op1, V2SFmode, 8);
15919           emit_insn (gen_sse_loadhps (op0, op0, m));
15920         }
15921     }
15922   else if (MEM_P (op0))
15923     {
15924       /* If we're optimizing for size, movups is the smallest.  */
15925       if (optimize_insn_for_size_p ()
15926           || TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15927         {
15928           op0 = gen_lowpart (V4SFmode, op0);
15929           op1 = gen_lowpart (V4SFmode, op1);
15930           emit_insn (gen_sse_movups (op0, op1));
15931           return;
15932         }
15933
15934       /* ??? Similar to above, only less clear because of quote
15935          typeless stores unquote.  */
15936       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
15937           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
15938         {
15939           op0 = gen_lowpart (V16QImode, op0);
15940           op1 = gen_lowpart (V16QImode, op1);
15941           emit_insn (gen_sse2_movdqu (op0, op1));
15942           return;
15943         }
15944
15945       if (TARGET_SSE2 && mode == V2DFmode)
15946         {
15947           if (TARGET_SSE_UNALIGNED_STORE_OPTIMAL)
15948             {
15949               op0 = gen_lowpart (V2DFmode, op0);
15950               op1 = gen_lowpart (V2DFmode, op1);
15951               emit_insn (gen_sse2_movupd (op0, op1));
15952             }
15953           else
15954             {
15955               m = adjust_address (op0, DFmode, 0);
15956               emit_insn (gen_sse2_storelpd (m, op1));
15957               m = adjust_address (op0, DFmode, 8);
15958               emit_insn (gen_sse2_storehpd (m, op1));
15959             }
15960         }
15961       else
15962         {
15963           if (mode != V4SFmode)
15964             op1 = gen_lowpart (V4SFmode, op1);
15965
15966           if (TARGET_SSE_UNALIGNED_STORE_OPTIMAL)
15967             {
15968               op0 = gen_lowpart (V4SFmode, op0);
15969               emit_insn (gen_sse_movups (op0, op1));
15970             }
15971           else
15972             {
15973               m = adjust_address (op0, V2SFmode, 0);
15974               emit_insn (gen_sse_storelps (m, op1));
15975               m = adjust_address (op0, V2SFmode, 8);
15976               emit_insn (gen_sse_storehps (m, op1));
15977             }
15978         }
15979     }
15980   else
15981     gcc_unreachable ();
15982 }
15983
15984 /* Expand a push in MODE.  This is some mode for which we do not support
15985    proper push instructions, at least from the registers that we expect
15986    the value to live in.  */
15987
15988 void
15989 ix86_expand_push (enum machine_mode mode, rtx x)
15990 {
15991   rtx tmp;
15992
15993   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
15994                              GEN_INT (-GET_MODE_SIZE (mode)),
15995                              stack_pointer_rtx, 1, OPTAB_DIRECT);
15996   if (tmp != stack_pointer_rtx)
15997     emit_move_insn (stack_pointer_rtx, tmp);
15998
15999   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
16000
16001   /* When we push an operand onto stack, it has to be aligned at least
16002      at the function argument boundary.  However since we don't have
16003      the argument type, we can't determine the actual argument
16004      boundary.  */
16005   emit_move_insn (tmp, x);
16006 }
16007
16008 /* Helper function of ix86_fixup_binary_operands to canonicalize
16009    operand order.  Returns true if the operands should be swapped.  */
16010
16011 static bool
16012 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
16013                              rtx operands[])
16014 {
16015   rtx dst = operands[0];
16016   rtx src1 = operands[1];
16017   rtx src2 = operands[2];
16018
16019   /* If the operation is not commutative, we can't do anything.  */
16020   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
16021     return false;
16022
16023   /* Highest priority is that src1 should match dst.  */
16024   if (rtx_equal_p (dst, src1))
16025     return false;
16026   if (rtx_equal_p (dst, src2))
16027     return true;
16028
16029   /* Next highest priority is that immediate constants come second.  */
16030   if (immediate_operand (src2, mode))
16031     return false;
16032   if (immediate_operand (src1, mode))
16033     return true;
16034
16035   /* Lowest priority is that memory references should come second.  */
16036   if (MEM_P (src2))
16037     return false;
16038   if (MEM_P (src1))
16039     return true;
16040
16041   return false;
16042 }
16043
16044
16045 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
16046    destination to use for the operation.  If different from the true
16047    destination in operands[0], a copy operation will be required.  */
16048
16049 rtx
16050 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
16051                             rtx operands[])
16052 {
16053   rtx dst = operands[0];
16054   rtx src1 = operands[1];
16055   rtx src2 = operands[2];
16056
16057   /* Canonicalize operand order.  */
16058   if (ix86_swap_binary_operands_p (code, mode, operands))
16059     {
16060       rtx temp;
16061
16062       /* It is invalid to swap operands of different modes.  */
16063       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
16064
16065       temp = src1;
16066       src1 = src2;
16067       src2 = temp;
16068     }
16069
16070   /* Both source operands cannot be in memory.  */
16071   if (MEM_P (src1) && MEM_P (src2))
16072     {
16073       /* Optimization: Only read from memory once.  */
16074       if (rtx_equal_p (src1, src2))
16075         {
16076           src2 = force_reg (mode, src2);
16077           src1 = src2;
16078         }
16079       else
16080         src2 = force_reg (mode, src2);
16081     }
16082
16083   /* If the destination is memory, and we do not have matching source
16084      operands, do things in registers.  */
16085   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
16086     dst = gen_reg_rtx (mode);
16087
16088   /* Source 1 cannot be a constant.  */
16089   if (CONSTANT_P (src1))
16090     src1 = force_reg (mode, src1);
16091
16092   /* Source 1 cannot be a non-matching memory.  */
16093   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
16094     src1 = force_reg (mode, src1);
16095
16096   operands[1] = src1;
16097   operands[2] = src2;
16098   return dst;
16099 }
16100
16101 /* Similarly, but assume that the destination has already been
16102    set up properly.  */
16103
16104 void
16105 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
16106                                     enum machine_mode mode, rtx operands[])
16107 {
16108   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
16109   gcc_assert (dst == operands[0]);
16110 }
16111
16112 /* Attempt to expand a binary operator.  Make the expansion closer to the
16113    actual machine, then just general_operand, which will allow 3 separate
16114    memory references (one output, two input) in a single insn.  */
16115
16116 void
16117 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
16118                              rtx operands[])
16119 {
16120   rtx src1, src2, dst, op, clob;
16121
16122   dst = ix86_fixup_binary_operands (code, mode, operands);
16123   src1 = operands[1];
16124   src2 = operands[2];
16125
16126  /* Emit the instruction.  */
16127
16128   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
16129   if (reload_in_progress)
16130     {
16131       /* Reload doesn't know about the flags register, and doesn't know that
16132          it doesn't want to clobber it.  We can only do this with PLUS.  */
16133       gcc_assert (code == PLUS);
16134       emit_insn (op);
16135     }
16136   else if (reload_completed
16137            && code == PLUS
16138            && !rtx_equal_p (dst, src1))
16139     {
16140       /* This is going to be an LEA; avoid splitting it later.  */
16141       emit_insn (op);
16142     }
16143   else
16144     {
16145       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
16146       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
16147     }
16148
16149   /* Fix up the destination if needed.  */
16150   if (dst != operands[0])
16151     emit_move_insn (operands[0], dst);
16152 }
16153
16154 /* Return TRUE or FALSE depending on whether the binary operator meets the
16155    appropriate constraints.  */
16156
16157 bool
16158 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
16159                          rtx operands[3])
16160 {
16161   rtx dst = operands[0];
16162   rtx src1 = operands[1];
16163   rtx src2 = operands[2];
16164
16165   /* Both source operands cannot be in memory.  */
16166   if (MEM_P (src1) && MEM_P (src2))
16167     return false;
16168
16169   /* Canonicalize operand order for commutative operators.  */
16170   if (ix86_swap_binary_operands_p (code, mode, operands))
16171     {
16172       rtx temp = src1;
16173       src1 = src2;
16174       src2 = temp;
16175     }
16176
16177   /* If the destination is memory, we must have a matching source operand.  */
16178   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
16179       return false;
16180
16181   /* Source 1 cannot be a constant.  */
16182   if (CONSTANT_P (src1))
16183     return false;
16184
16185   /* Source 1 cannot be a non-matching memory.  */
16186   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
16187     {
16188       /* Support "andhi/andsi/anddi" as a zero-extending move.  */
16189       return (code == AND
16190               && (mode == HImode
16191                   || mode == SImode
16192                   || (TARGET_64BIT && mode == DImode))
16193               && CONST_INT_P (src2)
16194               && (INTVAL (src2) == 0xff
16195                   || INTVAL (src2) == 0xffff));
16196     }
16197
16198   return true;
16199 }
16200
16201 /* Attempt to expand a unary operator.  Make the expansion closer to the
16202    actual machine, then just general_operand, which will allow 2 separate
16203    memory references (one output, one input) in a single insn.  */
16204
16205 void
16206 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
16207                             rtx operands[])
16208 {
16209   int matching_memory;
16210   rtx src, dst, op, clob;
16211
16212   dst = operands[0];
16213   src = operands[1];
16214
16215   /* If the destination is memory, and we do not have matching source
16216      operands, do things in registers.  */
16217   matching_memory = 0;
16218   if (MEM_P (dst))
16219     {
16220       if (rtx_equal_p (dst, src))
16221         matching_memory = 1;
16222       else
16223         dst = gen_reg_rtx (mode);
16224     }
16225
16226   /* When source operand is memory, destination must match.  */
16227   if (MEM_P (src) && !matching_memory)
16228     src = force_reg (mode, src);
16229
16230   /* Emit the instruction.  */
16231
16232   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
16233   if (reload_in_progress || code == NOT)
16234     {
16235       /* Reload doesn't know about the flags register, and doesn't know that
16236          it doesn't want to clobber it.  */
16237       gcc_assert (code == NOT);
16238       emit_insn (op);
16239     }
16240   else
16241     {
16242       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
16243       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
16244     }
16245
16246   /* Fix up the destination if needed.  */
16247   if (dst != operands[0])
16248     emit_move_insn (operands[0], dst);
16249 }
16250
16251 /* Split 32bit/64bit divmod with 8bit unsigned divmod if dividend and
16252    divisor are within the range [0-255].  */
16253
16254 void
16255 ix86_split_idivmod (enum machine_mode mode, rtx operands[],
16256                     bool signed_p)
16257 {
16258   rtx end_label, qimode_label;
16259   rtx insn, div, mod;
16260   rtx scratch, tmp0, tmp1, tmp2;
16261   rtx (*gen_divmod4_1) (rtx, rtx, rtx, rtx);
16262   rtx (*gen_zero_extend) (rtx, rtx);
16263   rtx (*gen_test_ccno_1) (rtx, rtx);
16264
16265   switch (mode)
16266     {
16267     case SImode:
16268       gen_divmod4_1 = signed_p ? gen_divmodsi4_1 : gen_udivmodsi4_1;
16269       gen_test_ccno_1 = gen_testsi_ccno_1;
16270       gen_zero_extend = gen_zero_extendqisi2;
16271       break;
16272     case DImode:
16273       gen_divmod4_1 = signed_p ? gen_divmoddi4_1 : gen_udivmoddi4_1;
16274       gen_test_ccno_1 = gen_testdi_ccno_1;
16275       gen_zero_extend = gen_zero_extendqidi2;
16276       break;
16277     default:
16278       gcc_unreachable ();
16279     }
16280
16281   end_label = gen_label_rtx ();
16282   qimode_label = gen_label_rtx ();
16283
16284   scratch = gen_reg_rtx (mode);
16285
16286   /* Use 8bit unsigned divimod if dividend and divisor are within
16287      the range [0-255].  */
16288   emit_move_insn (scratch, operands[2]);
16289   scratch = expand_simple_binop (mode, IOR, scratch, operands[3],
16290                                  scratch, 1, OPTAB_DIRECT);
16291   emit_insn (gen_test_ccno_1 (scratch, GEN_INT (-0x100)));
16292   tmp0 = gen_rtx_REG (CCNOmode, FLAGS_REG);
16293   tmp0 = gen_rtx_EQ (VOIDmode, tmp0, const0_rtx);
16294   tmp0 = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp0,
16295                                gen_rtx_LABEL_REF (VOIDmode, qimode_label),
16296                                pc_rtx);
16297   insn = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp0));
16298   predict_jump (REG_BR_PROB_BASE * 50 / 100);
16299   JUMP_LABEL (insn) = qimode_label;
16300
16301   /* Generate original signed/unsigned divimod.  */
16302   div = gen_divmod4_1 (operands[0], operands[1],
16303                        operands[2], operands[3]);
16304   emit_insn (div);
16305
16306   /* Branch to the end.  */
16307   emit_jump_insn (gen_jump (end_label));
16308   emit_barrier ();
16309
16310   /* Generate 8bit unsigned divide.  */
16311   emit_label (qimode_label);
16312   /* Don't use operands[0] for result of 8bit divide since not all
16313      registers support QImode ZERO_EXTRACT.  */
16314   tmp0 = simplify_gen_subreg (HImode, scratch, mode, 0);
16315   tmp1 = simplify_gen_subreg (HImode, operands[2], mode, 0);
16316   tmp2 = simplify_gen_subreg (QImode, operands[3], mode, 0);
16317   emit_insn (gen_udivmodhiqi3 (tmp0, tmp1, tmp2));
16318
16319   if (signed_p)
16320     {
16321       div = gen_rtx_DIV (SImode, operands[2], operands[3]);
16322       mod = gen_rtx_MOD (SImode, operands[2], operands[3]);
16323     }
16324   else
16325     {
16326       div = gen_rtx_UDIV (SImode, operands[2], operands[3]);
16327       mod = gen_rtx_UMOD (SImode, operands[2], operands[3]);
16328     }
16329
16330   /* Extract remainder from AH.  */
16331   tmp1 = gen_rtx_ZERO_EXTRACT (mode, tmp0, GEN_INT (8), GEN_INT (8));
16332   if (REG_P (operands[1]))
16333     insn = emit_move_insn (operands[1], tmp1);
16334   else
16335     {
16336       /* Need a new scratch register since the old one has result 
16337          of 8bit divide.  */
16338       scratch = gen_reg_rtx (mode);
16339       emit_move_insn (scratch, tmp1);
16340       insn = emit_move_insn (operands[1], scratch);
16341     }
16342   set_unique_reg_note (insn, REG_EQUAL, mod);
16343
16344   /* Zero extend quotient from AL.  */
16345   tmp1 = gen_lowpart (QImode, tmp0);
16346   insn = emit_insn (gen_zero_extend (operands[0], tmp1));
16347   set_unique_reg_note (insn, REG_EQUAL, div);
16348
16349   emit_label (end_label);
16350 }
16351
16352 #define LEA_SEARCH_THRESHOLD 12
16353
16354 /* Search backward for non-agu definition of register number REGNO1
16355    or register number REGNO2 in INSN's basic block until
16356    1. Pass LEA_SEARCH_THRESHOLD instructions, or
16357    2. Reach BB boundary, or
16358    3. Reach agu definition.
16359    Returns the distance between the non-agu definition point and INSN.
16360    If no definition point, returns -1.  */
16361
16362 static int
16363 distance_non_agu_define (unsigned int regno1, unsigned int regno2,
16364                          rtx insn)
16365 {
16366   basic_block bb = BLOCK_FOR_INSN (insn);
16367   int distance = 0;
16368   df_ref *def_rec;
16369   enum attr_type insn_type;
16370
16371   if (insn != BB_HEAD (bb))
16372     {
16373       rtx prev = PREV_INSN (insn);
16374       while (prev && distance < LEA_SEARCH_THRESHOLD)
16375         {
16376           if (NONDEBUG_INSN_P (prev))
16377             {
16378               distance++;
16379               for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
16380                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16381                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
16382                     && (regno1 == DF_REF_REGNO (*def_rec)
16383                         || regno2 == DF_REF_REGNO (*def_rec)))
16384                   {
16385                     insn_type = get_attr_type (prev);
16386                     if (insn_type != TYPE_LEA)
16387                       goto done;
16388                   }
16389             }
16390           if (prev == BB_HEAD (bb))
16391             break;
16392           prev = PREV_INSN (prev);
16393         }
16394     }
16395
16396   if (distance < LEA_SEARCH_THRESHOLD)
16397     {
16398       edge e;
16399       edge_iterator ei;
16400       bool simple_loop = false;
16401
16402       FOR_EACH_EDGE (e, ei, bb->preds)
16403         if (e->src == bb)
16404           {
16405             simple_loop = true;
16406             break;
16407           }
16408
16409       if (simple_loop)
16410         {
16411           rtx prev = BB_END (bb);
16412           while (prev
16413                  && prev != insn
16414                  && distance < LEA_SEARCH_THRESHOLD)
16415             {
16416               if (NONDEBUG_INSN_P (prev))
16417                 {
16418                   distance++;
16419                   for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
16420                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16421                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
16422                         && (regno1 == DF_REF_REGNO (*def_rec)
16423                             || regno2 == DF_REF_REGNO (*def_rec)))
16424                       {
16425                         insn_type = get_attr_type (prev);
16426                         if (insn_type != TYPE_LEA)
16427                           goto done;
16428                       }
16429                 }
16430               prev = PREV_INSN (prev);
16431             }
16432         }
16433     }
16434
16435   distance = -1;
16436
16437 done:
16438   /* get_attr_type may modify recog data.  We want to make sure
16439      that recog data is valid for instruction INSN, on which
16440      distance_non_agu_define is called.  INSN is unchanged here.  */
16441   extract_insn_cached (insn);
16442   return distance;
16443 }
16444
16445 /* Return the distance between INSN and the next insn that uses
16446    register number REGNO0 in memory address.  Return -1 if no such
16447    a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set.  */
16448
16449 static int
16450 distance_agu_use (unsigned int regno0, rtx insn)
16451 {
16452   basic_block bb = BLOCK_FOR_INSN (insn);
16453   int distance = 0;
16454   df_ref *def_rec;
16455   df_ref *use_rec;
16456
16457   if (insn != BB_END (bb))
16458     {
16459       rtx next = NEXT_INSN (insn);
16460       while (next && distance < LEA_SEARCH_THRESHOLD)
16461         {
16462           if (NONDEBUG_INSN_P (next))
16463             {
16464               distance++;
16465
16466               for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
16467                 if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
16468                      || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
16469                     && regno0 == DF_REF_REGNO (*use_rec))
16470                   {
16471                     /* Return DISTANCE if OP0 is used in memory
16472                        address in NEXT.  */
16473                     return distance;
16474                   }
16475
16476               for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
16477                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16478                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
16479                     && regno0 == DF_REF_REGNO (*def_rec))
16480                   {
16481                     /* Return -1 if OP0 is set in NEXT.  */
16482                     return -1;
16483                   }
16484             }
16485           if (next == BB_END (bb))
16486             break;
16487           next = NEXT_INSN (next);
16488         }
16489     }
16490
16491   if (distance < LEA_SEARCH_THRESHOLD)
16492     {
16493       edge e;
16494       edge_iterator ei;
16495       bool simple_loop = false;
16496
16497       FOR_EACH_EDGE (e, ei, bb->succs)
16498         if (e->dest == bb)
16499           {
16500             simple_loop = true;
16501             break;
16502           }
16503
16504       if (simple_loop)
16505         {
16506           rtx next = BB_HEAD (bb);
16507           while (next
16508                  && next != insn
16509                  && distance < LEA_SEARCH_THRESHOLD)
16510             {
16511               if (NONDEBUG_INSN_P (next))
16512                 {
16513                   distance++;
16514
16515                   for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
16516                     if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
16517                          || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
16518                         && regno0 == DF_REF_REGNO (*use_rec))
16519                       {
16520                         /* Return DISTANCE if OP0 is used in memory
16521                            address in NEXT.  */
16522                         return distance;
16523                       }
16524
16525                   for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
16526                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16527                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
16528                         && regno0 == DF_REF_REGNO (*def_rec))
16529                       {
16530                         /* Return -1 if OP0 is set in NEXT.  */
16531                         return -1;
16532                       }
16533
16534                 }
16535               next = NEXT_INSN (next);
16536             }
16537         }
16538     }
16539
16540   return -1;
16541 }
16542
16543 /* Define this macro to tune LEA priority vs ADD, it take effect when
16544    there is a dilemma of choicing LEA or ADD
16545    Negative value: ADD is more preferred than LEA
16546    Zero: Netrual
16547    Positive value: LEA is more preferred than ADD*/
16548 #define IX86_LEA_PRIORITY 2
16549
16550 /* Return true if it is ok to optimize an ADD operation to LEA
16551    operation to avoid flag register consumation.  For most processors,
16552    ADD is faster than LEA.  For the processors like ATOM, if the
16553    destination register of LEA holds an actual address which will be
16554    used soon, LEA is better and otherwise ADD is better.  */
16555
16556 bool
16557 ix86_lea_for_add_ok (rtx insn, rtx operands[])
16558 {
16559   unsigned int regno0 = true_regnum (operands[0]);
16560   unsigned int regno1 = true_regnum (operands[1]);
16561   unsigned int regno2 = true_regnum (operands[2]);
16562
16563   /* If a = b + c, (a!=b && a!=c), must use lea form. */
16564   if (regno0 != regno1 && regno0 != regno2)
16565     return true;
16566
16567   if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
16568     return false;
16569   else
16570     {
16571       int dist_define, dist_use;
16572
16573       /* Return false if REGNO0 isn't used in memory address. */
16574       dist_use = distance_agu_use (regno0, insn);
16575       if (dist_use <= 0)
16576         return false;
16577
16578       dist_define = distance_non_agu_define (regno1, regno2, insn);
16579       if (dist_define <= 0)
16580         return true;
16581
16582       /* If this insn has both backward non-agu dependence and forward
16583          agu dependence, the one with short distance take effect. */
16584       if ((dist_define + IX86_LEA_PRIORITY) < dist_use)
16585         return false;
16586
16587       return true;
16588     }
16589 }
16590
16591 /* Return true if destination reg of SET_BODY is shift count of
16592    USE_BODY.  */
16593
16594 static bool
16595 ix86_dep_by_shift_count_body (const_rtx set_body, const_rtx use_body)
16596 {
16597   rtx set_dest;
16598   rtx shift_rtx;
16599   int i;
16600
16601   /* Retrieve destination of SET_BODY.  */
16602   switch (GET_CODE (set_body))
16603     {
16604     case SET:
16605       set_dest = SET_DEST (set_body);
16606       if (!set_dest || !REG_P (set_dest))
16607         return false;
16608       break;
16609     case PARALLEL:
16610       for (i = XVECLEN (set_body, 0) - 1; i >= 0; i--)
16611         if (ix86_dep_by_shift_count_body (XVECEXP (set_body, 0, i),
16612                                           use_body))
16613           return true;
16614     default:
16615       return false;
16616       break;
16617     }
16618
16619   /* Retrieve shift count of USE_BODY.  */
16620   switch (GET_CODE (use_body))
16621     {
16622     case SET:
16623       shift_rtx = XEXP (use_body, 1);
16624       break;
16625     case PARALLEL:
16626       for (i = XVECLEN (use_body, 0) - 1; i >= 0; i--)
16627         if (ix86_dep_by_shift_count_body (set_body,
16628                                           XVECEXP (use_body, 0, i)))
16629           return true;
16630     default:
16631       return false;
16632       break;
16633     }
16634
16635   if (shift_rtx
16636       && (GET_CODE (shift_rtx) == ASHIFT
16637           || GET_CODE (shift_rtx) == LSHIFTRT
16638           || GET_CODE (shift_rtx) == ASHIFTRT
16639           || GET_CODE (shift_rtx) == ROTATE
16640           || GET_CODE (shift_rtx) == ROTATERT))
16641     {
16642       rtx shift_count = XEXP (shift_rtx, 1);
16643
16644       /* Return true if shift count is dest of SET_BODY.  */
16645       if (REG_P (shift_count)
16646           && true_regnum (set_dest) == true_regnum (shift_count))
16647         return true;
16648     }
16649
16650   return false;
16651 }
16652
16653 /* Return true if destination reg of SET_INSN is shift count of
16654    USE_INSN.  */
16655
16656 bool
16657 ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn)
16658 {
16659   return ix86_dep_by_shift_count_body (PATTERN (set_insn),
16660                                        PATTERN (use_insn));
16661 }
16662
16663 /* Return TRUE or FALSE depending on whether the unary operator meets the
16664    appropriate constraints.  */
16665
16666 bool
16667 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
16668                         enum machine_mode mode ATTRIBUTE_UNUSED,
16669                         rtx operands[2] ATTRIBUTE_UNUSED)
16670 {
16671   /* If one of operands is memory, source and destination must match.  */
16672   if ((MEM_P (operands[0])
16673        || MEM_P (operands[1]))
16674       && ! rtx_equal_p (operands[0], operands[1]))
16675     return false;
16676   return true;
16677 }
16678
16679 /* Return TRUE if the operands to a vec_interleave_{high,low}v2df
16680    are ok, keeping in mind the possible movddup alternative.  */
16681
16682 bool
16683 ix86_vec_interleave_v2df_operator_ok (rtx operands[3], bool high)
16684 {
16685   if (MEM_P (operands[0]))
16686     return rtx_equal_p (operands[0], operands[1 + high]);
16687   if (MEM_P (operands[1]) && MEM_P (operands[2]))
16688     return TARGET_SSE3 && rtx_equal_p (operands[1], operands[2]);
16689   return true;
16690 }
16691
16692 /* Post-reload splitter for converting an SF or DFmode value in an
16693    SSE register into an unsigned SImode.  */
16694
16695 void
16696 ix86_split_convert_uns_si_sse (rtx operands[])
16697 {
16698   enum machine_mode vecmode;
16699   rtx value, large, zero_or_two31, input, two31, x;
16700
16701   large = operands[1];
16702   zero_or_two31 = operands[2];
16703   input = operands[3];
16704   two31 = operands[4];
16705   vecmode = GET_MODE (large);
16706   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
16707
16708   /* Load up the value into the low element.  We must ensure that the other
16709      elements are valid floats -- zero is the easiest such value.  */
16710   if (MEM_P (input))
16711     {
16712       if (vecmode == V4SFmode)
16713         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
16714       else
16715         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
16716     }
16717   else
16718     {
16719       input = gen_rtx_REG (vecmode, REGNO (input));
16720       emit_move_insn (value, CONST0_RTX (vecmode));
16721       if (vecmode == V4SFmode)
16722         emit_insn (gen_sse_movss (value, value, input));
16723       else
16724         emit_insn (gen_sse2_movsd (value, value, input));
16725     }
16726
16727   emit_move_insn (large, two31);
16728   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
16729
16730   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
16731   emit_insn (gen_rtx_SET (VOIDmode, large, x));
16732
16733   x = gen_rtx_AND (vecmode, zero_or_two31, large);
16734   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
16735
16736   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
16737   emit_insn (gen_rtx_SET (VOIDmode, value, x));
16738
16739   large = gen_rtx_REG (V4SImode, REGNO (large));
16740   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
16741
16742   x = gen_rtx_REG (V4SImode, REGNO (value));
16743   if (vecmode == V4SFmode)
16744     emit_insn (gen_sse2_cvttps2dq (x, value));
16745   else
16746     emit_insn (gen_sse2_cvttpd2dq (x, value));
16747   value = x;
16748
16749   emit_insn (gen_xorv4si3 (value, value, large));
16750 }
16751
16752 /* Convert an unsigned DImode value into a DFmode, using only SSE.
16753    Expects the 64-bit DImode to be supplied in a pair of integral
16754    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
16755    -mfpmath=sse, !optimize_size only.  */
16756
16757 void
16758 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
16759 {
16760   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
16761   rtx int_xmm, fp_xmm;
16762   rtx biases, exponents;
16763   rtx x;
16764
16765   int_xmm = gen_reg_rtx (V4SImode);
16766   if (TARGET_INTER_UNIT_MOVES)
16767     emit_insn (gen_movdi_to_sse (int_xmm, input));
16768   else if (TARGET_SSE_SPLIT_REGS)
16769     {
16770       emit_clobber (int_xmm);
16771       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
16772     }
16773   else
16774     {
16775       x = gen_reg_rtx (V2DImode);
16776       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
16777       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
16778     }
16779
16780   x = gen_rtx_CONST_VECTOR (V4SImode,
16781                             gen_rtvec (4, GEN_INT (0x43300000UL),
16782                                        GEN_INT (0x45300000UL),
16783                                        const0_rtx, const0_rtx));
16784   exponents = validize_mem (force_const_mem (V4SImode, x));
16785
16786   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
16787   emit_insn (gen_vec_interleave_lowv4si (int_xmm, int_xmm, exponents));
16788
16789   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
16790      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
16791      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
16792      (0x1.0p84 + double(fp_value_hi_xmm)).
16793      Note these exponents differ by 32.  */
16794
16795   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
16796
16797   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
16798      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
16799   real_ldexp (&bias_lo_rvt, &dconst1, 52);
16800   real_ldexp (&bias_hi_rvt, &dconst1, 84);
16801   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
16802   x = const_double_from_real_value (bias_hi_rvt, DFmode);
16803   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
16804   biases = validize_mem (force_const_mem (V2DFmode, biases));
16805   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
16806
16807   /* Add the upper and lower DFmode values together.  */
16808   if (TARGET_SSE3)
16809     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
16810   else
16811     {
16812       x = copy_to_mode_reg (V2DFmode, fp_xmm);
16813       emit_insn (gen_vec_interleave_highv2df (fp_xmm, fp_xmm, fp_xmm));
16814       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
16815     }
16816
16817   ix86_expand_vector_extract (false, target, fp_xmm, 0);
16818 }
16819
16820 /* Not used, but eases macroization of patterns.  */
16821 void
16822 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
16823                                   rtx input ATTRIBUTE_UNUSED)
16824 {
16825   gcc_unreachable ();
16826 }
16827
16828 /* Convert an unsigned SImode value into a DFmode.  Only currently used
16829    for SSE, but applicable anywhere.  */
16830
16831 void
16832 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
16833 {
16834   REAL_VALUE_TYPE TWO31r;
16835   rtx x, fp;
16836
16837   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
16838                            NULL, 1, OPTAB_DIRECT);
16839
16840   fp = gen_reg_rtx (DFmode);
16841   emit_insn (gen_floatsidf2 (fp, x));
16842
16843   real_ldexp (&TWO31r, &dconst1, 31);
16844   x = const_double_from_real_value (TWO31r, DFmode);
16845
16846   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
16847   if (x != target)
16848     emit_move_insn (target, x);
16849 }
16850
16851 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
16852    32-bit mode; otherwise we have a direct convert instruction.  */
16853
16854 void
16855 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
16856 {
16857   REAL_VALUE_TYPE TWO32r;
16858   rtx fp_lo, fp_hi, x;
16859
16860   fp_lo = gen_reg_rtx (DFmode);
16861   fp_hi = gen_reg_rtx (DFmode);
16862
16863   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
16864
16865   real_ldexp (&TWO32r, &dconst1, 32);
16866   x = const_double_from_real_value (TWO32r, DFmode);
16867   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
16868
16869   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
16870
16871   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
16872                            0, OPTAB_DIRECT);
16873   if (x != target)
16874     emit_move_insn (target, x);
16875 }
16876
16877 /* Convert an unsigned SImode value into a SFmode, using only SSE.
16878    For x86_32, -mfpmath=sse, !optimize_size only.  */
16879 void
16880 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
16881 {
16882   REAL_VALUE_TYPE ONE16r;
16883   rtx fp_hi, fp_lo, int_hi, int_lo, x;
16884
16885   real_ldexp (&ONE16r, &dconst1, 16);
16886   x = const_double_from_real_value (ONE16r, SFmode);
16887   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
16888                                       NULL, 0, OPTAB_DIRECT);
16889   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
16890                                       NULL, 0, OPTAB_DIRECT);
16891   fp_hi = gen_reg_rtx (SFmode);
16892   fp_lo = gen_reg_rtx (SFmode);
16893   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
16894   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
16895   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
16896                                0, OPTAB_DIRECT);
16897   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
16898                                0, OPTAB_DIRECT);
16899   if (!rtx_equal_p (target, fp_hi))
16900     emit_move_insn (target, fp_hi);
16901 }
16902
16903 /* A subroutine of ix86_build_signbit_mask.  If VECT is true,
16904    then replicate the value for all elements of the vector
16905    register.  */
16906
16907 rtx
16908 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
16909 {
16910   rtvec v;
16911   switch (mode)
16912     {
16913     case V4SImode:
16914       gcc_assert (vect);
16915       v = gen_rtvec (4, value, value, value, value);
16916       return gen_rtx_CONST_VECTOR (V4SImode, v);
16917
16918     case V2DImode:
16919       gcc_assert (vect);
16920       v = gen_rtvec (2, value, value);
16921       return gen_rtx_CONST_VECTOR (V2DImode, v);
16922
16923     case V8SFmode:
16924       if (vect)
16925         v = gen_rtvec (8, value, value, value, value,
16926                        value, value, value, value);
16927       else
16928         v = gen_rtvec (8, value, CONST0_RTX (SFmode),
16929                        CONST0_RTX (SFmode), CONST0_RTX (SFmode),
16930                        CONST0_RTX (SFmode), CONST0_RTX (SFmode),
16931                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
16932       return gen_rtx_CONST_VECTOR (V8SFmode, v);
16933
16934     case V4SFmode:
16935       if (vect)
16936         v = gen_rtvec (4, value, value, value, value);
16937       else
16938         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
16939                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
16940       return gen_rtx_CONST_VECTOR (V4SFmode, v);
16941
16942     case V4DFmode:
16943       if (vect)
16944         v = gen_rtvec (4, value, value, value, value);
16945       else
16946         v = gen_rtvec (4, value, CONST0_RTX (DFmode),
16947                        CONST0_RTX (DFmode), CONST0_RTX (DFmode));
16948       return gen_rtx_CONST_VECTOR (V4DFmode, v);
16949
16950     case V2DFmode:
16951       if (vect)
16952         v = gen_rtvec (2, value, value);
16953       else
16954         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
16955       return gen_rtx_CONST_VECTOR (V2DFmode, v);
16956
16957     default:
16958       gcc_unreachable ();
16959     }
16960 }
16961
16962 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
16963    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
16964    for an SSE register.  If VECT is true, then replicate the mask for
16965    all elements of the vector register.  If INVERT is true, then create
16966    a mask excluding the sign bit.  */
16967
16968 rtx
16969 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
16970 {
16971   enum machine_mode vec_mode, imode;
16972   HOST_WIDE_INT hi, lo;
16973   int shift = 63;
16974   rtx v;
16975   rtx mask;
16976
16977   /* Find the sign bit, sign extended to 2*HWI.  */
16978   switch (mode)
16979     {
16980     case V4SImode:
16981     case V8SFmode:
16982     case V4SFmode:
16983       vec_mode = mode;
16984       mode = GET_MODE_INNER (mode);
16985       imode = SImode;
16986       lo = 0x80000000, hi = lo < 0;
16987       break;
16988
16989     case V2DImode:
16990     case V4DFmode:
16991     case V2DFmode:
16992       vec_mode = mode;
16993       mode = GET_MODE_INNER (mode);
16994       imode = DImode;
16995       if (HOST_BITS_PER_WIDE_INT >= 64)
16996         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
16997       else
16998         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
16999       break;
17000
17001     case TImode:
17002     case TFmode:
17003       vec_mode = VOIDmode;
17004       if (HOST_BITS_PER_WIDE_INT >= 64)
17005         {
17006           imode = TImode;
17007           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
17008         }
17009       else
17010         {
17011           rtvec vec;
17012
17013           imode = DImode;
17014           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
17015
17016           if (invert)
17017             {
17018               lo = ~lo, hi = ~hi;
17019               v = constm1_rtx;
17020             }
17021           else
17022             v = const0_rtx;
17023
17024           mask = immed_double_const (lo, hi, imode);
17025
17026           vec = gen_rtvec (2, v, mask);
17027           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
17028           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
17029
17030           return v;
17031         }
17032      break;
17033
17034     default:
17035       gcc_unreachable ();
17036     }
17037
17038   if (invert)
17039     lo = ~lo, hi = ~hi;
17040
17041   /* Force this value into the low part of a fp vector constant.  */
17042   mask = immed_double_const (lo, hi, imode);
17043   mask = gen_lowpart (mode, mask);
17044
17045   if (vec_mode == VOIDmode)
17046     return force_reg (mode, mask);
17047
17048   v = ix86_build_const_vector (vec_mode, vect, mask);
17049   return force_reg (vec_mode, v);
17050 }
17051
17052 /* Generate code for floating point ABS or NEG.  */
17053
17054 void
17055 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
17056                                 rtx operands[])
17057 {
17058   rtx mask, set, dst, src;
17059   bool use_sse = false;
17060   bool vector_mode = VECTOR_MODE_P (mode);
17061   enum machine_mode vmode = mode;
17062
17063   if (vector_mode)
17064     use_sse = true;
17065   else if (mode == TFmode)
17066     use_sse = true;
17067   else if (TARGET_SSE_MATH)
17068     {
17069       use_sse = SSE_FLOAT_MODE_P (mode);
17070       if (mode == SFmode)
17071         vmode = V4SFmode;
17072       else if (mode == DFmode)
17073         vmode = V2DFmode;
17074     }
17075
17076   /* NEG and ABS performed with SSE use bitwise mask operations.
17077      Create the appropriate mask now.  */
17078   if (use_sse)
17079     mask = ix86_build_signbit_mask (vmode, vector_mode, code == ABS);
17080   else
17081     mask = NULL_RTX;
17082
17083   dst = operands[0];
17084   src = operands[1];
17085
17086   set = gen_rtx_fmt_e (code, mode, src);
17087   set = gen_rtx_SET (VOIDmode, dst, set);
17088
17089   if (mask)
17090     {
17091       rtx use, clob;
17092       rtvec par;
17093
17094       use = gen_rtx_USE (VOIDmode, mask);
17095       if (vector_mode)
17096         par = gen_rtvec (2, set, use);
17097       else
17098         {
17099           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
17100           par = gen_rtvec (3, set, use, clob);
17101         }
17102       emit_insn (gen_rtx_PARALLEL (VOIDmode, par));
17103     }
17104   else
17105     emit_insn (set);
17106 }
17107
17108 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
17109
17110 void
17111 ix86_expand_copysign (rtx operands[])
17112 {
17113   enum machine_mode mode, vmode;
17114   rtx dest, op0, op1, mask, nmask;
17115
17116   dest = operands[0];
17117   op0 = operands[1];
17118   op1 = operands[2];
17119
17120   mode = GET_MODE (dest);
17121
17122   if (mode == SFmode)
17123     vmode = V4SFmode;
17124   else if (mode == DFmode)
17125     vmode = V2DFmode;
17126   else
17127     vmode = mode;
17128
17129   if (GET_CODE (op0) == CONST_DOUBLE)
17130     {
17131       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
17132
17133       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
17134         op0 = simplify_unary_operation (ABS, mode, op0, mode);
17135
17136       if (mode == SFmode || mode == DFmode)
17137         {
17138           if (op0 == CONST0_RTX (mode))
17139             op0 = CONST0_RTX (vmode);
17140           else
17141             {
17142               rtx v = ix86_build_const_vector (vmode, false, op0);
17143
17144               op0 = force_reg (vmode, v);
17145             }
17146         }
17147       else if (op0 != CONST0_RTX (mode))
17148         op0 = force_reg (mode, op0);
17149
17150       mask = ix86_build_signbit_mask (vmode, 0, 0);
17151
17152       if (mode == SFmode)
17153         copysign_insn = gen_copysignsf3_const;
17154       else if (mode == DFmode)
17155         copysign_insn = gen_copysigndf3_const;
17156       else
17157         copysign_insn = gen_copysigntf3_const;
17158
17159         emit_insn (copysign_insn (dest, op0, op1, mask));
17160     }
17161   else
17162     {
17163       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
17164
17165       nmask = ix86_build_signbit_mask (vmode, 0, 1);
17166       mask = ix86_build_signbit_mask (vmode, 0, 0);
17167
17168       if (mode == SFmode)
17169         copysign_insn = gen_copysignsf3_var;
17170       else if (mode == DFmode)
17171         copysign_insn = gen_copysigndf3_var;
17172       else
17173         copysign_insn = gen_copysigntf3_var;
17174
17175       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
17176     }
17177 }
17178
17179 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
17180    be a constant, and so has already been expanded into a vector constant.  */
17181
17182 void
17183 ix86_split_copysign_const (rtx operands[])
17184 {
17185   enum machine_mode mode, vmode;
17186   rtx dest, op0, mask, x;
17187
17188   dest = operands[0];
17189   op0 = operands[1];
17190   mask = operands[3];
17191
17192   mode = GET_MODE (dest);
17193   vmode = GET_MODE (mask);
17194
17195   dest = simplify_gen_subreg (vmode, dest, mode, 0);
17196   x = gen_rtx_AND (vmode, dest, mask);
17197   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17198
17199   if (op0 != CONST0_RTX (vmode))
17200     {
17201       x = gen_rtx_IOR (vmode, dest, op0);
17202       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17203     }
17204 }
17205
17206 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
17207    so we have to do two masks.  */
17208
17209 void
17210 ix86_split_copysign_var (rtx operands[])
17211 {
17212   enum machine_mode mode, vmode;
17213   rtx dest, scratch, op0, op1, mask, nmask, x;
17214
17215   dest = operands[0];
17216   scratch = operands[1];
17217   op0 = operands[2];
17218   op1 = operands[3];
17219   nmask = operands[4];
17220   mask = operands[5];
17221
17222   mode = GET_MODE (dest);
17223   vmode = GET_MODE (mask);
17224
17225   if (rtx_equal_p (op0, op1))
17226     {
17227       /* Shouldn't happen often (it's useless, obviously), but when it does
17228          we'd generate incorrect code if we continue below.  */
17229       emit_move_insn (dest, op0);
17230       return;
17231     }
17232
17233   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
17234     {
17235       gcc_assert (REGNO (op1) == REGNO (scratch));
17236
17237       x = gen_rtx_AND (vmode, scratch, mask);
17238       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17239
17240       dest = mask;
17241       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
17242       x = gen_rtx_NOT (vmode, dest);
17243       x = gen_rtx_AND (vmode, x, op0);
17244       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17245     }
17246   else
17247     {
17248       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
17249         {
17250           x = gen_rtx_AND (vmode, scratch, mask);
17251         }
17252       else                                              /* alternative 2,4 */
17253         {
17254           gcc_assert (REGNO (mask) == REGNO (scratch));
17255           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
17256           x = gen_rtx_AND (vmode, scratch, op1);
17257         }
17258       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17259
17260       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
17261         {
17262           dest = simplify_gen_subreg (vmode, op0, mode, 0);
17263           x = gen_rtx_AND (vmode, dest, nmask);
17264         }
17265       else                                              /* alternative 3,4 */
17266         {
17267           gcc_assert (REGNO (nmask) == REGNO (dest));
17268           dest = nmask;
17269           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
17270           x = gen_rtx_AND (vmode, dest, op0);
17271         }
17272       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17273     }
17274
17275   x = gen_rtx_IOR (vmode, dest, scratch);
17276   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17277 }
17278
17279 /* Return TRUE or FALSE depending on whether the first SET in INSN
17280    has source and destination with matching CC modes, and that the
17281    CC mode is at least as constrained as REQ_MODE.  */
17282
17283 bool
17284 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
17285 {
17286   rtx set;
17287   enum machine_mode set_mode;
17288
17289   set = PATTERN (insn);
17290   if (GET_CODE (set) == PARALLEL)
17291     set = XVECEXP (set, 0, 0);
17292   gcc_assert (GET_CODE (set) == SET);
17293   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
17294
17295   set_mode = GET_MODE (SET_DEST (set));
17296   switch (set_mode)
17297     {
17298     case CCNOmode:
17299       if (req_mode != CCNOmode
17300           && (req_mode != CCmode
17301               || XEXP (SET_SRC (set), 1) != const0_rtx))
17302         return false;
17303       break;
17304     case CCmode:
17305       if (req_mode == CCGCmode)
17306         return false;
17307       /* FALLTHRU */
17308     case CCGCmode:
17309       if (req_mode == CCGOCmode || req_mode == CCNOmode)
17310         return false;
17311       /* FALLTHRU */
17312     case CCGOCmode:
17313       if (req_mode == CCZmode)
17314         return false;
17315       /* FALLTHRU */
17316     case CCAmode:
17317     case CCCmode:
17318     case CCOmode:
17319     case CCSmode:
17320     case CCZmode:
17321       break;
17322
17323     default:
17324       gcc_unreachable ();
17325     }
17326
17327   return GET_MODE (SET_SRC (set)) == set_mode;
17328 }
17329
17330 /* Generate insn patterns to do an integer compare of OPERANDS.  */
17331
17332 static rtx
17333 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
17334 {
17335   enum machine_mode cmpmode;
17336   rtx tmp, flags;
17337
17338   cmpmode = SELECT_CC_MODE (code, op0, op1);
17339   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
17340
17341   /* This is very simple, but making the interface the same as in the
17342      FP case makes the rest of the code easier.  */
17343   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
17344   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
17345
17346   /* Return the test that should be put into the flags user, i.e.
17347      the bcc, scc, or cmov instruction.  */
17348   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
17349 }
17350
17351 /* Figure out whether to use ordered or unordered fp comparisons.
17352    Return the appropriate mode to use.  */
17353
17354 enum machine_mode
17355 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
17356 {
17357   /* ??? In order to make all comparisons reversible, we do all comparisons
17358      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
17359      all forms trapping and nontrapping comparisons, we can make inequality
17360      comparisons trapping again, since it results in better code when using
17361      FCOM based compares.  */
17362   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
17363 }
17364
17365 enum machine_mode
17366 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
17367 {
17368   enum machine_mode mode = GET_MODE (op0);
17369
17370   if (SCALAR_FLOAT_MODE_P (mode))
17371     {
17372       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
17373       return ix86_fp_compare_mode (code);
17374     }
17375
17376   switch (code)
17377     {
17378       /* Only zero flag is needed.  */
17379     case EQ:                    /* ZF=0 */
17380     case NE:                    /* ZF!=0 */
17381       return CCZmode;
17382       /* Codes needing carry flag.  */
17383     case GEU:                   /* CF=0 */
17384     case LTU:                   /* CF=1 */
17385       /* Detect overflow checks.  They need just the carry flag.  */
17386       if (GET_CODE (op0) == PLUS
17387           && rtx_equal_p (op1, XEXP (op0, 0)))
17388         return CCCmode;
17389       else
17390         return CCmode;
17391     case GTU:                   /* CF=0 & ZF=0 */
17392     case LEU:                   /* CF=1 | ZF=1 */
17393       /* Detect overflow checks.  They need just the carry flag.  */
17394       if (GET_CODE (op0) == MINUS
17395           && rtx_equal_p (op1, XEXP (op0, 0)))
17396         return CCCmode;
17397       else
17398         return CCmode;
17399       /* Codes possibly doable only with sign flag when
17400          comparing against zero.  */
17401     case GE:                    /* SF=OF   or   SF=0 */
17402     case LT:                    /* SF<>OF  or   SF=1 */
17403       if (op1 == const0_rtx)
17404         return CCGOCmode;
17405       else
17406         /* For other cases Carry flag is not required.  */
17407         return CCGCmode;
17408       /* Codes doable only with sign flag when comparing
17409          against zero, but we miss jump instruction for it
17410          so we need to use relational tests against overflow
17411          that thus needs to be zero.  */
17412     case GT:                    /* ZF=0 & SF=OF */
17413     case LE:                    /* ZF=1 | SF<>OF */
17414       if (op1 == const0_rtx)
17415         return CCNOmode;
17416       else
17417         return CCGCmode;
17418       /* strcmp pattern do (use flags) and combine may ask us for proper
17419          mode.  */
17420     case USE:
17421       return CCmode;
17422     default:
17423       gcc_unreachable ();
17424     }
17425 }
17426
17427 /* Return the fixed registers used for condition codes.  */
17428
17429 static bool
17430 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
17431 {
17432   *p1 = FLAGS_REG;
17433   *p2 = FPSR_REG;
17434   return true;
17435 }
17436
17437 /* If two condition code modes are compatible, return a condition code
17438    mode which is compatible with both.  Otherwise, return
17439    VOIDmode.  */
17440
17441 static enum machine_mode
17442 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
17443 {
17444   if (m1 == m2)
17445     return m1;
17446
17447   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
17448     return VOIDmode;
17449
17450   if ((m1 == CCGCmode && m2 == CCGOCmode)
17451       || (m1 == CCGOCmode && m2 == CCGCmode))
17452     return CCGCmode;
17453
17454   switch (m1)
17455     {
17456     default:
17457       gcc_unreachable ();
17458
17459     case CCmode:
17460     case CCGCmode:
17461     case CCGOCmode:
17462     case CCNOmode:
17463     case CCAmode:
17464     case CCCmode:
17465     case CCOmode:
17466     case CCSmode:
17467     case CCZmode:
17468       switch (m2)
17469         {
17470         default:
17471           return VOIDmode;
17472
17473         case CCmode:
17474         case CCGCmode:
17475         case CCGOCmode:
17476         case CCNOmode:
17477         case CCAmode:
17478         case CCCmode:
17479         case CCOmode:
17480         case CCSmode:
17481         case CCZmode:
17482           return CCmode;
17483         }
17484
17485     case CCFPmode:
17486     case CCFPUmode:
17487       /* These are only compatible with themselves, which we already
17488          checked above.  */
17489       return VOIDmode;
17490     }
17491 }
17492
17493
17494 /* Return a comparison we can do and that it is equivalent to
17495    swap_condition (code) apart possibly from orderedness.
17496    But, never change orderedness if TARGET_IEEE_FP, returning
17497    UNKNOWN in that case if necessary.  */
17498
17499 static enum rtx_code
17500 ix86_fp_swap_condition (enum rtx_code code)
17501 {
17502   switch (code)
17503     {
17504     case GT:                   /* GTU - CF=0 & ZF=0 */
17505       return TARGET_IEEE_FP ? UNKNOWN : UNLT;
17506     case GE:                   /* GEU - CF=0 */
17507       return TARGET_IEEE_FP ? UNKNOWN : UNLE;
17508     case UNLT:                 /* LTU - CF=1 */
17509       return TARGET_IEEE_FP ? UNKNOWN : GT;
17510     case UNLE:                 /* LEU - CF=1 | ZF=1 */
17511       return TARGET_IEEE_FP ? UNKNOWN : GE;
17512     default:
17513       return swap_condition (code);
17514     }
17515 }
17516
17517 /* Return cost of comparison CODE using the best strategy for performance.
17518    All following functions do use number of instructions as a cost metrics.
17519    In future this should be tweaked to compute bytes for optimize_size and
17520    take into account performance of various instructions on various CPUs.  */
17521
17522 static int
17523 ix86_fp_comparison_cost (enum rtx_code code)
17524 {
17525   int arith_cost;
17526
17527   /* The cost of code using bit-twiddling on %ah.  */
17528   switch (code)
17529     {
17530     case UNLE:
17531     case UNLT:
17532     case LTGT:
17533     case GT:
17534     case GE:
17535     case UNORDERED:
17536     case ORDERED:
17537     case UNEQ:
17538       arith_cost = 4;
17539       break;
17540     case LT:
17541     case NE:
17542     case EQ:
17543     case UNGE:
17544       arith_cost = TARGET_IEEE_FP ? 5 : 4;
17545       break;
17546     case LE:
17547     case UNGT:
17548       arith_cost = TARGET_IEEE_FP ? 6 : 4;
17549       break;
17550     default:
17551       gcc_unreachable ();
17552     }
17553
17554   switch (ix86_fp_comparison_strategy (code))
17555     {
17556     case IX86_FPCMP_COMI:
17557       return arith_cost > 4 ? 3 : 2;
17558     case IX86_FPCMP_SAHF:
17559       return arith_cost > 4 ? 4 : 3;
17560     default:
17561       return arith_cost;
17562     }
17563 }
17564
17565 /* Return strategy to use for floating-point.  We assume that fcomi is always
17566    preferrable where available, since that is also true when looking at size
17567    (2 bytes, vs. 3 for fnstsw+sahf and at least 5 for fnstsw+test).  */
17568
17569 enum ix86_fpcmp_strategy
17570 ix86_fp_comparison_strategy (enum rtx_code code ATTRIBUTE_UNUSED)
17571 {
17572   /* Do fcomi/sahf based test when profitable.  */
17573
17574   if (TARGET_CMOVE)
17575     return IX86_FPCMP_COMI;
17576
17577   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_function_for_size_p (cfun)))
17578     return IX86_FPCMP_SAHF;
17579
17580   return IX86_FPCMP_ARITH;
17581 }
17582
17583 /* Swap, force into registers, or otherwise massage the two operands
17584    to a fp comparison.  The operands are updated in place; the new
17585    comparison code is returned.  */
17586
17587 static enum rtx_code
17588 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
17589 {
17590   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
17591   rtx op0 = *pop0, op1 = *pop1;
17592   enum machine_mode op_mode = GET_MODE (op0);
17593   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
17594
17595   /* All of the unordered compare instructions only work on registers.
17596      The same is true of the fcomi compare instructions.  The XFmode
17597      compare instructions require registers except when comparing
17598      against zero or when converting operand 1 from fixed point to
17599      floating point.  */
17600
17601   if (!is_sse
17602       && (fpcmp_mode == CCFPUmode
17603           || (op_mode == XFmode
17604               && ! (standard_80387_constant_p (op0) == 1
17605                     || standard_80387_constant_p (op1) == 1)
17606               && GET_CODE (op1) != FLOAT)
17607           || ix86_fp_comparison_strategy (code) == IX86_FPCMP_COMI))
17608     {
17609       op0 = force_reg (op_mode, op0);
17610       op1 = force_reg (op_mode, op1);
17611     }
17612   else
17613     {
17614       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
17615          things around if they appear profitable, otherwise force op0
17616          into a register.  */
17617
17618       if (standard_80387_constant_p (op0) == 0
17619           || (MEM_P (op0)
17620               && ! (standard_80387_constant_p (op1) == 0
17621                     || MEM_P (op1))))
17622         {
17623           enum rtx_code new_code = ix86_fp_swap_condition (code);
17624           if (new_code != UNKNOWN)
17625             {
17626               rtx tmp;
17627               tmp = op0, op0 = op1, op1 = tmp;
17628               code = new_code;
17629             }
17630         }
17631
17632       if (!REG_P (op0))
17633         op0 = force_reg (op_mode, op0);
17634
17635       if (CONSTANT_P (op1))
17636         {
17637           int tmp = standard_80387_constant_p (op1);
17638           if (tmp == 0)
17639             op1 = validize_mem (force_const_mem (op_mode, op1));
17640           else if (tmp == 1)
17641             {
17642               if (TARGET_CMOVE)
17643                 op1 = force_reg (op_mode, op1);
17644             }
17645           else
17646             op1 = force_reg (op_mode, op1);
17647         }
17648     }
17649
17650   /* Try to rearrange the comparison to make it cheaper.  */
17651   if (ix86_fp_comparison_cost (code)
17652       > ix86_fp_comparison_cost (swap_condition (code))
17653       && (REG_P (op1) || can_create_pseudo_p ()))
17654     {
17655       rtx tmp;
17656       tmp = op0, op0 = op1, op1 = tmp;
17657       code = swap_condition (code);
17658       if (!REG_P (op0))
17659         op0 = force_reg (op_mode, op0);
17660     }
17661
17662   *pop0 = op0;
17663   *pop1 = op1;
17664   return code;
17665 }
17666
17667 /* Convert comparison codes we use to represent FP comparison to integer
17668    code that will result in proper branch.  Return UNKNOWN if no such code
17669    is available.  */
17670
17671 enum rtx_code
17672 ix86_fp_compare_code_to_integer (enum rtx_code code)
17673 {
17674   switch (code)
17675     {
17676     case GT:
17677       return GTU;
17678     case GE:
17679       return GEU;
17680     case ORDERED:
17681     case UNORDERED:
17682       return code;
17683       break;
17684     case UNEQ:
17685       return EQ;
17686       break;
17687     case UNLT:
17688       return LTU;
17689       break;
17690     case UNLE:
17691       return LEU;
17692       break;
17693     case LTGT:
17694       return NE;
17695       break;
17696     default:
17697       return UNKNOWN;
17698     }
17699 }
17700
17701 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
17702
17703 static rtx
17704 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch)
17705 {
17706   enum machine_mode fpcmp_mode, intcmp_mode;
17707   rtx tmp, tmp2;
17708
17709   fpcmp_mode = ix86_fp_compare_mode (code);
17710   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
17711
17712   /* Do fcomi/sahf based test when profitable.  */
17713   switch (ix86_fp_comparison_strategy (code))
17714     {
17715     case IX86_FPCMP_COMI:
17716       intcmp_mode = fpcmp_mode;
17717       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17718       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
17719                          tmp);
17720       emit_insn (tmp);
17721       break;
17722
17723     case IX86_FPCMP_SAHF:
17724       intcmp_mode = fpcmp_mode;
17725       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17726       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
17727                          tmp);
17728
17729       if (!scratch)
17730         scratch = gen_reg_rtx (HImode);
17731       tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
17732       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
17733       break;
17734
17735     case IX86_FPCMP_ARITH:
17736       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
17737       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17738       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
17739       if (!scratch)
17740         scratch = gen_reg_rtx (HImode);
17741       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
17742
17743       /* In the unordered case, we have to check C2 for NaN's, which
17744          doesn't happen to work out to anything nice combination-wise.
17745          So do some bit twiddling on the value we've got in AH to come
17746          up with an appropriate set of condition codes.  */
17747
17748       intcmp_mode = CCNOmode;
17749       switch (code)
17750         {
17751         case GT:
17752         case UNGT:
17753           if (code == GT || !TARGET_IEEE_FP)
17754             {
17755               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
17756               code = EQ;
17757             }
17758           else
17759             {
17760               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17761               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
17762               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
17763               intcmp_mode = CCmode;
17764               code = GEU;
17765             }
17766           break;
17767         case LT:
17768         case UNLT:
17769           if (code == LT && TARGET_IEEE_FP)
17770             {
17771               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17772               emit_insn (gen_cmpqi_ext_3 (scratch, const1_rtx));
17773               intcmp_mode = CCmode;
17774               code = EQ;
17775             }
17776           else
17777             {
17778               emit_insn (gen_testqi_ext_ccno_0 (scratch, const1_rtx));
17779               code = NE;
17780             }
17781           break;
17782         case GE:
17783         case UNGE:
17784           if (code == GE || !TARGET_IEEE_FP)
17785             {
17786               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
17787               code = EQ;
17788             }
17789           else
17790             {
17791               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17792               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch, const1_rtx));
17793               code = NE;
17794             }
17795           break;
17796         case LE:
17797         case UNLE:
17798           if (code == LE && TARGET_IEEE_FP)
17799             {
17800               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17801               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
17802               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
17803               intcmp_mode = CCmode;
17804               code = LTU;
17805             }
17806           else
17807             {
17808               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
17809               code = NE;
17810             }
17811           break;
17812         case EQ:
17813         case UNEQ:
17814           if (code == EQ && TARGET_IEEE_FP)
17815             {
17816               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17817               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
17818               intcmp_mode = CCmode;
17819               code = EQ;
17820             }
17821           else
17822             {
17823               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
17824               code = NE;
17825             }
17826           break;
17827         case NE:
17828         case LTGT:
17829           if (code == NE && TARGET_IEEE_FP)
17830             {
17831               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17832               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
17833                                              GEN_INT (0x40)));
17834               code = NE;
17835             }
17836           else
17837             {
17838               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
17839               code = EQ;
17840             }
17841           break;
17842
17843         case UNORDERED:
17844           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
17845           code = NE;
17846           break;
17847         case ORDERED:
17848           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
17849           code = EQ;
17850           break;
17851
17852         default:
17853           gcc_unreachable ();
17854         }
17855         break;
17856
17857     default:
17858       gcc_unreachable();
17859     }
17860
17861   /* Return the test that should be put into the flags user, i.e.
17862      the bcc, scc, or cmov instruction.  */
17863   return gen_rtx_fmt_ee (code, VOIDmode,
17864                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
17865                          const0_rtx);
17866 }
17867
17868 static rtx
17869 ix86_expand_compare (enum rtx_code code, rtx op0, rtx op1)
17870 {
17871   rtx ret;
17872
17873   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
17874     ret = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
17875
17876   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
17877     {
17878       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
17879       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
17880     }
17881   else
17882     ret = ix86_expand_int_compare (code, op0, op1);
17883
17884   return ret;
17885 }
17886
17887 void
17888 ix86_expand_branch (enum rtx_code code, rtx op0, rtx op1, rtx label)
17889 {
17890   enum machine_mode mode = GET_MODE (op0);
17891   rtx tmp;
17892
17893   switch (mode)
17894     {
17895     case SFmode:
17896     case DFmode:
17897     case XFmode:
17898     case QImode:
17899     case HImode:
17900     case SImode:
17901       simple:
17902       tmp = ix86_expand_compare (code, op0, op1);
17903       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
17904                                   gen_rtx_LABEL_REF (VOIDmode, label),
17905                                   pc_rtx);
17906       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
17907       return;
17908
17909     case DImode:
17910       if (TARGET_64BIT)
17911         goto simple;
17912     case TImode:
17913       /* Expand DImode branch into multiple compare+branch.  */
17914       {
17915         rtx lo[2], hi[2], label2;
17916         enum rtx_code code1, code2, code3;
17917         enum machine_mode submode;
17918
17919         if (CONSTANT_P (op0) && !CONSTANT_P (op1))
17920           {
17921             tmp = op0, op0 = op1, op1 = tmp;
17922             code = swap_condition (code);
17923           }
17924
17925         split_double_mode (mode, &op0, 1, lo+0, hi+0);
17926         split_double_mode (mode, &op1, 1, lo+1, hi+1);
17927
17928         submode = mode == DImode ? SImode : DImode;
17929
17930         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
17931            avoid two branches.  This costs one extra insn, so disable when
17932            optimizing for size.  */
17933
17934         if ((code == EQ || code == NE)
17935             && (!optimize_insn_for_size_p ()
17936                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
17937           {
17938             rtx xor0, xor1;
17939
17940             xor1 = hi[0];
17941             if (hi[1] != const0_rtx)
17942               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
17943                                    NULL_RTX, 0, OPTAB_WIDEN);
17944
17945             xor0 = lo[0];
17946             if (lo[1] != const0_rtx)
17947               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
17948                                    NULL_RTX, 0, OPTAB_WIDEN);
17949
17950             tmp = expand_binop (submode, ior_optab, xor1, xor0,
17951                                 NULL_RTX, 0, OPTAB_WIDEN);
17952
17953             ix86_expand_branch (code, tmp, const0_rtx, label);
17954             return;
17955           }
17956
17957         /* Otherwise, if we are doing less-than or greater-or-equal-than,
17958            op1 is a constant and the low word is zero, then we can just
17959            examine the high word.  Similarly for low word -1 and
17960            less-or-equal-than or greater-than.  */
17961
17962         if (CONST_INT_P (hi[1]))
17963           switch (code)
17964             {
17965             case LT: case LTU: case GE: case GEU:
17966               if (lo[1] == const0_rtx)
17967                 {
17968                   ix86_expand_branch (code, hi[0], hi[1], label);
17969                   return;
17970                 }
17971               break;
17972             case LE: case LEU: case GT: case GTU:
17973               if (lo[1] == constm1_rtx)
17974                 {
17975                   ix86_expand_branch (code, hi[0], hi[1], label);
17976                   return;
17977                 }
17978               break;
17979             default:
17980               break;
17981             }
17982
17983         /* Otherwise, we need two or three jumps.  */
17984
17985         label2 = gen_label_rtx ();
17986
17987         code1 = code;
17988         code2 = swap_condition (code);
17989         code3 = unsigned_condition (code);
17990
17991         switch (code)
17992           {
17993           case LT: case GT: case LTU: case GTU:
17994             break;
17995
17996           case LE:   code1 = LT;  code2 = GT;  break;
17997           case GE:   code1 = GT;  code2 = LT;  break;
17998           case LEU:  code1 = LTU; code2 = GTU; break;
17999           case GEU:  code1 = GTU; code2 = LTU; break;
18000
18001           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
18002           case NE:   code2 = UNKNOWN; break;
18003
18004           default:
18005             gcc_unreachable ();
18006           }
18007
18008         /*
18009          * a < b =>
18010          *    if (hi(a) < hi(b)) goto true;
18011          *    if (hi(a) > hi(b)) goto false;
18012          *    if (lo(a) < lo(b)) goto true;
18013          *  false:
18014          */
18015
18016         if (code1 != UNKNOWN)
18017           ix86_expand_branch (code1, hi[0], hi[1], label);
18018         if (code2 != UNKNOWN)
18019           ix86_expand_branch (code2, hi[0], hi[1], label2);
18020
18021         ix86_expand_branch (code3, lo[0], lo[1], label);
18022
18023         if (code2 != UNKNOWN)
18024           emit_label (label2);
18025         return;
18026       }
18027
18028     default:
18029       gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC);
18030       goto simple;
18031     }
18032 }
18033
18034 /* Split branch based on floating point condition.  */
18035 void
18036 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
18037                       rtx target1, rtx target2, rtx tmp, rtx pushed)
18038 {
18039   rtx condition;
18040   rtx i;
18041
18042   if (target2 != pc_rtx)
18043     {
18044       rtx tmp = target2;
18045       code = reverse_condition_maybe_unordered (code);
18046       target2 = target1;
18047       target1 = tmp;
18048     }
18049
18050   condition = ix86_expand_fp_compare (code, op1, op2,
18051                                       tmp);
18052
18053   /* Remove pushed operand from stack.  */
18054   if (pushed)
18055     ix86_free_from_memory (GET_MODE (pushed));
18056
18057   i = emit_jump_insn (gen_rtx_SET
18058                       (VOIDmode, pc_rtx,
18059                        gen_rtx_IF_THEN_ELSE (VOIDmode,
18060                                              condition, target1, target2)));
18061   if (split_branch_probability >= 0)
18062     add_reg_note (i, REG_BR_PROB, GEN_INT (split_branch_probability));
18063 }
18064
18065 void
18066 ix86_expand_setcc (rtx dest, enum rtx_code code, rtx op0, rtx op1)
18067 {
18068   rtx ret;
18069
18070   gcc_assert (GET_MODE (dest) == QImode);
18071
18072   ret = ix86_expand_compare (code, op0, op1);
18073   PUT_MODE (ret, QImode);
18074   emit_insn (gen_rtx_SET (VOIDmode, dest, ret));
18075 }
18076
18077 /* Expand comparison setting or clearing carry flag.  Return true when
18078    successful and set pop for the operation.  */
18079 static bool
18080 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
18081 {
18082   enum machine_mode mode =
18083     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
18084
18085   /* Do not handle double-mode compares that go through special path.  */
18086   if (mode == (TARGET_64BIT ? TImode : DImode))
18087     return false;
18088
18089   if (SCALAR_FLOAT_MODE_P (mode))
18090     {
18091       rtx compare_op, compare_seq;
18092
18093       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
18094
18095       /* Shortcut:  following common codes never translate
18096          into carry flag compares.  */
18097       if (code == EQ || code == NE || code == UNEQ || code == LTGT
18098           || code == ORDERED || code == UNORDERED)
18099         return false;
18100
18101       /* These comparisons require zero flag; swap operands so they won't.  */
18102       if ((code == GT || code == UNLE || code == LE || code == UNGT)
18103           && !TARGET_IEEE_FP)
18104         {
18105           rtx tmp = op0;
18106           op0 = op1;
18107           op1 = tmp;
18108           code = swap_condition (code);
18109         }
18110
18111       /* Try to expand the comparison and verify that we end up with
18112          carry flag based comparison.  This fails to be true only when
18113          we decide to expand comparison using arithmetic that is not
18114          too common scenario.  */
18115       start_sequence ();
18116       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
18117       compare_seq = get_insns ();
18118       end_sequence ();
18119
18120       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
18121           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
18122         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
18123       else
18124         code = GET_CODE (compare_op);
18125
18126       if (code != LTU && code != GEU)
18127         return false;
18128
18129       emit_insn (compare_seq);
18130       *pop = compare_op;
18131       return true;
18132     }
18133
18134   if (!INTEGRAL_MODE_P (mode))
18135     return false;
18136
18137   switch (code)
18138     {
18139     case LTU:
18140     case GEU:
18141       break;
18142
18143     /* Convert a==0 into (unsigned)a<1.  */
18144     case EQ:
18145     case NE:
18146       if (op1 != const0_rtx)
18147         return false;
18148       op1 = const1_rtx;
18149       code = (code == EQ ? LTU : GEU);
18150       break;
18151
18152     /* Convert a>b into b<a or a>=b-1.  */
18153     case GTU:
18154     case LEU:
18155       if (CONST_INT_P (op1))
18156         {
18157           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
18158           /* Bail out on overflow.  We still can swap operands but that
18159              would force loading of the constant into register.  */
18160           if (op1 == const0_rtx
18161               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
18162             return false;
18163           code = (code == GTU ? GEU : LTU);
18164         }
18165       else
18166         {
18167           rtx tmp = op1;
18168           op1 = op0;
18169           op0 = tmp;
18170           code = (code == GTU ? LTU : GEU);
18171         }
18172       break;
18173
18174     /* Convert a>=0 into (unsigned)a<0x80000000.  */
18175     case LT:
18176     case GE:
18177       if (mode == DImode || op1 != const0_rtx)
18178         return false;
18179       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
18180       code = (code == LT ? GEU : LTU);
18181       break;
18182     case LE:
18183     case GT:
18184       if (mode == DImode || op1 != constm1_rtx)
18185         return false;
18186       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
18187       code = (code == LE ? GEU : LTU);
18188       break;
18189
18190     default:
18191       return false;
18192     }
18193   /* Swapping operands may cause constant to appear as first operand.  */
18194   if (!nonimmediate_operand (op0, VOIDmode))
18195     {
18196       if (!can_create_pseudo_p ())
18197         return false;
18198       op0 = force_reg (mode, op0);
18199     }
18200   *pop = ix86_expand_compare (code, op0, op1);
18201   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
18202   return true;
18203 }
18204
18205 bool
18206 ix86_expand_int_movcc (rtx operands[])
18207 {
18208   enum rtx_code code = GET_CODE (operands[1]), compare_code;
18209   rtx compare_seq, compare_op;
18210   enum machine_mode mode = GET_MODE (operands[0]);
18211   bool sign_bit_compare_p = false;
18212   rtx op0 = XEXP (operands[1], 0);
18213   rtx op1 = XEXP (operands[1], 1);
18214
18215   start_sequence ();
18216   compare_op = ix86_expand_compare (code, op0, op1);
18217   compare_seq = get_insns ();
18218   end_sequence ();
18219
18220   compare_code = GET_CODE (compare_op);
18221
18222   if ((op1 == const0_rtx && (code == GE || code == LT))
18223       || (op1 == constm1_rtx && (code == GT || code == LE)))
18224     sign_bit_compare_p = true;
18225
18226   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
18227      HImode insns, we'd be swallowed in word prefix ops.  */
18228
18229   if ((mode != HImode || TARGET_FAST_PREFIX)
18230       && (mode != (TARGET_64BIT ? TImode : DImode))
18231       && CONST_INT_P (operands[2])
18232       && CONST_INT_P (operands[3]))
18233     {
18234       rtx out = operands[0];
18235       HOST_WIDE_INT ct = INTVAL (operands[2]);
18236       HOST_WIDE_INT cf = INTVAL (operands[3]);
18237       HOST_WIDE_INT diff;
18238
18239       diff = ct - cf;
18240       /*  Sign bit compares are better done using shifts than we do by using
18241           sbb.  */
18242       if (sign_bit_compare_p
18243           || ix86_expand_carry_flag_compare (code, op0, op1, &compare_op))
18244         {
18245           /* Detect overlap between destination and compare sources.  */
18246           rtx tmp = out;
18247
18248           if (!sign_bit_compare_p)
18249             {
18250               rtx flags;
18251               bool fpcmp = false;
18252
18253               compare_code = GET_CODE (compare_op);
18254
18255               flags = XEXP (compare_op, 0);
18256
18257               if (GET_MODE (flags) == CCFPmode
18258                   || GET_MODE (flags) == CCFPUmode)
18259                 {
18260                   fpcmp = true;
18261                   compare_code
18262                     = ix86_fp_compare_code_to_integer (compare_code);
18263                 }
18264
18265               /* To simplify rest of code, restrict to the GEU case.  */
18266               if (compare_code == LTU)
18267                 {
18268                   HOST_WIDE_INT tmp = ct;
18269                   ct = cf;
18270                   cf = tmp;
18271                   compare_code = reverse_condition (compare_code);
18272                   code = reverse_condition (code);
18273                 }
18274               else
18275                 {
18276                   if (fpcmp)
18277                     PUT_CODE (compare_op,
18278                               reverse_condition_maybe_unordered
18279                                 (GET_CODE (compare_op)));
18280                   else
18281                     PUT_CODE (compare_op,
18282                               reverse_condition (GET_CODE (compare_op)));
18283                 }
18284               diff = ct - cf;
18285
18286               if (reg_overlap_mentioned_p (out, op0)
18287                   || reg_overlap_mentioned_p (out, op1))
18288                 tmp = gen_reg_rtx (mode);
18289
18290               if (mode == DImode)
18291                 emit_insn (gen_x86_movdicc_0_m1 (tmp, flags, compare_op));
18292               else
18293                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp),
18294                                                  flags, compare_op));
18295             }
18296           else
18297             {
18298               if (code == GT || code == GE)
18299                 code = reverse_condition (code);
18300               else
18301                 {
18302                   HOST_WIDE_INT tmp = ct;
18303                   ct = cf;
18304                   cf = tmp;
18305                   diff = ct - cf;
18306                 }
18307               tmp = emit_store_flag (tmp, code, op0, op1, VOIDmode, 0, -1);
18308             }
18309
18310           if (diff == 1)
18311             {
18312               /*
18313                * cmpl op0,op1
18314                * sbbl dest,dest
18315                * [addl dest, ct]
18316                *
18317                * Size 5 - 8.
18318                */
18319               if (ct)
18320                 tmp = expand_simple_binop (mode, PLUS,
18321                                            tmp, GEN_INT (ct),
18322                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18323             }
18324           else if (cf == -1)
18325             {
18326               /*
18327                * cmpl op0,op1
18328                * sbbl dest,dest
18329                * orl $ct, dest
18330                *
18331                * Size 8.
18332                */
18333               tmp = expand_simple_binop (mode, IOR,
18334                                          tmp, GEN_INT (ct),
18335                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
18336             }
18337           else if (diff == -1 && ct)
18338             {
18339               /*
18340                * cmpl op0,op1
18341                * sbbl dest,dest
18342                * notl dest
18343                * [addl dest, cf]
18344                *
18345                * Size 8 - 11.
18346                */
18347               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
18348               if (cf)
18349                 tmp = expand_simple_binop (mode, PLUS,
18350                                            copy_rtx (tmp), GEN_INT (cf),
18351                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18352             }
18353           else
18354             {
18355               /*
18356                * cmpl op0,op1
18357                * sbbl dest,dest
18358                * [notl dest]
18359                * andl cf - ct, dest
18360                * [addl dest, ct]
18361                *
18362                * Size 8 - 11.
18363                */
18364
18365               if (cf == 0)
18366                 {
18367                   cf = ct;
18368                   ct = 0;
18369                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
18370                 }
18371
18372               tmp = expand_simple_binop (mode, AND,
18373                                          copy_rtx (tmp),
18374                                          gen_int_mode (cf - ct, mode),
18375                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
18376               if (ct)
18377                 tmp = expand_simple_binop (mode, PLUS,
18378                                            copy_rtx (tmp), GEN_INT (ct),
18379                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18380             }
18381
18382           if (!rtx_equal_p (tmp, out))
18383             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
18384
18385           return true;
18386         }
18387
18388       if (diff < 0)
18389         {
18390           enum machine_mode cmp_mode = GET_MODE (op0);
18391
18392           HOST_WIDE_INT tmp;
18393           tmp = ct, ct = cf, cf = tmp;
18394           diff = -diff;
18395
18396           if (SCALAR_FLOAT_MODE_P (cmp_mode))
18397             {
18398               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
18399
18400               /* We may be reversing unordered compare to normal compare, that
18401                  is not valid in general (we may convert non-trapping condition
18402                  to trapping one), however on i386 we currently emit all
18403                  comparisons unordered.  */
18404               compare_code = reverse_condition_maybe_unordered (compare_code);
18405               code = reverse_condition_maybe_unordered (code);
18406             }
18407           else
18408             {
18409               compare_code = reverse_condition (compare_code);
18410               code = reverse_condition (code);
18411             }
18412         }
18413
18414       compare_code = UNKNOWN;
18415       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
18416           && CONST_INT_P (op1))
18417         {
18418           if (op1 == const0_rtx
18419               && (code == LT || code == GE))
18420             compare_code = code;
18421           else if (op1 == constm1_rtx)
18422             {
18423               if (code == LE)
18424                 compare_code = LT;
18425               else if (code == GT)
18426                 compare_code = GE;
18427             }
18428         }
18429
18430       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
18431       if (compare_code != UNKNOWN
18432           && GET_MODE (op0) == GET_MODE (out)
18433           && (cf == -1 || ct == -1))
18434         {
18435           /* If lea code below could be used, only optimize
18436              if it results in a 2 insn sequence.  */
18437
18438           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
18439                  || diff == 3 || diff == 5 || diff == 9)
18440               || (compare_code == LT && ct == -1)
18441               || (compare_code == GE && cf == -1))
18442             {
18443               /*
18444                * notl op1       (if necessary)
18445                * sarl $31, op1
18446                * orl cf, op1
18447                */
18448               if (ct != -1)
18449                 {
18450                   cf = ct;
18451                   ct = -1;
18452                   code = reverse_condition (code);
18453                 }
18454
18455               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, -1);
18456
18457               out = expand_simple_binop (mode, IOR,
18458                                          out, GEN_INT (cf),
18459                                          out, 1, OPTAB_DIRECT);
18460               if (out != operands[0])
18461                 emit_move_insn (operands[0], out);
18462
18463               return true;
18464             }
18465         }
18466
18467
18468       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
18469            || diff == 3 || diff == 5 || diff == 9)
18470           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
18471           && (mode != DImode
18472               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
18473         {
18474           /*
18475            * xorl dest,dest
18476            * cmpl op1,op2
18477            * setcc dest
18478            * lea cf(dest*(ct-cf)),dest
18479            *
18480            * Size 14.
18481            *
18482            * This also catches the degenerate setcc-only case.
18483            */
18484
18485           rtx tmp;
18486           int nops;
18487
18488           out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, 1);
18489
18490           nops = 0;
18491           /* On x86_64 the lea instruction operates on Pmode, so we need
18492              to get arithmetics done in proper mode to match.  */
18493           if (diff == 1)
18494             tmp = copy_rtx (out);
18495           else
18496             {
18497               rtx out1;
18498               out1 = copy_rtx (out);
18499               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
18500               nops++;
18501               if (diff & 1)
18502                 {
18503                   tmp = gen_rtx_PLUS (mode, tmp, out1);
18504                   nops++;
18505                 }
18506             }
18507           if (cf != 0)
18508             {
18509               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
18510               nops++;
18511             }
18512           if (!rtx_equal_p (tmp, out))
18513             {
18514               if (nops == 1)
18515                 out = force_operand (tmp, copy_rtx (out));
18516               else
18517                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
18518             }
18519           if (!rtx_equal_p (out, operands[0]))
18520             emit_move_insn (operands[0], copy_rtx (out));
18521
18522           return true;
18523         }
18524
18525       /*
18526        * General case:                  Jumpful:
18527        *   xorl dest,dest               cmpl op1, op2
18528        *   cmpl op1, op2                movl ct, dest
18529        *   setcc dest                   jcc 1f
18530        *   decl dest                    movl cf, dest
18531        *   andl (cf-ct),dest            1:
18532        *   addl ct,dest
18533        *
18534        * Size 20.                       Size 14.
18535        *
18536        * This is reasonably steep, but branch mispredict costs are
18537        * high on modern cpus, so consider failing only if optimizing
18538        * for space.
18539        */
18540
18541       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
18542           && BRANCH_COST (optimize_insn_for_speed_p (),
18543                           false) >= 2)
18544         {
18545           if (cf == 0)
18546             {
18547               enum machine_mode cmp_mode = GET_MODE (op0);
18548
18549               cf = ct;
18550               ct = 0;
18551
18552               if (SCALAR_FLOAT_MODE_P (cmp_mode))
18553                 {
18554                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
18555
18556                   /* We may be reversing unordered compare to normal compare,
18557                      that is not valid in general (we may convert non-trapping
18558                      condition to trapping one), however on i386 we currently
18559                      emit all comparisons unordered.  */
18560                   code = reverse_condition_maybe_unordered (code);
18561                 }
18562               else
18563                 {
18564                   code = reverse_condition (code);
18565                   if (compare_code != UNKNOWN)
18566                     compare_code = reverse_condition (compare_code);
18567                 }
18568             }
18569
18570           if (compare_code != UNKNOWN)
18571             {
18572               /* notl op1       (if needed)
18573                  sarl $31, op1
18574                  andl (cf-ct), op1
18575                  addl ct, op1
18576
18577                  For x < 0 (resp. x <= -1) there will be no notl,
18578                  so if possible swap the constants to get rid of the
18579                  complement.
18580                  True/false will be -1/0 while code below (store flag
18581                  followed by decrement) is 0/-1, so the constants need
18582                  to be exchanged once more.  */
18583
18584               if (compare_code == GE || !cf)
18585                 {
18586                   code = reverse_condition (code);
18587                   compare_code = LT;
18588                 }
18589               else
18590                 {
18591                   HOST_WIDE_INT tmp = cf;
18592                   cf = ct;
18593                   ct = tmp;
18594                 }
18595
18596               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, -1);
18597             }
18598           else
18599             {
18600               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, 1);
18601
18602               out = expand_simple_binop (mode, PLUS, copy_rtx (out),
18603                                          constm1_rtx,
18604                                          copy_rtx (out), 1, OPTAB_DIRECT);
18605             }
18606
18607           out = expand_simple_binop (mode, AND, copy_rtx (out),
18608                                      gen_int_mode (cf - ct, mode),
18609                                      copy_rtx (out), 1, OPTAB_DIRECT);
18610           if (ct)
18611             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
18612                                        copy_rtx (out), 1, OPTAB_DIRECT);
18613           if (!rtx_equal_p (out, operands[0]))
18614             emit_move_insn (operands[0], copy_rtx (out));
18615
18616           return true;
18617         }
18618     }
18619
18620   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
18621     {
18622       /* Try a few things more with specific constants and a variable.  */
18623
18624       optab op;
18625       rtx var, orig_out, out, tmp;
18626
18627       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
18628         return false;
18629
18630       /* If one of the two operands is an interesting constant, load a
18631          constant with the above and mask it in with a logical operation.  */
18632
18633       if (CONST_INT_P (operands[2]))
18634         {
18635           var = operands[3];
18636           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
18637             operands[3] = constm1_rtx, op = and_optab;
18638           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
18639             operands[3] = const0_rtx, op = ior_optab;
18640           else
18641             return false;
18642         }
18643       else if (CONST_INT_P (operands[3]))
18644         {
18645           var = operands[2];
18646           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
18647             operands[2] = constm1_rtx, op = and_optab;
18648           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
18649             operands[2] = const0_rtx, op = ior_optab;
18650           else
18651             return false;
18652         }
18653       else
18654         return false;
18655
18656       orig_out = operands[0];
18657       tmp = gen_reg_rtx (mode);
18658       operands[0] = tmp;
18659
18660       /* Recurse to get the constant loaded.  */
18661       if (ix86_expand_int_movcc (operands) == 0)
18662         return false;
18663
18664       /* Mask in the interesting variable.  */
18665       out = expand_binop (mode, op, var, tmp, orig_out, 0,
18666                           OPTAB_WIDEN);
18667       if (!rtx_equal_p (out, orig_out))
18668         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
18669
18670       return true;
18671     }
18672
18673   /*
18674    * For comparison with above,
18675    *
18676    * movl cf,dest
18677    * movl ct,tmp
18678    * cmpl op1,op2
18679    * cmovcc tmp,dest
18680    *
18681    * Size 15.
18682    */
18683
18684   if (! nonimmediate_operand (operands[2], mode))
18685     operands[2] = force_reg (mode, operands[2]);
18686   if (! nonimmediate_operand (operands[3], mode))
18687     operands[3] = force_reg (mode, operands[3]);
18688
18689   if (! register_operand (operands[2], VOIDmode)
18690       && (mode == QImode
18691           || ! register_operand (operands[3], VOIDmode)))
18692     operands[2] = force_reg (mode, operands[2]);
18693
18694   if (mode == QImode
18695       && ! register_operand (operands[3], VOIDmode))
18696     operands[3] = force_reg (mode, operands[3]);
18697
18698   emit_insn (compare_seq);
18699   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
18700                           gen_rtx_IF_THEN_ELSE (mode,
18701                                                 compare_op, operands[2],
18702                                                 operands[3])));
18703   return true;
18704 }
18705
18706 /* Swap, force into registers, or otherwise massage the two operands
18707    to an sse comparison with a mask result.  Thus we differ a bit from
18708    ix86_prepare_fp_compare_args which expects to produce a flags result.
18709
18710    The DEST operand exists to help determine whether to commute commutative
18711    operators.  The POP0/POP1 operands are updated in place.  The new
18712    comparison code is returned, or UNKNOWN if not implementable.  */
18713
18714 static enum rtx_code
18715 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
18716                                   rtx *pop0, rtx *pop1)
18717 {
18718   rtx tmp;
18719
18720   switch (code)
18721     {
18722     case LTGT:
18723     case UNEQ:
18724       /* We have no LTGT as an operator.  We could implement it with
18725          NE & ORDERED, but this requires an extra temporary.  It's
18726          not clear that it's worth it.  */
18727       return UNKNOWN;
18728
18729     case LT:
18730     case LE:
18731     case UNGT:
18732     case UNGE:
18733       /* These are supported directly.  */
18734       break;
18735
18736     case EQ:
18737     case NE:
18738     case UNORDERED:
18739     case ORDERED:
18740       /* For commutative operators, try to canonicalize the destination
18741          operand to be first in the comparison - this helps reload to
18742          avoid extra moves.  */
18743       if (!dest || !rtx_equal_p (dest, *pop1))
18744         break;
18745       /* FALLTHRU */
18746
18747     case GE:
18748     case GT:
18749     case UNLE:
18750     case UNLT:
18751       /* These are not supported directly.  Swap the comparison operands
18752          to transform into something that is supported.  */
18753       tmp = *pop0;
18754       *pop0 = *pop1;
18755       *pop1 = tmp;
18756       code = swap_condition (code);
18757       break;
18758
18759     default:
18760       gcc_unreachable ();
18761     }
18762
18763   return code;
18764 }
18765
18766 /* Detect conditional moves that exactly match min/max operational
18767    semantics.  Note that this is IEEE safe, as long as we don't
18768    interchange the operands.
18769
18770    Returns FALSE if this conditional move doesn't match a MIN/MAX,
18771    and TRUE if the operation is successful and instructions are emitted.  */
18772
18773 static bool
18774 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
18775                            rtx cmp_op1, rtx if_true, rtx if_false)
18776 {
18777   enum machine_mode mode;
18778   bool is_min;
18779   rtx tmp;
18780
18781   if (code == LT)
18782     ;
18783   else if (code == UNGE)
18784     {
18785       tmp = if_true;
18786       if_true = if_false;
18787       if_false = tmp;
18788     }
18789   else
18790     return false;
18791
18792   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
18793     is_min = true;
18794   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
18795     is_min = false;
18796   else
18797     return false;
18798
18799   mode = GET_MODE (dest);
18800
18801   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
18802      but MODE may be a vector mode and thus not appropriate.  */
18803   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
18804     {
18805       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
18806       rtvec v;
18807
18808       if_true = force_reg (mode, if_true);
18809       v = gen_rtvec (2, if_true, if_false);
18810       tmp = gen_rtx_UNSPEC (mode, v, u);
18811     }
18812   else
18813     {
18814       code = is_min ? SMIN : SMAX;
18815       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
18816     }
18817
18818   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
18819   return true;
18820 }
18821
18822 /* Expand an sse vector comparison.  Return the register with the result.  */
18823
18824 static rtx
18825 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
18826                      rtx op_true, rtx op_false)
18827 {
18828   enum machine_mode mode = GET_MODE (dest);
18829   rtx x;
18830
18831   cmp_op0 = force_reg (mode, cmp_op0);
18832   if (!nonimmediate_operand (cmp_op1, mode))
18833     cmp_op1 = force_reg (mode, cmp_op1);
18834
18835   if (optimize
18836       || reg_overlap_mentioned_p (dest, op_true)
18837       || reg_overlap_mentioned_p (dest, op_false))
18838     dest = gen_reg_rtx (mode);
18839
18840   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
18841   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18842
18843   return dest;
18844 }
18845
18846 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
18847    operations.  This is used for both scalar and vector conditional moves.  */
18848
18849 static void
18850 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
18851 {
18852   enum machine_mode mode = GET_MODE (dest);
18853   rtx t2, t3, x;
18854
18855   if (op_false == CONST0_RTX (mode))
18856     {
18857       op_true = force_reg (mode, op_true);
18858       x = gen_rtx_AND (mode, cmp, op_true);
18859       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18860     }
18861   else if (op_true == CONST0_RTX (mode))
18862     {
18863       op_false = force_reg (mode, op_false);
18864       x = gen_rtx_NOT (mode, cmp);
18865       x = gen_rtx_AND (mode, x, op_false);
18866       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18867     }
18868   else if (TARGET_XOP)
18869     {
18870       rtx pcmov = gen_rtx_SET (mode, dest,
18871                                gen_rtx_IF_THEN_ELSE (mode, cmp,
18872                                                      op_true,
18873                                                      op_false));
18874       emit_insn (pcmov);
18875     }
18876   else
18877     {
18878       op_true = force_reg (mode, op_true);
18879       op_false = force_reg (mode, op_false);
18880
18881       t2 = gen_reg_rtx (mode);
18882       if (optimize)
18883         t3 = gen_reg_rtx (mode);
18884       else
18885         t3 = dest;
18886
18887       x = gen_rtx_AND (mode, op_true, cmp);
18888       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
18889
18890       x = gen_rtx_NOT (mode, cmp);
18891       x = gen_rtx_AND (mode, x, op_false);
18892       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
18893
18894       x = gen_rtx_IOR (mode, t3, t2);
18895       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18896     }
18897 }
18898
18899 /* Expand a floating-point conditional move.  Return true if successful.  */
18900
18901 bool
18902 ix86_expand_fp_movcc (rtx operands[])
18903 {
18904   enum machine_mode mode = GET_MODE (operands[0]);
18905   enum rtx_code code = GET_CODE (operands[1]);
18906   rtx tmp, compare_op;
18907   rtx op0 = XEXP (operands[1], 0);
18908   rtx op1 = XEXP (operands[1], 1);
18909
18910   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
18911     {
18912       enum machine_mode cmode;
18913
18914       /* Since we've no cmove for sse registers, don't force bad register
18915          allocation just to gain access to it.  Deny movcc when the
18916          comparison mode doesn't match the move mode.  */
18917       cmode = GET_MODE (op0);
18918       if (cmode == VOIDmode)
18919         cmode = GET_MODE (op1);
18920       if (cmode != mode)
18921         return false;
18922
18923       code = ix86_prepare_sse_fp_compare_args (operands[0], code, &op0, &op1);
18924       if (code == UNKNOWN)
18925         return false;
18926
18927       if (ix86_expand_sse_fp_minmax (operands[0], code, op0, op1,
18928                                      operands[2], operands[3]))
18929         return true;
18930
18931       tmp = ix86_expand_sse_cmp (operands[0], code, op0, op1,
18932                                  operands[2], operands[3]);
18933       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
18934       return true;
18935     }
18936
18937   /* The floating point conditional move instructions don't directly
18938      support conditions resulting from a signed integer comparison.  */
18939
18940   compare_op = ix86_expand_compare (code, op0, op1);
18941   if (!fcmov_comparison_operator (compare_op, VOIDmode))
18942     {
18943       tmp = gen_reg_rtx (QImode);
18944       ix86_expand_setcc (tmp, code, op0, op1);
18945
18946       compare_op = ix86_expand_compare (NE, tmp, const0_rtx);
18947     }
18948
18949   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
18950                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
18951                                                 operands[2], operands[3])));
18952
18953   return true;
18954 }
18955
18956 /* Expand a floating-point vector conditional move; a vcond operation
18957    rather than a movcc operation.  */
18958
18959 bool
18960 ix86_expand_fp_vcond (rtx operands[])
18961 {
18962   enum rtx_code code = GET_CODE (operands[3]);
18963   rtx cmp;
18964
18965   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
18966                                            &operands[4], &operands[5]);
18967   if (code == UNKNOWN)
18968     return false;
18969
18970   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
18971                                  operands[5], operands[1], operands[2]))
18972     return true;
18973
18974   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
18975                              operands[1], operands[2]);
18976   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
18977   return true;
18978 }
18979
18980 /* Expand a signed/unsigned integral vector conditional move.  */
18981
18982 bool
18983 ix86_expand_int_vcond (rtx operands[])
18984 {
18985   enum machine_mode mode = GET_MODE (operands[0]);
18986   enum rtx_code code = GET_CODE (operands[3]);
18987   bool negate = false;
18988   rtx x, cop0, cop1;
18989
18990   cop0 = operands[4];
18991   cop1 = operands[5];
18992
18993   /* XOP supports all of the comparisons on all vector int types.  */
18994   if (!TARGET_XOP)
18995     {
18996       /* Canonicalize the comparison to EQ, GT, GTU.  */
18997       switch (code)
18998         {
18999         case EQ:
19000         case GT:
19001         case GTU:
19002           break;
19003
19004         case NE:
19005         case LE:
19006         case LEU:
19007           code = reverse_condition (code);
19008           negate = true;
19009           break;
19010
19011         case GE:
19012         case GEU:
19013           code = reverse_condition (code);
19014           negate = true;
19015           /* FALLTHRU */
19016
19017         case LT:
19018         case LTU:
19019           code = swap_condition (code);
19020           x = cop0, cop0 = cop1, cop1 = x;
19021           break;
19022
19023         default:
19024           gcc_unreachable ();
19025         }
19026
19027       /* Only SSE4.1/SSE4.2 supports V2DImode.  */
19028       if (mode == V2DImode)
19029         {
19030           switch (code)
19031             {
19032             case EQ:
19033               /* SSE4.1 supports EQ.  */
19034               if (!TARGET_SSE4_1)
19035                 return false;
19036               break;
19037
19038             case GT:
19039             case GTU:
19040               /* SSE4.2 supports GT/GTU.  */
19041               if (!TARGET_SSE4_2)
19042                 return false;
19043               break;
19044
19045             default:
19046               gcc_unreachable ();
19047             }
19048         }
19049
19050       /* Unsigned parallel compare is not supported by the hardware.
19051          Play some tricks to turn this into a signed comparison
19052          against 0.  */
19053       if (code == GTU)
19054         {
19055           cop0 = force_reg (mode, cop0);
19056
19057           switch (mode)
19058             {
19059             case V4SImode:
19060             case V2DImode:
19061                 {
19062                   rtx t1, t2, mask;
19063                   rtx (*gen_sub3) (rtx, rtx, rtx);
19064
19065                   /* Subtract (-(INT MAX) - 1) from both operands to make
19066                      them signed.  */
19067                   mask = ix86_build_signbit_mask (mode, true, false);
19068                   gen_sub3 = (mode == V4SImode
19069                               ? gen_subv4si3 : gen_subv2di3);
19070                   t1 = gen_reg_rtx (mode);
19071                   emit_insn (gen_sub3 (t1, cop0, mask));
19072
19073                   t2 = gen_reg_rtx (mode);
19074                   emit_insn (gen_sub3 (t2, cop1, mask));
19075
19076                   cop0 = t1;
19077                   cop1 = t2;
19078                   code = GT;
19079                 }
19080               break;
19081
19082             case V16QImode:
19083             case V8HImode:
19084               /* Perform a parallel unsigned saturating subtraction.  */
19085               x = gen_reg_rtx (mode);
19086               emit_insn (gen_rtx_SET (VOIDmode, x,
19087                                       gen_rtx_US_MINUS (mode, cop0, cop1)));
19088
19089               cop0 = x;
19090               cop1 = CONST0_RTX (mode);
19091               code = EQ;
19092               negate = !negate;
19093               break;
19094
19095             default:
19096               gcc_unreachable ();
19097             }
19098         }
19099     }
19100
19101   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
19102                            operands[1+negate], operands[2-negate]);
19103
19104   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
19105                          operands[2-negate]);
19106   return true;
19107 }
19108
19109 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
19110    true if we should do zero extension, else sign extension.  HIGH_P is
19111    true if we want the N/2 high elements, else the low elements.  */
19112
19113 void
19114 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
19115 {
19116   enum machine_mode imode = GET_MODE (operands[1]);
19117   rtx (*unpack)(rtx, rtx, rtx);
19118   rtx se, dest;
19119
19120   switch (imode)
19121     {
19122     case V16QImode:
19123       if (high_p)
19124         unpack = gen_vec_interleave_highv16qi;
19125       else
19126         unpack = gen_vec_interleave_lowv16qi;
19127       break;
19128     case V8HImode:
19129       if (high_p)
19130         unpack = gen_vec_interleave_highv8hi;
19131       else
19132         unpack = gen_vec_interleave_lowv8hi;
19133       break;
19134     case V4SImode:
19135       if (high_p)
19136         unpack = gen_vec_interleave_highv4si;
19137       else
19138         unpack = gen_vec_interleave_lowv4si;
19139       break;
19140     default:
19141       gcc_unreachable ();
19142     }
19143
19144   dest = gen_lowpart (imode, operands[0]);
19145
19146   if (unsigned_p)
19147     se = force_reg (imode, CONST0_RTX (imode));
19148   else
19149     se = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
19150                               operands[1], pc_rtx, pc_rtx);
19151
19152   emit_insn (unpack (dest, operands[1], se));
19153 }
19154
19155 /* This function performs the same task as ix86_expand_sse_unpack,
19156    but with SSE4.1 instructions.  */
19157
19158 void
19159 ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p)
19160 {
19161   enum machine_mode imode = GET_MODE (operands[1]);
19162   rtx (*unpack)(rtx, rtx);
19163   rtx src, dest;
19164
19165   switch (imode)
19166     {
19167     case V16QImode:
19168       if (unsigned_p)
19169         unpack = gen_sse4_1_zero_extendv8qiv8hi2;
19170       else
19171         unpack = gen_sse4_1_sign_extendv8qiv8hi2;
19172       break;
19173     case V8HImode:
19174       if (unsigned_p)
19175         unpack = gen_sse4_1_zero_extendv4hiv4si2;
19176       else
19177         unpack = gen_sse4_1_sign_extendv4hiv4si2;
19178       break;
19179     case V4SImode:
19180       if (unsigned_p)
19181         unpack = gen_sse4_1_zero_extendv2siv2di2;
19182       else
19183         unpack = gen_sse4_1_sign_extendv2siv2di2;
19184       break;
19185     default:
19186       gcc_unreachable ();
19187     }
19188
19189   dest = operands[0];
19190   if (high_p)
19191     {
19192       /* Shift higher 8 bytes to lower 8 bytes.  */
19193       src = gen_reg_rtx (imode);
19194       emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, src),
19195                                      gen_lowpart (V1TImode, operands[1]),
19196                                      GEN_INT (64)));
19197     }
19198   else
19199     src = operands[1];
19200
19201   emit_insn (unpack (dest, src));
19202 }
19203
19204 /* Expand conditional increment or decrement using adb/sbb instructions.
19205    The default case using setcc followed by the conditional move can be
19206    done by generic code.  */
19207 bool
19208 ix86_expand_int_addcc (rtx operands[])
19209 {
19210   enum rtx_code code = GET_CODE (operands[1]);
19211   rtx flags;
19212   rtx (*insn)(rtx, rtx, rtx, rtx, rtx);
19213   rtx compare_op;
19214   rtx val = const0_rtx;
19215   bool fpcmp = false;
19216   enum machine_mode mode;
19217   rtx op0 = XEXP (operands[1], 0);
19218   rtx op1 = XEXP (operands[1], 1);
19219
19220   if (operands[3] != const1_rtx
19221       && operands[3] != constm1_rtx)
19222     return false;
19223   if (!ix86_expand_carry_flag_compare (code, op0, op1, &compare_op))
19224      return false;
19225   code = GET_CODE (compare_op);
19226
19227   flags = XEXP (compare_op, 0);
19228
19229   if (GET_MODE (flags) == CCFPmode
19230       || GET_MODE (flags) == CCFPUmode)
19231     {
19232       fpcmp = true;
19233       code = ix86_fp_compare_code_to_integer (code);
19234     }
19235
19236   if (code != LTU)
19237     {
19238       val = constm1_rtx;
19239       if (fpcmp)
19240         PUT_CODE (compare_op,
19241                   reverse_condition_maybe_unordered
19242                     (GET_CODE (compare_op)));
19243       else
19244         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
19245     }
19246
19247   mode = GET_MODE (operands[0]);
19248
19249   /* Construct either adc or sbb insn.  */
19250   if ((code == LTU) == (operands[3] == constm1_rtx))
19251     {
19252       switch (mode)
19253         {
19254           case QImode:
19255             insn = gen_subqi3_carry;
19256             break;
19257           case HImode:
19258             insn = gen_subhi3_carry;
19259             break;
19260           case SImode:
19261             insn = gen_subsi3_carry;
19262             break;
19263           case DImode:
19264             insn = gen_subdi3_carry;
19265             break;
19266           default:
19267             gcc_unreachable ();
19268         }
19269     }
19270   else
19271     {
19272       switch (mode)
19273         {
19274           case QImode:
19275             insn = gen_addqi3_carry;
19276             break;
19277           case HImode:
19278             insn = gen_addhi3_carry;
19279             break;
19280           case SImode:
19281             insn = gen_addsi3_carry;
19282             break;
19283           case DImode:
19284             insn = gen_adddi3_carry;
19285             break;
19286           default:
19287             gcc_unreachable ();
19288         }
19289     }
19290   emit_insn (insn (operands[0], operands[2], val, flags, compare_op));
19291
19292   return true;
19293 }
19294
19295
19296 /* Split operands 0 and 1 into half-mode parts.  Similar to split_double_mode,
19297    but works for floating pointer parameters and nonoffsetable memories.
19298    For pushes, it returns just stack offsets; the values will be saved
19299    in the right order.  Maximally three parts are generated.  */
19300
19301 static int
19302 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
19303 {
19304   int size;
19305
19306   if (!TARGET_64BIT)
19307     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
19308   else
19309     size = (GET_MODE_SIZE (mode) + 4) / 8;
19310
19311   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
19312   gcc_assert (size >= 2 && size <= 4);
19313
19314   /* Optimize constant pool reference to immediates.  This is used by fp
19315      moves, that force all constants to memory to allow combining.  */
19316   if (MEM_P (operand) && MEM_READONLY_P (operand))
19317     {
19318       rtx tmp = maybe_get_pool_constant (operand);
19319       if (tmp)
19320         operand = tmp;
19321     }
19322
19323   if (MEM_P (operand) && !offsettable_memref_p (operand))
19324     {
19325       /* The only non-offsetable memories we handle are pushes.  */
19326       int ok = push_operand (operand, VOIDmode);
19327
19328       gcc_assert (ok);
19329
19330       operand = copy_rtx (operand);
19331       PUT_MODE (operand, Pmode);
19332       parts[0] = parts[1] = parts[2] = parts[3] = operand;
19333       return size;
19334     }
19335
19336   if (GET_CODE (operand) == CONST_VECTOR)
19337     {
19338       enum machine_mode imode = int_mode_for_mode (mode);
19339       /* Caution: if we looked through a constant pool memory above,
19340          the operand may actually have a different mode now.  That's
19341          ok, since we want to pun this all the way back to an integer.  */
19342       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
19343       gcc_assert (operand != NULL);
19344       mode = imode;
19345     }
19346
19347   if (!TARGET_64BIT)
19348     {
19349       if (mode == DImode)
19350         split_double_mode (mode, &operand, 1, &parts[0], &parts[1]);
19351       else
19352         {
19353           int i;
19354
19355           if (REG_P (operand))
19356             {
19357               gcc_assert (reload_completed);
19358               for (i = 0; i < size; i++)
19359                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
19360             }
19361           else if (offsettable_memref_p (operand))
19362             {
19363               operand = adjust_address (operand, SImode, 0);
19364               parts[0] = operand;
19365               for (i = 1; i < size; i++)
19366                 parts[i] = adjust_address (operand, SImode, 4 * i);
19367             }
19368           else if (GET_CODE (operand) == CONST_DOUBLE)
19369             {
19370               REAL_VALUE_TYPE r;
19371               long l[4];
19372
19373               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
19374               switch (mode)
19375                 {
19376                 case TFmode:
19377                   real_to_target (l, &r, mode);
19378                   parts[3] = gen_int_mode (l[3], SImode);
19379                   parts[2] = gen_int_mode (l[2], SImode);
19380                   break;
19381                 case XFmode:
19382                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
19383                   parts[2] = gen_int_mode (l[2], SImode);
19384                   break;
19385                 case DFmode:
19386                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
19387                   break;
19388                 default:
19389                   gcc_unreachable ();
19390                 }
19391               parts[1] = gen_int_mode (l[1], SImode);
19392               parts[0] = gen_int_mode (l[0], SImode);
19393             }
19394           else
19395             gcc_unreachable ();
19396         }
19397     }
19398   else
19399     {
19400       if (mode == TImode)
19401         split_double_mode (mode, &operand, 1, &parts[0], &parts[1]);
19402       if (mode == XFmode || mode == TFmode)
19403         {
19404           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
19405           if (REG_P (operand))
19406             {
19407               gcc_assert (reload_completed);
19408               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
19409               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
19410             }
19411           else if (offsettable_memref_p (operand))
19412             {
19413               operand = adjust_address (operand, DImode, 0);
19414               parts[0] = operand;
19415               parts[1] = adjust_address (operand, upper_mode, 8);
19416             }
19417           else if (GET_CODE (operand) == CONST_DOUBLE)
19418             {
19419               REAL_VALUE_TYPE r;
19420               long l[4];
19421
19422               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
19423               real_to_target (l, &r, mode);
19424
19425               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
19426               if (HOST_BITS_PER_WIDE_INT >= 64)
19427                 parts[0]
19428                   = gen_int_mode
19429                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
19430                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
19431                        DImode);
19432               else
19433                 parts[0] = immed_double_const (l[0], l[1], DImode);
19434
19435               if (upper_mode == SImode)
19436                 parts[1] = gen_int_mode (l[2], SImode);
19437               else if (HOST_BITS_PER_WIDE_INT >= 64)
19438                 parts[1]
19439                   = gen_int_mode
19440                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
19441                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
19442                        DImode);
19443               else
19444                 parts[1] = immed_double_const (l[2], l[3], DImode);
19445             }
19446           else
19447             gcc_unreachable ();
19448         }
19449     }
19450
19451   return size;
19452 }
19453
19454 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
19455    Return false when normal moves are needed; true when all required
19456    insns have been emitted.  Operands 2-4 contain the input values
19457    int the correct order; operands 5-7 contain the output values.  */
19458
19459 void
19460 ix86_split_long_move (rtx operands[])
19461 {
19462   rtx part[2][4];
19463   int nparts, i, j;
19464   int push = 0;
19465   int collisions = 0;
19466   enum machine_mode mode = GET_MODE (operands[0]);
19467   bool collisionparts[4];
19468
19469   /* The DFmode expanders may ask us to move double.
19470      For 64bit target this is single move.  By hiding the fact
19471      here we simplify i386.md splitters.  */
19472   if (TARGET_64BIT && GET_MODE_SIZE (GET_MODE (operands[0])) == 8)
19473     {
19474       /* Optimize constant pool reference to immediates.  This is used by
19475          fp moves, that force all constants to memory to allow combining.  */
19476
19477       if (MEM_P (operands[1])
19478           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
19479           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
19480         operands[1] = get_pool_constant (XEXP (operands[1], 0));
19481       if (push_operand (operands[0], VOIDmode))
19482         {
19483           operands[0] = copy_rtx (operands[0]);
19484           PUT_MODE (operands[0], Pmode);
19485         }
19486       else
19487         operands[0] = gen_lowpart (DImode, operands[0]);
19488       operands[1] = gen_lowpart (DImode, operands[1]);
19489       emit_move_insn (operands[0], operands[1]);
19490       return;
19491     }
19492
19493   /* The only non-offsettable memory we handle is push.  */
19494   if (push_operand (operands[0], VOIDmode))
19495     push = 1;
19496   else
19497     gcc_assert (!MEM_P (operands[0])
19498                 || offsettable_memref_p (operands[0]));
19499
19500   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
19501   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
19502
19503   /* When emitting push, take care for source operands on the stack.  */
19504   if (push && MEM_P (operands[1])
19505       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
19506     {
19507       rtx src_base = XEXP (part[1][nparts - 1], 0);
19508
19509       /* Compensate for the stack decrement by 4.  */
19510       if (!TARGET_64BIT && nparts == 3
19511           && mode == XFmode && TARGET_128BIT_LONG_DOUBLE)
19512         src_base = plus_constant (src_base, 4);
19513
19514       /* src_base refers to the stack pointer and is
19515          automatically decreased by emitted push.  */
19516       for (i = 0; i < nparts; i++)
19517         part[1][i] = change_address (part[1][i],
19518                                      GET_MODE (part[1][i]), src_base);
19519     }
19520
19521   /* We need to do copy in the right order in case an address register
19522      of the source overlaps the destination.  */
19523   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
19524     {
19525       rtx tmp;
19526
19527       for (i = 0; i < nparts; i++)
19528         {
19529           collisionparts[i]
19530             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
19531           if (collisionparts[i])
19532             collisions++;
19533         }
19534
19535       /* Collision in the middle part can be handled by reordering.  */
19536       if (collisions == 1 && nparts == 3 && collisionparts [1])
19537         {
19538           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
19539           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
19540         }
19541       else if (collisions == 1
19542                && nparts == 4
19543                && (collisionparts [1] || collisionparts [2]))
19544         {
19545           if (collisionparts [1])
19546             {
19547               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
19548               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
19549             }
19550           else
19551             {
19552               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
19553               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
19554             }
19555         }
19556
19557       /* If there are more collisions, we can't handle it by reordering.
19558          Do an lea to the last part and use only one colliding move.  */
19559       else if (collisions > 1)
19560         {
19561           rtx base;
19562
19563           collisions = 1;
19564
19565           base = part[0][nparts - 1];
19566
19567           /* Handle the case when the last part isn't valid for lea.
19568              Happens in 64-bit mode storing the 12-byte XFmode.  */
19569           if (GET_MODE (base) != Pmode)
19570             base = gen_rtx_REG (Pmode, REGNO (base));
19571
19572           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
19573           part[1][0] = replace_equiv_address (part[1][0], base);
19574           for (i = 1; i < nparts; i++)
19575             {
19576               tmp = plus_constant (base, UNITS_PER_WORD * i);
19577               part[1][i] = replace_equiv_address (part[1][i], tmp);
19578             }
19579         }
19580     }
19581
19582   if (push)
19583     {
19584       if (!TARGET_64BIT)
19585         {
19586           if (nparts == 3)
19587             {
19588               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
19589                 emit_insn (gen_addsi3 (stack_pointer_rtx,
19590                                        stack_pointer_rtx, GEN_INT (-4)));
19591               emit_move_insn (part[0][2], part[1][2]);
19592             }
19593           else if (nparts == 4)
19594             {
19595               emit_move_insn (part[0][3], part[1][3]);
19596               emit_move_insn (part[0][2], part[1][2]);
19597             }
19598         }
19599       else
19600         {
19601           /* In 64bit mode we don't have 32bit push available.  In case this is
19602              register, it is OK - we will just use larger counterpart.  We also
19603              retype memory - these comes from attempt to avoid REX prefix on
19604              moving of second half of TFmode value.  */
19605           if (GET_MODE (part[1][1]) == SImode)
19606             {
19607               switch (GET_CODE (part[1][1]))
19608                 {
19609                 case MEM:
19610                   part[1][1] = adjust_address (part[1][1], DImode, 0);
19611                   break;
19612
19613                 case REG:
19614                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
19615                   break;
19616
19617                 default:
19618                   gcc_unreachable ();
19619                 }
19620
19621               if (GET_MODE (part[1][0]) == SImode)
19622                 part[1][0] = part[1][1];
19623             }
19624         }
19625       emit_move_insn (part[0][1], part[1][1]);
19626       emit_move_insn (part[0][0], part[1][0]);
19627       return;
19628     }
19629
19630   /* Choose correct order to not overwrite the source before it is copied.  */
19631   if ((REG_P (part[0][0])
19632        && REG_P (part[1][1])
19633        && (REGNO (part[0][0]) == REGNO (part[1][1])
19634            || (nparts == 3
19635                && REGNO (part[0][0]) == REGNO (part[1][2]))
19636            || (nparts == 4
19637                && REGNO (part[0][0]) == REGNO (part[1][3]))))
19638       || (collisions > 0
19639           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
19640     {
19641       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
19642         {
19643           operands[2 + i] = part[0][j];
19644           operands[6 + i] = part[1][j];
19645         }
19646     }
19647   else
19648     {
19649       for (i = 0; i < nparts; i++)
19650         {
19651           operands[2 + i] = part[0][i];
19652           operands[6 + i] = part[1][i];
19653         }
19654     }
19655
19656   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
19657   if (optimize_insn_for_size_p ())
19658     {
19659       for (j = 0; j < nparts - 1; j++)
19660         if (CONST_INT_P (operands[6 + j])
19661             && operands[6 + j] != const0_rtx
19662             && REG_P (operands[2 + j]))
19663           for (i = j; i < nparts - 1; i++)
19664             if (CONST_INT_P (operands[7 + i])
19665                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
19666               operands[7 + i] = operands[2 + j];
19667     }
19668
19669   for (i = 0; i < nparts; i++)
19670     emit_move_insn (operands[2 + i], operands[6 + i]);
19671
19672   return;
19673 }
19674
19675 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
19676    left shift by a constant, either using a single shift or
19677    a sequence of add instructions.  */
19678
19679 static void
19680 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
19681 {
19682   rtx (*insn)(rtx, rtx, rtx);
19683
19684   if (count == 1
19685       || (count * ix86_cost->add <= ix86_cost->shift_const
19686           && !optimize_insn_for_size_p ()))
19687     {
19688       insn = mode == DImode ? gen_addsi3 : gen_adddi3;
19689       while (count-- > 0)
19690         emit_insn (insn (operand, operand, operand));
19691     }
19692   else
19693     {
19694       insn = mode == DImode ? gen_ashlsi3 : gen_ashldi3;
19695       emit_insn (insn (operand, operand, GEN_INT (count)));
19696     }
19697 }
19698
19699 void
19700 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
19701 {
19702   rtx (*gen_ashl3)(rtx, rtx, rtx);
19703   rtx (*gen_shld)(rtx, rtx, rtx);
19704   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19705
19706   rtx low[2], high[2];
19707   int count;
19708
19709   if (CONST_INT_P (operands[2]))
19710     {
19711       split_double_mode (mode, operands, 2, low, high);
19712       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19713
19714       if (count >= half_width)
19715         {
19716           emit_move_insn (high[0], low[1]);
19717           emit_move_insn (low[0], const0_rtx);
19718
19719           if (count > half_width)
19720             ix86_expand_ashl_const (high[0], count - half_width, mode);
19721         }
19722       else
19723         {
19724           gen_shld = mode == DImode ? gen_x86_shld : gen_x86_64_shld;
19725
19726           if (!rtx_equal_p (operands[0], operands[1]))
19727             emit_move_insn (operands[0], operands[1]);
19728
19729           emit_insn (gen_shld (high[0], low[0], GEN_INT (count)));
19730           ix86_expand_ashl_const (low[0], count, mode);
19731         }
19732       return;
19733     }
19734
19735   split_double_mode (mode, operands, 1, low, high);
19736
19737   gen_ashl3 = mode == DImode ? gen_ashlsi3 : gen_ashldi3;
19738
19739   if (operands[1] == const1_rtx)
19740     {
19741       /* Assuming we've chosen a QImode capable registers, then 1 << N
19742          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
19743       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
19744         {
19745           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
19746
19747           ix86_expand_clear (low[0]);
19748           ix86_expand_clear (high[0]);
19749           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (half_width)));
19750
19751           d = gen_lowpart (QImode, low[0]);
19752           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
19753           s = gen_rtx_EQ (QImode, flags, const0_rtx);
19754           emit_insn (gen_rtx_SET (VOIDmode, d, s));
19755
19756           d = gen_lowpart (QImode, high[0]);
19757           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
19758           s = gen_rtx_NE (QImode, flags, const0_rtx);
19759           emit_insn (gen_rtx_SET (VOIDmode, d, s));
19760         }
19761
19762       /* Otherwise, we can get the same results by manually performing
19763          a bit extract operation on bit 5/6, and then performing the two
19764          shifts.  The two methods of getting 0/1 into low/high are exactly
19765          the same size.  Avoiding the shift in the bit extract case helps
19766          pentium4 a bit; no one else seems to care much either way.  */
19767       else
19768         {
19769           enum machine_mode half_mode;
19770           rtx (*gen_lshr3)(rtx, rtx, rtx);
19771           rtx (*gen_and3)(rtx, rtx, rtx);
19772           rtx (*gen_xor3)(rtx, rtx, rtx);
19773           HOST_WIDE_INT bits;
19774           rtx x;
19775
19776           if (mode == DImode)
19777             {
19778               half_mode = SImode;
19779               gen_lshr3 = gen_lshrsi3;
19780               gen_and3 = gen_andsi3;
19781               gen_xor3 = gen_xorsi3;
19782               bits = 5;
19783             }
19784           else
19785             {
19786               half_mode = DImode;
19787               gen_lshr3 = gen_lshrdi3;
19788               gen_and3 = gen_anddi3;
19789               gen_xor3 = gen_xordi3;
19790               bits = 6;
19791             }
19792
19793           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
19794             x = gen_rtx_ZERO_EXTEND (half_mode, operands[2]);
19795           else
19796             x = gen_lowpart (half_mode, operands[2]);
19797           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
19798
19799           emit_insn (gen_lshr3 (high[0], high[0], GEN_INT (bits)));
19800           emit_insn (gen_and3 (high[0], high[0], const1_rtx));
19801           emit_move_insn (low[0], high[0]);
19802           emit_insn (gen_xor3 (low[0], low[0], const1_rtx));
19803         }
19804
19805       emit_insn (gen_ashl3 (low[0], low[0], operands[2]));
19806       emit_insn (gen_ashl3 (high[0], high[0], operands[2]));
19807       return;
19808     }
19809
19810   if (operands[1] == constm1_rtx)
19811     {
19812       /* For -1 << N, we can avoid the shld instruction, because we
19813          know that we're shifting 0...31/63 ones into a -1.  */
19814       emit_move_insn (low[0], constm1_rtx);
19815       if (optimize_insn_for_size_p ())
19816         emit_move_insn (high[0], low[0]);
19817       else
19818         emit_move_insn (high[0], constm1_rtx);
19819     }
19820   else
19821     {
19822       gen_shld = mode == DImode ? gen_x86_shld : gen_x86_64_shld;
19823
19824       if (!rtx_equal_p (operands[0], operands[1]))
19825         emit_move_insn (operands[0], operands[1]);
19826
19827       split_double_mode (mode, operands, 1, low, high);
19828       emit_insn (gen_shld (high[0], low[0], operands[2]));
19829     }
19830
19831   emit_insn (gen_ashl3 (low[0], low[0], operands[2]));
19832
19833   if (TARGET_CMOVE && scratch)
19834     {
19835       rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19836         = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19837
19838       ix86_expand_clear (scratch);
19839       emit_insn (gen_x86_shift_adj_1 (high[0], low[0], operands[2], scratch));
19840     }
19841   else
19842     {
19843       rtx (*gen_x86_shift_adj_2)(rtx, rtx, rtx)
19844         = mode == DImode ? gen_x86_shiftsi_adj_2 : gen_x86_shiftdi_adj_2;
19845
19846       emit_insn (gen_x86_shift_adj_2 (high[0], low[0], operands[2]));
19847     }
19848 }
19849
19850 void
19851 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
19852 {
19853   rtx (*gen_ashr3)(rtx, rtx, rtx)
19854     = mode == DImode ? gen_ashrsi3 : gen_ashrdi3;
19855   rtx (*gen_shrd)(rtx, rtx, rtx);
19856   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19857
19858   rtx low[2], high[2];
19859   int count;
19860
19861   if (CONST_INT_P (operands[2]))
19862     {
19863       split_double_mode (mode, operands, 2, low, high);
19864       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19865
19866       if (count == GET_MODE_BITSIZE (mode) - 1)
19867         {
19868           emit_move_insn (high[0], high[1]);
19869           emit_insn (gen_ashr3 (high[0], high[0],
19870                                 GEN_INT (half_width - 1)));
19871           emit_move_insn (low[0], high[0]);
19872
19873         }
19874       else if (count >= half_width)
19875         {
19876           emit_move_insn (low[0], high[1]);
19877           emit_move_insn (high[0], low[0]);
19878           emit_insn (gen_ashr3 (high[0], high[0],
19879                                 GEN_INT (half_width - 1)));
19880
19881           if (count > half_width)
19882             emit_insn (gen_ashr3 (low[0], low[0],
19883                                   GEN_INT (count - half_width)));
19884         }
19885       else
19886         {
19887           gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19888
19889           if (!rtx_equal_p (operands[0], operands[1]))
19890             emit_move_insn (operands[0], operands[1]);
19891
19892           emit_insn (gen_shrd (low[0], high[0], GEN_INT (count)));
19893           emit_insn (gen_ashr3 (high[0], high[0], GEN_INT (count)));
19894         }
19895     }
19896   else
19897     {
19898       gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19899
19900      if (!rtx_equal_p (operands[0], operands[1]))
19901         emit_move_insn (operands[0], operands[1]);
19902
19903       split_double_mode (mode, operands, 1, low, high);
19904
19905       emit_insn (gen_shrd (low[0], high[0], operands[2]));
19906       emit_insn (gen_ashr3 (high[0], high[0], operands[2]));
19907
19908       if (TARGET_CMOVE && scratch)
19909         {
19910           rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19911             = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19912
19913           emit_move_insn (scratch, high[0]);
19914           emit_insn (gen_ashr3 (scratch, scratch,
19915                                 GEN_INT (half_width - 1)));
19916           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
19917                                           scratch));
19918         }
19919       else
19920         {
19921           rtx (*gen_x86_shift_adj_3)(rtx, rtx, rtx)
19922             = mode == DImode ? gen_x86_shiftsi_adj_3 : gen_x86_shiftdi_adj_3;
19923
19924           emit_insn (gen_x86_shift_adj_3 (low[0], high[0], operands[2]));
19925         }
19926     }
19927 }
19928
19929 void
19930 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
19931 {
19932   rtx (*gen_lshr3)(rtx, rtx, rtx)
19933     = mode == DImode ? gen_lshrsi3 : gen_lshrdi3;
19934   rtx (*gen_shrd)(rtx, rtx, rtx);
19935   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19936
19937   rtx low[2], high[2];
19938   int count;
19939
19940   if (CONST_INT_P (operands[2]))
19941     {
19942       split_double_mode (mode, operands, 2, low, high);
19943       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19944
19945       if (count >= half_width)
19946         {
19947           emit_move_insn (low[0], high[1]);
19948           ix86_expand_clear (high[0]);
19949
19950           if (count > half_width)
19951             emit_insn (gen_lshr3 (low[0], low[0],
19952                                   GEN_INT (count - half_width)));
19953         }
19954       else
19955         {
19956           gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19957
19958           if (!rtx_equal_p (operands[0], operands[1]))
19959             emit_move_insn (operands[0], operands[1]);
19960
19961           emit_insn (gen_shrd (low[0], high[0], GEN_INT (count)));
19962           emit_insn (gen_lshr3 (high[0], high[0], GEN_INT (count)));
19963         }
19964     }
19965   else
19966     {
19967       gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19968
19969       if (!rtx_equal_p (operands[0], operands[1]))
19970         emit_move_insn (operands[0], operands[1]);
19971
19972       split_double_mode (mode, operands, 1, low, high);
19973
19974       emit_insn (gen_shrd (low[0], high[0], operands[2]));
19975       emit_insn (gen_lshr3 (high[0], high[0], operands[2]));
19976
19977       if (TARGET_CMOVE && scratch)
19978         {
19979           rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19980             = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19981
19982           ix86_expand_clear (scratch);
19983           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
19984                                           scratch));
19985         }
19986       else
19987         {
19988           rtx (*gen_x86_shift_adj_2)(rtx, rtx, rtx)
19989             = mode == DImode ? gen_x86_shiftsi_adj_2 : gen_x86_shiftdi_adj_2;
19990
19991           emit_insn (gen_x86_shift_adj_2 (low[0], high[0], operands[2]));
19992         }
19993     }
19994 }
19995
19996 /* Predict just emitted jump instruction to be taken with probability PROB.  */
19997 static void
19998 predict_jump (int prob)
19999 {
20000   rtx insn = get_last_insn ();
20001   gcc_assert (JUMP_P (insn));
20002   add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
20003 }
20004
20005 /* Helper function for the string operations below.  Dest VARIABLE whether
20006    it is aligned to VALUE bytes.  If true, jump to the label.  */
20007 static rtx
20008 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
20009 {
20010   rtx label = gen_label_rtx ();
20011   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
20012   if (GET_MODE (variable) == DImode)
20013     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
20014   else
20015     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
20016   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
20017                            1, label);
20018   if (epilogue)
20019     predict_jump (REG_BR_PROB_BASE * 50 / 100);
20020   else
20021     predict_jump (REG_BR_PROB_BASE * 90 / 100);
20022   return label;
20023 }
20024
20025 /* Adjust COUNTER by the VALUE.  */
20026 static void
20027 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
20028 {
20029   rtx (*gen_add)(rtx, rtx, rtx)
20030     = GET_MODE (countreg) == DImode ? gen_adddi3 : gen_addsi3;
20031
20032   emit_insn (gen_add (countreg, countreg, GEN_INT (-value)));
20033 }
20034
20035 /* Zero extend possibly SImode EXP to Pmode register.  */
20036 rtx
20037 ix86_zero_extend_to_Pmode (rtx exp)
20038 {
20039   rtx r;
20040   if (GET_MODE (exp) == VOIDmode)
20041     return force_reg (Pmode, exp);
20042   if (GET_MODE (exp) == Pmode)
20043     return copy_to_mode_reg (Pmode, exp);
20044   r = gen_reg_rtx (Pmode);
20045   emit_insn (gen_zero_extendsidi2 (r, exp));
20046   return r;
20047 }
20048
20049 /* Divide COUNTREG by SCALE.  */
20050 static rtx
20051 scale_counter (rtx countreg, int scale)
20052 {
20053   rtx sc;
20054
20055   if (scale == 1)
20056     return countreg;
20057   if (CONST_INT_P (countreg))
20058     return GEN_INT (INTVAL (countreg) / scale);
20059   gcc_assert (REG_P (countreg));
20060
20061   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
20062                             GEN_INT (exact_log2 (scale)),
20063                             NULL, 1, OPTAB_DIRECT);
20064   return sc;
20065 }
20066
20067 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
20068    DImode for constant loop counts.  */
20069
20070 static enum machine_mode
20071 counter_mode (rtx count_exp)
20072 {
20073   if (GET_MODE (count_exp) != VOIDmode)
20074     return GET_MODE (count_exp);
20075   if (!CONST_INT_P (count_exp))
20076     return Pmode;
20077   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
20078     return DImode;
20079   return SImode;
20080 }
20081
20082 /* When SRCPTR is non-NULL, output simple loop to move memory
20083    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
20084    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
20085    equivalent loop to set memory by VALUE (supposed to be in MODE).
20086
20087    The size is rounded down to whole number of chunk size moved at once.
20088    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
20089
20090
20091 static void
20092 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
20093                                rtx destptr, rtx srcptr, rtx value,
20094                                rtx count, enum machine_mode mode, int unroll,
20095                                int expected_size)
20096 {
20097   rtx out_label, top_label, iter, tmp;
20098   enum machine_mode iter_mode = counter_mode (count);
20099   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
20100   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
20101   rtx size;
20102   rtx x_addr;
20103   rtx y_addr;
20104   int i;
20105
20106   top_label = gen_label_rtx ();
20107   out_label = gen_label_rtx ();
20108   iter = gen_reg_rtx (iter_mode);
20109
20110   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
20111                               NULL, 1, OPTAB_DIRECT);
20112   /* Those two should combine.  */
20113   if (piece_size == const1_rtx)
20114     {
20115       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
20116                                true, out_label);
20117       predict_jump (REG_BR_PROB_BASE * 10 / 100);
20118     }
20119   emit_move_insn (iter, const0_rtx);
20120
20121   emit_label (top_label);
20122
20123   tmp = convert_modes (Pmode, iter_mode, iter, true);
20124   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
20125   destmem = change_address (destmem, mode, x_addr);
20126
20127   if (srcmem)
20128     {
20129       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
20130       srcmem = change_address (srcmem, mode, y_addr);
20131
20132       /* When unrolling for chips that reorder memory reads and writes,
20133          we can save registers by using single temporary.
20134          Also using 4 temporaries is overkill in 32bit mode.  */
20135       if (!TARGET_64BIT && 0)
20136         {
20137           for (i = 0; i < unroll; i++)
20138             {
20139               if (i)
20140                 {
20141                   destmem =
20142                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20143                   srcmem =
20144                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
20145                 }
20146               emit_move_insn (destmem, srcmem);
20147             }
20148         }
20149       else
20150         {
20151           rtx tmpreg[4];
20152           gcc_assert (unroll <= 4);
20153           for (i = 0; i < unroll; i++)
20154             {
20155               tmpreg[i] = gen_reg_rtx (mode);
20156               if (i)
20157                 {
20158                   srcmem =
20159                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
20160                 }
20161               emit_move_insn (tmpreg[i], srcmem);
20162             }
20163           for (i = 0; i < unroll; i++)
20164             {
20165               if (i)
20166                 {
20167                   destmem =
20168                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20169                 }
20170               emit_move_insn (destmem, tmpreg[i]);
20171             }
20172         }
20173     }
20174   else
20175     for (i = 0; i < unroll; i++)
20176       {
20177         if (i)
20178           destmem =
20179             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20180         emit_move_insn (destmem, value);
20181       }
20182
20183   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
20184                              true, OPTAB_LIB_WIDEN);
20185   if (tmp != iter)
20186     emit_move_insn (iter, tmp);
20187
20188   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
20189                            true, top_label);
20190   if (expected_size != -1)
20191     {
20192       expected_size /= GET_MODE_SIZE (mode) * unroll;
20193       if (expected_size == 0)
20194         predict_jump (0);
20195       else if (expected_size > REG_BR_PROB_BASE)
20196         predict_jump (REG_BR_PROB_BASE - 1);
20197       else
20198         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
20199     }
20200   else
20201     predict_jump (REG_BR_PROB_BASE * 80 / 100);
20202   iter = ix86_zero_extend_to_Pmode (iter);
20203   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
20204                              true, OPTAB_LIB_WIDEN);
20205   if (tmp != destptr)
20206     emit_move_insn (destptr, tmp);
20207   if (srcptr)
20208     {
20209       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
20210                                  true, OPTAB_LIB_WIDEN);
20211       if (tmp != srcptr)
20212         emit_move_insn (srcptr, tmp);
20213     }
20214   emit_label (out_label);
20215 }
20216
20217 /* Output "rep; mov" instruction.
20218    Arguments have same meaning as for previous function */
20219 static void
20220 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
20221                            rtx destptr, rtx srcptr,
20222                            rtx count,
20223                            enum machine_mode mode)
20224 {
20225   rtx destexp;
20226   rtx srcexp;
20227   rtx countreg;
20228
20229   /* If the size is known, it is shorter to use rep movs.  */
20230   if (mode == QImode && CONST_INT_P (count)
20231       && !(INTVAL (count) & 3))
20232     mode = SImode;
20233
20234   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
20235     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
20236   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
20237     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
20238   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
20239   if (mode != QImode)
20240     {
20241       destexp = gen_rtx_ASHIFT (Pmode, countreg,
20242                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20243       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
20244       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
20245                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20246       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
20247     }
20248   else
20249     {
20250       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
20251       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
20252     }
20253   if (CONST_INT_P (count))
20254     {
20255       count = GEN_INT (INTVAL (count)
20256                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
20257       destmem = shallow_copy_rtx (destmem);
20258       srcmem = shallow_copy_rtx (srcmem);
20259       set_mem_size (destmem, count);
20260       set_mem_size (srcmem, count);
20261     }
20262   else
20263     {
20264       if (MEM_SIZE (destmem))
20265         set_mem_size (destmem, NULL_RTX);
20266       if (MEM_SIZE (srcmem))
20267         set_mem_size (srcmem, NULL_RTX);
20268     }
20269   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
20270                           destexp, srcexp));
20271 }
20272
20273 /* Output "rep; stos" instruction.
20274    Arguments have same meaning as for previous function */
20275 static void
20276 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
20277                             rtx count, enum machine_mode mode,
20278                             rtx orig_value)
20279 {
20280   rtx destexp;
20281   rtx countreg;
20282
20283   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
20284     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
20285   value = force_reg (mode, gen_lowpart (mode, value));
20286   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
20287   if (mode != QImode)
20288     {
20289       destexp = gen_rtx_ASHIFT (Pmode, countreg,
20290                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20291       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
20292     }
20293   else
20294     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
20295   if (orig_value == const0_rtx && CONST_INT_P (count))
20296     {
20297       count = GEN_INT (INTVAL (count)
20298                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
20299       destmem = shallow_copy_rtx (destmem);
20300       set_mem_size (destmem, count);
20301     }
20302   else if (MEM_SIZE (destmem))
20303     set_mem_size (destmem, NULL_RTX);
20304   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
20305 }
20306
20307 static void
20308 emit_strmov (rtx destmem, rtx srcmem,
20309              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
20310 {
20311   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
20312   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
20313   emit_insn (gen_strmov (destptr, dest, srcptr, src));
20314 }
20315
20316 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
20317 static void
20318 expand_movmem_epilogue (rtx destmem, rtx srcmem,
20319                         rtx destptr, rtx srcptr, rtx count, int max_size)
20320 {
20321   rtx src, dest;
20322   if (CONST_INT_P (count))
20323     {
20324       HOST_WIDE_INT countval = INTVAL (count);
20325       int offset = 0;
20326
20327       if ((countval & 0x10) && max_size > 16)
20328         {
20329           if (TARGET_64BIT)
20330             {
20331               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
20332               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
20333             }
20334           else
20335             gcc_unreachable ();
20336           offset += 16;
20337         }
20338       if ((countval & 0x08) && max_size > 8)
20339         {
20340           if (TARGET_64BIT)
20341             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
20342           else
20343             {
20344               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
20345               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
20346             }
20347           offset += 8;
20348         }
20349       if ((countval & 0x04) && max_size > 4)
20350         {
20351           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
20352           offset += 4;
20353         }
20354       if ((countval & 0x02) && max_size > 2)
20355         {
20356           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
20357           offset += 2;
20358         }
20359       if ((countval & 0x01) && max_size > 1)
20360         {
20361           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
20362           offset += 1;
20363         }
20364       return;
20365     }
20366   if (max_size > 8)
20367     {
20368       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
20369                                     count, 1, OPTAB_DIRECT);
20370       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
20371                                      count, QImode, 1, 4);
20372       return;
20373     }
20374
20375   /* When there are stringops, we can cheaply increase dest and src pointers.
20376      Otherwise we save code size by maintaining offset (zero is readily
20377      available from preceding rep operation) and using x86 addressing modes.
20378    */
20379   if (TARGET_SINGLE_STRINGOP)
20380     {
20381       if (max_size > 4)
20382         {
20383           rtx label = ix86_expand_aligntest (count, 4, true);
20384           src = change_address (srcmem, SImode, srcptr);
20385           dest = change_address (destmem, SImode, destptr);
20386           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20387           emit_label (label);
20388           LABEL_NUSES (label) = 1;
20389         }
20390       if (max_size > 2)
20391         {
20392           rtx label = ix86_expand_aligntest (count, 2, true);
20393           src = change_address (srcmem, HImode, srcptr);
20394           dest = change_address (destmem, HImode, destptr);
20395           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20396           emit_label (label);
20397           LABEL_NUSES (label) = 1;
20398         }
20399       if (max_size > 1)
20400         {
20401           rtx label = ix86_expand_aligntest (count, 1, true);
20402           src = change_address (srcmem, QImode, srcptr);
20403           dest = change_address (destmem, QImode, destptr);
20404           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20405           emit_label (label);
20406           LABEL_NUSES (label) = 1;
20407         }
20408     }
20409   else
20410     {
20411       rtx offset = force_reg (Pmode, const0_rtx);
20412       rtx tmp;
20413
20414       if (max_size > 4)
20415         {
20416           rtx label = ix86_expand_aligntest (count, 4, true);
20417           src = change_address (srcmem, SImode, srcptr);
20418           dest = change_address (destmem, SImode, destptr);
20419           emit_move_insn (dest, src);
20420           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
20421                                      true, OPTAB_LIB_WIDEN);
20422           if (tmp != offset)
20423             emit_move_insn (offset, tmp);
20424           emit_label (label);
20425           LABEL_NUSES (label) = 1;
20426         }
20427       if (max_size > 2)
20428         {
20429           rtx label = ix86_expand_aligntest (count, 2, true);
20430           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
20431           src = change_address (srcmem, HImode, tmp);
20432           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
20433           dest = change_address (destmem, HImode, tmp);
20434           emit_move_insn (dest, src);
20435           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
20436                                      true, OPTAB_LIB_WIDEN);
20437           if (tmp != offset)
20438             emit_move_insn (offset, tmp);
20439           emit_label (label);
20440           LABEL_NUSES (label) = 1;
20441         }
20442       if (max_size > 1)
20443         {
20444           rtx label = ix86_expand_aligntest (count, 1, true);
20445           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
20446           src = change_address (srcmem, QImode, tmp);
20447           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
20448           dest = change_address (destmem, QImode, tmp);
20449           emit_move_insn (dest, src);
20450           emit_label (label);
20451           LABEL_NUSES (label) = 1;
20452         }
20453     }
20454 }
20455
20456 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
20457 static void
20458 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
20459                                  rtx count, int max_size)
20460 {
20461   count =
20462     expand_simple_binop (counter_mode (count), AND, count,
20463                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
20464   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
20465                                  gen_lowpart (QImode, value), count, QImode,
20466                                  1, max_size / 2);
20467 }
20468
20469 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
20470 static void
20471 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
20472 {
20473   rtx dest;
20474
20475   if (CONST_INT_P (count))
20476     {
20477       HOST_WIDE_INT countval = INTVAL (count);
20478       int offset = 0;
20479
20480       if ((countval & 0x10) && max_size > 16)
20481         {
20482           if (TARGET_64BIT)
20483             {
20484               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
20485               emit_insn (gen_strset (destptr, dest, value));
20486               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
20487               emit_insn (gen_strset (destptr, dest, value));
20488             }
20489           else
20490             gcc_unreachable ();
20491           offset += 16;
20492         }
20493       if ((countval & 0x08) && max_size > 8)
20494         {
20495           if (TARGET_64BIT)
20496             {
20497               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
20498               emit_insn (gen_strset (destptr, dest, value));
20499             }
20500           else
20501             {
20502               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
20503               emit_insn (gen_strset (destptr, dest, value));
20504               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
20505               emit_insn (gen_strset (destptr, dest, value));
20506             }
20507           offset += 8;
20508         }
20509       if ((countval & 0x04) && max_size > 4)
20510         {
20511           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
20512           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
20513           offset += 4;
20514         }
20515       if ((countval & 0x02) && max_size > 2)
20516         {
20517           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
20518           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
20519           offset += 2;
20520         }
20521       if ((countval & 0x01) && max_size > 1)
20522         {
20523           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
20524           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
20525           offset += 1;
20526         }
20527       return;
20528     }
20529   if (max_size > 32)
20530     {
20531       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
20532       return;
20533     }
20534   if (max_size > 16)
20535     {
20536       rtx label = ix86_expand_aligntest (count, 16, true);
20537       if (TARGET_64BIT)
20538         {
20539           dest = change_address (destmem, DImode, destptr);
20540           emit_insn (gen_strset (destptr, dest, value));
20541           emit_insn (gen_strset (destptr, dest, value));
20542         }
20543       else
20544         {
20545           dest = change_address (destmem, SImode, destptr);
20546           emit_insn (gen_strset (destptr, dest, value));
20547           emit_insn (gen_strset (destptr, dest, value));
20548           emit_insn (gen_strset (destptr, dest, value));
20549           emit_insn (gen_strset (destptr, dest, value));
20550         }
20551       emit_label (label);
20552       LABEL_NUSES (label) = 1;
20553     }
20554   if (max_size > 8)
20555     {
20556       rtx label = ix86_expand_aligntest (count, 8, true);
20557       if (TARGET_64BIT)
20558         {
20559           dest = change_address (destmem, DImode, destptr);
20560           emit_insn (gen_strset (destptr, dest, value));
20561         }
20562       else
20563         {
20564           dest = change_address (destmem, SImode, destptr);
20565           emit_insn (gen_strset (destptr, dest, value));
20566           emit_insn (gen_strset (destptr, dest, value));
20567         }
20568       emit_label (label);
20569       LABEL_NUSES (label) = 1;
20570     }
20571   if (max_size > 4)
20572     {
20573       rtx label = ix86_expand_aligntest (count, 4, true);
20574       dest = change_address (destmem, SImode, destptr);
20575       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
20576       emit_label (label);
20577       LABEL_NUSES (label) = 1;
20578     }
20579   if (max_size > 2)
20580     {
20581       rtx label = ix86_expand_aligntest (count, 2, true);
20582       dest = change_address (destmem, HImode, destptr);
20583       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
20584       emit_label (label);
20585       LABEL_NUSES (label) = 1;
20586     }
20587   if (max_size > 1)
20588     {
20589       rtx label = ix86_expand_aligntest (count, 1, true);
20590       dest = change_address (destmem, QImode, destptr);
20591       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
20592       emit_label (label);
20593       LABEL_NUSES (label) = 1;
20594     }
20595 }
20596
20597 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
20598    DESIRED_ALIGNMENT.  */
20599 static void
20600 expand_movmem_prologue (rtx destmem, rtx srcmem,
20601                         rtx destptr, rtx srcptr, rtx count,
20602                         int align, int desired_alignment)
20603 {
20604   if (align <= 1 && desired_alignment > 1)
20605     {
20606       rtx label = ix86_expand_aligntest (destptr, 1, false);
20607       srcmem = change_address (srcmem, QImode, srcptr);
20608       destmem = change_address (destmem, QImode, destptr);
20609       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20610       ix86_adjust_counter (count, 1);
20611       emit_label (label);
20612       LABEL_NUSES (label) = 1;
20613     }
20614   if (align <= 2 && desired_alignment > 2)
20615     {
20616       rtx label = ix86_expand_aligntest (destptr, 2, false);
20617       srcmem = change_address (srcmem, HImode, srcptr);
20618       destmem = change_address (destmem, HImode, destptr);
20619       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20620       ix86_adjust_counter (count, 2);
20621       emit_label (label);
20622       LABEL_NUSES (label) = 1;
20623     }
20624   if (align <= 4 && desired_alignment > 4)
20625     {
20626       rtx label = ix86_expand_aligntest (destptr, 4, false);
20627       srcmem = change_address (srcmem, SImode, srcptr);
20628       destmem = change_address (destmem, SImode, destptr);
20629       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20630       ix86_adjust_counter (count, 4);
20631       emit_label (label);
20632       LABEL_NUSES (label) = 1;
20633     }
20634   gcc_assert (desired_alignment <= 8);
20635 }
20636
20637 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
20638    ALIGN_BYTES is how many bytes need to be copied.  */
20639 static rtx
20640 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
20641                                  int desired_align, int align_bytes)
20642 {
20643   rtx src = *srcp;
20644   rtx src_size, dst_size;
20645   int off = 0;
20646   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
20647   if (src_align_bytes >= 0)
20648     src_align_bytes = desired_align - src_align_bytes;
20649   src_size = MEM_SIZE (src);
20650   dst_size = MEM_SIZE (dst);
20651   if (align_bytes & 1)
20652     {
20653       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
20654       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
20655       off = 1;
20656       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20657     }
20658   if (align_bytes & 2)
20659     {
20660       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
20661       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
20662       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
20663         set_mem_align (dst, 2 * BITS_PER_UNIT);
20664       if (src_align_bytes >= 0
20665           && (src_align_bytes & 1) == (align_bytes & 1)
20666           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
20667         set_mem_align (src, 2 * BITS_PER_UNIT);
20668       off = 2;
20669       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20670     }
20671   if (align_bytes & 4)
20672     {
20673       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
20674       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
20675       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
20676         set_mem_align (dst, 4 * BITS_PER_UNIT);
20677       if (src_align_bytes >= 0)
20678         {
20679           unsigned int src_align = 0;
20680           if ((src_align_bytes & 3) == (align_bytes & 3))
20681             src_align = 4;
20682           else if ((src_align_bytes & 1) == (align_bytes & 1))
20683             src_align = 2;
20684           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
20685             set_mem_align (src, src_align * BITS_PER_UNIT);
20686         }
20687       off = 4;
20688       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20689     }
20690   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
20691   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
20692   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
20693     set_mem_align (dst, desired_align * BITS_PER_UNIT);
20694   if (src_align_bytes >= 0)
20695     {
20696       unsigned int src_align = 0;
20697       if ((src_align_bytes & 7) == (align_bytes & 7))
20698         src_align = 8;
20699       else if ((src_align_bytes & 3) == (align_bytes & 3))
20700         src_align = 4;
20701       else if ((src_align_bytes & 1) == (align_bytes & 1))
20702         src_align = 2;
20703       if (src_align > (unsigned int) desired_align)
20704         src_align = desired_align;
20705       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
20706         set_mem_align (src, src_align * BITS_PER_UNIT);
20707     }
20708   if (dst_size)
20709     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
20710   if (src_size)
20711     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
20712   *srcp = src;
20713   return dst;
20714 }
20715
20716 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
20717    DESIRED_ALIGNMENT.  */
20718 static void
20719 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
20720                         int align, int desired_alignment)
20721 {
20722   if (align <= 1 && desired_alignment > 1)
20723     {
20724       rtx label = ix86_expand_aligntest (destptr, 1, false);
20725       destmem = change_address (destmem, QImode, destptr);
20726       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
20727       ix86_adjust_counter (count, 1);
20728       emit_label (label);
20729       LABEL_NUSES (label) = 1;
20730     }
20731   if (align <= 2 && desired_alignment > 2)
20732     {
20733       rtx label = ix86_expand_aligntest (destptr, 2, false);
20734       destmem = change_address (destmem, HImode, destptr);
20735       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
20736       ix86_adjust_counter (count, 2);
20737       emit_label (label);
20738       LABEL_NUSES (label) = 1;
20739     }
20740   if (align <= 4 && desired_alignment > 4)
20741     {
20742       rtx label = ix86_expand_aligntest (destptr, 4, false);
20743       destmem = change_address (destmem, SImode, destptr);
20744       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
20745       ix86_adjust_counter (count, 4);
20746       emit_label (label);
20747       LABEL_NUSES (label) = 1;
20748     }
20749   gcc_assert (desired_alignment <= 8);
20750 }
20751
20752 /* Set enough from DST to align DST known to by aligned by ALIGN to
20753    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
20754 static rtx
20755 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
20756                                  int desired_align, int align_bytes)
20757 {
20758   int off = 0;
20759   rtx dst_size = MEM_SIZE (dst);
20760   if (align_bytes & 1)
20761     {
20762       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
20763       off = 1;
20764       emit_insn (gen_strset (destreg, dst,
20765                              gen_lowpart (QImode, value)));
20766     }
20767   if (align_bytes & 2)
20768     {
20769       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
20770       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
20771         set_mem_align (dst, 2 * BITS_PER_UNIT);
20772       off = 2;
20773       emit_insn (gen_strset (destreg, dst,
20774                              gen_lowpart (HImode, value)));
20775     }
20776   if (align_bytes & 4)
20777     {
20778       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
20779       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
20780         set_mem_align (dst, 4 * BITS_PER_UNIT);
20781       off = 4;
20782       emit_insn (gen_strset (destreg, dst,
20783                              gen_lowpart (SImode, value)));
20784     }
20785   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
20786   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
20787     set_mem_align (dst, desired_align * BITS_PER_UNIT);
20788   if (dst_size)
20789     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
20790   return dst;
20791 }
20792
20793 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
20794 static enum stringop_alg
20795 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
20796             int *dynamic_check)
20797 {
20798   const struct stringop_algs * algs;
20799   bool optimize_for_speed;
20800   /* Algorithms using the rep prefix want at least edi and ecx;
20801      additionally, memset wants eax and memcpy wants esi.  Don't
20802      consider such algorithms if the user has appropriated those
20803      registers for their own purposes.  */
20804   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
20805                              || (memset
20806                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
20807
20808 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
20809                            || (alg != rep_prefix_1_byte         \
20810                                && alg != rep_prefix_4_byte      \
20811                                && alg != rep_prefix_8_byte))
20812   const struct processor_costs *cost;
20813
20814   /* Even if the string operation call is cold, we still might spend a lot
20815      of time processing large blocks.  */
20816   if (optimize_function_for_size_p (cfun)
20817       || (optimize_insn_for_size_p ()
20818           && expected_size != -1 && expected_size < 256))
20819     optimize_for_speed = false;
20820   else
20821     optimize_for_speed = true;
20822
20823   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
20824
20825   *dynamic_check = -1;
20826   if (memset)
20827     algs = &cost->memset[TARGET_64BIT != 0];
20828   else
20829     algs = &cost->memcpy[TARGET_64BIT != 0];
20830   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
20831     return stringop_alg;
20832   /* rep; movq or rep; movl is the smallest variant.  */
20833   else if (!optimize_for_speed)
20834     {
20835       if (!count || (count & 3))
20836         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
20837       else
20838         return rep_prefix_usable ? rep_prefix_4_byte : loop;
20839     }
20840   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
20841    */
20842   else if (expected_size != -1 && expected_size < 4)
20843     return loop_1_byte;
20844   else if (expected_size != -1)
20845     {
20846       unsigned int i;
20847       enum stringop_alg alg = libcall;
20848       for (i = 0; i < MAX_STRINGOP_ALGS; i++)
20849         {
20850           /* We get here if the algorithms that were not libcall-based
20851              were rep-prefix based and we are unable to use rep prefixes
20852              based on global register usage.  Break out of the loop and
20853              use the heuristic below.  */
20854           if (algs->size[i].max == 0)
20855             break;
20856           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
20857             {
20858               enum stringop_alg candidate = algs->size[i].alg;
20859
20860               if (candidate != libcall && ALG_USABLE_P (candidate))
20861                 alg = candidate;
20862               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
20863                  last non-libcall inline algorithm.  */
20864               if (TARGET_INLINE_ALL_STRINGOPS)
20865                 {
20866                   /* When the current size is best to be copied by a libcall,
20867                      but we are still forced to inline, run the heuristic below
20868                      that will pick code for medium sized blocks.  */
20869                   if (alg != libcall)
20870                     return alg;
20871                   break;
20872                 }
20873               else if (ALG_USABLE_P (candidate))
20874                 return candidate;
20875             }
20876         }
20877       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
20878     }
20879   /* When asked to inline the call anyway, try to pick meaningful choice.
20880      We look for maximal size of block that is faster to copy by hand and
20881      take blocks of at most of that size guessing that average size will
20882      be roughly half of the block.
20883
20884      If this turns out to be bad, we might simply specify the preferred
20885      choice in ix86_costs.  */
20886   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20887       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
20888     {
20889       int max = -1;
20890       enum stringop_alg alg;
20891       int i;
20892       bool any_alg_usable_p = true;
20893
20894       for (i = 0; i < MAX_STRINGOP_ALGS; i++)
20895         {
20896           enum stringop_alg candidate = algs->size[i].alg;
20897           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
20898
20899           if (candidate != libcall && candidate
20900               && ALG_USABLE_P (candidate))
20901               max = algs->size[i].max;
20902         }
20903       /* If there aren't any usable algorithms, then recursing on
20904          smaller sizes isn't going to find anything.  Just return the
20905          simple byte-at-a-time copy loop.  */
20906       if (!any_alg_usable_p)
20907         {
20908           /* Pick something reasonable.  */
20909           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20910             *dynamic_check = 128;
20911           return loop_1_byte;
20912         }
20913       if (max == -1)
20914         max = 4096;
20915       alg = decide_alg (count, max / 2, memset, dynamic_check);
20916       gcc_assert (*dynamic_check == -1);
20917       gcc_assert (alg != libcall);
20918       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20919         *dynamic_check = max;
20920       return alg;
20921     }
20922   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
20923 #undef ALG_USABLE_P
20924 }
20925
20926 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
20927    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
20928 static int
20929 decide_alignment (int align,
20930                   enum stringop_alg alg,
20931                   int expected_size)
20932 {
20933   int desired_align = 0;
20934   switch (alg)
20935     {
20936       case no_stringop:
20937         gcc_unreachable ();
20938       case loop:
20939       case unrolled_loop:
20940         desired_align = GET_MODE_SIZE (Pmode);
20941         break;
20942       case rep_prefix_8_byte:
20943         desired_align = 8;
20944         break;
20945       case rep_prefix_4_byte:
20946         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
20947            copying whole cacheline at once.  */
20948         if (TARGET_PENTIUMPRO)
20949           desired_align = 8;
20950         else
20951           desired_align = 4;
20952         break;
20953       case rep_prefix_1_byte:
20954         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
20955            copying whole cacheline at once.  */
20956         if (TARGET_PENTIUMPRO)
20957           desired_align = 8;
20958         else
20959           desired_align = 1;
20960         break;
20961       case loop_1_byte:
20962         desired_align = 1;
20963         break;
20964       case libcall:
20965         return 0;
20966     }
20967
20968   if (optimize_size)
20969     desired_align = 1;
20970   if (desired_align < align)
20971     desired_align = align;
20972   if (expected_size != -1 && expected_size < 4)
20973     desired_align = align;
20974   return desired_align;
20975 }
20976
20977 /* Return the smallest power of 2 greater than VAL.  */
20978 static int
20979 smallest_pow2_greater_than (int val)
20980 {
20981   int ret = 1;
20982   while (ret <= val)
20983     ret <<= 1;
20984   return ret;
20985 }
20986
20987 /* Expand string move (memcpy) operation.  Use i386 string operations
20988    when profitable.  expand_setmem contains similar code.  The code
20989    depends upon architecture, block size and alignment, but always has
20990    the same overall structure:
20991
20992    1) Prologue guard: Conditional that jumps up to epilogues for small
20993       blocks that can be handled by epilogue alone.  This is faster
20994       but also needed for correctness, since prologue assume the block
20995       is larger than the desired alignment.
20996
20997       Optional dynamic check for size and libcall for large
20998       blocks is emitted here too, with -minline-stringops-dynamically.
20999
21000    2) Prologue: copy first few bytes in order to get destination
21001       aligned to DESIRED_ALIGN.  It is emitted only when ALIGN is less
21002       than DESIRED_ALIGN and up to DESIRED_ALIGN - ALIGN bytes can be
21003       copied.  We emit either a jump tree on power of two sized
21004       blocks, or a byte loop.
21005
21006    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
21007       with specified algorithm.
21008
21009    4) Epilogue: code copying tail of the block that is too small to be
21010       handled by main body (or up to size guarded by prologue guard).  */
21011
21012 bool
21013 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
21014                     rtx expected_align_exp, rtx expected_size_exp)
21015 {
21016   rtx destreg;
21017   rtx srcreg;
21018   rtx label = NULL;
21019   rtx tmp;
21020   rtx jump_around_label = NULL;
21021   HOST_WIDE_INT align = 1;
21022   unsigned HOST_WIDE_INT count = 0;
21023   HOST_WIDE_INT expected_size = -1;
21024   int size_needed = 0, epilogue_size_needed;
21025   int desired_align = 0, align_bytes = 0;
21026   enum stringop_alg alg;
21027   int dynamic_check;
21028   bool need_zero_guard = false;
21029
21030   if (CONST_INT_P (align_exp))
21031     align = INTVAL (align_exp);
21032   /* i386 can do misaligned access on reasonably increased cost.  */
21033   if (CONST_INT_P (expected_align_exp)
21034       && INTVAL (expected_align_exp) > align)
21035     align = INTVAL (expected_align_exp);
21036   /* ALIGN is the minimum of destination and source alignment, but we care here
21037      just about destination alignment.  */
21038   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
21039     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
21040
21041   if (CONST_INT_P (count_exp))
21042     count = expected_size = INTVAL (count_exp);
21043   if (CONST_INT_P (expected_size_exp) && count == 0)
21044     expected_size = INTVAL (expected_size_exp);
21045
21046   /* Make sure we don't need to care about overflow later on.  */
21047   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
21048     return false;
21049
21050   /* Step 0: Decide on preferred algorithm, desired alignment and
21051      size of chunks to be copied by main loop.  */
21052
21053   alg = decide_alg (count, expected_size, false, &dynamic_check);
21054   desired_align = decide_alignment (align, alg, expected_size);
21055
21056   if (!TARGET_ALIGN_STRINGOPS)
21057     align = desired_align;
21058
21059   if (alg == libcall)
21060     return false;
21061   gcc_assert (alg != no_stringop);
21062   if (!count)
21063     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
21064   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
21065   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
21066   switch (alg)
21067     {
21068     case libcall:
21069     case no_stringop:
21070       gcc_unreachable ();
21071     case loop:
21072       need_zero_guard = true;
21073       size_needed = GET_MODE_SIZE (Pmode);
21074       break;
21075     case unrolled_loop:
21076       need_zero_guard = true;
21077       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
21078       break;
21079     case rep_prefix_8_byte:
21080       size_needed = 8;
21081       break;
21082     case rep_prefix_4_byte:
21083       size_needed = 4;
21084       break;
21085     case rep_prefix_1_byte:
21086       size_needed = 1;
21087       break;
21088     case loop_1_byte:
21089       need_zero_guard = true;
21090       size_needed = 1;
21091       break;
21092     }
21093
21094   epilogue_size_needed = size_needed;
21095
21096   /* Step 1: Prologue guard.  */
21097
21098   /* Alignment code needs count to be in register.  */
21099   if (CONST_INT_P (count_exp) && desired_align > align)
21100     {
21101       if (INTVAL (count_exp) > desired_align
21102           && INTVAL (count_exp) > size_needed)
21103         {
21104           align_bytes
21105             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
21106           if (align_bytes <= 0)
21107             align_bytes = 0;
21108           else
21109             align_bytes = desired_align - align_bytes;
21110         }
21111       if (align_bytes == 0)
21112         count_exp = force_reg (counter_mode (count_exp), count_exp);
21113     }
21114   gcc_assert (desired_align >= 1 && align >= 1);
21115
21116   /* Ensure that alignment prologue won't copy past end of block.  */
21117   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
21118     {
21119       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
21120       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
21121          Make sure it is power of 2.  */
21122       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
21123
21124       if (count)
21125         {
21126           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
21127             {
21128               /* If main algorithm works on QImode, no epilogue is needed.
21129                  For small sizes just don't align anything.  */
21130               if (size_needed == 1)
21131                 desired_align = align;
21132               else
21133                 goto epilogue;
21134             }
21135         }
21136       else
21137         {
21138           label = gen_label_rtx ();
21139           emit_cmp_and_jump_insns (count_exp,
21140                                    GEN_INT (epilogue_size_needed),
21141                                    LTU, 0, counter_mode (count_exp), 1, label);
21142           if (expected_size == -1 || expected_size < epilogue_size_needed)
21143             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21144           else
21145             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21146         }
21147     }
21148
21149   /* Emit code to decide on runtime whether library call or inline should be
21150      used.  */
21151   if (dynamic_check != -1)
21152     {
21153       if (CONST_INT_P (count_exp))
21154         {
21155           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
21156             {
21157               emit_block_move_via_libcall (dst, src, count_exp, false);
21158               count_exp = const0_rtx;
21159               goto epilogue;
21160             }
21161         }
21162       else
21163         {
21164           rtx hot_label = gen_label_rtx ();
21165           jump_around_label = gen_label_rtx ();
21166           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
21167                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
21168           predict_jump (REG_BR_PROB_BASE * 90 / 100);
21169           emit_block_move_via_libcall (dst, src, count_exp, false);
21170           emit_jump (jump_around_label);
21171           emit_label (hot_label);
21172         }
21173     }
21174
21175   /* Step 2: Alignment prologue.  */
21176
21177   if (desired_align > align)
21178     {
21179       if (align_bytes == 0)
21180         {
21181           /* Except for the first move in epilogue, we no longer know
21182              constant offset in aliasing info.  It don't seems to worth
21183              the pain to maintain it for the first move, so throw away
21184              the info early.  */
21185           src = change_address (src, BLKmode, srcreg);
21186           dst = change_address (dst, BLKmode, destreg);
21187           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
21188                                   desired_align);
21189         }
21190       else
21191         {
21192           /* If we know how many bytes need to be stored before dst is
21193              sufficiently aligned, maintain aliasing info accurately.  */
21194           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
21195                                                  desired_align, align_bytes);
21196           count_exp = plus_constant (count_exp, -align_bytes);
21197           count -= align_bytes;
21198         }
21199       if (need_zero_guard
21200           && (count < (unsigned HOST_WIDE_INT) size_needed
21201               || (align_bytes == 0
21202                   && count < ((unsigned HOST_WIDE_INT) size_needed
21203                               + desired_align - align))))
21204         {
21205           /* It is possible that we copied enough so the main loop will not
21206              execute.  */
21207           gcc_assert (size_needed > 1);
21208           if (label == NULL_RTX)
21209             label = gen_label_rtx ();
21210           emit_cmp_and_jump_insns (count_exp,
21211                                    GEN_INT (size_needed),
21212                                    LTU, 0, counter_mode (count_exp), 1, label);
21213           if (expected_size == -1
21214               || expected_size < (desired_align - align) / 2 + size_needed)
21215             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21216           else
21217             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21218         }
21219     }
21220   if (label && size_needed == 1)
21221     {
21222       emit_label (label);
21223       LABEL_NUSES (label) = 1;
21224       label = NULL;
21225       epilogue_size_needed = 1;
21226     }
21227   else if (label == NULL_RTX)
21228     epilogue_size_needed = size_needed;
21229
21230   /* Step 3: Main loop.  */
21231
21232   switch (alg)
21233     {
21234     case libcall:
21235     case no_stringop:
21236       gcc_unreachable ();
21237     case loop_1_byte:
21238       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21239                                      count_exp, QImode, 1, expected_size);
21240       break;
21241     case loop:
21242       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21243                                      count_exp, Pmode, 1, expected_size);
21244       break;
21245     case unrolled_loop:
21246       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
21247          registers for 4 temporaries anyway.  */
21248       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21249                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
21250                                      expected_size);
21251       break;
21252     case rep_prefix_8_byte:
21253       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21254                                  DImode);
21255       break;
21256     case rep_prefix_4_byte:
21257       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21258                                  SImode);
21259       break;
21260     case rep_prefix_1_byte:
21261       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21262                                  QImode);
21263       break;
21264     }
21265   /* Adjust properly the offset of src and dest memory for aliasing.  */
21266   if (CONST_INT_P (count_exp))
21267     {
21268       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
21269                                           (count / size_needed) * size_needed);
21270       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
21271                                           (count / size_needed) * size_needed);
21272     }
21273   else
21274     {
21275       src = change_address (src, BLKmode, srcreg);
21276       dst = change_address (dst, BLKmode, destreg);
21277     }
21278
21279   /* Step 4: Epilogue to copy the remaining bytes.  */
21280  epilogue:
21281   if (label)
21282     {
21283       /* When the main loop is done, COUNT_EXP might hold original count,
21284          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
21285          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
21286          bytes. Compensate if needed.  */
21287
21288       if (size_needed < epilogue_size_needed)
21289         {
21290           tmp =
21291             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
21292                                  GEN_INT (size_needed - 1), count_exp, 1,
21293                                  OPTAB_DIRECT);
21294           if (tmp != count_exp)
21295             emit_move_insn (count_exp, tmp);
21296         }
21297       emit_label (label);
21298       LABEL_NUSES (label) = 1;
21299     }
21300
21301   if (count_exp != const0_rtx && epilogue_size_needed > 1)
21302     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
21303                             epilogue_size_needed);
21304   if (jump_around_label)
21305     emit_label (jump_around_label);
21306   return true;
21307 }
21308
21309 /* Helper function for memcpy.  For QImode value 0xXY produce
21310    0xXYXYXYXY of wide specified by MODE.  This is essentially
21311    a * 0x10101010, but we can do slightly better than
21312    synth_mult by unwinding the sequence by hand on CPUs with
21313    slow multiply.  */
21314 static rtx
21315 promote_duplicated_reg (enum machine_mode mode, rtx val)
21316 {
21317   enum machine_mode valmode = GET_MODE (val);
21318   rtx tmp;
21319   int nops = mode == DImode ? 3 : 2;
21320
21321   gcc_assert (mode == SImode || mode == DImode);
21322   if (val == const0_rtx)
21323     return copy_to_mode_reg (mode, const0_rtx);
21324   if (CONST_INT_P (val))
21325     {
21326       HOST_WIDE_INT v = INTVAL (val) & 255;
21327
21328       v |= v << 8;
21329       v |= v << 16;
21330       if (mode == DImode)
21331         v |= (v << 16) << 16;
21332       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
21333     }
21334
21335   if (valmode == VOIDmode)
21336     valmode = QImode;
21337   if (valmode != QImode)
21338     val = gen_lowpart (QImode, val);
21339   if (mode == QImode)
21340     return val;
21341   if (!TARGET_PARTIAL_REG_STALL)
21342     nops--;
21343   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
21344       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
21345       <= (ix86_cost->shift_const + ix86_cost->add) * nops
21346           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
21347     {
21348       rtx reg = convert_modes (mode, QImode, val, true);
21349       tmp = promote_duplicated_reg (mode, const1_rtx);
21350       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
21351                                   OPTAB_DIRECT);
21352     }
21353   else
21354     {
21355       rtx reg = convert_modes (mode, QImode, val, true);
21356
21357       if (!TARGET_PARTIAL_REG_STALL)
21358         if (mode == SImode)
21359           emit_insn (gen_movsi_insv_1 (reg, reg));
21360         else
21361           emit_insn (gen_movdi_insv_1 (reg, reg));
21362       else
21363         {
21364           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
21365                                      NULL, 1, OPTAB_DIRECT);
21366           reg =
21367             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21368         }
21369       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
21370                                  NULL, 1, OPTAB_DIRECT);
21371       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21372       if (mode == SImode)
21373         return reg;
21374       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
21375                                  NULL, 1, OPTAB_DIRECT);
21376       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21377       return reg;
21378     }
21379 }
21380
21381 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
21382    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
21383    alignment from ALIGN to DESIRED_ALIGN.  */
21384 static rtx
21385 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
21386 {
21387   rtx promoted_val;
21388
21389   if (TARGET_64BIT
21390       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
21391     promoted_val = promote_duplicated_reg (DImode, val);
21392   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
21393     promoted_val = promote_duplicated_reg (SImode, val);
21394   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
21395     promoted_val = promote_duplicated_reg (HImode, val);
21396   else
21397     promoted_val = val;
21398
21399   return promoted_val;
21400 }
21401
21402 /* Expand string clear operation (bzero).  Use i386 string operations when
21403    profitable.  See expand_movmem comment for explanation of individual
21404    steps performed.  */
21405 bool
21406 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
21407                     rtx expected_align_exp, rtx expected_size_exp)
21408 {
21409   rtx destreg;
21410   rtx label = NULL;
21411   rtx tmp;
21412   rtx jump_around_label = NULL;
21413   HOST_WIDE_INT align = 1;
21414   unsigned HOST_WIDE_INT count = 0;
21415   HOST_WIDE_INT expected_size = -1;
21416   int size_needed = 0, epilogue_size_needed;
21417   int desired_align = 0, align_bytes = 0;
21418   enum stringop_alg alg;
21419   rtx promoted_val = NULL;
21420   bool force_loopy_epilogue = false;
21421   int dynamic_check;
21422   bool need_zero_guard = false;
21423
21424   if (CONST_INT_P (align_exp))
21425     align = INTVAL (align_exp);
21426   /* i386 can do misaligned access on reasonably increased cost.  */
21427   if (CONST_INT_P (expected_align_exp)
21428       && INTVAL (expected_align_exp) > align)
21429     align = INTVAL (expected_align_exp);
21430   if (CONST_INT_P (count_exp))
21431     count = expected_size = INTVAL (count_exp);
21432   if (CONST_INT_P (expected_size_exp) && count == 0)
21433     expected_size = INTVAL (expected_size_exp);
21434
21435   /* Make sure we don't need to care about overflow later on.  */
21436   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
21437     return false;
21438
21439   /* Step 0: Decide on preferred algorithm, desired alignment and
21440      size of chunks to be copied by main loop.  */
21441
21442   alg = decide_alg (count, expected_size, true, &dynamic_check);
21443   desired_align = decide_alignment (align, alg, expected_size);
21444
21445   if (!TARGET_ALIGN_STRINGOPS)
21446     align = desired_align;
21447
21448   if (alg == libcall)
21449     return false;
21450   gcc_assert (alg != no_stringop);
21451   if (!count)
21452     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
21453   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
21454   switch (alg)
21455     {
21456     case libcall:
21457     case no_stringop:
21458       gcc_unreachable ();
21459     case loop:
21460       need_zero_guard = true;
21461       size_needed = GET_MODE_SIZE (Pmode);
21462       break;
21463     case unrolled_loop:
21464       need_zero_guard = true;
21465       size_needed = GET_MODE_SIZE (Pmode) * 4;
21466       break;
21467     case rep_prefix_8_byte:
21468       size_needed = 8;
21469       break;
21470     case rep_prefix_4_byte:
21471       size_needed = 4;
21472       break;
21473     case rep_prefix_1_byte:
21474       size_needed = 1;
21475       break;
21476     case loop_1_byte:
21477       need_zero_guard = true;
21478       size_needed = 1;
21479       break;
21480     }
21481   epilogue_size_needed = size_needed;
21482
21483   /* Step 1: Prologue guard.  */
21484
21485   /* Alignment code needs count to be in register.  */
21486   if (CONST_INT_P (count_exp) && desired_align > align)
21487     {
21488       if (INTVAL (count_exp) > desired_align
21489           && INTVAL (count_exp) > size_needed)
21490         {
21491           align_bytes
21492             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
21493           if (align_bytes <= 0)
21494             align_bytes = 0;
21495           else
21496             align_bytes = desired_align - align_bytes;
21497         }
21498       if (align_bytes == 0)
21499         {
21500           enum machine_mode mode = SImode;
21501           if (TARGET_64BIT && (count & ~0xffffffff))
21502             mode = DImode;
21503           count_exp = force_reg (mode, count_exp);
21504         }
21505     }
21506   /* Do the cheap promotion to allow better CSE across the
21507      main loop and epilogue (ie one load of the big constant in the
21508      front of all code.  */
21509   if (CONST_INT_P (val_exp))
21510     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
21511                                                    desired_align, align);
21512   /* Ensure that alignment prologue won't copy past end of block.  */
21513   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
21514     {
21515       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
21516       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
21517          Make sure it is power of 2.  */
21518       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
21519
21520       /* To improve performance of small blocks, we jump around the VAL
21521          promoting mode.  This mean that if the promoted VAL is not constant,
21522          we might not use it in the epilogue and have to use byte
21523          loop variant.  */
21524       if (epilogue_size_needed > 2 && !promoted_val)
21525         force_loopy_epilogue = true;
21526       if (count)
21527         {
21528           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
21529             {
21530               /* If main algorithm works on QImode, no epilogue is needed.
21531                  For small sizes just don't align anything.  */
21532               if (size_needed == 1)
21533                 desired_align = align;
21534               else
21535                 goto epilogue;
21536             }
21537         }
21538       else
21539         {
21540           label = gen_label_rtx ();
21541           emit_cmp_and_jump_insns (count_exp,
21542                                    GEN_INT (epilogue_size_needed),
21543                                    LTU, 0, counter_mode (count_exp), 1, label);
21544           if (expected_size == -1 || expected_size <= epilogue_size_needed)
21545             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21546           else
21547             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21548         }
21549     }
21550   if (dynamic_check != -1)
21551     {
21552       rtx hot_label = gen_label_rtx ();
21553       jump_around_label = gen_label_rtx ();
21554       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
21555                                LEU, 0, counter_mode (count_exp), 1, hot_label);
21556       predict_jump (REG_BR_PROB_BASE * 90 / 100);
21557       set_storage_via_libcall (dst, count_exp, val_exp, false);
21558       emit_jump (jump_around_label);
21559       emit_label (hot_label);
21560     }
21561
21562   /* Step 2: Alignment prologue.  */
21563
21564   /* Do the expensive promotion once we branched off the small blocks.  */
21565   if (!promoted_val)
21566     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
21567                                                    desired_align, align);
21568   gcc_assert (desired_align >= 1 && align >= 1);
21569
21570   if (desired_align > align)
21571     {
21572       if (align_bytes == 0)
21573         {
21574           /* Except for the first move in epilogue, we no longer know
21575              constant offset in aliasing info.  It don't seems to worth
21576              the pain to maintain it for the first move, so throw away
21577              the info early.  */
21578           dst = change_address (dst, BLKmode, destreg);
21579           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
21580                                   desired_align);
21581         }
21582       else
21583         {
21584           /* If we know how many bytes need to be stored before dst is
21585              sufficiently aligned, maintain aliasing info accurately.  */
21586           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
21587                                                  desired_align, align_bytes);
21588           count_exp = plus_constant (count_exp, -align_bytes);
21589           count -= align_bytes;
21590         }
21591       if (need_zero_guard
21592           && (count < (unsigned HOST_WIDE_INT) size_needed
21593               || (align_bytes == 0
21594                   && count < ((unsigned HOST_WIDE_INT) size_needed
21595                               + desired_align - align))))
21596         {
21597           /* It is possible that we copied enough so the main loop will not
21598              execute.  */
21599           gcc_assert (size_needed > 1);
21600           if (label == NULL_RTX)
21601             label = gen_label_rtx ();
21602           emit_cmp_and_jump_insns (count_exp,
21603                                    GEN_INT (size_needed),
21604                                    LTU, 0, counter_mode (count_exp), 1, label);
21605           if (expected_size == -1
21606               || expected_size < (desired_align - align) / 2 + size_needed)
21607             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21608           else
21609             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21610         }
21611     }
21612   if (label && size_needed == 1)
21613     {
21614       emit_label (label);
21615       LABEL_NUSES (label) = 1;
21616       label = NULL;
21617       promoted_val = val_exp;
21618       epilogue_size_needed = 1;
21619     }
21620   else if (label == NULL_RTX)
21621     epilogue_size_needed = size_needed;
21622
21623   /* Step 3: Main loop.  */
21624
21625   switch (alg)
21626     {
21627     case libcall:
21628     case no_stringop:
21629       gcc_unreachable ();
21630     case loop_1_byte:
21631       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21632                                      count_exp, QImode, 1, expected_size);
21633       break;
21634     case loop:
21635       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21636                                      count_exp, Pmode, 1, expected_size);
21637       break;
21638     case unrolled_loop:
21639       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21640                                      count_exp, Pmode, 4, expected_size);
21641       break;
21642     case rep_prefix_8_byte:
21643       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21644                                   DImode, val_exp);
21645       break;
21646     case rep_prefix_4_byte:
21647       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21648                                   SImode, val_exp);
21649       break;
21650     case rep_prefix_1_byte:
21651       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21652                                   QImode, val_exp);
21653       break;
21654     }
21655   /* Adjust properly the offset of src and dest memory for aliasing.  */
21656   if (CONST_INT_P (count_exp))
21657     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
21658                                         (count / size_needed) * size_needed);
21659   else
21660     dst = change_address (dst, BLKmode, destreg);
21661
21662   /* Step 4: Epilogue to copy the remaining bytes.  */
21663
21664   if (label)
21665     {
21666       /* When the main loop is done, COUNT_EXP might hold original count,
21667          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
21668          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
21669          bytes. Compensate if needed.  */
21670
21671       if (size_needed < epilogue_size_needed)
21672         {
21673           tmp =
21674             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
21675                                  GEN_INT (size_needed - 1), count_exp, 1,
21676                                  OPTAB_DIRECT);
21677           if (tmp != count_exp)
21678             emit_move_insn (count_exp, tmp);
21679         }
21680       emit_label (label);
21681       LABEL_NUSES (label) = 1;
21682     }
21683  epilogue:
21684   if (count_exp != const0_rtx && epilogue_size_needed > 1)
21685     {
21686       if (force_loopy_epilogue)
21687         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
21688                                          epilogue_size_needed);
21689       else
21690         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
21691                                 epilogue_size_needed);
21692     }
21693   if (jump_around_label)
21694     emit_label (jump_around_label);
21695   return true;
21696 }
21697
21698 /* Expand the appropriate insns for doing strlen if not just doing
21699    repnz; scasb
21700
21701    out = result, initialized with the start address
21702    align_rtx = alignment of the address.
21703    scratch = scratch register, initialized with the startaddress when
21704         not aligned, otherwise undefined
21705
21706    This is just the body. It needs the initializations mentioned above and
21707    some address computing at the end.  These things are done in i386.md.  */
21708
21709 static void
21710 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
21711 {
21712   int align;
21713   rtx tmp;
21714   rtx align_2_label = NULL_RTX;
21715   rtx align_3_label = NULL_RTX;
21716   rtx align_4_label = gen_label_rtx ();
21717   rtx end_0_label = gen_label_rtx ();
21718   rtx mem;
21719   rtx tmpreg = gen_reg_rtx (SImode);
21720   rtx scratch = gen_reg_rtx (SImode);
21721   rtx cmp;
21722
21723   align = 0;
21724   if (CONST_INT_P (align_rtx))
21725     align = INTVAL (align_rtx);
21726
21727   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
21728
21729   /* Is there a known alignment and is it less than 4?  */
21730   if (align < 4)
21731     {
21732       rtx scratch1 = gen_reg_rtx (Pmode);
21733       emit_move_insn (scratch1, out);
21734       /* Is there a known alignment and is it not 2? */
21735       if (align != 2)
21736         {
21737           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
21738           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
21739
21740           /* Leave just the 3 lower bits.  */
21741           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
21742                                     NULL_RTX, 0, OPTAB_WIDEN);
21743
21744           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
21745                                    Pmode, 1, align_4_label);
21746           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
21747                                    Pmode, 1, align_2_label);
21748           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
21749                                    Pmode, 1, align_3_label);
21750         }
21751       else
21752         {
21753           /* Since the alignment is 2, we have to check 2 or 0 bytes;
21754              check if is aligned to 4 - byte.  */
21755
21756           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
21757                                     NULL_RTX, 0, OPTAB_WIDEN);
21758
21759           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
21760                                    Pmode, 1, align_4_label);
21761         }
21762
21763       mem = change_address (src, QImode, out);
21764
21765       /* Now compare the bytes.  */
21766
21767       /* Compare the first n unaligned byte on a byte per byte basis.  */
21768       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
21769                                QImode, 1, end_0_label);
21770
21771       /* Increment the address.  */
21772       emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21773
21774       /* Not needed with an alignment of 2 */
21775       if (align != 2)
21776         {
21777           emit_label (align_2_label);
21778
21779           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
21780                                    end_0_label);
21781
21782           emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21783
21784           emit_label (align_3_label);
21785         }
21786
21787       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
21788                                end_0_label);
21789
21790       emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21791     }
21792
21793   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
21794      align this loop.  It gives only huge programs, but does not help to
21795      speed up.  */
21796   emit_label (align_4_label);
21797
21798   mem = change_address (src, SImode, out);
21799   emit_move_insn (scratch, mem);
21800   emit_insn (ix86_gen_add3 (out, out, GEN_INT (4)));
21801
21802   /* This formula yields a nonzero result iff one of the bytes is zero.
21803      This saves three branches inside loop and many cycles.  */
21804
21805   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
21806   emit_insn (gen_one_cmplsi2 (scratch, scratch));
21807   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
21808   emit_insn (gen_andsi3 (tmpreg, tmpreg,
21809                          gen_int_mode (0x80808080, SImode)));
21810   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
21811                            align_4_label);
21812
21813   if (TARGET_CMOVE)
21814     {
21815        rtx reg = gen_reg_rtx (SImode);
21816        rtx reg2 = gen_reg_rtx (Pmode);
21817        emit_move_insn (reg, tmpreg);
21818        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
21819
21820        /* If zero is not in the first two bytes, move two bytes forward.  */
21821        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
21822        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21823        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
21824        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
21825                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
21826                                                      reg,
21827                                                      tmpreg)));
21828        /* Emit lea manually to avoid clobbering of flags.  */
21829        emit_insn (gen_rtx_SET (SImode, reg2,
21830                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
21831
21832        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21833        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
21834        emit_insn (gen_rtx_SET (VOIDmode, out,
21835                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
21836                                                      reg2,
21837                                                      out)));
21838     }
21839   else
21840     {
21841        rtx end_2_label = gen_label_rtx ();
21842        /* Is zero in the first two bytes? */
21843
21844        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
21845        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21846        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
21847        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
21848                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
21849                             pc_rtx);
21850        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
21851        JUMP_LABEL (tmp) = end_2_label;
21852
21853        /* Not in the first two.  Move two bytes forward.  */
21854        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
21855        emit_insn (ix86_gen_add3 (out, out, const2_rtx));
21856
21857        emit_label (end_2_label);
21858
21859     }
21860
21861   /* Avoid branch in fixing the byte.  */
21862   tmpreg = gen_lowpart (QImode, tmpreg);
21863   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
21864   tmp = gen_rtx_REG (CCmode, FLAGS_REG);
21865   cmp = gen_rtx_LTU (VOIDmode, tmp, const0_rtx);
21866   emit_insn (ix86_gen_sub3_carry (out, out, GEN_INT (3), tmp, cmp));
21867
21868   emit_label (end_0_label);
21869 }
21870
21871 /* Expand strlen.  */
21872
21873 bool
21874 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
21875 {
21876   rtx addr, scratch1, scratch2, scratch3, scratch4;
21877
21878   /* The generic case of strlen expander is long.  Avoid it's
21879      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
21880
21881   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
21882       && !TARGET_INLINE_ALL_STRINGOPS
21883       && !optimize_insn_for_size_p ()
21884       && (!CONST_INT_P (align) || INTVAL (align) < 4))
21885     return false;
21886
21887   addr = force_reg (Pmode, XEXP (src, 0));
21888   scratch1 = gen_reg_rtx (Pmode);
21889
21890   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
21891       && !optimize_insn_for_size_p ())
21892     {
21893       /* Well it seems that some optimizer does not combine a call like
21894          foo(strlen(bar), strlen(bar));
21895          when the move and the subtraction is done here.  It does calculate
21896          the length just once when these instructions are done inside of
21897          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
21898          often used and I use one fewer register for the lifetime of
21899          output_strlen_unroll() this is better.  */
21900
21901       emit_move_insn (out, addr);
21902
21903       ix86_expand_strlensi_unroll_1 (out, src, align);
21904
21905       /* strlensi_unroll_1 returns the address of the zero at the end of
21906          the string, like memchr(), so compute the length by subtracting
21907          the start address.  */
21908       emit_insn (ix86_gen_sub3 (out, out, addr));
21909     }
21910   else
21911     {
21912       rtx unspec;
21913
21914       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
21915       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
21916         return false;
21917
21918       scratch2 = gen_reg_rtx (Pmode);
21919       scratch3 = gen_reg_rtx (Pmode);
21920       scratch4 = force_reg (Pmode, constm1_rtx);
21921
21922       emit_move_insn (scratch3, addr);
21923       eoschar = force_reg (QImode, eoschar);
21924
21925       src = replace_equiv_address_nv (src, scratch3);
21926
21927       /* If .md starts supporting :P, this can be done in .md.  */
21928       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
21929                                                  scratch4), UNSPEC_SCAS);
21930       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
21931       emit_insn (ix86_gen_one_cmpl2 (scratch2, scratch1));
21932       emit_insn (ix86_gen_add3 (out, scratch2, constm1_rtx));
21933     }
21934   return true;
21935 }
21936
21937 /* For given symbol (function) construct code to compute address of it's PLT
21938    entry in large x86-64 PIC model.  */
21939 rtx
21940 construct_plt_address (rtx symbol)
21941 {
21942   rtx tmp = gen_reg_rtx (Pmode);
21943   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
21944
21945   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
21946   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
21947
21948   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
21949   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
21950   return tmp;
21951 }
21952
21953 rtx
21954 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
21955                   rtx callarg2,
21956                   rtx pop, int sibcall)
21957 {
21958   rtx use = NULL, call;
21959
21960   if (pop == const0_rtx)
21961     pop = NULL;
21962   gcc_assert (!TARGET_64BIT || !pop);
21963
21964   if (TARGET_MACHO && !TARGET_64BIT)
21965     {
21966 #if TARGET_MACHO
21967       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
21968         fnaddr = machopic_indirect_call_target (fnaddr);
21969 #endif
21970     }
21971   else
21972     {
21973       /* Static functions and indirect calls don't need the pic register.  */
21974       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
21975           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
21976           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
21977         use_reg (&use, pic_offset_table_rtx);
21978     }
21979
21980   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
21981     {
21982       rtx al = gen_rtx_REG (QImode, AX_REG);
21983       emit_move_insn (al, callarg2);
21984       use_reg (&use, al);
21985     }
21986
21987   if (ix86_cmodel == CM_LARGE_PIC
21988       && MEM_P (fnaddr)
21989       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
21990       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
21991     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
21992   else if (sibcall
21993            ? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
21994            : !call_insn_operand (XEXP (fnaddr, 0), Pmode))
21995     {
21996       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
21997       fnaddr = gen_rtx_MEM (QImode, fnaddr);
21998     }
21999
22000   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
22001   if (retval)
22002     call = gen_rtx_SET (VOIDmode, retval, call);
22003   if (pop)
22004     {
22005       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
22006       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
22007       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
22008     }
22009   if (TARGET_64BIT_MS_ABI
22010       && (!callarg2 || INTVAL (callarg2) != -2))
22011     {
22012       /* We need to represent that SI and DI registers are clobbered
22013          by SYSV calls.  */
22014       static int clobbered_registers[] = {
22015         XMM6_REG, XMM7_REG, XMM8_REG,
22016         XMM9_REG, XMM10_REG, XMM11_REG,
22017         XMM12_REG, XMM13_REG, XMM14_REG,
22018         XMM15_REG, SI_REG, DI_REG
22019       };
22020       unsigned int i;
22021       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
22022       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
22023                                    UNSPEC_MS_TO_SYSV_CALL);
22024
22025       vec[0] = call;
22026       vec[1] = unspec;
22027       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
22028         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
22029                                       ? TImode : DImode,
22030                                       gen_rtx_REG
22031                                         (SSE_REGNO_P (clobbered_registers[i])
22032                                                       ? TImode : DImode,
22033                                          clobbered_registers[i]));
22034
22035       call = gen_rtx_PARALLEL (VOIDmode,
22036                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
22037                                + 2, vec));
22038     }
22039
22040   /* Add UNSPEC_CALL_NEEDS_VZEROUPPER decoration.  */
22041   if (TARGET_VZEROUPPER)
22042     {
22043       rtx unspec;
22044       int avx256;
22045
22046       if (cfun->machine->callee_pass_avx256_p)
22047         {
22048           if (cfun->machine->callee_return_avx256_p)
22049             avx256 = callee_return_pass_avx256;
22050           else
22051             avx256 = callee_pass_avx256;
22052         }
22053       else if (cfun->machine->callee_return_avx256_p)
22054         avx256 = callee_return_avx256;
22055       else
22056         avx256 = call_no_avx256;
22057
22058       if (reload_completed)
22059         emit_insn (gen_avx_vzeroupper (GEN_INT (avx256)));
22060       else
22061         {
22062           unspec = gen_rtx_UNSPEC (VOIDmode,
22063                                    gen_rtvec (1, GEN_INT (avx256)),
22064                                    UNSPEC_CALL_NEEDS_VZEROUPPER);
22065           call = gen_rtx_PARALLEL (VOIDmode,
22066                                    gen_rtvec (2, call, unspec));
22067         }
22068     }
22069
22070   call = emit_call_insn (call);
22071   if (use)
22072     CALL_INSN_FUNCTION_USAGE (call) = use;
22073
22074   return call;
22075 }
22076
22077 void
22078 ix86_split_call_vzeroupper (rtx insn, rtx vzeroupper)
22079 {
22080   rtx call = XVECEXP (PATTERN (insn), 0, 0);
22081   emit_insn (gen_avx_vzeroupper (vzeroupper));
22082   emit_call_insn (call);
22083 }
22084
22085 /* Output the assembly for a call instruction.  */
22086
22087 const char *
22088 ix86_output_call_insn (rtx insn, rtx call_op, int addr_op)
22089 {
22090   bool direct_p = constant_call_address_operand (call_op, Pmode);
22091   bool seh_nop_p = false;
22092
22093   gcc_assert (addr_op == 0 || addr_op == 1);
22094
22095   if (SIBLING_CALL_P (insn))
22096     {
22097       if (direct_p)
22098         return addr_op ? "jmp\t%P1" : "jmp\t%P0";
22099       /* SEH epilogue detection requires the indirect branch case
22100          to include REX.W.  */
22101       else if (TARGET_SEH)
22102         return addr_op ? "rex.W jmp %A1" : "rex.W jmp %A0";
22103       else
22104         return addr_op ? "jmp\t%A1" : "jmp\t%A0";
22105     }
22106
22107   /* SEH unwinding can require an extra nop to be emitted in several
22108      circumstances.  Determine if we have one of those.  */
22109   if (TARGET_SEH)
22110     {
22111       rtx i;
22112
22113       for (i = NEXT_INSN (insn); i ; i = NEXT_INSN (i))
22114         {
22115           /* If we get to another real insn, we don't need the nop.  */
22116           if (INSN_P (i))
22117             break;
22118
22119           /* If we get to the epilogue note, prevent a catch region from
22120              being adjacent to the standard epilogue sequence.  If non-
22121              call-exceptions, we'll have done this during epilogue emission. */
22122           if (NOTE_P (i) && NOTE_KIND (i) == NOTE_INSN_EPILOGUE_BEG
22123               && !flag_non_call_exceptions
22124               && !can_throw_internal (insn))
22125             {
22126               seh_nop_p = true;
22127               break;
22128             }
22129         }
22130
22131       /* If we didn't find a real insn following the call, prevent the
22132          unwinder from looking into the next function.  */
22133       if (i == NULL)
22134         seh_nop_p = true;
22135     }
22136
22137   if (direct_p)
22138     {
22139       if (seh_nop_p)
22140         return addr_op ? "call\t%P1\n\tnop" : "call\t%P0\n\tnop";
22141       else
22142         return addr_op ? "call\t%P1" : "call\t%P0";
22143     }
22144   else
22145     {
22146       if (seh_nop_p)
22147         return addr_op ? "call\t%A1\n\tnop" : "call\t%A0\n\tnop";
22148       else
22149         return addr_op ? "call\t%A1" : "call\t%A0";
22150     }
22151 }
22152 \f
22153 /* Clear stack slot assignments remembered from previous functions.
22154    This is called from INIT_EXPANDERS once before RTL is emitted for each
22155    function.  */
22156
22157 static struct machine_function *
22158 ix86_init_machine_status (void)
22159 {
22160   struct machine_function *f;
22161
22162   f = ggc_alloc_cleared_machine_function ();
22163   f->use_fast_prologue_epilogue_nregs = -1;
22164   f->tls_descriptor_call_expanded_p = 0;
22165   f->call_abi = ix86_abi;
22166
22167   return f;
22168 }
22169
22170 /* Return a MEM corresponding to a stack slot with mode MODE.
22171    Allocate a new slot if necessary.
22172
22173    The RTL for a function can have several slots available: N is
22174    which slot to use.  */
22175
22176 rtx
22177 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
22178 {
22179   struct stack_local_entry *s;
22180
22181   gcc_assert (n < MAX_386_STACK_LOCALS);
22182
22183   /* Virtual slot is valid only before vregs are instantiated.  */
22184   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
22185
22186   for (s = ix86_stack_locals; s; s = s->next)
22187     if (s->mode == mode && s->n == n)
22188       return copy_rtx (s->rtl);
22189
22190   s = ggc_alloc_stack_local_entry ();
22191   s->n = n;
22192   s->mode = mode;
22193   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
22194
22195   s->next = ix86_stack_locals;
22196   ix86_stack_locals = s;
22197   return s->rtl;
22198 }
22199
22200 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
22201
22202 static GTY(()) rtx ix86_tls_symbol;
22203 rtx
22204 ix86_tls_get_addr (void)
22205 {
22206
22207   if (!ix86_tls_symbol)
22208     {
22209       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
22210                                             (TARGET_ANY_GNU_TLS
22211                                              && !TARGET_64BIT)
22212                                             ? "___tls_get_addr"
22213                                             : "__tls_get_addr");
22214     }
22215
22216   return ix86_tls_symbol;
22217 }
22218
22219 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
22220
22221 static GTY(()) rtx ix86_tls_module_base_symbol;
22222 rtx
22223 ix86_tls_module_base (void)
22224 {
22225
22226   if (!ix86_tls_module_base_symbol)
22227     {
22228       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
22229                                                         "_TLS_MODULE_BASE_");
22230       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
22231         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
22232     }
22233
22234   return ix86_tls_module_base_symbol;
22235 }
22236 \f
22237 /* Calculate the length of the memory address in the instruction
22238    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
22239
22240 int
22241 memory_address_length (rtx addr)
22242 {
22243   struct ix86_address parts;
22244   rtx base, index, disp;
22245   int len;
22246   int ok;
22247
22248   if (GET_CODE (addr) == PRE_DEC
22249       || GET_CODE (addr) == POST_INC
22250       || GET_CODE (addr) == PRE_MODIFY
22251       || GET_CODE (addr) == POST_MODIFY)
22252     return 0;
22253
22254   ok = ix86_decompose_address (addr, &parts);
22255   gcc_assert (ok);
22256
22257   if (parts.base && GET_CODE (parts.base) == SUBREG)
22258     parts.base = SUBREG_REG (parts.base);
22259   if (parts.index && GET_CODE (parts.index) == SUBREG)
22260     parts.index = SUBREG_REG (parts.index);
22261
22262   base = parts.base;
22263   index = parts.index;
22264   disp = parts.disp;
22265   len = 0;
22266
22267   /* Rule of thumb:
22268        - esp as the base always wants an index,
22269        - ebp as the base always wants a displacement,
22270        - r12 as the base always wants an index,
22271        - r13 as the base always wants a displacement.  */
22272
22273   /* Register Indirect.  */
22274   if (base && !index && !disp)
22275     {
22276       /* esp (for its index) and ebp (for its displacement) need
22277          the two-byte modrm form.  Similarly for r12 and r13 in 64-bit
22278          code.  */
22279       if (REG_P (addr)
22280           && (addr == arg_pointer_rtx
22281               || addr == frame_pointer_rtx
22282               || REGNO (addr) == SP_REG
22283               || REGNO (addr) == BP_REG
22284               || REGNO (addr) == R12_REG
22285               || REGNO (addr) == R13_REG))
22286         len = 1;
22287     }
22288
22289   /* Direct Addressing.  In 64-bit mode mod 00 r/m 5
22290      is not disp32, but disp32(%rip), so for disp32
22291      SIB byte is needed, unless print_operand_address
22292      optimizes it into disp32(%rip) or (%rip) is implied
22293      by UNSPEC.  */
22294   else if (disp && !base && !index)
22295     {
22296       len = 4;
22297       if (TARGET_64BIT)
22298         {
22299           rtx symbol = disp;
22300
22301           if (GET_CODE (disp) == CONST)
22302             symbol = XEXP (disp, 0);
22303           if (GET_CODE (symbol) == PLUS
22304               && CONST_INT_P (XEXP (symbol, 1)))
22305             symbol = XEXP (symbol, 0);
22306
22307           if (GET_CODE (symbol) != LABEL_REF
22308               && (GET_CODE (symbol) != SYMBOL_REF
22309                   || SYMBOL_REF_TLS_MODEL (symbol) != 0)
22310               && (GET_CODE (symbol) != UNSPEC
22311                   || (XINT (symbol, 1) != UNSPEC_GOTPCREL
22312                       && XINT (symbol, 1) != UNSPEC_PCREL
22313                       && XINT (symbol, 1) != UNSPEC_GOTNTPOFF)))
22314             len += 1;
22315         }
22316     }
22317
22318   else
22319     {
22320       /* Find the length of the displacement constant.  */
22321       if (disp)
22322         {
22323           if (base && satisfies_constraint_K (disp))
22324             len = 1;
22325           else
22326             len = 4;
22327         }
22328       /* ebp always wants a displacement.  Similarly r13.  */
22329       else if (base && REG_P (base)
22330                && (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
22331         len = 1;
22332
22333       /* An index requires the two-byte modrm form....  */
22334       if (index
22335           /* ...like esp (or r12), which always wants an index.  */
22336           || base == arg_pointer_rtx
22337           || base == frame_pointer_rtx
22338           || (base && REG_P (base)
22339               && (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
22340         len += 1;
22341     }
22342
22343   switch (parts.seg)
22344     {
22345     case SEG_FS:
22346     case SEG_GS:
22347       len += 1;
22348       break;
22349     default:
22350       break;
22351     }
22352
22353   return len;
22354 }
22355
22356 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
22357    is set, expect that insn have 8bit immediate alternative.  */
22358 int
22359 ix86_attr_length_immediate_default (rtx insn, int shortform)
22360 {
22361   int len = 0;
22362   int i;
22363   extract_insn_cached (insn);
22364   for (i = recog_data.n_operands - 1; i >= 0; --i)
22365     if (CONSTANT_P (recog_data.operand[i]))
22366       {
22367         enum attr_mode mode = get_attr_mode (insn);
22368
22369         gcc_assert (!len);
22370         if (shortform && CONST_INT_P (recog_data.operand[i]))
22371           {
22372             HOST_WIDE_INT ival = INTVAL (recog_data.operand[i]);
22373             switch (mode)
22374               {
22375               case MODE_QI:
22376                 len = 1;
22377                 continue;
22378               case MODE_HI:
22379                 ival = trunc_int_for_mode (ival, HImode);
22380                 break;
22381               case MODE_SI:
22382                 ival = trunc_int_for_mode (ival, SImode);
22383                 break;
22384               default:
22385                 break;
22386               }
22387             if (IN_RANGE (ival, -128, 127))
22388               {
22389                 len = 1;
22390                 continue;
22391               }
22392           }
22393         switch (mode)
22394           {
22395           case MODE_QI:
22396             len = 1;
22397             break;
22398           case MODE_HI:
22399             len = 2;
22400             break;
22401           case MODE_SI:
22402             len = 4;
22403             break;
22404           /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
22405           case MODE_DI:
22406             len = 4;
22407             break;
22408           default:
22409             fatal_insn ("unknown insn mode", insn);
22410         }
22411       }
22412   return len;
22413 }
22414 /* Compute default value for "length_address" attribute.  */
22415 int
22416 ix86_attr_length_address_default (rtx insn)
22417 {
22418   int i;
22419
22420   if (get_attr_type (insn) == TYPE_LEA)
22421     {
22422       rtx set = PATTERN (insn), addr;
22423
22424       if (GET_CODE (set) == PARALLEL)
22425         set = XVECEXP (set, 0, 0);
22426
22427       gcc_assert (GET_CODE (set) == SET);
22428
22429       addr = SET_SRC (set);
22430       if (TARGET_64BIT && get_attr_mode (insn) == MODE_SI)
22431         {
22432           if (GET_CODE (addr) == ZERO_EXTEND)
22433             addr = XEXP (addr, 0);
22434           if (GET_CODE (addr) == SUBREG)
22435             addr = SUBREG_REG (addr);
22436         }
22437
22438       return memory_address_length (addr);
22439     }
22440
22441   extract_insn_cached (insn);
22442   for (i = recog_data.n_operands - 1; i >= 0; --i)
22443     if (MEM_P (recog_data.operand[i]))
22444       {
22445         constrain_operands_cached (reload_completed);
22446         if (which_alternative != -1)
22447           {
22448             const char *constraints = recog_data.constraints[i];
22449             int alt = which_alternative;
22450
22451             while (*constraints == '=' || *constraints == '+')
22452               constraints++;
22453             while (alt-- > 0)
22454               while (*constraints++ != ',')
22455                 ;
22456             /* Skip ignored operands.  */
22457             if (*constraints == 'X')
22458               continue;
22459           }
22460         return memory_address_length (XEXP (recog_data.operand[i], 0));
22461       }
22462   return 0;
22463 }
22464
22465 /* Compute default value for "length_vex" attribute. It includes
22466    2 or 3 byte VEX prefix and 1 opcode byte.  */
22467
22468 int
22469 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
22470                               int has_vex_w)
22471 {
22472   int i;
22473
22474   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
22475      byte VEX prefix.  */
22476   if (!has_0f_opcode || has_vex_w)
22477     return 3 + 1;
22478
22479  /* We can always use 2 byte VEX prefix in 32bit.  */
22480   if (!TARGET_64BIT)
22481     return 2 + 1;
22482
22483   extract_insn_cached (insn);
22484
22485   for (i = recog_data.n_operands - 1; i >= 0; --i)
22486     if (REG_P (recog_data.operand[i]))
22487       {
22488         /* REX.W bit uses 3 byte VEX prefix.  */
22489         if (GET_MODE (recog_data.operand[i]) == DImode
22490             && GENERAL_REG_P (recog_data.operand[i]))
22491           return 3 + 1;
22492       }
22493     else
22494       {
22495         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
22496         if (MEM_P (recog_data.operand[i])
22497             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
22498           return 3 + 1;
22499       }
22500
22501   return 2 + 1;
22502 }
22503 \f
22504 /* Return the maximum number of instructions a cpu can issue.  */
22505
22506 static int
22507 ix86_issue_rate (void)
22508 {
22509   switch (ix86_tune)
22510     {
22511     case PROCESSOR_PENTIUM:
22512     case PROCESSOR_ATOM:
22513     case PROCESSOR_K6:
22514       return 2;
22515
22516     case PROCESSOR_PENTIUMPRO:
22517     case PROCESSOR_PENTIUM4:
22518     case PROCESSOR_CORE2_32:
22519     case PROCESSOR_CORE2_64:
22520     case PROCESSOR_COREI7_32:
22521     case PROCESSOR_COREI7_64:
22522     case PROCESSOR_ATHLON:
22523     case PROCESSOR_K8:
22524     case PROCESSOR_AMDFAM10:
22525     case PROCESSOR_NOCONA:
22526     case PROCESSOR_GENERIC32:
22527     case PROCESSOR_GENERIC64:
22528     case PROCESSOR_BDVER1:
22529     case PROCESSOR_BTVER1:
22530       return 3;
22531
22532     default:
22533       return 1;
22534     }
22535 }
22536
22537 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
22538    by DEP_INSN and nothing set by DEP_INSN.  */
22539
22540 static int
22541 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
22542 {
22543   rtx set, set2;
22544
22545   /* Simplify the test for uninteresting insns.  */
22546   if (insn_type != TYPE_SETCC
22547       && insn_type != TYPE_ICMOV
22548       && insn_type != TYPE_FCMOV
22549       && insn_type != TYPE_IBR)
22550     return 0;
22551
22552   if ((set = single_set (dep_insn)) != 0)
22553     {
22554       set = SET_DEST (set);
22555       set2 = NULL_RTX;
22556     }
22557   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
22558            && XVECLEN (PATTERN (dep_insn), 0) == 2
22559            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
22560            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
22561     {
22562       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
22563       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
22564     }
22565   else
22566     return 0;
22567
22568   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
22569     return 0;
22570
22571   /* This test is true if the dependent insn reads the flags but
22572      not any other potentially set register.  */
22573   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
22574     return 0;
22575
22576   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
22577     return 0;
22578
22579   return 1;
22580 }
22581
22582 /* Return true iff USE_INSN has a memory address with operands set by
22583    SET_INSN.  */
22584
22585 bool
22586 ix86_agi_dependent (rtx set_insn, rtx use_insn)
22587 {
22588   int i;
22589   extract_insn_cached (use_insn);
22590   for (i = recog_data.n_operands - 1; i >= 0; --i)
22591     if (MEM_P (recog_data.operand[i]))
22592       {
22593         rtx addr = XEXP (recog_data.operand[i], 0);
22594         return modified_in_p (addr, set_insn) != 0;
22595       }
22596   return false;
22597 }
22598
22599 static int
22600 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22601 {
22602   enum attr_type insn_type, dep_insn_type;
22603   enum attr_memory memory;
22604   rtx set, set2;
22605   int dep_insn_code_number;
22606
22607   /* Anti and output dependencies have zero cost on all CPUs.  */
22608   if (REG_NOTE_KIND (link) != 0)
22609     return 0;
22610
22611   dep_insn_code_number = recog_memoized (dep_insn);
22612
22613   /* If we can't recognize the insns, we can't really do anything.  */
22614   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
22615     return cost;
22616
22617   insn_type = get_attr_type (insn);
22618   dep_insn_type = get_attr_type (dep_insn);
22619
22620   switch (ix86_tune)
22621     {
22622     case PROCESSOR_PENTIUM:
22623       /* Address Generation Interlock adds a cycle of latency.  */
22624       if (insn_type == TYPE_LEA)
22625         {
22626           rtx addr = PATTERN (insn);
22627
22628           if (GET_CODE (addr) == PARALLEL)
22629             addr = XVECEXP (addr, 0, 0);
22630
22631           gcc_assert (GET_CODE (addr) == SET);
22632
22633           addr = SET_SRC (addr);
22634           if (modified_in_p (addr, dep_insn))
22635             cost += 1;
22636         }
22637       else if (ix86_agi_dependent (dep_insn, insn))
22638         cost += 1;
22639
22640       /* ??? Compares pair with jump/setcc.  */
22641       if (ix86_flags_dependent (insn, dep_insn, insn_type))
22642         cost = 0;
22643
22644       /* Floating point stores require value to be ready one cycle earlier.  */
22645       if (insn_type == TYPE_FMOV
22646           && get_attr_memory (insn) == MEMORY_STORE
22647           && !ix86_agi_dependent (dep_insn, insn))
22648         cost += 1;
22649       break;
22650
22651     case PROCESSOR_PENTIUMPRO:
22652       memory = get_attr_memory (insn);
22653
22654       /* INT->FP conversion is expensive.  */
22655       if (get_attr_fp_int_src (dep_insn))
22656         cost += 5;
22657
22658       /* There is one cycle extra latency between an FP op and a store.  */
22659       if (insn_type == TYPE_FMOV
22660           && (set = single_set (dep_insn)) != NULL_RTX
22661           && (set2 = single_set (insn)) != NULL_RTX
22662           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
22663           && MEM_P (SET_DEST (set2)))
22664         cost += 1;
22665
22666       /* Show ability of reorder buffer to hide latency of load by executing
22667          in parallel with previous instruction in case
22668          previous instruction is not needed to compute the address.  */
22669       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22670           && !ix86_agi_dependent (dep_insn, insn))
22671         {
22672           /* Claim moves to take one cycle, as core can issue one load
22673              at time and the next load can start cycle later.  */
22674           if (dep_insn_type == TYPE_IMOV
22675               || dep_insn_type == TYPE_FMOV)
22676             cost = 1;
22677           else if (cost > 1)
22678             cost--;
22679         }
22680       break;
22681
22682     case PROCESSOR_K6:
22683       memory = get_attr_memory (insn);
22684
22685       /* The esp dependency is resolved before the instruction is really
22686          finished.  */
22687       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
22688           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
22689         return 1;
22690
22691       /* INT->FP conversion is expensive.  */
22692       if (get_attr_fp_int_src (dep_insn))
22693         cost += 5;
22694
22695       /* Show ability of reorder buffer to hide latency of load by executing
22696          in parallel with previous instruction in case
22697          previous instruction is not needed to compute the address.  */
22698       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22699           && !ix86_agi_dependent (dep_insn, insn))
22700         {
22701           /* Claim moves to take one cycle, as core can issue one load
22702              at time and the next load can start cycle later.  */
22703           if (dep_insn_type == TYPE_IMOV
22704               || dep_insn_type == TYPE_FMOV)
22705             cost = 1;
22706           else if (cost > 2)
22707             cost -= 2;
22708           else
22709             cost = 1;
22710         }
22711       break;
22712
22713     case PROCESSOR_ATHLON:
22714     case PROCESSOR_K8:
22715     case PROCESSOR_AMDFAM10:
22716     case PROCESSOR_BDVER1:
22717     case PROCESSOR_BTVER1:
22718     case PROCESSOR_ATOM:
22719     case PROCESSOR_GENERIC32:
22720     case PROCESSOR_GENERIC64:
22721       memory = get_attr_memory (insn);
22722
22723       /* Show ability of reorder buffer to hide latency of load by executing
22724          in parallel with previous instruction in case
22725          previous instruction is not needed to compute the address.  */
22726       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22727           && !ix86_agi_dependent (dep_insn, insn))
22728         {
22729           enum attr_unit unit = get_attr_unit (insn);
22730           int loadcost = 3;
22731
22732           /* Because of the difference between the length of integer and
22733              floating unit pipeline preparation stages, the memory operands
22734              for floating point are cheaper.
22735
22736              ??? For Athlon it the difference is most probably 2.  */
22737           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
22738             loadcost = 3;
22739           else
22740             loadcost = TARGET_ATHLON ? 2 : 0;
22741
22742           if (cost >= loadcost)
22743             cost -= loadcost;
22744           else
22745             cost = 0;
22746         }
22747
22748     default:
22749       break;
22750     }
22751
22752   return cost;
22753 }
22754
22755 /* How many alternative schedules to try.  This should be as wide as the
22756    scheduling freedom in the DFA, but no wider.  Making this value too
22757    large results extra work for the scheduler.  */
22758
22759 static int
22760 ia32_multipass_dfa_lookahead (void)
22761 {
22762   switch (ix86_tune)
22763     {
22764     case PROCESSOR_PENTIUM:
22765       return 2;
22766
22767     case PROCESSOR_PENTIUMPRO:
22768     case PROCESSOR_K6:
22769       return 1;
22770
22771     case PROCESSOR_CORE2_32:
22772     case PROCESSOR_CORE2_64:
22773     case PROCESSOR_COREI7_32:
22774     case PROCESSOR_COREI7_64:
22775       /* Generally, we want haifa-sched:max_issue() to look ahead as far
22776          as many instructions can be executed on a cycle, i.e.,
22777          issue_rate.  I wonder why tuning for many CPUs does not do this.  */
22778       return ix86_issue_rate ();
22779
22780     default:
22781       return 0;
22782     }
22783 }
22784
22785 \f
22786
22787 /* Model decoder of Core 2/i7.
22788    Below hooks for multipass scheduling (see haifa-sched.c:max_issue)
22789    track the instruction fetch block boundaries and make sure that long
22790    (9+ bytes) instructions are assigned to D0.  */
22791
22792 /* Maximum length of an insn that can be handled by
22793    a secondary decoder unit.  '8' for Core 2/i7.  */
22794 static int core2i7_secondary_decoder_max_insn_size;
22795
22796 /* Ifetch block size, i.e., number of bytes decoder reads per cycle.
22797    '16' for Core 2/i7.  */
22798 static int core2i7_ifetch_block_size;
22799
22800 /* Maximum number of instructions decoder can handle per cycle.
22801    '6' for Core 2/i7.  */
22802 static int core2i7_ifetch_block_max_insns;
22803
22804 typedef struct ix86_first_cycle_multipass_data_ *
22805   ix86_first_cycle_multipass_data_t;
22806 typedef const struct ix86_first_cycle_multipass_data_ *
22807   const_ix86_first_cycle_multipass_data_t;
22808
22809 /* A variable to store target state across calls to max_issue within
22810    one cycle.  */
22811 static struct ix86_first_cycle_multipass_data_ _ix86_first_cycle_multipass_data,
22812   *ix86_first_cycle_multipass_data = &_ix86_first_cycle_multipass_data;
22813
22814 /* Initialize DATA.  */
22815 static void
22816 core2i7_first_cycle_multipass_init (void *_data)
22817 {
22818   ix86_first_cycle_multipass_data_t data
22819     = (ix86_first_cycle_multipass_data_t) _data;
22820
22821   data->ifetch_block_len = 0;
22822   data->ifetch_block_n_insns = 0;
22823   data->ready_try_change = NULL;
22824   data->ready_try_change_size = 0;
22825 }
22826
22827 /* Advancing the cycle; reset ifetch block counts.  */
22828 static void
22829 core2i7_dfa_post_advance_cycle (void)
22830 {
22831   ix86_first_cycle_multipass_data_t data = ix86_first_cycle_multipass_data;
22832
22833   gcc_assert (data->ifetch_block_n_insns <= core2i7_ifetch_block_max_insns);
22834
22835   data->ifetch_block_len = 0;
22836   data->ifetch_block_n_insns = 0;
22837 }
22838
22839 static int min_insn_size (rtx);
22840
22841 /* Filter out insns from ready_try that the core will not be able to issue
22842    on current cycle due to decoder.  */
22843 static void
22844 core2i7_first_cycle_multipass_filter_ready_try
22845 (const_ix86_first_cycle_multipass_data_t data,
22846  char *ready_try, int n_ready, bool first_cycle_insn_p)
22847 {
22848   while (n_ready--)
22849     {
22850       rtx insn;
22851       int insn_size;
22852
22853       if (ready_try[n_ready])
22854         continue;
22855
22856       insn = get_ready_element (n_ready);
22857       insn_size = min_insn_size (insn);
22858
22859       if (/* If this is a too long an insn for a secondary decoder ...  */
22860           (!first_cycle_insn_p
22861            && insn_size > core2i7_secondary_decoder_max_insn_size)
22862           /* ... or it would not fit into the ifetch block ...  */
22863           || data->ifetch_block_len + insn_size > core2i7_ifetch_block_size
22864           /* ... or the decoder is full already ...  */
22865           || data->ifetch_block_n_insns + 1 > core2i7_ifetch_block_max_insns)
22866         /* ... mask the insn out.  */
22867         {
22868           ready_try[n_ready] = 1;
22869
22870           if (data->ready_try_change)
22871             SET_BIT (data->ready_try_change, n_ready);
22872         }
22873     }
22874 }
22875
22876 /* Prepare for a new round of multipass lookahead scheduling.  */
22877 static void
22878 core2i7_first_cycle_multipass_begin (void *_data, char *ready_try, int n_ready,
22879                                      bool first_cycle_insn_p)
22880 {
22881   ix86_first_cycle_multipass_data_t data
22882     = (ix86_first_cycle_multipass_data_t) _data;
22883   const_ix86_first_cycle_multipass_data_t prev_data
22884     = ix86_first_cycle_multipass_data;
22885
22886   /* Restore the state from the end of the previous round.  */
22887   data->ifetch_block_len = prev_data->ifetch_block_len;
22888   data->ifetch_block_n_insns = prev_data->ifetch_block_n_insns;
22889
22890   /* Filter instructions that cannot be issued on current cycle due to
22891      decoder restrictions.  */
22892   core2i7_first_cycle_multipass_filter_ready_try (data, ready_try, n_ready,
22893                                                   first_cycle_insn_p);
22894 }
22895
22896 /* INSN is being issued in current solution.  Account for its impact on
22897    the decoder model.  */
22898 static void
22899 core2i7_first_cycle_multipass_issue (void *_data, char *ready_try, int n_ready,
22900                                      rtx insn, const void *_prev_data)
22901 {
22902   ix86_first_cycle_multipass_data_t data
22903     = (ix86_first_cycle_multipass_data_t) _data;
22904   const_ix86_first_cycle_multipass_data_t prev_data
22905     = (const_ix86_first_cycle_multipass_data_t) _prev_data;
22906
22907   int insn_size = min_insn_size (insn);
22908
22909   data->ifetch_block_len = prev_data->ifetch_block_len + insn_size;
22910   data->ifetch_block_n_insns = prev_data->ifetch_block_n_insns + 1;
22911   gcc_assert (data->ifetch_block_len <= core2i7_ifetch_block_size
22912               && data->ifetch_block_n_insns <= core2i7_ifetch_block_max_insns);
22913
22914   /* Allocate or resize the bitmap for storing INSN's effect on ready_try.  */
22915   if (!data->ready_try_change)
22916     {
22917       data->ready_try_change = sbitmap_alloc (n_ready);
22918       data->ready_try_change_size = n_ready;
22919     }
22920   else if (data->ready_try_change_size < n_ready)
22921     {
22922       data->ready_try_change = sbitmap_resize (data->ready_try_change,
22923                                                n_ready, 0);
22924       data->ready_try_change_size = n_ready;
22925     }
22926   sbitmap_zero (data->ready_try_change);
22927
22928   /* Filter out insns from ready_try that the core will not be able to issue
22929      on current cycle due to decoder.  */
22930   core2i7_first_cycle_multipass_filter_ready_try (data, ready_try, n_ready,
22931                                                   false);
22932 }
22933
22934 /* Revert the effect on ready_try.  */
22935 static void
22936 core2i7_first_cycle_multipass_backtrack (const void *_data,
22937                                          char *ready_try,
22938                                          int n_ready ATTRIBUTE_UNUSED)
22939 {
22940   const_ix86_first_cycle_multipass_data_t data
22941     = (const_ix86_first_cycle_multipass_data_t) _data;
22942   unsigned int i = 0;
22943   sbitmap_iterator sbi;
22944
22945   gcc_assert (sbitmap_last_set_bit (data->ready_try_change) < n_ready);
22946   EXECUTE_IF_SET_IN_SBITMAP (data->ready_try_change, 0, i, sbi)
22947     {
22948       ready_try[i] = 0;
22949     }
22950 }
22951
22952 /* Save the result of multipass lookahead scheduling for the next round.  */
22953 static void
22954 core2i7_first_cycle_multipass_end (const void *_data)
22955 {
22956   const_ix86_first_cycle_multipass_data_t data
22957     = (const_ix86_first_cycle_multipass_data_t) _data;
22958   ix86_first_cycle_multipass_data_t next_data
22959     = ix86_first_cycle_multipass_data;
22960
22961   if (data != NULL)
22962     {
22963       next_data->ifetch_block_len = data->ifetch_block_len;
22964       next_data->ifetch_block_n_insns = data->ifetch_block_n_insns;
22965     }
22966 }
22967
22968 /* Deallocate target data.  */
22969 static void
22970 core2i7_first_cycle_multipass_fini (void *_data)
22971 {
22972   ix86_first_cycle_multipass_data_t data
22973     = (ix86_first_cycle_multipass_data_t) _data;
22974
22975   if (data->ready_try_change)
22976     {
22977       sbitmap_free (data->ready_try_change);
22978       data->ready_try_change = NULL;
22979       data->ready_try_change_size = 0;
22980     }
22981 }
22982
22983 /* Prepare for scheduling pass.  */
22984 static void
22985 ix86_sched_init_global (FILE *dump ATTRIBUTE_UNUSED,
22986                         int verbose ATTRIBUTE_UNUSED,
22987                         int max_uid ATTRIBUTE_UNUSED)
22988 {
22989   /* Install scheduling hooks for current CPU.  Some of these hooks are used
22990      in time-critical parts of the scheduler, so we only set them up when
22991      they are actually used.  */
22992   switch (ix86_tune)
22993     {
22994     case PROCESSOR_CORE2_32:
22995     case PROCESSOR_CORE2_64:
22996     case PROCESSOR_COREI7_32:
22997     case PROCESSOR_COREI7_64:
22998       targetm.sched.dfa_post_advance_cycle
22999         = core2i7_dfa_post_advance_cycle;
23000       targetm.sched.first_cycle_multipass_init
23001         = core2i7_first_cycle_multipass_init;
23002       targetm.sched.first_cycle_multipass_begin
23003         = core2i7_first_cycle_multipass_begin;
23004       targetm.sched.first_cycle_multipass_issue
23005         = core2i7_first_cycle_multipass_issue;
23006       targetm.sched.first_cycle_multipass_backtrack
23007         = core2i7_first_cycle_multipass_backtrack;
23008       targetm.sched.first_cycle_multipass_end
23009         = core2i7_first_cycle_multipass_end;
23010       targetm.sched.first_cycle_multipass_fini
23011         = core2i7_first_cycle_multipass_fini;
23012
23013       /* Set decoder parameters.  */
23014       core2i7_secondary_decoder_max_insn_size = 8;
23015       core2i7_ifetch_block_size = 16;
23016       core2i7_ifetch_block_max_insns = 6;
23017       break;
23018
23019     default:
23020       targetm.sched.dfa_post_advance_cycle = NULL;
23021       targetm.sched.first_cycle_multipass_init = NULL;
23022       targetm.sched.first_cycle_multipass_begin = NULL;
23023       targetm.sched.first_cycle_multipass_issue = NULL;
23024       targetm.sched.first_cycle_multipass_backtrack = NULL;
23025       targetm.sched.first_cycle_multipass_end = NULL;
23026       targetm.sched.first_cycle_multipass_fini = NULL;
23027       break;
23028     }
23029 }
23030
23031 \f
23032 /* Compute the alignment given to a constant that is being placed in memory.
23033    EXP is the constant and ALIGN is the alignment that the object would
23034    ordinarily have.
23035    The value of this function is used instead of that alignment to align
23036    the object.  */
23037
23038 int
23039 ix86_constant_alignment (tree exp, int align)
23040 {
23041   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
23042       || TREE_CODE (exp) == INTEGER_CST)
23043     {
23044       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
23045         return 64;
23046       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
23047         return 128;
23048     }
23049   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
23050            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
23051     return BITS_PER_WORD;
23052
23053   return align;
23054 }
23055
23056 /* Compute the alignment for a static variable.
23057    TYPE is the data type, and ALIGN is the alignment that
23058    the object would ordinarily have.  The value of this function is used
23059    instead of that alignment to align the object.  */
23060
23061 int
23062 ix86_data_alignment (tree type, int align)
23063 {
23064   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
23065
23066   if (AGGREGATE_TYPE_P (type)
23067       && TYPE_SIZE (type)
23068       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23069       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
23070           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
23071       && align < max_align)
23072     align = max_align;
23073
23074   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
23075      to 16byte boundary.  */
23076   if (TARGET_64BIT)
23077     {
23078       if (AGGREGATE_TYPE_P (type)
23079            && TYPE_SIZE (type)
23080            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23081            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
23082                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
23083         return 128;
23084     }
23085
23086   if (TREE_CODE (type) == ARRAY_TYPE)
23087     {
23088       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
23089         return 64;
23090       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
23091         return 128;
23092     }
23093   else if (TREE_CODE (type) == COMPLEX_TYPE)
23094     {
23095
23096       if (TYPE_MODE (type) == DCmode && align < 64)
23097         return 64;
23098       if ((TYPE_MODE (type) == XCmode
23099            || TYPE_MODE (type) == TCmode) && align < 128)
23100         return 128;
23101     }
23102   else if ((TREE_CODE (type) == RECORD_TYPE
23103             || TREE_CODE (type) == UNION_TYPE
23104             || TREE_CODE (type) == QUAL_UNION_TYPE)
23105            && TYPE_FIELDS (type))
23106     {
23107       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
23108         return 64;
23109       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
23110         return 128;
23111     }
23112   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
23113            || TREE_CODE (type) == INTEGER_TYPE)
23114     {
23115       if (TYPE_MODE (type) == DFmode && align < 64)
23116         return 64;
23117       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
23118         return 128;
23119     }
23120
23121   return align;
23122 }
23123
23124 /* Compute the alignment for a local variable or a stack slot.  EXP is
23125    the data type or decl itself, MODE is the widest mode available and
23126    ALIGN is the alignment that the object would ordinarily have.  The
23127    value of this macro is used instead of that alignment to align the
23128    object.  */
23129
23130 unsigned int
23131 ix86_local_alignment (tree exp, enum machine_mode mode,
23132                       unsigned int align)
23133 {
23134   tree type, decl;
23135
23136   if (exp && DECL_P (exp))
23137     {
23138       type = TREE_TYPE (exp);
23139       decl = exp;
23140     }
23141   else
23142     {
23143       type = exp;
23144       decl = NULL;
23145     }
23146
23147   /* Don't do dynamic stack realignment for long long objects with
23148      -mpreferred-stack-boundary=2.  */
23149   if (!TARGET_64BIT
23150       && align == 64
23151       && ix86_preferred_stack_boundary < 64
23152       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
23153       && (!type || !TYPE_USER_ALIGN (type))
23154       && (!decl || !DECL_USER_ALIGN (decl)))
23155     align = 32;
23156
23157   /* If TYPE is NULL, we are allocating a stack slot for caller-save
23158      register in MODE.  We will return the largest alignment of XF
23159      and DF.  */
23160   if (!type)
23161     {
23162       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
23163         align = GET_MODE_ALIGNMENT (DFmode);
23164       return align;
23165     }
23166
23167   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
23168      to 16byte boundary.  Exact wording is:
23169
23170      An array uses the same alignment as its elements, except that a local or
23171      global array variable of length at least 16 bytes or
23172      a C99 variable-length array variable always has alignment of at least 16 bytes.
23173
23174      This was added to allow use of aligned SSE instructions at arrays.  This
23175      rule is meant for static storage (where compiler can not do the analysis
23176      by itself).  We follow it for automatic variables only when convenient.
23177      We fully control everything in the function compiled and functions from
23178      other unit can not rely on the alignment.
23179
23180      Exclude va_list type.  It is the common case of local array where
23181      we can not benefit from the alignment.  */
23182   if (TARGET_64BIT && optimize_function_for_speed_p (cfun)
23183       && TARGET_SSE)
23184     {
23185       if (AGGREGATE_TYPE_P (type)
23186            && (va_list_type_node == NULL_TREE
23187                || (TYPE_MAIN_VARIANT (type)
23188                    != TYPE_MAIN_VARIANT (va_list_type_node)))
23189            && TYPE_SIZE (type)
23190            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23191            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
23192                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
23193         return 128;
23194     }
23195   if (TREE_CODE (type) == ARRAY_TYPE)
23196     {
23197       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
23198         return 64;
23199       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
23200         return 128;
23201     }
23202   else if (TREE_CODE (type) == COMPLEX_TYPE)
23203     {
23204       if (TYPE_MODE (type) == DCmode && align < 64)
23205         return 64;
23206       if ((TYPE_MODE (type) == XCmode
23207            || TYPE_MODE (type) == TCmode) && align < 128)
23208         return 128;
23209     }
23210   else if ((TREE_CODE (type) == RECORD_TYPE
23211             || TREE_CODE (type) == UNION_TYPE
23212             || TREE_CODE (type) == QUAL_UNION_TYPE)
23213            && TYPE_FIELDS (type))
23214     {
23215       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
23216         return 64;
23217       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
23218         return 128;
23219     }
23220   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
23221            || TREE_CODE (type) == INTEGER_TYPE)
23222     {
23223
23224       if (TYPE_MODE (type) == DFmode && align < 64)
23225         return 64;
23226       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
23227         return 128;
23228     }
23229   return align;
23230 }
23231
23232 /* Compute the minimum required alignment for dynamic stack realignment
23233    purposes for a local variable, parameter or a stack slot.  EXP is
23234    the data type or decl itself, MODE is its mode and ALIGN is the
23235    alignment that the object would ordinarily have.  */
23236
23237 unsigned int
23238 ix86_minimum_alignment (tree exp, enum machine_mode mode,
23239                         unsigned int align)
23240 {
23241   tree type, decl;
23242
23243   if (exp && DECL_P (exp))
23244     {
23245       type = TREE_TYPE (exp);
23246       decl = exp;
23247     }
23248   else
23249     {
23250       type = exp;
23251       decl = NULL;
23252     }
23253
23254   if (TARGET_64BIT || align != 64 || ix86_preferred_stack_boundary >= 64)
23255     return align;
23256
23257   /* Don't do dynamic stack realignment for long long objects with
23258      -mpreferred-stack-boundary=2.  */
23259   if ((mode == DImode || (type && TYPE_MODE (type) == DImode))
23260       && (!type || !TYPE_USER_ALIGN (type))
23261       && (!decl || !DECL_USER_ALIGN (decl)))
23262     return 32;
23263
23264   return align;
23265 }
23266 \f
23267 /* Find a location for the static chain incoming to a nested function.
23268    This is a register, unless all free registers are used by arguments.  */
23269
23270 static rtx
23271 ix86_static_chain (const_tree fndecl, bool incoming_p)
23272 {
23273   unsigned regno;
23274
23275   if (!DECL_STATIC_CHAIN (fndecl))
23276     return NULL;
23277
23278   if (TARGET_64BIT)
23279     {
23280       /* We always use R10 in 64-bit mode.  */
23281       regno = R10_REG;
23282     }
23283   else
23284     {
23285       tree fntype;
23286       /* By default in 32-bit mode we use ECX to pass the static chain.  */
23287       regno = CX_REG;
23288
23289       fntype = TREE_TYPE (fndecl);
23290       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
23291         {
23292           /* Fastcall functions use ecx/edx for arguments, which leaves
23293              us with EAX for the static chain.  */
23294           regno = AX_REG;
23295         }
23296       else if (ix86_is_type_thiscall (fntype))
23297         {
23298           /* Thiscall functions use ecx for arguments, which leaves
23299              us with EAX for the static chain.  */
23300           regno = AX_REG;
23301         }
23302       else if (ix86_function_regparm (fntype, fndecl) == 3)
23303         {
23304           /* For regparm 3, we have no free call-clobbered registers in
23305              which to store the static chain.  In order to implement this,
23306              we have the trampoline push the static chain to the stack.
23307              However, we can't push a value below the return address when
23308              we call the nested function directly, so we have to use an
23309              alternate entry point.  For this we use ESI, and have the
23310              alternate entry point push ESI, so that things appear the
23311              same once we're executing the nested function.  */
23312           if (incoming_p)
23313             {
23314               if (fndecl == current_function_decl)
23315                 ix86_static_chain_on_stack = true;
23316               return gen_frame_mem (SImode,
23317                                     plus_constant (arg_pointer_rtx, -8));
23318             }
23319           regno = SI_REG;
23320         }
23321     }
23322
23323   return gen_rtx_REG (Pmode, regno);
23324 }
23325
23326 /* Emit RTL insns to initialize the variable parts of a trampoline.
23327    FNDECL is the decl of the target address; M_TRAMP is a MEM for
23328    the trampoline, and CHAIN_VALUE is an RTX for the static chain
23329    to be passed to the target function.  */
23330
23331 static void
23332 ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
23333 {
23334   rtx mem, fnaddr;
23335
23336   fnaddr = XEXP (DECL_RTL (fndecl), 0);
23337
23338   if (!TARGET_64BIT)
23339     {
23340       rtx disp, chain;
23341       int opcode;
23342
23343       /* Depending on the static chain location, either load a register
23344          with a constant, or push the constant to the stack.  All of the
23345          instructions are the same size.  */
23346       chain = ix86_static_chain (fndecl, true);
23347       if (REG_P (chain))
23348         {
23349           if (REGNO (chain) == CX_REG)
23350             opcode = 0xb9;
23351           else if (REGNO (chain) == AX_REG)
23352             opcode = 0xb8;
23353           else
23354             gcc_unreachable ();
23355         }
23356       else
23357         opcode = 0x68;
23358
23359       mem = adjust_address (m_tramp, QImode, 0);
23360       emit_move_insn (mem, gen_int_mode (opcode, QImode));
23361
23362       mem = adjust_address (m_tramp, SImode, 1);
23363       emit_move_insn (mem, chain_value);
23364
23365       /* Compute offset from the end of the jmp to the target function.
23366          In the case in which the trampoline stores the static chain on
23367          the stack, we need to skip the first insn which pushes the
23368          (call-saved) register static chain; this push is 1 byte.  */
23369       disp = expand_binop (SImode, sub_optab, fnaddr,
23370                            plus_constant (XEXP (m_tramp, 0),
23371                                           MEM_P (chain) ? 9 : 10),
23372                            NULL_RTX, 1, OPTAB_DIRECT);
23373
23374       mem = adjust_address (m_tramp, QImode, 5);
23375       emit_move_insn (mem, gen_int_mode (0xe9, QImode));
23376
23377       mem = adjust_address (m_tramp, SImode, 6);
23378       emit_move_insn (mem, disp);
23379     }
23380   else
23381     {
23382       int offset = 0;
23383
23384       /* Load the function address to r11.  Try to load address using
23385          the shorter movl instead of movabs.  We may want to support
23386          movq for kernel mode, but kernel does not use trampolines at
23387          the moment.  */
23388       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
23389         {
23390           fnaddr = copy_to_mode_reg (DImode, fnaddr);
23391
23392           mem = adjust_address (m_tramp, HImode, offset);
23393           emit_move_insn (mem, gen_int_mode (0xbb41, HImode));
23394
23395           mem = adjust_address (m_tramp, SImode, offset + 2);
23396           emit_move_insn (mem, gen_lowpart (SImode, fnaddr));
23397           offset += 6;
23398         }
23399       else
23400         {
23401           mem = adjust_address (m_tramp, HImode, offset);
23402           emit_move_insn (mem, gen_int_mode (0xbb49, HImode));
23403
23404           mem = adjust_address (m_tramp, DImode, offset + 2);
23405           emit_move_insn (mem, fnaddr);
23406           offset += 10;
23407         }
23408
23409       /* Load static chain using movabs to r10.  */
23410       mem = adjust_address (m_tramp, HImode, offset);
23411       emit_move_insn (mem, gen_int_mode (0xba49, HImode));
23412
23413       mem = adjust_address (m_tramp, DImode, offset + 2);
23414       emit_move_insn (mem, chain_value);
23415       offset += 10;
23416
23417       /* Jump to r11; the last (unused) byte is a nop, only there to
23418          pad the write out to a single 32-bit store.  */
23419       mem = adjust_address (m_tramp, SImode, offset);
23420       emit_move_insn (mem, gen_int_mode (0x90e3ff49, SImode));
23421       offset += 4;
23422
23423       gcc_assert (offset <= TRAMPOLINE_SIZE);
23424     }
23425
23426 #ifdef ENABLE_EXECUTE_STACK
23427 #ifdef CHECK_EXECUTE_STACK_ENABLED
23428   if (CHECK_EXECUTE_STACK_ENABLED)
23429 #endif
23430   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
23431                      LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
23432 #endif
23433 }
23434 \f
23435 /* The following file contains several enumerations and data structures
23436    built from the definitions in i386-builtin-types.def.  */
23437
23438 #include "i386-builtin-types.inc"
23439
23440 /* Table for the ix86 builtin non-function types.  */
23441 static GTY(()) tree ix86_builtin_type_tab[(int) IX86_BT_LAST_CPTR + 1];
23442
23443 /* Retrieve an element from the above table, building some of
23444    the types lazily.  */
23445
23446 static tree
23447 ix86_get_builtin_type (enum ix86_builtin_type tcode)
23448 {
23449   unsigned int index;
23450   tree type, itype;
23451
23452   gcc_assert ((unsigned)tcode < ARRAY_SIZE(ix86_builtin_type_tab));
23453
23454   type = ix86_builtin_type_tab[(int) tcode];
23455   if (type != NULL)
23456     return type;
23457
23458   gcc_assert (tcode > IX86_BT_LAST_PRIM);
23459   if (tcode <= IX86_BT_LAST_VECT)
23460     {
23461       enum machine_mode mode;
23462
23463       index = tcode - IX86_BT_LAST_PRIM - 1;
23464       itype = ix86_get_builtin_type (ix86_builtin_type_vect_base[index]);
23465       mode = ix86_builtin_type_vect_mode[index];
23466
23467       type = build_vector_type_for_mode (itype, mode);
23468     }
23469   else
23470     {
23471       int quals;
23472
23473       index = tcode - IX86_BT_LAST_VECT - 1;
23474       if (tcode <= IX86_BT_LAST_PTR)
23475         quals = TYPE_UNQUALIFIED;
23476       else
23477         quals = TYPE_QUAL_CONST;
23478
23479       itype = ix86_get_builtin_type (ix86_builtin_type_ptr_base[index]);
23480       if (quals != TYPE_UNQUALIFIED)
23481         itype = build_qualified_type (itype, quals);
23482
23483       type = build_pointer_type (itype);
23484     }
23485
23486   ix86_builtin_type_tab[(int) tcode] = type;
23487   return type;
23488 }
23489
23490 /* Table for the ix86 builtin function types.  */
23491 static GTY(()) tree ix86_builtin_func_type_tab[(int) IX86_BT_LAST_ALIAS + 1];
23492
23493 /* Retrieve an element from the above table, building some of
23494    the types lazily.  */
23495
23496 static tree
23497 ix86_get_builtin_func_type (enum ix86_builtin_func_type tcode)
23498 {
23499   tree type;
23500
23501   gcc_assert ((unsigned)tcode < ARRAY_SIZE (ix86_builtin_func_type_tab));
23502
23503   type = ix86_builtin_func_type_tab[(int) tcode];
23504   if (type != NULL)
23505     return type;
23506
23507   if (tcode <= IX86_BT_LAST_FUNC)
23508     {
23509       unsigned start = ix86_builtin_func_start[(int) tcode];
23510       unsigned after = ix86_builtin_func_start[(int) tcode + 1];
23511       tree rtype, atype, args = void_list_node;
23512       unsigned i;
23513
23514       rtype = ix86_get_builtin_type (ix86_builtin_func_args[start]);
23515       for (i = after - 1; i > start; --i)
23516         {
23517           atype = ix86_get_builtin_type (ix86_builtin_func_args[i]);
23518           args = tree_cons (NULL, atype, args);
23519         }
23520
23521       type = build_function_type (rtype, args);
23522     }
23523   else
23524     {
23525       unsigned index = tcode - IX86_BT_LAST_FUNC - 1;
23526       enum ix86_builtin_func_type icode;
23527
23528       icode = ix86_builtin_func_alias_base[index];
23529       type = ix86_get_builtin_func_type (icode);
23530     }
23531
23532   ix86_builtin_func_type_tab[(int) tcode] = type;
23533   return type;
23534 }
23535
23536
23537 /* Codes for all the SSE/MMX builtins.  */
23538 enum ix86_builtins
23539 {
23540   IX86_BUILTIN_ADDPS,
23541   IX86_BUILTIN_ADDSS,
23542   IX86_BUILTIN_DIVPS,
23543   IX86_BUILTIN_DIVSS,
23544   IX86_BUILTIN_MULPS,
23545   IX86_BUILTIN_MULSS,
23546   IX86_BUILTIN_SUBPS,
23547   IX86_BUILTIN_SUBSS,
23548
23549   IX86_BUILTIN_CMPEQPS,
23550   IX86_BUILTIN_CMPLTPS,
23551   IX86_BUILTIN_CMPLEPS,
23552   IX86_BUILTIN_CMPGTPS,
23553   IX86_BUILTIN_CMPGEPS,
23554   IX86_BUILTIN_CMPNEQPS,
23555   IX86_BUILTIN_CMPNLTPS,
23556   IX86_BUILTIN_CMPNLEPS,
23557   IX86_BUILTIN_CMPNGTPS,
23558   IX86_BUILTIN_CMPNGEPS,
23559   IX86_BUILTIN_CMPORDPS,
23560   IX86_BUILTIN_CMPUNORDPS,
23561   IX86_BUILTIN_CMPEQSS,
23562   IX86_BUILTIN_CMPLTSS,
23563   IX86_BUILTIN_CMPLESS,
23564   IX86_BUILTIN_CMPNEQSS,
23565   IX86_BUILTIN_CMPNLTSS,
23566   IX86_BUILTIN_CMPNLESS,
23567   IX86_BUILTIN_CMPNGTSS,
23568   IX86_BUILTIN_CMPNGESS,
23569   IX86_BUILTIN_CMPORDSS,
23570   IX86_BUILTIN_CMPUNORDSS,
23571
23572   IX86_BUILTIN_COMIEQSS,
23573   IX86_BUILTIN_COMILTSS,
23574   IX86_BUILTIN_COMILESS,
23575   IX86_BUILTIN_COMIGTSS,
23576   IX86_BUILTIN_COMIGESS,
23577   IX86_BUILTIN_COMINEQSS,
23578   IX86_BUILTIN_UCOMIEQSS,
23579   IX86_BUILTIN_UCOMILTSS,
23580   IX86_BUILTIN_UCOMILESS,
23581   IX86_BUILTIN_UCOMIGTSS,
23582   IX86_BUILTIN_UCOMIGESS,
23583   IX86_BUILTIN_UCOMINEQSS,
23584
23585   IX86_BUILTIN_CVTPI2PS,
23586   IX86_BUILTIN_CVTPS2PI,
23587   IX86_BUILTIN_CVTSI2SS,
23588   IX86_BUILTIN_CVTSI642SS,
23589   IX86_BUILTIN_CVTSS2SI,
23590   IX86_BUILTIN_CVTSS2SI64,
23591   IX86_BUILTIN_CVTTPS2PI,
23592   IX86_BUILTIN_CVTTSS2SI,
23593   IX86_BUILTIN_CVTTSS2SI64,
23594
23595   IX86_BUILTIN_MAXPS,
23596   IX86_BUILTIN_MAXSS,
23597   IX86_BUILTIN_MINPS,
23598   IX86_BUILTIN_MINSS,
23599
23600   IX86_BUILTIN_LOADUPS,
23601   IX86_BUILTIN_STOREUPS,
23602   IX86_BUILTIN_MOVSS,
23603
23604   IX86_BUILTIN_MOVHLPS,
23605   IX86_BUILTIN_MOVLHPS,
23606   IX86_BUILTIN_LOADHPS,
23607   IX86_BUILTIN_LOADLPS,
23608   IX86_BUILTIN_STOREHPS,
23609   IX86_BUILTIN_STORELPS,
23610
23611   IX86_BUILTIN_MASKMOVQ,
23612   IX86_BUILTIN_MOVMSKPS,
23613   IX86_BUILTIN_PMOVMSKB,
23614
23615   IX86_BUILTIN_MOVNTPS,
23616   IX86_BUILTIN_MOVNTQ,
23617
23618   IX86_BUILTIN_LOADDQU,
23619   IX86_BUILTIN_STOREDQU,
23620
23621   IX86_BUILTIN_PACKSSWB,
23622   IX86_BUILTIN_PACKSSDW,
23623   IX86_BUILTIN_PACKUSWB,
23624
23625   IX86_BUILTIN_PADDB,
23626   IX86_BUILTIN_PADDW,
23627   IX86_BUILTIN_PADDD,
23628   IX86_BUILTIN_PADDQ,
23629   IX86_BUILTIN_PADDSB,
23630   IX86_BUILTIN_PADDSW,
23631   IX86_BUILTIN_PADDUSB,
23632   IX86_BUILTIN_PADDUSW,
23633   IX86_BUILTIN_PSUBB,
23634   IX86_BUILTIN_PSUBW,
23635   IX86_BUILTIN_PSUBD,
23636   IX86_BUILTIN_PSUBQ,
23637   IX86_BUILTIN_PSUBSB,
23638   IX86_BUILTIN_PSUBSW,
23639   IX86_BUILTIN_PSUBUSB,
23640   IX86_BUILTIN_PSUBUSW,
23641
23642   IX86_BUILTIN_PAND,
23643   IX86_BUILTIN_PANDN,
23644   IX86_BUILTIN_POR,
23645   IX86_BUILTIN_PXOR,
23646
23647   IX86_BUILTIN_PAVGB,
23648   IX86_BUILTIN_PAVGW,
23649
23650   IX86_BUILTIN_PCMPEQB,
23651   IX86_BUILTIN_PCMPEQW,
23652   IX86_BUILTIN_PCMPEQD,
23653   IX86_BUILTIN_PCMPGTB,
23654   IX86_BUILTIN_PCMPGTW,
23655   IX86_BUILTIN_PCMPGTD,
23656
23657   IX86_BUILTIN_PMADDWD,
23658
23659   IX86_BUILTIN_PMAXSW,
23660   IX86_BUILTIN_PMAXUB,
23661   IX86_BUILTIN_PMINSW,
23662   IX86_BUILTIN_PMINUB,
23663
23664   IX86_BUILTIN_PMULHUW,
23665   IX86_BUILTIN_PMULHW,
23666   IX86_BUILTIN_PMULLW,
23667
23668   IX86_BUILTIN_PSADBW,
23669   IX86_BUILTIN_PSHUFW,
23670
23671   IX86_BUILTIN_PSLLW,
23672   IX86_BUILTIN_PSLLD,
23673   IX86_BUILTIN_PSLLQ,
23674   IX86_BUILTIN_PSRAW,
23675   IX86_BUILTIN_PSRAD,
23676   IX86_BUILTIN_PSRLW,
23677   IX86_BUILTIN_PSRLD,
23678   IX86_BUILTIN_PSRLQ,
23679   IX86_BUILTIN_PSLLWI,
23680   IX86_BUILTIN_PSLLDI,
23681   IX86_BUILTIN_PSLLQI,
23682   IX86_BUILTIN_PSRAWI,
23683   IX86_BUILTIN_PSRADI,
23684   IX86_BUILTIN_PSRLWI,
23685   IX86_BUILTIN_PSRLDI,
23686   IX86_BUILTIN_PSRLQI,
23687
23688   IX86_BUILTIN_PUNPCKHBW,
23689   IX86_BUILTIN_PUNPCKHWD,
23690   IX86_BUILTIN_PUNPCKHDQ,
23691   IX86_BUILTIN_PUNPCKLBW,
23692   IX86_BUILTIN_PUNPCKLWD,
23693   IX86_BUILTIN_PUNPCKLDQ,
23694
23695   IX86_BUILTIN_SHUFPS,
23696
23697   IX86_BUILTIN_RCPPS,
23698   IX86_BUILTIN_RCPSS,
23699   IX86_BUILTIN_RSQRTPS,
23700   IX86_BUILTIN_RSQRTPS_NR,
23701   IX86_BUILTIN_RSQRTSS,
23702   IX86_BUILTIN_RSQRTF,
23703   IX86_BUILTIN_SQRTPS,
23704   IX86_BUILTIN_SQRTPS_NR,
23705   IX86_BUILTIN_SQRTSS,
23706
23707   IX86_BUILTIN_UNPCKHPS,
23708   IX86_BUILTIN_UNPCKLPS,
23709
23710   IX86_BUILTIN_ANDPS,
23711   IX86_BUILTIN_ANDNPS,
23712   IX86_BUILTIN_ORPS,
23713   IX86_BUILTIN_XORPS,
23714
23715   IX86_BUILTIN_EMMS,
23716   IX86_BUILTIN_LDMXCSR,
23717   IX86_BUILTIN_STMXCSR,
23718   IX86_BUILTIN_SFENCE,
23719
23720   /* 3DNow! Original */
23721   IX86_BUILTIN_FEMMS,
23722   IX86_BUILTIN_PAVGUSB,
23723   IX86_BUILTIN_PF2ID,
23724   IX86_BUILTIN_PFACC,
23725   IX86_BUILTIN_PFADD,
23726   IX86_BUILTIN_PFCMPEQ,
23727   IX86_BUILTIN_PFCMPGE,
23728   IX86_BUILTIN_PFCMPGT,
23729   IX86_BUILTIN_PFMAX,
23730   IX86_BUILTIN_PFMIN,
23731   IX86_BUILTIN_PFMUL,
23732   IX86_BUILTIN_PFRCP,
23733   IX86_BUILTIN_PFRCPIT1,
23734   IX86_BUILTIN_PFRCPIT2,
23735   IX86_BUILTIN_PFRSQIT1,
23736   IX86_BUILTIN_PFRSQRT,
23737   IX86_BUILTIN_PFSUB,
23738   IX86_BUILTIN_PFSUBR,
23739   IX86_BUILTIN_PI2FD,
23740   IX86_BUILTIN_PMULHRW,
23741
23742   /* 3DNow! Athlon Extensions */
23743   IX86_BUILTIN_PF2IW,
23744   IX86_BUILTIN_PFNACC,
23745   IX86_BUILTIN_PFPNACC,
23746   IX86_BUILTIN_PI2FW,
23747   IX86_BUILTIN_PSWAPDSI,
23748   IX86_BUILTIN_PSWAPDSF,
23749
23750   /* SSE2 */
23751   IX86_BUILTIN_ADDPD,
23752   IX86_BUILTIN_ADDSD,
23753   IX86_BUILTIN_DIVPD,
23754   IX86_BUILTIN_DIVSD,
23755   IX86_BUILTIN_MULPD,
23756   IX86_BUILTIN_MULSD,
23757   IX86_BUILTIN_SUBPD,
23758   IX86_BUILTIN_SUBSD,
23759
23760   IX86_BUILTIN_CMPEQPD,
23761   IX86_BUILTIN_CMPLTPD,
23762   IX86_BUILTIN_CMPLEPD,
23763   IX86_BUILTIN_CMPGTPD,
23764   IX86_BUILTIN_CMPGEPD,
23765   IX86_BUILTIN_CMPNEQPD,
23766   IX86_BUILTIN_CMPNLTPD,
23767   IX86_BUILTIN_CMPNLEPD,
23768   IX86_BUILTIN_CMPNGTPD,
23769   IX86_BUILTIN_CMPNGEPD,
23770   IX86_BUILTIN_CMPORDPD,
23771   IX86_BUILTIN_CMPUNORDPD,
23772   IX86_BUILTIN_CMPEQSD,
23773   IX86_BUILTIN_CMPLTSD,
23774   IX86_BUILTIN_CMPLESD,
23775   IX86_BUILTIN_CMPNEQSD,
23776   IX86_BUILTIN_CMPNLTSD,
23777   IX86_BUILTIN_CMPNLESD,
23778   IX86_BUILTIN_CMPORDSD,
23779   IX86_BUILTIN_CMPUNORDSD,
23780
23781   IX86_BUILTIN_COMIEQSD,
23782   IX86_BUILTIN_COMILTSD,
23783   IX86_BUILTIN_COMILESD,
23784   IX86_BUILTIN_COMIGTSD,
23785   IX86_BUILTIN_COMIGESD,
23786   IX86_BUILTIN_COMINEQSD,
23787   IX86_BUILTIN_UCOMIEQSD,
23788   IX86_BUILTIN_UCOMILTSD,
23789   IX86_BUILTIN_UCOMILESD,
23790   IX86_BUILTIN_UCOMIGTSD,
23791   IX86_BUILTIN_UCOMIGESD,
23792   IX86_BUILTIN_UCOMINEQSD,
23793
23794   IX86_BUILTIN_MAXPD,
23795   IX86_BUILTIN_MAXSD,
23796   IX86_BUILTIN_MINPD,
23797   IX86_BUILTIN_MINSD,
23798
23799   IX86_BUILTIN_ANDPD,
23800   IX86_BUILTIN_ANDNPD,
23801   IX86_BUILTIN_ORPD,
23802   IX86_BUILTIN_XORPD,
23803
23804   IX86_BUILTIN_SQRTPD,
23805   IX86_BUILTIN_SQRTSD,
23806
23807   IX86_BUILTIN_UNPCKHPD,
23808   IX86_BUILTIN_UNPCKLPD,
23809
23810   IX86_BUILTIN_SHUFPD,
23811
23812   IX86_BUILTIN_LOADUPD,
23813   IX86_BUILTIN_STOREUPD,
23814   IX86_BUILTIN_MOVSD,
23815
23816   IX86_BUILTIN_LOADHPD,
23817   IX86_BUILTIN_LOADLPD,
23818
23819   IX86_BUILTIN_CVTDQ2PD,
23820   IX86_BUILTIN_CVTDQ2PS,
23821
23822   IX86_BUILTIN_CVTPD2DQ,
23823   IX86_BUILTIN_CVTPD2PI,
23824   IX86_BUILTIN_CVTPD2PS,
23825   IX86_BUILTIN_CVTTPD2DQ,
23826   IX86_BUILTIN_CVTTPD2PI,
23827
23828   IX86_BUILTIN_CVTPI2PD,
23829   IX86_BUILTIN_CVTSI2SD,
23830   IX86_BUILTIN_CVTSI642SD,
23831
23832   IX86_BUILTIN_CVTSD2SI,
23833   IX86_BUILTIN_CVTSD2SI64,
23834   IX86_BUILTIN_CVTSD2SS,
23835   IX86_BUILTIN_CVTSS2SD,
23836   IX86_BUILTIN_CVTTSD2SI,
23837   IX86_BUILTIN_CVTTSD2SI64,
23838
23839   IX86_BUILTIN_CVTPS2DQ,
23840   IX86_BUILTIN_CVTPS2PD,
23841   IX86_BUILTIN_CVTTPS2DQ,
23842
23843   IX86_BUILTIN_MOVNTI,
23844   IX86_BUILTIN_MOVNTPD,
23845   IX86_BUILTIN_MOVNTDQ,
23846
23847   IX86_BUILTIN_MOVQ128,
23848
23849   /* SSE2 MMX */
23850   IX86_BUILTIN_MASKMOVDQU,
23851   IX86_BUILTIN_MOVMSKPD,
23852   IX86_BUILTIN_PMOVMSKB128,
23853
23854   IX86_BUILTIN_PACKSSWB128,
23855   IX86_BUILTIN_PACKSSDW128,
23856   IX86_BUILTIN_PACKUSWB128,
23857
23858   IX86_BUILTIN_PADDB128,
23859   IX86_BUILTIN_PADDW128,
23860   IX86_BUILTIN_PADDD128,
23861   IX86_BUILTIN_PADDQ128,
23862   IX86_BUILTIN_PADDSB128,
23863   IX86_BUILTIN_PADDSW128,
23864   IX86_BUILTIN_PADDUSB128,
23865   IX86_BUILTIN_PADDUSW128,
23866   IX86_BUILTIN_PSUBB128,
23867   IX86_BUILTIN_PSUBW128,
23868   IX86_BUILTIN_PSUBD128,
23869   IX86_BUILTIN_PSUBQ128,
23870   IX86_BUILTIN_PSUBSB128,
23871   IX86_BUILTIN_PSUBSW128,
23872   IX86_BUILTIN_PSUBUSB128,
23873   IX86_BUILTIN_PSUBUSW128,
23874
23875   IX86_BUILTIN_PAND128,
23876   IX86_BUILTIN_PANDN128,
23877   IX86_BUILTIN_POR128,
23878   IX86_BUILTIN_PXOR128,
23879
23880   IX86_BUILTIN_PAVGB128,
23881   IX86_BUILTIN_PAVGW128,
23882
23883   IX86_BUILTIN_PCMPEQB128,
23884   IX86_BUILTIN_PCMPEQW128,
23885   IX86_BUILTIN_PCMPEQD128,
23886   IX86_BUILTIN_PCMPGTB128,
23887   IX86_BUILTIN_PCMPGTW128,
23888   IX86_BUILTIN_PCMPGTD128,
23889
23890   IX86_BUILTIN_PMADDWD128,
23891
23892   IX86_BUILTIN_PMAXSW128,
23893   IX86_BUILTIN_PMAXUB128,
23894   IX86_BUILTIN_PMINSW128,
23895   IX86_BUILTIN_PMINUB128,
23896
23897   IX86_BUILTIN_PMULUDQ,
23898   IX86_BUILTIN_PMULUDQ128,
23899   IX86_BUILTIN_PMULHUW128,
23900   IX86_BUILTIN_PMULHW128,
23901   IX86_BUILTIN_PMULLW128,
23902
23903   IX86_BUILTIN_PSADBW128,
23904   IX86_BUILTIN_PSHUFHW,
23905   IX86_BUILTIN_PSHUFLW,
23906   IX86_BUILTIN_PSHUFD,
23907
23908   IX86_BUILTIN_PSLLDQI128,
23909   IX86_BUILTIN_PSLLWI128,
23910   IX86_BUILTIN_PSLLDI128,
23911   IX86_BUILTIN_PSLLQI128,
23912   IX86_BUILTIN_PSRAWI128,
23913   IX86_BUILTIN_PSRADI128,
23914   IX86_BUILTIN_PSRLDQI128,
23915   IX86_BUILTIN_PSRLWI128,
23916   IX86_BUILTIN_PSRLDI128,
23917   IX86_BUILTIN_PSRLQI128,
23918
23919   IX86_BUILTIN_PSLLDQ128,
23920   IX86_BUILTIN_PSLLW128,
23921   IX86_BUILTIN_PSLLD128,
23922   IX86_BUILTIN_PSLLQ128,
23923   IX86_BUILTIN_PSRAW128,
23924   IX86_BUILTIN_PSRAD128,
23925   IX86_BUILTIN_PSRLW128,
23926   IX86_BUILTIN_PSRLD128,
23927   IX86_BUILTIN_PSRLQ128,
23928
23929   IX86_BUILTIN_PUNPCKHBW128,
23930   IX86_BUILTIN_PUNPCKHWD128,
23931   IX86_BUILTIN_PUNPCKHDQ128,
23932   IX86_BUILTIN_PUNPCKHQDQ128,
23933   IX86_BUILTIN_PUNPCKLBW128,
23934   IX86_BUILTIN_PUNPCKLWD128,
23935   IX86_BUILTIN_PUNPCKLDQ128,
23936   IX86_BUILTIN_PUNPCKLQDQ128,
23937
23938   IX86_BUILTIN_CLFLUSH,
23939   IX86_BUILTIN_MFENCE,
23940   IX86_BUILTIN_LFENCE,
23941
23942   IX86_BUILTIN_BSRSI,
23943   IX86_BUILTIN_BSRDI,
23944   IX86_BUILTIN_RDPMC,
23945   IX86_BUILTIN_RDTSC,
23946   IX86_BUILTIN_RDTSCP,
23947   IX86_BUILTIN_ROLQI,
23948   IX86_BUILTIN_ROLHI,
23949   IX86_BUILTIN_RORQI,
23950   IX86_BUILTIN_RORHI,
23951
23952   /* SSE3.  */
23953   IX86_BUILTIN_ADDSUBPS,
23954   IX86_BUILTIN_HADDPS,
23955   IX86_BUILTIN_HSUBPS,
23956   IX86_BUILTIN_MOVSHDUP,
23957   IX86_BUILTIN_MOVSLDUP,
23958   IX86_BUILTIN_ADDSUBPD,
23959   IX86_BUILTIN_HADDPD,
23960   IX86_BUILTIN_HSUBPD,
23961   IX86_BUILTIN_LDDQU,
23962
23963   IX86_BUILTIN_MONITOR,
23964   IX86_BUILTIN_MWAIT,
23965
23966   /* SSSE3.  */
23967   IX86_BUILTIN_PHADDW,
23968   IX86_BUILTIN_PHADDD,
23969   IX86_BUILTIN_PHADDSW,
23970   IX86_BUILTIN_PHSUBW,
23971   IX86_BUILTIN_PHSUBD,
23972   IX86_BUILTIN_PHSUBSW,
23973   IX86_BUILTIN_PMADDUBSW,
23974   IX86_BUILTIN_PMULHRSW,
23975   IX86_BUILTIN_PSHUFB,
23976   IX86_BUILTIN_PSIGNB,
23977   IX86_BUILTIN_PSIGNW,
23978   IX86_BUILTIN_PSIGND,
23979   IX86_BUILTIN_PALIGNR,
23980   IX86_BUILTIN_PABSB,
23981   IX86_BUILTIN_PABSW,
23982   IX86_BUILTIN_PABSD,
23983
23984   IX86_BUILTIN_PHADDW128,
23985   IX86_BUILTIN_PHADDD128,
23986   IX86_BUILTIN_PHADDSW128,
23987   IX86_BUILTIN_PHSUBW128,
23988   IX86_BUILTIN_PHSUBD128,
23989   IX86_BUILTIN_PHSUBSW128,
23990   IX86_BUILTIN_PMADDUBSW128,
23991   IX86_BUILTIN_PMULHRSW128,
23992   IX86_BUILTIN_PSHUFB128,
23993   IX86_BUILTIN_PSIGNB128,
23994   IX86_BUILTIN_PSIGNW128,
23995   IX86_BUILTIN_PSIGND128,
23996   IX86_BUILTIN_PALIGNR128,
23997   IX86_BUILTIN_PABSB128,
23998   IX86_BUILTIN_PABSW128,
23999   IX86_BUILTIN_PABSD128,
24000
24001   /* AMDFAM10 - SSE4A New Instructions.  */
24002   IX86_BUILTIN_MOVNTSD,
24003   IX86_BUILTIN_MOVNTSS,
24004   IX86_BUILTIN_EXTRQI,
24005   IX86_BUILTIN_EXTRQ,
24006   IX86_BUILTIN_INSERTQI,
24007   IX86_BUILTIN_INSERTQ,
24008
24009   /* SSE4.1.  */
24010   IX86_BUILTIN_BLENDPD,
24011   IX86_BUILTIN_BLENDPS,
24012   IX86_BUILTIN_BLENDVPD,
24013   IX86_BUILTIN_BLENDVPS,
24014   IX86_BUILTIN_PBLENDVB128,
24015   IX86_BUILTIN_PBLENDW128,
24016
24017   IX86_BUILTIN_DPPD,
24018   IX86_BUILTIN_DPPS,
24019
24020   IX86_BUILTIN_INSERTPS128,
24021
24022   IX86_BUILTIN_MOVNTDQA,
24023   IX86_BUILTIN_MPSADBW128,
24024   IX86_BUILTIN_PACKUSDW128,
24025   IX86_BUILTIN_PCMPEQQ,
24026   IX86_BUILTIN_PHMINPOSUW128,
24027
24028   IX86_BUILTIN_PMAXSB128,
24029   IX86_BUILTIN_PMAXSD128,
24030   IX86_BUILTIN_PMAXUD128,
24031   IX86_BUILTIN_PMAXUW128,
24032
24033   IX86_BUILTIN_PMINSB128,
24034   IX86_BUILTIN_PMINSD128,
24035   IX86_BUILTIN_PMINUD128,
24036   IX86_BUILTIN_PMINUW128,
24037
24038   IX86_BUILTIN_PMOVSXBW128,
24039   IX86_BUILTIN_PMOVSXBD128,
24040   IX86_BUILTIN_PMOVSXBQ128,
24041   IX86_BUILTIN_PMOVSXWD128,
24042   IX86_BUILTIN_PMOVSXWQ128,
24043   IX86_BUILTIN_PMOVSXDQ128,
24044
24045   IX86_BUILTIN_PMOVZXBW128,
24046   IX86_BUILTIN_PMOVZXBD128,
24047   IX86_BUILTIN_PMOVZXBQ128,
24048   IX86_BUILTIN_PMOVZXWD128,
24049   IX86_BUILTIN_PMOVZXWQ128,
24050   IX86_BUILTIN_PMOVZXDQ128,
24051
24052   IX86_BUILTIN_PMULDQ128,
24053   IX86_BUILTIN_PMULLD128,
24054
24055   IX86_BUILTIN_ROUNDPD,
24056   IX86_BUILTIN_ROUNDPS,
24057   IX86_BUILTIN_ROUNDSD,
24058   IX86_BUILTIN_ROUNDSS,
24059
24060   IX86_BUILTIN_FLOORPD,
24061   IX86_BUILTIN_CEILPD,
24062   IX86_BUILTIN_TRUNCPD,
24063   IX86_BUILTIN_RINTPD,
24064   IX86_BUILTIN_FLOORPS,
24065   IX86_BUILTIN_CEILPS,
24066   IX86_BUILTIN_TRUNCPS,
24067   IX86_BUILTIN_RINTPS,
24068
24069   IX86_BUILTIN_PTESTZ,
24070   IX86_BUILTIN_PTESTC,
24071   IX86_BUILTIN_PTESTNZC,
24072
24073   IX86_BUILTIN_VEC_INIT_V2SI,
24074   IX86_BUILTIN_VEC_INIT_V4HI,
24075   IX86_BUILTIN_VEC_INIT_V8QI,
24076   IX86_BUILTIN_VEC_EXT_V2DF,
24077   IX86_BUILTIN_VEC_EXT_V2DI,
24078   IX86_BUILTIN_VEC_EXT_V4SF,
24079   IX86_BUILTIN_VEC_EXT_V4SI,
24080   IX86_BUILTIN_VEC_EXT_V8HI,
24081   IX86_BUILTIN_VEC_EXT_V2SI,
24082   IX86_BUILTIN_VEC_EXT_V4HI,
24083   IX86_BUILTIN_VEC_EXT_V16QI,
24084   IX86_BUILTIN_VEC_SET_V2DI,
24085   IX86_BUILTIN_VEC_SET_V4SF,
24086   IX86_BUILTIN_VEC_SET_V4SI,
24087   IX86_BUILTIN_VEC_SET_V8HI,
24088   IX86_BUILTIN_VEC_SET_V4HI,
24089   IX86_BUILTIN_VEC_SET_V16QI,
24090
24091   IX86_BUILTIN_VEC_PACK_SFIX,
24092
24093   /* SSE4.2.  */
24094   IX86_BUILTIN_CRC32QI,
24095   IX86_BUILTIN_CRC32HI,
24096   IX86_BUILTIN_CRC32SI,
24097   IX86_BUILTIN_CRC32DI,
24098
24099   IX86_BUILTIN_PCMPESTRI128,
24100   IX86_BUILTIN_PCMPESTRM128,
24101   IX86_BUILTIN_PCMPESTRA128,
24102   IX86_BUILTIN_PCMPESTRC128,
24103   IX86_BUILTIN_PCMPESTRO128,
24104   IX86_BUILTIN_PCMPESTRS128,
24105   IX86_BUILTIN_PCMPESTRZ128,
24106   IX86_BUILTIN_PCMPISTRI128,
24107   IX86_BUILTIN_PCMPISTRM128,
24108   IX86_BUILTIN_PCMPISTRA128,
24109   IX86_BUILTIN_PCMPISTRC128,
24110   IX86_BUILTIN_PCMPISTRO128,
24111   IX86_BUILTIN_PCMPISTRS128,
24112   IX86_BUILTIN_PCMPISTRZ128,
24113
24114   IX86_BUILTIN_PCMPGTQ,
24115
24116   /* AES instructions */
24117   IX86_BUILTIN_AESENC128,
24118   IX86_BUILTIN_AESENCLAST128,
24119   IX86_BUILTIN_AESDEC128,
24120   IX86_BUILTIN_AESDECLAST128,
24121   IX86_BUILTIN_AESIMC128,
24122   IX86_BUILTIN_AESKEYGENASSIST128,
24123
24124   /* PCLMUL instruction */
24125   IX86_BUILTIN_PCLMULQDQ128,
24126
24127   /* AVX */
24128   IX86_BUILTIN_ADDPD256,
24129   IX86_BUILTIN_ADDPS256,
24130   IX86_BUILTIN_ADDSUBPD256,
24131   IX86_BUILTIN_ADDSUBPS256,
24132   IX86_BUILTIN_ANDPD256,
24133   IX86_BUILTIN_ANDPS256,
24134   IX86_BUILTIN_ANDNPD256,
24135   IX86_BUILTIN_ANDNPS256,
24136   IX86_BUILTIN_BLENDPD256,
24137   IX86_BUILTIN_BLENDPS256,
24138   IX86_BUILTIN_BLENDVPD256,
24139   IX86_BUILTIN_BLENDVPS256,
24140   IX86_BUILTIN_DIVPD256,
24141   IX86_BUILTIN_DIVPS256,
24142   IX86_BUILTIN_DPPS256,
24143   IX86_BUILTIN_HADDPD256,
24144   IX86_BUILTIN_HADDPS256,
24145   IX86_BUILTIN_HSUBPD256,
24146   IX86_BUILTIN_HSUBPS256,
24147   IX86_BUILTIN_MAXPD256,
24148   IX86_BUILTIN_MAXPS256,
24149   IX86_BUILTIN_MINPD256,
24150   IX86_BUILTIN_MINPS256,
24151   IX86_BUILTIN_MULPD256,
24152   IX86_BUILTIN_MULPS256,
24153   IX86_BUILTIN_ORPD256,
24154   IX86_BUILTIN_ORPS256,
24155   IX86_BUILTIN_SHUFPD256,
24156   IX86_BUILTIN_SHUFPS256,
24157   IX86_BUILTIN_SUBPD256,
24158   IX86_BUILTIN_SUBPS256,
24159   IX86_BUILTIN_XORPD256,
24160   IX86_BUILTIN_XORPS256,
24161   IX86_BUILTIN_CMPSD,
24162   IX86_BUILTIN_CMPSS,
24163   IX86_BUILTIN_CMPPD,
24164   IX86_BUILTIN_CMPPS,
24165   IX86_BUILTIN_CMPPD256,
24166   IX86_BUILTIN_CMPPS256,
24167   IX86_BUILTIN_CVTDQ2PD256,
24168   IX86_BUILTIN_CVTDQ2PS256,
24169   IX86_BUILTIN_CVTPD2PS256,
24170   IX86_BUILTIN_CVTPS2DQ256,
24171   IX86_BUILTIN_CVTPS2PD256,
24172   IX86_BUILTIN_CVTTPD2DQ256,
24173   IX86_BUILTIN_CVTPD2DQ256,
24174   IX86_BUILTIN_CVTTPS2DQ256,
24175   IX86_BUILTIN_EXTRACTF128PD256,
24176   IX86_BUILTIN_EXTRACTF128PS256,
24177   IX86_BUILTIN_EXTRACTF128SI256,
24178   IX86_BUILTIN_VZEROALL,
24179   IX86_BUILTIN_VZEROUPPER,
24180   IX86_BUILTIN_VPERMILVARPD,
24181   IX86_BUILTIN_VPERMILVARPS,
24182   IX86_BUILTIN_VPERMILVARPD256,
24183   IX86_BUILTIN_VPERMILVARPS256,
24184   IX86_BUILTIN_VPERMILPD,
24185   IX86_BUILTIN_VPERMILPS,
24186   IX86_BUILTIN_VPERMILPD256,
24187   IX86_BUILTIN_VPERMILPS256,
24188   IX86_BUILTIN_VPERMIL2PD,
24189   IX86_BUILTIN_VPERMIL2PS,
24190   IX86_BUILTIN_VPERMIL2PD256,
24191   IX86_BUILTIN_VPERMIL2PS256,
24192   IX86_BUILTIN_VPERM2F128PD256,
24193   IX86_BUILTIN_VPERM2F128PS256,
24194   IX86_BUILTIN_VPERM2F128SI256,
24195   IX86_BUILTIN_VBROADCASTSS,
24196   IX86_BUILTIN_VBROADCASTSD256,
24197   IX86_BUILTIN_VBROADCASTSS256,
24198   IX86_BUILTIN_VBROADCASTPD256,
24199   IX86_BUILTIN_VBROADCASTPS256,
24200   IX86_BUILTIN_VINSERTF128PD256,
24201   IX86_BUILTIN_VINSERTF128PS256,
24202   IX86_BUILTIN_VINSERTF128SI256,
24203   IX86_BUILTIN_LOADUPD256,
24204   IX86_BUILTIN_LOADUPS256,
24205   IX86_BUILTIN_STOREUPD256,
24206   IX86_BUILTIN_STOREUPS256,
24207   IX86_BUILTIN_LDDQU256,
24208   IX86_BUILTIN_MOVNTDQ256,
24209   IX86_BUILTIN_MOVNTPD256,
24210   IX86_BUILTIN_MOVNTPS256,
24211   IX86_BUILTIN_LOADDQU256,
24212   IX86_BUILTIN_STOREDQU256,
24213   IX86_BUILTIN_MASKLOADPD,
24214   IX86_BUILTIN_MASKLOADPS,
24215   IX86_BUILTIN_MASKSTOREPD,
24216   IX86_BUILTIN_MASKSTOREPS,
24217   IX86_BUILTIN_MASKLOADPD256,
24218   IX86_BUILTIN_MASKLOADPS256,
24219   IX86_BUILTIN_MASKSTOREPD256,
24220   IX86_BUILTIN_MASKSTOREPS256,
24221   IX86_BUILTIN_MOVSHDUP256,
24222   IX86_BUILTIN_MOVSLDUP256,
24223   IX86_BUILTIN_MOVDDUP256,
24224
24225   IX86_BUILTIN_SQRTPD256,
24226   IX86_BUILTIN_SQRTPS256,
24227   IX86_BUILTIN_SQRTPS_NR256,
24228   IX86_BUILTIN_RSQRTPS256,
24229   IX86_BUILTIN_RSQRTPS_NR256,
24230
24231   IX86_BUILTIN_RCPPS256,
24232
24233   IX86_BUILTIN_ROUNDPD256,
24234   IX86_BUILTIN_ROUNDPS256,
24235
24236   IX86_BUILTIN_FLOORPD256,
24237   IX86_BUILTIN_CEILPD256,
24238   IX86_BUILTIN_TRUNCPD256,
24239   IX86_BUILTIN_RINTPD256,
24240   IX86_BUILTIN_FLOORPS256,
24241   IX86_BUILTIN_CEILPS256,
24242   IX86_BUILTIN_TRUNCPS256,
24243   IX86_BUILTIN_RINTPS256,
24244
24245   IX86_BUILTIN_UNPCKHPD256,
24246   IX86_BUILTIN_UNPCKLPD256,
24247   IX86_BUILTIN_UNPCKHPS256,
24248   IX86_BUILTIN_UNPCKLPS256,
24249
24250   IX86_BUILTIN_SI256_SI,
24251   IX86_BUILTIN_PS256_PS,
24252   IX86_BUILTIN_PD256_PD,
24253   IX86_BUILTIN_SI_SI256,
24254   IX86_BUILTIN_PS_PS256,
24255   IX86_BUILTIN_PD_PD256,
24256
24257   IX86_BUILTIN_VTESTZPD,
24258   IX86_BUILTIN_VTESTCPD,
24259   IX86_BUILTIN_VTESTNZCPD,
24260   IX86_BUILTIN_VTESTZPS,
24261   IX86_BUILTIN_VTESTCPS,
24262   IX86_BUILTIN_VTESTNZCPS,
24263   IX86_BUILTIN_VTESTZPD256,
24264   IX86_BUILTIN_VTESTCPD256,
24265   IX86_BUILTIN_VTESTNZCPD256,
24266   IX86_BUILTIN_VTESTZPS256,
24267   IX86_BUILTIN_VTESTCPS256,
24268   IX86_BUILTIN_VTESTNZCPS256,
24269   IX86_BUILTIN_PTESTZ256,
24270   IX86_BUILTIN_PTESTC256,
24271   IX86_BUILTIN_PTESTNZC256,
24272
24273   IX86_BUILTIN_MOVMSKPD256,
24274   IX86_BUILTIN_MOVMSKPS256,
24275
24276   /* TFmode support builtins.  */
24277   IX86_BUILTIN_INFQ,
24278   IX86_BUILTIN_HUGE_VALQ,
24279   IX86_BUILTIN_FABSQ,
24280   IX86_BUILTIN_COPYSIGNQ,
24281
24282   /* Vectorizer support builtins.  */
24283   IX86_BUILTIN_CPYSGNPS,
24284   IX86_BUILTIN_CPYSGNPD,
24285   IX86_BUILTIN_CPYSGNPS256,
24286   IX86_BUILTIN_CPYSGNPD256,
24287
24288   IX86_BUILTIN_CVTUDQ2PS,
24289
24290   IX86_BUILTIN_VEC_PERM_V2DF,
24291   IX86_BUILTIN_VEC_PERM_V4SF,
24292   IX86_BUILTIN_VEC_PERM_V2DI,
24293   IX86_BUILTIN_VEC_PERM_V4SI,
24294   IX86_BUILTIN_VEC_PERM_V8HI,
24295   IX86_BUILTIN_VEC_PERM_V16QI,
24296   IX86_BUILTIN_VEC_PERM_V2DI_U,
24297   IX86_BUILTIN_VEC_PERM_V4SI_U,
24298   IX86_BUILTIN_VEC_PERM_V8HI_U,
24299   IX86_BUILTIN_VEC_PERM_V16QI_U,
24300   IX86_BUILTIN_VEC_PERM_V4DF,
24301   IX86_BUILTIN_VEC_PERM_V8SF,
24302
24303   /* FMA4 and XOP instructions.  */
24304   IX86_BUILTIN_VFMADDSS,
24305   IX86_BUILTIN_VFMADDSD,
24306   IX86_BUILTIN_VFMADDPS,
24307   IX86_BUILTIN_VFMADDPD,
24308   IX86_BUILTIN_VFMADDPS256,
24309   IX86_BUILTIN_VFMADDPD256,
24310   IX86_BUILTIN_VFMADDSUBPS,
24311   IX86_BUILTIN_VFMADDSUBPD,
24312   IX86_BUILTIN_VFMADDSUBPS256,
24313   IX86_BUILTIN_VFMADDSUBPD256,
24314
24315   IX86_BUILTIN_VPCMOV,
24316   IX86_BUILTIN_VPCMOV_V2DI,
24317   IX86_BUILTIN_VPCMOV_V4SI,
24318   IX86_BUILTIN_VPCMOV_V8HI,
24319   IX86_BUILTIN_VPCMOV_V16QI,
24320   IX86_BUILTIN_VPCMOV_V4SF,
24321   IX86_BUILTIN_VPCMOV_V2DF,
24322   IX86_BUILTIN_VPCMOV256,
24323   IX86_BUILTIN_VPCMOV_V4DI256,
24324   IX86_BUILTIN_VPCMOV_V8SI256,
24325   IX86_BUILTIN_VPCMOV_V16HI256,
24326   IX86_BUILTIN_VPCMOV_V32QI256,
24327   IX86_BUILTIN_VPCMOV_V8SF256,
24328   IX86_BUILTIN_VPCMOV_V4DF256,
24329
24330   IX86_BUILTIN_VPPERM,
24331
24332   IX86_BUILTIN_VPMACSSWW,
24333   IX86_BUILTIN_VPMACSWW,
24334   IX86_BUILTIN_VPMACSSWD,
24335   IX86_BUILTIN_VPMACSWD,
24336   IX86_BUILTIN_VPMACSSDD,
24337   IX86_BUILTIN_VPMACSDD,
24338   IX86_BUILTIN_VPMACSSDQL,
24339   IX86_BUILTIN_VPMACSSDQH,
24340   IX86_BUILTIN_VPMACSDQL,
24341   IX86_BUILTIN_VPMACSDQH,
24342   IX86_BUILTIN_VPMADCSSWD,
24343   IX86_BUILTIN_VPMADCSWD,
24344
24345   IX86_BUILTIN_VPHADDBW,
24346   IX86_BUILTIN_VPHADDBD,
24347   IX86_BUILTIN_VPHADDBQ,
24348   IX86_BUILTIN_VPHADDWD,
24349   IX86_BUILTIN_VPHADDWQ,
24350   IX86_BUILTIN_VPHADDDQ,
24351   IX86_BUILTIN_VPHADDUBW,
24352   IX86_BUILTIN_VPHADDUBD,
24353   IX86_BUILTIN_VPHADDUBQ,
24354   IX86_BUILTIN_VPHADDUWD,
24355   IX86_BUILTIN_VPHADDUWQ,
24356   IX86_BUILTIN_VPHADDUDQ,
24357   IX86_BUILTIN_VPHSUBBW,
24358   IX86_BUILTIN_VPHSUBWD,
24359   IX86_BUILTIN_VPHSUBDQ,
24360
24361   IX86_BUILTIN_VPROTB,
24362   IX86_BUILTIN_VPROTW,
24363   IX86_BUILTIN_VPROTD,
24364   IX86_BUILTIN_VPROTQ,
24365   IX86_BUILTIN_VPROTB_IMM,
24366   IX86_BUILTIN_VPROTW_IMM,
24367   IX86_BUILTIN_VPROTD_IMM,
24368   IX86_BUILTIN_VPROTQ_IMM,
24369
24370   IX86_BUILTIN_VPSHLB,
24371   IX86_BUILTIN_VPSHLW,
24372   IX86_BUILTIN_VPSHLD,
24373   IX86_BUILTIN_VPSHLQ,
24374   IX86_BUILTIN_VPSHAB,
24375   IX86_BUILTIN_VPSHAW,
24376   IX86_BUILTIN_VPSHAD,
24377   IX86_BUILTIN_VPSHAQ,
24378
24379   IX86_BUILTIN_VFRCZSS,
24380   IX86_BUILTIN_VFRCZSD,
24381   IX86_BUILTIN_VFRCZPS,
24382   IX86_BUILTIN_VFRCZPD,
24383   IX86_BUILTIN_VFRCZPS256,
24384   IX86_BUILTIN_VFRCZPD256,
24385
24386   IX86_BUILTIN_VPCOMEQUB,
24387   IX86_BUILTIN_VPCOMNEUB,
24388   IX86_BUILTIN_VPCOMLTUB,
24389   IX86_BUILTIN_VPCOMLEUB,
24390   IX86_BUILTIN_VPCOMGTUB,
24391   IX86_BUILTIN_VPCOMGEUB,
24392   IX86_BUILTIN_VPCOMFALSEUB,
24393   IX86_BUILTIN_VPCOMTRUEUB,
24394
24395   IX86_BUILTIN_VPCOMEQUW,
24396   IX86_BUILTIN_VPCOMNEUW,
24397   IX86_BUILTIN_VPCOMLTUW,
24398   IX86_BUILTIN_VPCOMLEUW,
24399   IX86_BUILTIN_VPCOMGTUW,
24400   IX86_BUILTIN_VPCOMGEUW,
24401   IX86_BUILTIN_VPCOMFALSEUW,
24402   IX86_BUILTIN_VPCOMTRUEUW,
24403
24404   IX86_BUILTIN_VPCOMEQUD,
24405   IX86_BUILTIN_VPCOMNEUD,
24406   IX86_BUILTIN_VPCOMLTUD,
24407   IX86_BUILTIN_VPCOMLEUD,
24408   IX86_BUILTIN_VPCOMGTUD,
24409   IX86_BUILTIN_VPCOMGEUD,
24410   IX86_BUILTIN_VPCOMFALSEUD,
24411   IX86_BUILTIN_VPCOMTRUEUD,
24412
24413   IX86_BUILTIN_VPCOMEQUQ,
24414   IX86_BUILTIN_VPCOMNEUQ,
24415   IX86_BUILTIN_VPCOMLTUQ,
24416   IX86_BUILTIN_VPCOMLEUQ,
24417   IX86_BUILTIN_VPCOMGTUQ,
24418   IX86_BUILTIN_VPCOMGEUQ,
24419   IX86_BUILTIN_VPCOMFALSEUQ,
24420   IX86_BUILTIN_VPCOMTRUEUQ,
24421
24422   IX86_BUILTIN_VPCOMEQB,
24423   IX86_BUILTIN_VPCOMNEB,
24424   IX86_BUILTIN_VPCOMLTB,
24425   IX86_BUILTIN_VPCOMLEB,
24426   IX86_BUILTIN_VPCOMGTB,
24427   IX86_BUILTIN_VPCOMGEB,
24428   IX86_BUILTIN_VPCOMFALSEB,
24429   IX86_BUILTIN_VPCOMTRUEB,
24430
24431   IX86_BUILTIN_VPCOMEQW,
24432   IX86_BUILTIN_VPCOMNEW,
24433   IX86_BUILTIN_VPCOMLTW,
24434   IX86_BUILTIN_VPCOMLEW,
24435   IX86_BUILTIN_VPCOMGTW,
24436   IX86_BUILTIN_VPCOMGEW,
24437   IX86_BUILTIN_VPCOMFALSEW,
24438   IX86_BUILTIN_VPCOMTRUEW,
24439
24440   IX86_BUILTIN_VPCOMEQD,
24441   IX86_BUILTIN_VPCOMNED,
24442   IX86_BUILTIN_VPCOMLTD,
24443   IX86_BUILTIN_VPCOMLED,
24444   IX86_BUILTIN_VPCOMGTD,
24445   IX86_BUILTIN_VPCOMGED,
24446   IX86_BUILTIN_VPCOMFALSED,
24447   IX86_BUILTIN_VPCOMTRUED,
24448
24449   IX86_BUILTIN_VPCOMEQQ,
24450   IX86_BUILTIN_VPCOMNEQ,
24451   IX86_BUILTIN_VPCOMLTQ,
24452   IX86_BUILTIN_VPCOMLEQ,
24453   IX86_BUILTIN_VPCOMGTQ,
24454   IX86_BUILTIN_VPCOMGEQ,
24455   IX86_BUILTIN_VPCOMFALSEQ,
24456   IX86_BUILTIN_VPCOMTRUEQ,
24457
24458   /* LWP instructions.  */
24459   IX86_BUILTIN_LLWPCB,
24460   IX86_BUILTIN_SLWPCB,
24461   IX86_BUILTIN_LWPVAL32,
24462   IX86_BUILTIN_LWPVAL64,
24463   IX86_BUILTIN_LWPINS32,
24464   IX86_BUILTIN_LWPINS64,
24465
24466   IX86_BUILTIN_CLZS,
24467
24468   /* BMI instructions.  */
24469   IX86_BUILTIN_BEXTR32,
24470   IX86_BUILTIN_BEXTR64,
24471   IX86_BUILTIN_CTZS,
24472
24473   /* TBM instructions.  */
24474   IX86_BUILTIN_BEXTRI32,
24475   IX86_BUILTIN_BEXTRI64,
24476
24477
24478   /* FSGSBASE instructions.  */
24479   IX86_BUILTIN_RDFSBASE32,
24480   IX86_BUILTIN_RDFSBASE64,
24481   IX86_BUILTIN_RDGSBASE32,
24482   IX86_BUILTIN_RDGSBASE64,
24483   IX86_BUILTIN_WRFSBASE32,
24484   IX86_BUILTIN_WRFSBASE64,
24485   IX86_BUILTIN_WRGSBASE32,
24486   IX86_BUILTIN_WRGSBASE64,
24487
24488   /* RDRND instructions.  */
24489   IX86_BUILTIN_RDRAND16_STEP,
24490   IX86_BUILTIN_RDRAND32_STEP,
24491   IX86_BUILTIN_RDRAND64_STEP,
24492
24493   /* F16C instructions.  */
24494   IX86_BUILTIN_CVTPH2PS,
24495   IX86_BUILTIN_CVTPH2PS256,
24496   IX86_BUILTIN_CVTPS2PH,
24497   IX86_BUILTIN_CVTPS2PH256,
24498
24499   /* CFString built-in for darwin */
24500   IX86_BUILTIN_CFSTRING,
24501
24502   IX86_BUILTIN_MAX
24503 };
24504
24505 /* Table for the ix86 builtin decls.  */
24506 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
24507
24508 /* Table of all of the builtin functions that are possible with different ISA's
24509    but are waiting to be built until a function is declared to use that
24510    ISA.  */
24511 struct builtin_isa {
24512   const char *name;             /* function name */
24513   enum ix86_builtin_func_type tcode; /* type to use in the declaration */
24514   int isa;                      /* isa_flags this builtin is defined for */
24515   bool const_p;                 /* true if the declaration is constant */
24516   bool set_and_not_built_p;
24517 };
24518
24519 static struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
24520
24521
24522 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
24523    of which isa_flags to use in the ix86_builtins_isa array.  Stores the
24524    function decl in the ix86_builtins array.  Returns the function decl or
24525    NULL_TREE, if the builtin was not added.
24526
24527    If the front end has a special hook for builtin functions, delay adding
24528    builtin functions that aren't in the current ISA until the ISA is changed
24529    with function specific optimization.  Doing so, can save about 300K for the
24530    default compiler.  When the builtin is expanded, check at that time whether
24531    it is valid.
24532
24533    If the front end doesn't have a special hook, record all builtins, even if
24534    it isn't an instruction set in the current ISA in case the user uses
24535    function specific options for a different ISA, so that we don't get scope
24536    errors if a builtin is added in the middle of a function scope.  */
24537
24538 static inline tree
24539 def_builtin (int mask, const char *name, enum ix86_builtin_func_type tcode,
24540              enum ix86_builtins code)
24541 {
24542   tree decl = NULL_TREE;
24543
24544   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
24545     {
24546       ix86_builtins_isa[(int) code].isa = mask;
24547
24548       mask &= ~OPTION_MASK_ISA_64BIT;
24549       if (mask == 0
24550           || (mask & ix86_isa_flags) != 0
24551           || (lang_hooks.builtin_function
24552               == lang_hooks.builtin_function_ext_scope))
24553
24554         {
24555           tree type = ix86_get_builtin_func_type (tcode);
24556           decl = add_builtin_function (name, type, code, BUILT_IN_MD,
24557                                        NULL, NULL_TREE);
24558           ix86_builtins[(int) code] = decl;
24559           ix86_builtins_isa[(int) code].set_and_not_built_p = false;
24560         }
24561       else
24562         {
24563           ix86_builtins[(int) code] = NULL_TREE;
24564           ix86_builtins_isa[(int) code].tcode = tcode;
24565           ix86_builtins_isa[(int) code].name = name;
24566           ix86_builtins_isa[(int) code].const_p = false;
24567           ix86_builtins_isa[(int) code].set_and_not_built_p = true;
24568         }
24569     }
24570
24571   return decl;
24572 }
24573
24574 /* Like def_builtin, but also marks the function decl "const".  */
24575
24576 static inline tree
24577 def_builtin_const (int mask, const char *name,
24578                    enum ix86_builtin_func_type tcode, enum ix86_builtins code)
24579 {
24580   tree decl = def_builtin (mask, name, tcode, code);
24581   if (decl)
24582     TREE_READONLY (decl) = 1;
24583   else
24584     ix86_builtins_isa[(int) code].const_p = true;
24585
24586   return decl;
24587 }
24588
24589 /* Add any new builtin functions for a given ISA that may not have been
24590    declared.  This saves a bit of space compared to adding all of the
24591    declarations to the tree, even if we didn't use them.  */
24592
24593 static void
24594 ix86_add_new_builtins (int isa)
24595 {
24596   int i;
24597
24598   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
24599     {
24600       if ((ix86_builtins_isa[i].isa & isa) != 0
24601           && ix86_builtins_isa[i].set_and_not_built_p)
24602         {
24603           tree decl, type;
24604
24605           /* Don't define the builtin again.  */
24606           ix86_builtins_isa[i].set_and_not_built_p = false;
24607
24608           type = ix86_get_builtin_func_type (ix86_builtins_isa[i].tcode);
24609           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
24610                                                  type, i, BUILT_IN_MD, NULL,
24611                                                  NULL_TREE);
24612
24613           ix86_builtins[i] = decl;
24614           if (ix86_builtins_isa[i].const_p)
24615             TREE_READONLY (decl) = 1;
24616         }
24617     }
24618 }
24619
24620 /* Bits for builtin_description.flag.  */
24621
24622 /* Set when we don't support the comparison natively, and should
24623    swap_comparison in order to support it.  */
24624 #define BUILTIN_DESC_SWAP_OPERANDS      1
24625
24626 struct builtin_description
24627 {
24628   const unsigned int mask;
24629   const enum insn_code icode;
24630   const char *const name;
24631   const enum ix86_builtins code;
24632   const enum rtx_code comparison;
24633   const int flag;
24634 };
24635
24636 static const struct builtin_description bdesc_comi[] =
24637 {
24638   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
24639   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
24640   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
24641   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
24642   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
24643   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
24644   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
24645   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
24646   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
24647   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
24648   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
24649   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
24650   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
24651   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
24652   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
24653   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
24654   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
24655   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
24656   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
24657   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
24658   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
24659   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
24660   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
24661   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
24662 };
24663
24664 static const struct builtin_description bdesc_pcmpestr[] =
24665 {
24666   /* SSE4.2 */
24667   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
24668   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
24669   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
24670   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
24671   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
24672   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
24673   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
24674 };
24675
24676 static const struct builtin_description bdesc_pcmpistr[] =
24677 {
24678   /* SSE4.2 */
24679   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
24680   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
24681   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
24682   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
24683   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
24684   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
24685   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
24686 };
24687
24688 /* Special builtins with variable number of arguments.  */
24689 static const struct builtin_description bdesc_special_args[] =
24690 {
24691   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtsc, "__builtin_ia32_rdtsc", IX86_BUILTIN_RDTSC, UNKNOWN, (int) UINT64_FTYPE_VOID },
24692   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtscp, "__builtin_ia32_rdtscp", IX86_BUILTIN_RDTSCP, UNKNOWN, (int) UINT64_FTYPE_PUNSIGNED },
24693
24694   /* MMX */
24695   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
24696
24697   /* 3DNow! */
24698   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
24699
24700   /* SSE */
24701   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24702   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24703   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
24704
24705   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
24706   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
24707   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
24708   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
24709
24710   /* SSE or 3DNow!A  */
24711   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24712   { 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 },
24713
24714   /* SSE2 */
24715   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24716   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24717   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24718   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
24719   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24720   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
24721   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
24722   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
24723   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
24724
24725   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
24726   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
24727
24728   /* SSE3 */
24729   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
24730
24731   /* SSE4.1 */
24732   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
24733
24734   /* SSE4A */
24735   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24736   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24737
24738   /* AVX */
24739   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
24740   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, "__builtin_ia32_vzeroupper", IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
24741
24742   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4sf, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
24743   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4df, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
24744   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv8sf, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
24745   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v4df, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
24746   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v8sf, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
24747
24748   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
24749   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
24750   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
24751   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
24752   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
24753   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
24754   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
24755
24756   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
24757   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
24758   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
24759
24760   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DI },
24761   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SI },
24762   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DI },
24763   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SI },
24764   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DI_V2DF },
24765   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SI_V4SF },
24766   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DI_V4DF },
24767   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SI_V8SF },
24768
24769   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcb, "__builtin_ia32_llwpcb", IX86_BUILTIN_LLWPCB, UNKNOWN, (int) VOID_FTYPE_PVOID },
24770   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcb, "__builtin_ia32_slwpcb", IX86_BUILTIN_SLWPCB, UNKNOWN, (int) PVOID_FTYPE_VOID },
24771   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3, "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL32, UNKNOWN, (int) VOID_FTYPE_UINT_UINT_UINT },
24772   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT },
24773   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS32, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT },
24774   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT },
24775
24776   /* FSGSBASE */
24777   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdfsbasesi, "__builtin_ia32_rdfsbase32", IX86_BUILTIN_RDFSBASE32, UNKNOWN, (int) UNSIGNED_FTYPE_VOID },
24778   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdfsbasedi, "__builtin_ia32_rdfsbase64", IX86_BUILTIN_RDFSBASE64, UNKNOWN, (int) UINT64_FTYPE_VOID },
24779   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdgsbasesi, "__builtin_ia32_rdgsbase32", IX86_BUILTIN_RDGSBASE32, UNKNOWN, (int) UNSIGNED_FTYPE_VOID },
24780   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdgsbasedi, "__builtin_ia32_rdgsbase64", IX86_BUILTIN_RDGSBASE64, UNKNOWN, (int) UINT64_FTYPE_VOID },
24781   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrfsbasesi, "__builtin_ia32_wrfsbase32", IX86_BUILTIN_WRFSBASE32, UNKNOWN, (int) VOID_FTYPE_UNSIGNED },
24782   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrfsbasedi, "__builtin_ia32_wrfsbase64", IX86_BUILTIN_WRFSBASE64, UNKNOWN, (int) VOID_FTYPE_UINT64 },
24783   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrgsbasesi, "__builtin_ia32_wrgsbase32", IX86_BUILTIN_WRGSBASE32, UNKNOWN, (int) VOID_FTYPE_UNSIGNED },
24784   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrgsbasedi, "__builtin_ia32_wrgsbase64", IX86_BUILTIN_WRGSBASE64, UNKNOWN, (int) VOID_FTYPE_UINT64 },
24785 };
24786
24787 /* Builtins with variable number of arguments.  */
24788 static const struct builtin_description bdesc_args[] =
24789 {
24790   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_bsr, "__builtin_ia32_bsrsi", IX86_BUILTIN_BSRSI, UNKNOWN, (int) INT_FTYPE_INT },
24791   { OPTION_MASK_ISA_64BIT, CODE_FOR_bsr_rex64, "__builtin_ia32_bsrdi", IX86_BUILTIN_BSRDI, UNKNOWN, (int) INT64_FTYPE_INT64 },
24792   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdpmc, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT },
24793   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlqi3, "__builtin_ia32_rolqi", IX86_BUILTIN_ROLQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
24794   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlhi3, "__builtin_ia32_rolhi", IX86_BUILTIN_ROLHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
24795   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrqi3, "__builtin_ia32_rorqi", IX86_BUILTIN_RORQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
24796   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrhi3, "__builtin_ia32_rorhi", IX86_BUILTIN_RORHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
24797
24798   /* MMX */
24799   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24800   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24801   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24802   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24803   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24804   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24805
24806   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24807   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24808   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24809   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24810   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24811   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24812   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24813   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24814
24815   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24816   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24817
24818   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24819   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24820   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24821   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24822
24823   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24824   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24825   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24826   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24827   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24828   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24829
24830   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24831   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24832   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24833   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24834   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
24835   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
24836
24837   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
24838   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
24839   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
24840
24841   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
24842
24843   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24844   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24845   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
24846   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24847   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24848   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
24849
24850   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24851   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24852   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
24853   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24854   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24855   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
24856
24857   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24858   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24859   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24860   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24861
24862   /* 3DNow! */
24863   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
24864   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
24865   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24866   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24867
24868   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24869   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24870   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24871   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24872   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24873   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24874   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24875   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24876   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24877   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24878   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24879   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24880   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24881   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24882   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24883
24884   /* 3DNow!A */
24885   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
24886   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
24887   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
24888   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24889   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24890   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24891
24892   /* SSE */
24893   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
24894   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24895   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24896   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24897   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24898   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24899   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
24900   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
24901   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
24902   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
24903   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
24904   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
24905
24906   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
24907
24908   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24909   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24910   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24911   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24912   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24913   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24914   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24915   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24916
24917   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
24918   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
24919   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
24920   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24921   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24922   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24923   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
24924   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
24925   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
24926   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24927   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
24928   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24929   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
24930   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
24931   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
24932   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24933   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
24934   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
24935   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
24936   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24937   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24938   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24939
24940   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24941   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24942   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24943   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24944
24945   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24946   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24947   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24948   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24949
24950   { OPTION_MASK_ISA_SSE, CODE_FOR_copysignv4sf3,  "__builtin_ia32_copysignps", IX86_BUILTIN_CPYSGNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24951
24952   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24953   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24954   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24955   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_highv4sf, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24956   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_lowv4sf, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24957
24958   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
24959   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
24960   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
24961
24962   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
24963
24964   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24965   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24966   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24967
24968   /* SSE MMX or 3Dnow!A */
24969   { 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 },
24970   { 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 },
24971   { 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 },
24972
24973   { 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 },
24974   { 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 },
24975   { 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 },
24976   { 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 },
24977
24978   { 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 },
24979   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
24980
24981   { 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 },
24982
24983   /* SSE2 */
24984   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
24985
24986   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2df", IX86_BUILTIN_VEC_PERM_V2DF, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DI },
24987   { OPTION_MASK_ISA_SSE, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4sf", IX86_BUILTIN_VEC_PERM_V4SF, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SI },
24988   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2di", IX86_BUILTIN_VEC_PERM_V2DI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_V2DI },
24989   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4si", IX86_BUILTIN_VEC_PERM_V4SI, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_V4SI },
24990   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8hi", IX86_BUILTIN_VEC_PERM_V8HI, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_V8HI },
24991   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v16qi", IX86_BUILTIN_VEC_PERM_V16QI, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
24992   { 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 },
24993   { 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 },
24994   { 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 },
24995   { 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 },
24996   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4df", IX86_BUILTIN_VEC_PERM_V4DF, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DI },
24997   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8sf", IX86_BUILTIN_VEC_PERM_V8SF, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SI },
24998
24999   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
25000   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
25001   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
25002   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
25003   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
25004   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtudq2ps, "__builtin_ia32_cvtudq2ps", IX86_BUILTIN_CVTUDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
25005
25006   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
25007   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
25008   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
25009   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
25010   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
25011
25012   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
25013
25014   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
25015   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
25016   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
25017   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
25018
25019   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
25020   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
25021   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
25022
25023   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25024   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25025   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25026   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25027   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25028   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25029   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25030   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25031
25032   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
25033   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
25034   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
25035   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
25036   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
25037   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25038   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
25039   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
25040   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
25041   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
25042   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
25043   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25044   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
25045   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
25046   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
25047   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25048   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
25049   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
25050   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
25051   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25052
25053   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25054   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25055   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25056   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25057
25058   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25059   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25060   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25061   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25062
25063   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysignv2df3,  "__builtin_ia32_copysignpd", IX86_BUILTIN_CPYSGNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25064
25065   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25066   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2df, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25067   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2df, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25068
25069   { 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 },
25070
25071   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25072   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25073   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25074   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25075   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25076   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25077   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25078   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25079
25080   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25081   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25082   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25083   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25084   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25085   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25086   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25087   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25088
25089   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25090   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
25091
25092   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25093   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25094   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25095   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25096
25097   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25098   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25099
25100   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25101   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25102   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
25103   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25104   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25105   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
25106
25107   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25108   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25109   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25110   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25111
25112   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv16qi, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25113   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv8hi, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
25114   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv4si, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
25115   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2di, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25116   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv16qi, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25117   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv8hi, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25118   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv4si, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25119   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2di, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25120
25121   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
25122   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
25123   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
25124
25125   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25126   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
25127
25128   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
25129   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
25130
25131   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
25132
25133   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
25134   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
25135   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
25136   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
25137
25138   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlv1ti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
25139   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25140   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25141   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
25142   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25143   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25144   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
25145
25146   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrv1ti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
25147   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25148   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25149   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
25150   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25151   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25152   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
25153
25154   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25155   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25156   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25157   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25158
25159   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
25160   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
25161   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
25162
25163   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
25164
25165   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
25166   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
25167
25168   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
25169
25170   /* SSE2 MMX */
25171   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
25172   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
25173
25174   /* SSE3 */
25175   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
25176   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
25177
25178   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25179   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25180   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25181   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25182   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25183   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25184
25185   /* SSSE3 */
25186   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
25187   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
25188   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
25189   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
25190   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
25191   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
25192
25193   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25194   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25195   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25196   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25197   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25198   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25199   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25200   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25201   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25202   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25203   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25204   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25205   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
25206   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
25207   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25208   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25209   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25210   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
25211   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25212   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
25213   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25214   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25215   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25216   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25217
25218   /* SSSE3.  */
25219   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT_CONVERT },
25220   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_INT_CONVERT },
25221
25222   /* SSE4.1 */
25223   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25224   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25225   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
25226   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
25227   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25228   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25229   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25230   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
25231   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
25232   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
25233
25234   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
25235   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
25236   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
25237   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
25238   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
25239   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
25240   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
25241   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
25242   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
25243   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
25244   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
25245   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
25246   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
25247
25248   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
25249   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25250   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25251   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25252   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25253   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25254   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25255   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25256   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25257   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25258   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
25259   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25260
25261   /* SSE4.1 */
25262   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
25263   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
25264   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25265   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25266
25267   { 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 },
25268   { 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 },
25269   { 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 },
25270   { 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 },
25271
25272   { 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 },
25273   { 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 },
25274   { 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 },
25275   { 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 },
25276
25277   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25278   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25279   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25280
25281   /* SSE4.2 */
25282   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25283   { 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 },
25284   { 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 },
25285   { 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 },
25286   { 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 },
25287
25288   /* SSE4A */
25289   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
25290   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
25291   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
25292   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25293
25294   /* AES */
25295   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
25296   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
25297
25298   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25299   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25300   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25301   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25302
25303   /* PCLMUL */
25304   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
25305
25306   /* AVX */
25307   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25308   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25309   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25310   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25311   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25312   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25313   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25314   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25315   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25316   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25317   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25318   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25319   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25320   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25321   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25322   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25323   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25324   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25325   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25326   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25327   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25328   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25329   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25330   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25331   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25332   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25333
25334   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
25335   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
25336   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
25337   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
25338
25339   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25340   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25341   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
25342   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
25343   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25344   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25345   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25346   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vmcmpv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25347   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vmcmpv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25348   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25349   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25350   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25351   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25352   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
25353   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
25354   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
25355   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
25356   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
25357   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
25358   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
25359   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
25360   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
25361   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
25362   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
25363   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25364   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25365   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
25366   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
25367   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
25368   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
25369   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
25370   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
25371   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
25372   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
25373
25374   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25375   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25376   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
25377
25378   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
25379   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25380   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25381   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25382   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25383
25384   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25385
25386   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
25387   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
25388
25389   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_floorpd256", IX86_BUILTIN_FLOORPD256, (enum rtx_code) ROUND_FLOOR, (int) V4DF_FTYPE_V4DF_ROUND },
25390   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_ceilpd256", IX86_BUILTIN_CEILPD256, (enum rtx_code) ROUND_CEIL, (int) V4DF_FTYPE_V4DF_ROUND },
25391   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_truncpd256", IX86_BUILTIN_TRUNCPD256, (enum rtx_code) ROUND_TRUNC, (int) V4DF_FTYPE_V4DF_ROUND },
25392   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_rintpd256", IX86_BUILTIN_RINTPD256, (enum rtx_code) ROUND_MXCSR, (int) V4DF_FTYPE_V4DF_ROUND },
25393
25394   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_floorps256", IX86_BUILTIN_FLOORPS256, (enum rtx_code) ROUND_FLOOR, (int) V8SF_FTYPE_V8SF_ROUND },
25395   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_ceilps256", IX86_BUILTIN_CEILPS256, (enum rtx_code) ROUND_CEIL, (int) V8SF_FTYPE_V8SF_ROUND },
25396   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_truncps256", IX86_BUILTIN_TRUNCPS256, (enum rtx_code) ROUND_TRUNC, (int) V8SF_FTYPE_V8SF_ROUND },
25397   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_rintps256", IX86_BUILTIN_RINTPS256, (enum rtx_code) ROUND_MXCSR, (int) V8SF_FTYPE_V8SF_ROUND },
25398
25399   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25400   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25401   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25402   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25403
25404   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
25405   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
25406   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
25407   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v8si, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
25408   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v8sf, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
25409   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v4df, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
25410
25411   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25412   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25413   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25414   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25415   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25416   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25417   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25418   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25419   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25420   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25421   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25422   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25423   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25424   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25425   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25426
25427   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
25428   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
25429
25430   { OPTION_MASK_ISA_AVX, CODE_FOR_copysignv8sf3,  "__builtin_ia32_copysignps256", IX86_BUILTIN_CPYSGNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25431   { OPTION_MASK_ISA_AVX, CODE_FOR_copysignv4df3,  "__builtin_ia32_copysignpd256", IX86_BUILTIN_CPYSGNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25432
25433   { OPTION_MASK_ISA_ABM, CODE_FOR_clzhi2_abm,   "__builtin_clzs",   IX86_BUILTIN_CLZS,    UNKNOWN,     (int) UINT16_FTYPE_UINT16 },
25434
25435   /* BMI */
25436   { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_si, "__builtin_ia32_bextr_u32", IX86_BUILTIN_BEXTR32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
25437   { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_di, "__builtin_ia32_bextr_u64", IX86_BUILTIN_BEXTR64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
25438   { OPTION_MASK_ISA_BMI, CODE_FOR_ctzhi2,       "__builtin_ctzs",           IX86_BUILTIN_CTZS,    UNKNOWN, (int) UINT16_FTYPE_UINT16 },
25439
25440   /* TBM */
25441   { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_si, "__builtin_ia32_bextri_u32", IX86_BUILTIN_BEXTRI32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
25442   { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_di, "__builtin_ia32_bextri_u64", IX86_BUILTIN_BEXTRI64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
25443
25444   /* F16C */
25445   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtph2ps, "__builtin_ia32_vcvtph2ps", IX86_BUILTIN_CVTPH2PS, UNKNOWN, (int) V4SF_FTYPE_V8HI },
25446   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtph2ps256, "__builtin_ia32_vcvtph2ps256", IX86_BUILTIN_CVTPH2PS256, UNKNOWN, (int) V8SF_FTYPE_V8HI },
25447   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtps2ph, "__builtin_ia32_vcvtps2ph", IX86_BUILTIN_CVTPS2PH, UNKNOWN, (int) V8HI_FTYPE_V4SF_INT },
25448   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtps2ph256, "__builtin_ia32_vcvtps2ph256", IX86_BUILTIN_CVTPS2PH256, UNKNOWN, (int) V8HI_FTYPE_V8SF_INT },
25449 };
25450
25451 /* FMA4 and XOP.  */
25452 #define MULTI_ARG_4_DF2_DI_I    V2DF_FTYPE_V2DF_V2DF_V2DI_INT
25453 #define MULTI_ARG_4_DF2_DI_I1   V4DF_FTYPE_V4DF_V4DF_V4DI_INT
25454 #define MULTI_ARG_4_SF2_SI_I    V4SF_FTYPE_V4SF_V4SF_V4SI_INT
25455 #define MULTI_ARG_4_SF2_SI_I1   V8SF_FTYPE_V8SF_V8SF_V8SI_INT
25456 #define MULTI_ARG_3_SF          V4SF_FTYPE_V4SF_V4SF_V4SF
25457 #define MULTI_ARG_3_DF          V2DF_FTYPE_V2DF_V2DF_V2DF
25458 #define MULTI_ARG_3_SF2         V8SF_FTYPE_V8SF_V8SF_V8SF
25459 #define MULTI_ARG_3_DF2         V4DF_FTYPE_V4DF_V4DF_V4DF
25460 #define MULTI_ARG_3_DI          V2DI_FTYPE_V2DI_V2DI_V2DI
25461 #define MULTI_ARG_3_SI          V4SI_FTYPE_V4SI_V4SI_V4SI
25462 #define MULTI_ARG_3_SI_DI       V4SI_FTYPE_V4SI_V4SI_V2DI
25463 #define MULTI_ARG_3_HI          V8HI_FTYPE_V8HI_V8HI_V8HI
25464 #define MULTI_ARG_3_HI_SI       V8HI_FTYPE_V8HI_V8HI_V4SI
25465 #define MULTI_ARG_3_QI          V16QI_FTYPE_V16QI_V16QI_V16QI
25466 #define MULTI_ARG_3_DI2         V4DI_FTYPE_V4DI_V4DI_V4DI
25467 #define MULTI_ARG_3_SI2         V8SI_FTYPE_V8SI_V8SI_V8SI
25468 #define MULTI_ARG_3_HI2         V16HI_FTYPE_V16HI_V16HI_V16HI
25469 #define MULTI_ARG_3_QI2         V32QI_FTYPE_V32QI_V32QI_V32QI
25470 #define MULTI_ARG_2_SF          V4SF_FTYPE_V4SF_V4SF
25471 #define MULTI_ARG_2_DF          V2DF_FTYPE_V2DF_V2DF
25472 #define MULTI_ARG_2_DI          V2DI_FTYPE_V2DI_V2DI
25473 #define MULTI_ARG_2_SI          V4SI_FTYPE_V4SI_V4SI
25474 #define MULTI_ARG_2_HI          V8HI_FTYPE_V8HI_V8HI
25475 #define MULTI_ARG_2_QI          V16QI_FTYPE_V16QI_V16QI
25476 #define MULTI_ARG_2_DI_IMM      V2DI_FTYPE_V2DI_SI
25477 #define MULTI_ARG_2_SI_IMM      V4SI_FTYPE_V4SI_SI
25478 #define MULTI_ARG_2_HI_IMM      V8HI_FTYPE_V8HI_SI
25479 #define MULTI_ARG_2_QI_IMM      V16QI_FTYPE_V16QI_SI
25480 #define MULTI_ARG_2_DI_CMP      V2DI_FTYPE_V2DI_V2DI_CMP
25481 #define MULTI_ARG_2_SI_CMP      V4SI_FTYPE_V4SI_V4SI_CMP
25482 #define MULTI_ARG_2_HI_CMP      V8HI_FTYPE_V8HI_V8HI_CMP
25483 #define MULTI_ARG_2_QI_CMP      V16QI_FTYPE_V16QI_V16QI_CMP
25484 #define MULTI_ARG_2_SF_TF       V4SF_FTYPE_V4SF_V4SF_TF
25485 #define MULTI_ARG_2_DF_TF       V2DF_FTYPE_V2DF_V2DF_TF
25486 #define MULTI_ARG_2_DI_TF       V2DI_FTYPE_V2DI_V2DI_TF
25487 #define MULTI_ARG_2_SI_TF       V4SI_FTYPE_V4SI_V4SI_TF
25488 #define MULTI_ARG_2_HI_TF       V8HI_FTYPE_V8HI_V8HI_TF
25489 #define MULTI_ARG_2_QI_TF       V16QI_FTYPE_V16QI_V16QI_TF
25490 #define MULTI_ARG_1_SF          V4SF_FTYPE_V4SF
25491 #define MULTI_ARG_1_DF          V2DF_FTYPE_V2DF
25492 #define MULTI_ARG_1_SF2         V8SF_FTYPE_V8SF
25493 #define MULTI_ARG_1_DF2         V4DF_FTYPE_V4DF
25494 #define MULTI_ARG_1_DI          V2DI_FTYPE_V2DI
25495 #define MULTI_ARG_1_SI          V4SI_FTYPE_V4SI
25496 #define MULTI_ARG_1_HI          V8HI_FTYPE_V8HI
25497 #define MULTI_ARG_1_QI          V16QI_FTYPE_V16QI
25498 #define MULTI_ARG_1_SI_DI       V2DI_FTYPE_V4SI
25499 #define MULTI_ARG_1_HI_DI       V2DI_FTYPE_V8HI
25500 #define MULTI_ARG_1_HI_SI       V4SI_FTYPE_V8HI
25501 #define MULTI_ARG_1_QI_DI       V2DI_FTYPE_V16QI
25502 #define MULTI_ARG_1_QI_SI       V4SI_FTYPE_V16QI
25503 #define MULTI_ARG_1_QI_HI       V8HI_FTYPE_V16QI
25504
25505 static const struct builtin_description bdesc_multi_arg[] =
25506 {
25507   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmadd_v4sf,
25508     "__builtin_ia32_vfmaddss", IX86_BUILTIN_VFMADDSS,
25509     UNKNOWN, (int)MULTI_ARG_3_SF },
25510   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmadd_v2df,
25511     "__builtin_ia32_vfmaddsd", IX86_BUILTIN_VFMADDSD,
25512     UNKNOWN, (int)MULTI_ARG_3_DF },
25513
25514   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v4sf,
25515     "__builtin_ia32_vfmaddps", IX86_BUILTIN_VFMADDPS,
25516     UNKNOWN, (int)MULTI_ARG_3_SF },
25517   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v2df,
25518     "__builtin_ia32_vfmaddpd", IX86_BUILTIN_VFMADDPD,
25519     UNKNOWN, (int)MULTI_ARG_3_DF },
25520   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v8sf,
25521     "__builtin_ia32_vfmaddps256", IX86_BUILTIN_VFMADDPS256,
25522     UNKNOWN, (int)MULTI_ARG_3_SF2 },
25523   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v4df,
25524     "__builtin_ia32_vfmaddpd256", IX86_BUILTIN_VFMADDPD256,
25525     UNKNOWN, (int)MULTI_ARG_3_DF2 },
25526
25527   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v4sf,
25528     "__builtin_ia32_vfmaddsubps", IX86_BUILTIN_VFMADDSUBPS,
25529     UNKNOWN, (int)MULTI_ARG_3_SF },
25530   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v2df,
25531     "__builtin_ia32_vfmaddsubpd", IX86_BUILTIN_VFMADDSUBPD,
25532     UNKNOWN, (int)MULTI_ARG_3_DF },
25533   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v8sf,
25534     "__builtin_ia32_vfmaddsubps256", IX86_BUILTIN_VFMADDSUBPS256,
25535     UNKNOWN, (int)MULTI_ARG_3_SF2 },
25536   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v4df,
25537     "__builtin_ia32_vfmaddsubpd256", IX86_BUILTIN_VFMADDSUBPD256,
25538     UNKNOWN, (int)MULTI_ARG_3_DF2 },
25539
25540   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov",      IX86_BUILTIN_VPCMOV,      UNKNOWN,      (int)MULTI_ARG_3_DI },
25541   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov_v2di", IX86_BUILTIN_VPCMOV_V2DI, UNKNOWN,      (int)MULTI_ARG_3_DI },
25542   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4si,        "__builtin_ia32_vpcmov_v4si", IX86_BUILTIN_VPCMOV_V4SI, UNKNOWN,      (int)MULTI_ARG_3_SI },
25543   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8hi,        "__builtin_ia32_vpcmov_v8hi", IX86_BUILTIN_VPCMOV_V8HI, UNKNOWN,      (int)MULTI_ARG_3_HI },
25544   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16qi,       "__builtin_ia32_vpcmov_v16qi",IX86_BUILTIN_VPCMOV_V16QI,UNKNOWN,      (int)MULTI_ARG_3_QI },
25545   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2df,        "__builtin_ia32_vpcmov_v2df", IX86_BUILTIN_VPCMOV_V2DF, UNKNOWN,      (int)MULTI_ARG_3_DF },
25546   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4sf,        "__builtin_ia32_vpcmov_v4sf", IX86_BUILTIN_VPCMOV_V4SF, UNKNOWN,      (int)MULTI_ARG_3_SF },
25547
25548   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov256",       IX86_BUILTIN_VPCMOV256,       UNKNOWN,      (int)MULTI_ARG_3_DI2 },
25549   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov_v4di256",  IX86_BUILTIN_VPCMOV_V4DI256,  UNKNOWN,      (int)MULTI_ARG_3_DI2 },
25550   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8si256,        "__builtin_ia32_vpcmov_v8si256",  IX86_BUILTIN_VPCMOV_V8SI256,  UNKNOWN,      (int)MULTI_ARG_3_SI2 },
25551   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16hi256,       "__builtin_ia32_vpcmov_v16hi256", IX86_BUILTIN_VPCMOV_V16HI256, UNKNOWN,      (int)MULTI_ARG_3_HI2 },
25552   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v32qi256,       "__builtin_ia32_vpcmov_v32qi256", IX86_BUILTIN_VPCMOV_V32QI256, UNKNOWN,      (int)MULTI_ARG_3_QI2 },
25553   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4df256,        "__builtin_ia32_vpcmov_v4df256",  IX86_BUILTIN_VPCMOV_V4DF256,  UNKNOWN,      (int)MULTI_ARG_3_DF2 },
25554   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8sf256,        "__builtin_ia32_vpcmov_v8sf256",  IX86_BUILTIN_VPCMOV_V8SF256,  UNKNOWN,      (int)MULTI_ARG_3_SF2 },
25555
25556   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pperm,             "__builtin_ia32_vpperm",      IX86_BUILTIN_VPPERM,      UNKNOWN,      (int)MULTI_ARG_3_QI },
25557
25558   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssww,          "__builtin_ia32_vpmacssww",   IX86_BUILTIN_VPMACSSWW,   UNKNOWN,      (int)MULTI_ARG_3_HI },
25559   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsww,           "__builtin_ia32_vpmacsww",    IX86_BUILTIN_VPMACSWW,    UNKNOWN,      (int)MULTI_ARG_3_HI },
25560   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsswd,          "__builtin_ia32_vpmacsswd",   IX86_BUILTIN_VPMACSSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25561   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacswd,           "__builtin_ia32_vpmacswd",    IX86_BUILTIN_VPMACSWD,    UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25562   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdd,          "__builtin_ia32_vpmacssdd",   IX86_BUILTIN_VPMACSSDD,   UNKNOWN,      (int)MULTI_ARG_3_SI },
25563   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdd,           "__builtin_ia32_vpmacsdd",    IX86_BUILTIN_VPMACSDD,    UNKNOWN,      (int)MULTI_ARG_3_SI },
25564   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdql,         "__builtin_ia32_vpmacssdql",  IX86_BUILTIN_VPMACSSDQL,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25565   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdqh,         "__builtin_ia32_vpmacssdqh",  IX86_BUILTIN_VPMACSSDQH,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25566   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdql,          "__builtin_ia32_vpmacsdql",   IX86_BUILTIN_VPMACSDQL,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25567   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdqh,          "__builtin_ia32_vpmacsdqh",   IX86_BUILTIN_VPMACSDQH,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25568   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcsswd,         "__builtin_ia32_vpmadcsswd",  IX86_BUILTIN_VPMADCSSWD,  UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25569   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcswd,          "__builtin_ia32_vpmadcswd",   IX86_BUILTIN_VPMADCSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25570
25571   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv2di3,        "__builtin_ia32_vprotq",      IX86_BUILTIN_VPROTQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25572   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv4si3,        "__builtin_ia32_vprotd",      IX86_BUILTIN_VPROTD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25573   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv8hi3,        "__builtin_ia32_vprotw",      IX86_BUILTIN_VPROTW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25574   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv16qi3,       "__builtin_ia32_vprotb",      IX86_BUILTIN_VPROTB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25575   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv2di3,         "__builtin_ia32_vprotqi",     IX86_BUILTIN_VPROTQ_IMM,  UNKNOWN,      (int)MULTI_ARG_2_DI_IMM },
25576   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv4si3,         "__builtin_ia32_vprotdi",     IX86_BUILTIN_VPROTD_IMM,  UNKNOWN,      (int)MULTI_ARG_2_SI_IMM },
25577   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv8hi3,         "__builtin_ia32_vprotwi",     IX86_BUILTIN_VPROTW_IMM,  UNKNOWN,      (int)MULTI_ARG_2_HI_IMM },
25578   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv16qi3,        "__builtin_ia32_vprotbi",     IX86_BUILTIN_VPROTB_IMM,  UNKNOWN,      (int)MULTI_ARG_2_QI_IMM },
25579   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv2di3,         "__builtin_ia32_vpshaq",      IX86_BUILTIN_VPSHAQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25580   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv4si3,         "__builtin_ia32_vpshad",      IX86_BUILTIN_VPSHAD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25581   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv8hi3,         "__builtin_ia32_vpshaw",      IX86_BUILTIN_VPSHAW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25582   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv16qi3,        "__builtin_ia32_vpshab",      IX86_BUILTIN_VPSHAB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25583   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv2di3,         "__builtin_ia32_vpshlq",      IX86_BUILTIN_VPSHLQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25584   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv4si3,         "__builtin_ia32_vpshld",      IX86_BUILTIN_VPSHLD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25585   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv8hi3,         "__builtin_ia32_vpshlw",      IX86_BUILTIN_VPSHLW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25586   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv16qi3,        "__builtin_ia32_vpshlb",      IX86_BUILTIN_VPSHLB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25587
25588   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv4sf2,       "__builtin_ia32_vfrczss",     IX86_BUILTIN_VFRCZSS,     UNKNOWN,      (int)MULTI_ARG_2_SF },
25589   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv2df2,       "__builtin_ia32_vfrczsd",     IX86_BUILTIN_VFRCZSD,     UNKNOWN,      (int)MULTI_ARG_2_DF },
25590   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4sf2,         "__builtin_ia32_vfrczps",     IX86_BUILTIN_VFRCZPS,     UNKNOWN,      (int)MULTI_ARG_1_SF },
25591   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv2df2,         "__builtin_ia32_vfrczpd",     IX86_BUILTIN_VFRCZPD,     UNKNOWN,      (int)MULTI_ARG_1_DF },
25592   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv8sf2,         "__builtin_ia32_vfrczps256",  IX86_BUILTIN_VFRCZPS256,  UNKNOWN,      (int)MULTI_ARG_1_SF2 },
25593   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4df2,         "__builtin_ia32_vfrczpd256",  IX86_BUILTIN_VFRCZPD256,  UNKNOWN,      (int)MULTI_ARG_1_DF2 },
25594
25595   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbw,           "__builtin_ia32_vphaddbw",    IX86_BUILTIN_VPHADDBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25596   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbd,           "__builtin_ia32_vphaddbd",    IX86_BUILTIN_VPHADDBD,    UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
25597   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbq,           "__builtin_ia32_vphaddbq",    IX86_BUILTIN_VPHADDBQ,    UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
25598   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwd,           "__builtin_ia32_vphaddwd",    IX86_BUILTIN_VPHADDWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25599   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwq,           "__builtin_ia32_vphaddwq",    IX86_BUILTIN_VPHADDWQ,    UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
25600   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadddq,           "__builtin_ia32_vphadddq",    IX86_BUILTIN_VPHADDDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25601   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubw,          "__builtin_ia32_vphaddubw",   IX86_BUILTIN_VPHADDUBW,   UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25602   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubd,          "__builtin_ia32_vphaddubd",   IX86_BUILTIN_VPHADDUBD,   UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
25603   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubq,          "__builtin_ia32_vphaddubq",   IX86_BUILTIN_VPHADDUBQ,   UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
25604   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwd,          "__builtin_ia32_vphadduwd",   IX86_BUILTIN_VPHADDUWD,   UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25605   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwq,          "__builtin_ia32_vphadduwq",   IX86_BUILTIN_VPHADDUWQ,   UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
25606   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddudq,          "__builtin_ia32_vphaddudq",   IX86_BUILTIN_VPHADDUDQ,   UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25607   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubbw,           "__builtin_ia32_vphsubbw",    IX86_BUILTIN_VPHSUBBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25608   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubwd,           "__builtin_ia32_vphsubwd",    IX86_BUILTIN_VPHSUBWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25609   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubdq,           "__builtin_ia32_vphsubdq",    IX86_BUILTIN_VPHSUBDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25610
25611   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomeqb",    IX86_BUILTIN_VPCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
25612   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneb",    IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
25613   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneqb",   IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
25614   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomltb",    IX86_BUILTIN_VPCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
25615   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomleb",    IX86_BUILTIN_VPCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
25616   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgtb",    IX86_BUILTIN_VPCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
25617   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgeb",    IX86_BUILTIN_VPCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
25618
25619   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomeqw",    IX86_BUILTIN_VPCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
25620   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomnew",    IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
25621   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomneqw",   IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
25622   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomltw",    IX86_BUILTIN_VPCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
25623   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomlew",    IX86_BUILTIN_VPCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
25624   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgtw",    IX86_BUILTIN_VPCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
25625   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgew",    IX86_BUILTIN_VPCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
25626
25627   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomeqd",    IX86_BUILTIN_VPCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
25628   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomned",    IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
25629   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomneqd",   IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
25630   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomltd",    IX86_BUILTIN_VPCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
25631   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomled",    IX86_BUILTIN_VPCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
25632   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomgtd",    IX86_BUILTIN_VPCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
25633   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomged",    IX86_BUILTIN_VPCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
25634
25635   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomeqq",    IX86_BUILTIN_VPCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
25636   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneq",    IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
25637   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneqq",   IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
25638   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomltq",    IX86_BUILTIN_VPCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
25639   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomleq",    IX86_BUILTIN_VPCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
25640   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgtq",    IX86_BUILTIN_VPCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
25641   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgeq",    IX86_BUILTIN_VPCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
25642
25643   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomequb",   IX86_BUILTIN_VPCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
25644   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomneub",   IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
25645   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomnequb",  IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
25646   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomltub",   IX86_BUILTIN_VPCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
25647   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomleub",   IX86_BUILTIN_VPCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
25648   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgtub",   IX86_BUILTIN_VPCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
25649   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgeub",   IX86_BUILTIN_VPCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
25650
25651   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomequw",   IX86_BUILTIN_VPCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
25652   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomneuw",   IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
25653   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomnequw",  IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
25654   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomltuw",   IX86_BUILTIN_VPCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
25655   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomleuw",   IX86_BUILTIN_VPCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
25656   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgtuw",   IX86_BUILTIN_VPCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
25657   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgeuw",   IX86_BUILTIN_VPCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
25658
25659   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomequd",   IX86_BUILTIN_VPCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
25660   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomneud",   IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
25661   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomnequd",  IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
25662   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomltud",   IX86_BUILTIN_VPCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
25663   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomleud",   IX86_BUILTIN_VPCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
25664   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgtud",   IX86_BUILTIN_VPCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
25665   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgeud",   IX86_BUILTIN_VPCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
25666
25667   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomequq",   IX86_BUILTIN_VPCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
25668   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomneuq",   IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
25669   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomnequq",  IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
25670   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomltuq",   IX86_BUILTIN_VPCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
25671   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomleuq",   IX86_BUILTIN_VPCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
25672   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgtuq",   IX86_BUILTIN_VPCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
25673   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgeuq",   IX86_BUILTIN_VPCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
25674
25675   { 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 },
25676   { 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 },
25677   { 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 },
25678   { 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 },
25679   { 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 },
25680   { 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 },
25681   { 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 },
25682   { 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 },
25683
25684   { 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 },
25685   { 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 },
25686   { 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 },
25687   { 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 },
25688   { 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 },
25689   { 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 },
25690   { 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 },
25691   { 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 },
25692
25693   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v2df3,     "__builtin_ia32_vpermil2pd",  IX86_BUILTIN_VPERMIL2PD, UNKNOWN, (int)MULTI_ARG_4_DF2_DI_I },
25694   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v4sf3,     "__builtin_ia32_vpermil2ps",  IX86_BUILTIN_VPERMIL2PS, UNKNOWN, (int)MULTI_ARG_4_SF2_SI_I },
25695   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v4df3,     "__builtin_ia32_vpermil2pd256", IX86_BUILTIN_VPERMIL2PD256, UNKNOWN, (int)MULTI_ARG_4_DF2_DI_I1 },
25696   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v8sf3,     "__builtin_ia32_vpermil2ps256", IX86_BUILTIN_VPERMIL2PS256, UNKNOWN, (int)MULTI_ARG_4_SF2_SI_I1 },
25697
25698 };
25699
25700 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
25701    in the current target ISA to allow the user to compile particular modules
25702    with different target specific options that differ from the command line
25703    options.  */
25704 static void
25705 ix86_init_mmx_sse_builtins (void)
25706 {
25707   const struct builtin_description * d;
25708   enum ix86_builtin_func_type ftype;
25709   size_t i;
25710
25711   /* Add all special builtins with variable number of operands.  */
25712   for (i = 0, d = bdesc_special_args;
25713        i < ARRAY_SIZE (bdesc_special_args);
25714        i++, d++)
25715     {
25716       if (d->name == 0)
25717         continue;
25718
25719       ftype = (enum ix86_builtin_func_type) d->flag;
25720       def_builtin (d->mask, d->name, ftype, d->code);
25721     }
25722
25723   /* Add all builtins with variable number of operands.  */
25724   for (i = 0, d = bdesc_args;
25725        i < ARRAY_SIZE (bdesc_args);
25726        i++, d++)
25727     {
25728       if (d->name == 0)
25729         continue;
25730
25731       ftype = (enum ix86_builtin_func_type) d->flag;
25732       def_builtin_const (d->mask, d->name, ftype, d->code);
25733     }
25734
25735   /* pcmpestr[im] insns.  */
25736   for (i = 0, d = bdesc_pcmpestr;
25737        i < ARRAY_SIZE (bdesc_pcmpestr);
25738        i++, d++)
25739     {
25740       if (d->code == IX86_BUILTIN_PCMPESTRM128)
25741         ftype = V16QI_FTYPE_V16QI_INT_V16QI_INT_INT;
25742       else
25743         ftype = INT_FTYPE_V16QI_INT_V16QI_INT_INT;
25744       def_builtin_const (d->mask, d->name, ftype, d->code);
25745     }
25746
25747   /* pcmpistr[im] insns.  */
25748   for (i = 0, d = bdesc_pcmpistr;
25749        i < ARRAY_SIZE (bdesc_pcmpistr);
25750        i++, d++)
25751     {
25752       if (d->code == IX86_BUILTIN_PCMPISTRM128)
25753         ftype = V16QI_FTYPE_V16QI_V16QI_INT;
25754       else
25755         ftype = INT_FTYPE_V16QI_V16QI_INT;
25756       def_builtin_const (d->mask, d->name, ftype, d->code);
25757     }
25758
25759   /* comi/ucomi insns.  */
25760   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
25761     {
25762       if (d->mask == OPTION_MASK_ISA_SSE2)
25763         ftype = INT_FTYPE_V2DF_V2DF;
25764       else
25765         ftype = INT_FTYPE_V4SF_V4SF;
25766       def_builtin_const (d->mask, d->name, ftype, d->code);
25767     }
25768
25769   /* SSE */
25770   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr",
25771                VOID_FTYPE_UNSIGNED, IX86_BUILTIN_LDMXCSR);
25772   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr",
25773                UNSIGNED_FTYPE_VOID, IX86_BUILTIN_STMXCSR);
25774
25775   /* SSE or 3DNow!A */
25776   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25777                "__builtin_ia32_maskmovq", VOID_FTYPE_V8QI_V8QI_PCHAR,
25778                IX86_BUILTIN_MASKMOVQ);
25779
25780   /* SSE2 */
25781   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu",
25782                VOID_FTYPE_V16QI_V16QI_PCHAR, IX86_BUILTIN_MASKMOVDQU);
25783
25784   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush",
25785                VOID_FTYPE_PCVOID, IX86_BUILTIN_CLFLUSH);
25786   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence",
25787                             VOID_FTYPE_VOID, IX86_BUILTIN_MFENCE);
25788
25789   /* SSE3.  */
25790   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor",
25791                VOID_FTYPE_PCVOID_UNSIGNED_UNSIGNED, IX86_BUILTIN_MONITOR);
25792   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait",
25793                VOID_FTYPE_UNSIGNED_UNSIGNED, IX86_BUILTIN_MWAIT);
25794
25795   /* AES */
25796   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128",
25797                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENC128);
25798   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128",
25799                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENCLAST128);
25800   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128",
25801                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDEC128);
25802   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128",
25803                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDECLAST128);
25804   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128",
25805                      V2DI_FTYPE_V2DI, IX86_BUILTIN_AESIMC128);
25806   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128",
25807                      V2DI_FTYPE_V2DI_INT, IX86_BUILTIN_AESKEYGENASSIST128);
25808
25809   /* PCLMUL */
25810   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128",
25811                      V2DI_FTYPE_V2DI_V2DI_INT, IX86_BUILTIN_PCLMULQDQ128);
25812
25813   /* RDRND */
25814   def_builtin (OPTION_MASK_ISA_RDRND, "__builtin_ia32_rdrand16_step",
25815                INT_FTYPE_PUSHORT, IX86_BUILTIN_RDRAND16_STEP);
25816   def_builtin (OPTION_MASK_ISA_RDRND, "__builtin_ia32_rdrand32_step",
25817                INT_FTYPE_PUNSIGNED, IX86_BUILTIN_RDRAND32_STEP);
25818   def_builtin (OPTION_MASK_ISA_RDRND | OPTION_MASK_ISA_64BIT,
25819                "__builtin_ia32_rdrand64_step", INT_FTYPE_PULONGLONG,
25820                IX86_BUILTIN_RDRAND64_STEP);
25821
25822   /* MMX access to the vec_init patterns.  */
25823   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si",
25824                      V2SI_FTYPE_INT_INT, IX86_BUILTIN_VEC_INIT_V2SI);
25825
25826   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi",
25827                      V4HI_FTYPE_HI_HI_HI_HI,
25828                      IX86_BUILTIN_VEC_INIT_V4HI);
25829
25830   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi",
25831                      V8QI_FTYPE_QI_QI_QI_QI_QI_QI_QI_QI,
25832                      IX86_BUILTIN_VEC_INIT_V8QI);
25833
25834   /* Access to the vec_extract patterns.  */
25835   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df",
25836                      DOUBLE_FTYPE_V2DF_INT, IX86_BUILTIN_VEC_EXT_V2DF);
25837   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di",
25838                      DI_FTYPE_V2DI_INT, IX86_BUILTIN_VEC_EXT_V2DI);
25839   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf",
25840                      FLOAT_FTYPE_V4SF_INT, IX86_BUILTIN_VEC_EXT_V4SF);
25841   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si",
25842                      SI_FTYPE_V4SI_INT, IX86_BUILTIN_VEC_EXT_V4SI);
25843   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi",
25844                      HI_FTYPE_V8HI_INT, IX86_BUILTIN_VEC_EXT_V8HI);
25845
25846   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25847                      "__builtin_ia32_vec_ext_v4hi",
25848                      HI_FTYPE_V4HI_INT, IX86_BUILTIN_VEC_EXT_V4HI);
25849
25850   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si",
25851                      SI_FTYPE_V2SI_INT, IX86_BUILTIN_VEC_EXT_V2SI);
25852
25853   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi",
25854                      QI_FTYPE_V16QI_INT, IX86_BUILTIN_VEC_EXT_V16QI);
25855
25856   /* Access to the vec_set patterns.  */
25857   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT,
25858                      "__builtin_ia32_vec_set_v2di",
25859                      V2DI_FTYPE_V2DI_DI_INT, IX86_BUILTIN_VEC_SET_V2DI);
25860
25861   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf",
25862                      V4SF_FTYPE_V4SF_FLOAT_INT, IX86_BUILTIN_VEC_SET_V4SF);
25863
25864   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si",
25865                      V4SI_FTYPE_V4SI_SI_INT, IX86_BUILTIN_VEC_SET_V4SI);
25866
25867   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi",
25868                      V8HI_FTYPE_V8HI_HI_INT, IX86_BUILTIN_VEC_SET_V8HI);
25869
25870   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25871                      "__builtin_ia32_vec_set_v4hi",
25872                      V4HI_FTYPE_V4HI_HI_INT, IX86_BUILTIN_VEC_SET_V4HI);
25873
25874   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi",
25875                      V16QI_FTYPE_V16QI_QI_INT, IX86_BUILTIN_VEC_SET_V16QI);
25876
25877   /* Add FMA4 multi-arg argument instructions */
25878   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
25879     {
25880       if (d->name == 0)
25881         continue;
25882
25883       ftype = (enum ix86_builtin_func_type) d->flag;
25884       def_builtin_const (d->mask, d->name, ftype, d->code);
25885     }
25886 }
25887
25888 /* Internal method for ix86_init_builtins.  */
25889
25890 static void
25891 ix86_init_builtins_va_builtins_abi (void)
25892 {
25893   tree ms_va_ref, sysv_va_ref;
25894   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
25895   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
25896   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
25897   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
25898
25899   if (!TARGET_64BIT)
25900     return;
25901   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
25902   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
25903   ms_va_ref = build_reference_type (ms_va_list_type_node);
25904   sysv_va_ref =
25905     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
25906
25907   fnvoid_va_end_ms =
25908     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
25909   fnvoid_va_start_ms =
25910     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
25911   fnvoid_va_end_sysv =
25912     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
25913   fnvoid_va_start_sysv =
25914     build_varargs_function_type_list (void_type_node, sysv_va_ref,
25915                                        NULL_TREE);
25916   fnvoid_va_copy_ms =
25917     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
25918                               NULL_TREE);
25919   fnvoid_va_copy_sysv =
25920     build_function_type_list (void_type_node, sysv_va_ref,
25921                               sysv_va_ref, NULL_TREE);
25922
25923   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
25924                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
25925   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
25926                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
25927   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
25928                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
25929   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
25930                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25931   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
25932                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25933   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
25934                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25935 }
25936
25937 static void
25938 ix86_init_builtin_types (void)
25939 {
25940   tree float128_type_node, float80_type_node;
25941
25942   /* The __float80 type.  */
25943   float80_type_node = long_double_type_node;
25944   if (TYPE_MODE (float80_type_node) != XFmode)
25945     {
25946       /* The __float80 type.  */
25947       float80_type_node = make_node (REAL_TYPE);
25948
25949       TYPE_PRECISION (float80_type_node) = 80;
25950       layout_type (float80_type_node);
25951     }
25952   lang_hooks.types.register_builtin_type (float80_type_node, "__float80");
25953
25954   /* The __float128 type.  */
25955   float128_type_node = make_node (REAL_TYPE);
25956   TYPE_PRECISION (float128_type_node) = 128;
25957   layout_type (float128_type_node);
25958   lang_hooks.types.register_builtin_type (float128_type_node, "__float128");
25959
25960   /* This macro is built by i386-builtin-types.awk.  */
25961   DEFINE_BUILTIN_PRIMITIVE_TYPES;
25962 }
25963
25964 static void
25965 ix86_init_builtins (void)
25966 {
25967   tree t;
25968
25969   ix86_init_builtin_types ();
25970
25971   /* TFmode support builtins.  */
25972   def_builtin_const (0, "__builtin_infq",
25973                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_INFQ);
25974   def_builtin_const (0, "__builtin_huge_valq",
25975                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_HUGE_VALQ);
25976
25977   /* We will expand them to normal call if SSE2 isn't available since
25978      they are used by libgcc. */
25979   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128);
25980   t = add_builtin_function ("__builtin_fabsq", t, IX86_BUILTIN_FABSQ,
25981                             BUILT_IN_MD, "__fabstf2", NULL_TREE);
25982   TREE_READONLY (t) = 1;
25983   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = t;
25984
25985   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128_FLOAT128);
25986   t = add_builtin_function ("__builtin_copysignq", t, IX86_BUILTIN_COPYSIGNQ,
25987                             BUILT_IN_MD, "__copysigntf3", NULL_TREE);
25988   TREE_READONLY (t) = 1;
25989   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = t;
25990
25991   ix86_init_mmx_sse_builtins ();
25992
25993   if (TARGET_64BIT)
25994     ix86_init_builtins_va_builtins_abi ();
25995
25996 #ifdef SUBTARGET_INIT_BUILTINS
25997   SUBTARGET_INIT_BUILTINS;
25998 #endif
25999 }
26000
26001 /* Return the ix86 builtin for CODE.  */
26002
26003 static tree
26004 ix86_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
26005 {
26006   if (code >= IX86_BUILTIN_MAX)
26007     return error_mark_node;
26008
26009   return ix86_builtins[code];
26010 }
26011
26012 /* Errors in the source file can cause expand_expr to return const0_rtx
26013    where we expect a vector.  To avoid crashing, use one of the vector
26014    clear instructions.  */
26015 static rtx
26016 safe_vector_operand (rtx x, enum machine_mode mode)
26017 {
26018   if (x == const0_rtx)
26019     x = CONST0_RTX (mode);
26020   return x;
26021 }
26022
26023 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
26024
26025 static rtx
26026 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
26027 {
26028   rtx pat;
26029   tree arg0 = CALL_EXPR_ARG (exp, 0);
26030   tree arg1 = CALL_EXPR_ARG (exp, 1);
26031   rtx op0 = expand_normal (arg0);
26032   rtx op1 = expand_normal (arg1);
26033   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26034   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
26035   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
26036
26037   if (VECTOR_MODE_P (mode0))
26038     op0 = safe_vector_operand (op0, mode0);
26039   if (VECTOR_MODE_P (mode1))
26040     op1 = safe_vector_operand (op1, mode1);
26041
26042   if (optimize || !target
26043       || GET_MODE (target) != tmode
26044       || !insn_data[icode].operand[0].predicate (target, tmode))
26045     target = gen_reg_rtx (tmode);
26046
26047   if (GET_MODE (op1) == SImode && mode1 == TImode)
26048     {
26049       rtx x = gen_reg_rtx (V4SImode);
26050       emit_insn (gen_sse2_loadd (x, op1));
26051       op1 = gen_lowpart (TImode, x);
26052     }
26053
26054   if (!insn_data[icode].operand[1].predicate (op0, mode0))
26055     op0 = copy_to_mode_reg (mode0, op0);
26056   if (!insn_data[icode].operand[2].predicate (op1, mode1))
26057     op1 = copy_to_mode_reg (mode1, op1);
26058
26059   pat = GEN_FCN (icode) (target, op0, op1);
26060   if (! pat)
26061     return 0;
26062
26063   emit_insn (pat);
26064
26065   return target;
26066 }
26067
26068 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
26069
26070 static rtx
26071 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
26072                                enum ix86_builtin_func_type m_type,
26073                                enum rtx_code sub_code)
26074 {
26075   rtx pat;
26076   int i;
26077   int nargs;
26078   bool comparison_p = false;
26079   bool tf_p = false;
26080   bool last_arg_constant = false;
26081   int num_memory = 0;
26082   struct {
26083     rtx op;
26084     enum machine_mode mode;
26085   } args[4];
26086
26087   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26088
26089   switch (m_type)
26090     {
26091     case MULTI_ARG_4_DF2_DI_I:
26092     case MULTI_ARG_4_DF2_DI_I1:
26093     case MULTI_ARG_4_SF2_SI_I:
26094     case MULTI_ARG_4_SF2_SI_I1:
26095       nargs = 4;
26096       last_arg_constant = true;
26097       break;
26098
26099     case MULTI_ARG_3_SF:
26100     case MULTI_ARG_3_DF:
26101     case MULTI_ARG_3_SF2:
26102     case MULTI_ARG_3_DF2:
26103     case MULTI_ARG_3_DI:
26104     case MULTI_ARG_3_SI:
26105     case MULTI_ARG_3_SI_DI:
26106     case MULTI_ARG_3_HI:
26107     case MULTI_ARG_3_HI_SI:
26108     case MULTI_ARG_3_QI:
26109     case MULTI_ARG_3_DI2:
26110     case MULTI_ARG_3_SI2:
26111     case MULTI_ARG_3_HI2:
26112     case MULTI_ARG_3_QI2:
26113       nargs = 3;
26114       break;
26115
26116     case MULTI_ARG_2_SF:
26117     case MULTI_ARG_2_DF:
26118     case MULTI_ARG_2_DI:
26119     case MULTI_ARG_2_SI:
26120     case MULTI_ARG_2_HI:
26121     case MULTI_ARG_2_QI:
26122       nargs = 2;
26123       break;
26124
26125     case MULTI_ARG_2_DI_IMM:
26126     case MULTI_ARG_2_SI_IMM:
26127     case MULTI_ARG_2_HI_IMM:
26128     case MULTI_ARG_2_QI_IMM:
26129       nargs = 2;
26130       last_arg_constant = true;
26131       break;
26132
26133     case MULTI_ARG_1_SF:
26134     case MULTI_ARG_1_DF:
26135     case MULTI_ARG_1_SF2:
26136     case MULTI_ARG_1_DF2:
26137     case MULTI_ARG_1_DI:
26138     case MULTI_ARG_1_SI:
26139     case MULTI_ARG_1_HI:
26140     case MULTI_ARG_1_QI:
26141     case MULTI_ARG_1_SI_DI:
26142     case MULTI_ARG_1_HI_DI:
26143     case MULTI_ARG_1_HI_SI:
26144     case MULTI_ARG_1_QI_DI:
26145     case MULTI_ARG_1_QI_SI:
26146     case MULTI_ARG_1_QI_HI:
26147       nargs = 1;
26148       break;
26149
26150     case MULTI_ARG_2_DI_CMP:
26151     case MULTI_ARG_2_SI_CMP:
26152     case MULTI_ARG_2_HI_CMP:
26153     case MULTI_ARG_2_QI_CMP:
26154       nargs = 2;
26155       comparison_p = true;
26156       break;
26157
26158     case MULTI_ARG_2_SF_TF:
26159     case MULTI_ARG_2_DF_TF:
26160     case MULTI_ARG_2_DI_TF:
26161     case MULTI_ARG_2_SI_TF:
26162     case MULTI_ARG_2_HI_TF:
26163     case MULTI_ARG_2_QI_TF:
26164       nargs = 2;
26165       tf_p = true;
26166       break;
26167
26168     default:
26169       gcc_unreachable ();
26170     }
26171
26172   if (optimize || !target
26173       || GET_MODE (target) != tmode
26174       || !insn_data[icode].operand[0].predicate (target, tmode))
26175     target = gen_reg_rtx (tmode);
26176
26177   gcc_assert (nargs <= 4);
26178
26179   for (i = 0; i < nargs; i++)
26180     {
26181       tree arg = CALL_EXPR_ARG (exp, i);
26182       rtx op = expand_normal (arg);
26183       int adjust = (comparison_p) ? 1 : 0;
26184       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
26185
26186       if (last_arg_constant && i == nargs-1)
26187         {
26188           if (!CONST_INT_P (op))
26189             {
26190               error ("last argument must be an immediate");
26191               return gen_reg_rtx (tmode);
26192             }
26193         }
26194       else
26195         {
26196           if (VECTOR_MODE_P (mode))
26197             op = safe_vector_operand (op, mode);
26198
26199           /* If we aren't optimizing, only allow one memory operand to be
26200              generated.  */
26201           if (memory_operand (op, mode))
26202             num_memory++;
26203
26204           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
26205
26206           if (optimize
26207               || !insn_data[icode].operand[i+adjust+1].predicate (op, mode)
26208               || num_memory > 1)
26209             op = force_reg (mode, op);
26210         }
26211
26212       args[i].op = op;
26213       args[i].mode = mode;
26214     }
26215
26216   switch (nargs)
26217     {
26218     case 1:
26219       pat = GEN_FCN (icode) (target, args[0].op);
26220       break;
26221
26222     case 2:
26223       if (tf_p)
26224         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
26225                                GEN_INT ((int)sub_code));
26226       else if (! comparison_p)
26227         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
26228       else
26229         {
26230           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
26231                                        args[0].op,
26232                                        args[1].op);
26233
26234           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
26235         }
26236       break;
26237
26238     case 3:
26239       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
26240       break;
26241
26242     case 4:
26243       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op, args[3].op);
26244       break;
26245
26246     default:
26247       gcc_unreachable ();
26248     }
26249
26250   if (! pat)
26251     return 0;
26252
26253   emit_insn (pat);
26254   return target;
26255 }
26256
26257 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
26258    insns with vec_merge.  */
26259
26260 static rtx
26261 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
26262                                     rtx target)
26263 {
26264   rtx pat;
26265   tree arg0 = CALL_EXPR_ARG (exp, 0);
26266   rtx op1, op0 = expand_normal (arg0);
26267   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26268   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
26269
26270   if (optimize || !target
26271       || GET_MODE (target) != tmode
26272       || !insn_data[icode].operand[0].predicate (target, tmode))
26273     target = gen_reg_rtx (tmode);
26274
26275   if (VECTOR_MODE_P (mode0))
26276     op0 = safe_vector_operand (op0, mode0);
26277
26278   if ((optimize && !register_operand (op0, mode0))
26279       || !insn_data[icode].operand[1].predicate (op0, mode0))
26280     op0 = copy_to_mode_reg (mode0, op0);
26281
26282   op1 = op0;
26283   if (!insn_data[icode].operand[2].predicate (op1, mode0))
26284     op1 = copy_to_mode_reg (mode0, op1);
26285
26286   pat = GEN_FCN (icode) (target, op0, op1);
26287   if (! pat)
26288     return 0;
26289   emit_insn (pat);
26290   return target;
26291 }
26292
26293 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
26294
26295 static rtx
26296 ix86_expand_sse_compare (const struct builtin_description *d,
26297                          tree exp, rtx target, bool swap)
26298 {
26299   rtx pat;
26300   tree arg0 = CALL_EXPR_ARG (exp, 0);
26301   tree arg1 = CALL_EXPR_ARG (exp, 1);
26302   rtx op0 = expand_normal (arg0);
26303   rtx op1 = expand_normal (arg1);
26304   rtx op2;
26305   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
26306   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
26307   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
26308   enum rtx_code comparison = d->comparison;
26309
26310   if (VECTOR_MODE_P (mode0))
26311     op0 = safe_vector_operand (op0, mode0);
26312   if (VECTOR_MODE_P (mode1))
26313     op1 = safe_vector_operand (op1, mode1);
26314
26315   /* Swap operands if we have a comparison that isn't available in
26316      hardware.  */
26317   if (swap)
26318     {
26319       rtx tmp = gen_reg_rtx (mode1);
26320       emit_move_insn (tmp, op1);
26321       op1 = op0;
26322       op0 = tmp;
26323     }
26324
26325   if (optimize || !target
26326       || GET_MODE (target) != tmode
26327       || !insn_data[d->icode].operand[0].predicate (target, tmode))
26328     target = gen_reg_rtx (tmode);
26329
26330   if ((optimize && !register_operand (op0, mode0))
26331       || !insn_data[d->icode].operand[1].predicate (op0, mode0))
26332     op0 = copy_to_mode_reg (mode0, op0);
26333   if ((optimize && !register_operand (op1, mode1))
26334       || !insn_data[d->icode].operand[2].predicate (op1, mode1))
26335     op1 = copy_to_mode_reg (mode1, op1);
26336
26337   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
26338   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
26339   if (! pat)
26340     return 0;
26341   emit_insn (pat);
26342   return target;
26343 }
26344
26345 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
26346
26347 static rtx
26348 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
26349                       rtx target)
26350 {
26351   rtx pat;
26352   tree arg0 = CALL_EXPR_ARG (exp, 0);
26353   tree arg1 = CALL_EXPR_ARG (exp, 1);
26354   rtx op0 = expand_normal (arg0);
26355   rtx op1 = expand_normal (arg1);
26356   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
26357   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
26358   enum rtx_code comparison = d->comparison;
26359
26360   if (VECTOR_MODE_P (mode0))
26361     op0 = safe_vector_operand (op0, mode0);
26362   if (VECTOR_MODE_P (mode1))
26363     op1 = safe_vector_operand (op1, mode1);
26364
26365   /* Swap operands if we have a comparison that isn't available in
26366      hardware.  */
26367   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
26368     {
26369       rtx tmp = op1;
26370       op1 = op0;
26371       op0 = tmp;
26372     }
26373
26374   target = gen_reg_rtx (SImode);
26375   emit_move_insn (target, const0_rtx);
26376   target = gen_rtx_SUBREG (QImode, target, 0);
26377
26378   if ((optimize && !register_operand (op0, mode0))
26379       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26380     op0 = copy_to_mode_reg (mode0, op0);
26381   if ((optimize && !register_operand (op1, mode1))
26382       || !insn_data[d->icode].operand[1].predicate (op1, mode1))
26383     op1 = copy_to_mode_reg (mode1, op1);
26384
26385   pat = GEN_FCN (d->icode) (op0, op1);
26386   if (! pat)
26387     return 0;
26388   emit_insn (pat);
26389   emit_insn (gen_rtx_SET (VOIDmode,
26390                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26391                           gen_rtx_fmt_ee (comparison, QImode,
26392                                           SET_DEST (pat),
26393                                           const0_rtx)));
26394
26395   return SUBREG_REG (target);
26396 }
26397
26398 /* Subroutine of ix86_expand_args_builtin to take care of round insns.  */
26399
26400 static rtx
26401 ix86_expand_sse_round (const struct builtin_description *d, tree exp,
26402                        rtx target)
26403 {
26404   rtx pat;
26405   tree arg0 = CALL_EXPR_ARG (exp, 0);
26406   rtx op1, op0 = expand_normal (arg0);
26407   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
26408   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
26409
26410   if (optimize || target == 0
26411       || GET_MODE (target) != tmode
26412       || !insn_data[d->icode].operand[0].predicate (target, tmode))
26413     target = gen_reg_rtx (tmode);
26414
26415   if (VECTOR_MODE_P (mode0))
26416     op0 = safe_vector_operand (op0, mode0);
26417
26418   if ((optimize && !register_operand (op0, mode0))
26419       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26420     op0 = copy_to_mode_reg (mode0, op0);
26421
26422   op1 = GEN_INT (d->comparison);
26423
26424   pat = GEN_FCN (d->icode) (target, op0, op1);
26425   if (! pat)
26426     return 0;
26427   emit_insn (pat);
26428   return target;
26429 }
26430
26431 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
26432
26433 static rtx
26434 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
26435                        rtx target)
26436 {
26437   rtx pat;
26438   tree arg0 = CALL_EXPR_ARG (exp, 0);
26439   tree arg1 = CALL_EXPR_ARG (exp, 1);
26440   rtx op0 = expand_normal (arg0);
26441   rtx op1 = expand_normal (arg1);
26442   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
26443   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
26444   enum rtx_code comparison = d->comparison;
26445
26446   if (VECTOR_MODE_P (mode0))
26447     op0 = safe_vector_operand (op0, mode0);
26448   if (VECTOR_MODE_P (mode1))
26449     op1 = safe_vector_operand (op1, mode1);
26450
26451   target = gen_reg_rtx (SImode);
26452   emit_move_insn (target, const0_rtx);
26453   target = gen_rtx_SUBREG (QImode, target, 0);
26454
26455   if ((optimize && !register_operand (op0, mode0))
26456       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26457     op0 = copy_to_mode_reg (mode0, op0);
26458   if ((optimize && !register_operand (op1, mode1))
26459       || !insn_data[d->icode].operand[1].predicate (op1, mode1))
26460     op1 = copy_to_mode_reg (mode1, op1);
26461
26462   pat = GEN_FCN (d->icode) (op0, op1);
26463   if (! pat)
26464     return 0;
26465   emit_insn (pat);
26466   emit_insn (gen_rtx_SET (VOIDmode,
26467                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26468                           gen_rtx_fmt_ee (comparison, QImode,
26469                                           SET_DEST (pat),
26470                                           const0_rtx)));
26471
26472   return SUBREG_REG (target);
26473 }
26474
26475 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
26476
26477 static rtx
26478 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
26479                           tree exp, rtx target)
26480 {
26481   rtx pat;
26482   tree arg0 = CALL_EXPR_ARG (exp, 0);
26483   tree arg1 = CALL_EXPR_ARG (exp, 1);
26484   tree arg2 = CALL_EXPR_ARG (exp, 2);
26485   tree arg3 = CALL_EXPR_ARG (exp, 3);
26486   tree arg4 = CALL_EXPR_ARG (exp, 4);
26487   rtx scratch0, scratch1;
26488   rtx op0 = expand_normal (arg0);
26489   rtx op1 = expand_normal (arg1);
26490   rtx op2 = expand_normal (arg2);
26491   rtx op3 = expand_normal (arg3);
26492   rtx op4 = expand_normal (arg4);
26493   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
26494
26495   tmode0 = insn_data[d->icode].operand[0].mode;
26496   tmode1 = insn_data[d->icode].operand[1].mode;
26497   modev2 = insn_data[d->icode].operand[2].mode;
26498   modei3 = insn_data[d->icode].operand[3].mode;
26499   modev4 = insn_data[d->icode].operand[4].mode;
26500   modei5 = insn_data[d->icode].operand[5].mode;
26501   modeimm = insn_data[d->icode].operand[6].mode;
26502
26503   if (VECTOR_MODE_P (modev2))
26504     op0 = safe_vector_operand (op0, modev2);
26505   if (VECTOR_MODE_P (modev4))
26506     op2 = safe_vector_operand (op2, modev4);
26507
26508   if (!insn_data[d->icode].operand[2].predicate (op0, modev2))
26509     op0 = copy_to_mode_reg (modev2, op0);
26510   if (!insn_data[d->icode].operand[3].predicate (op1, modei3))
26511     op1 = copy_to_mode_reg (modei3, op1);
26512   if ((optimize && !register_operand (op2, modev4))
26513       || !insn_data[d->icode].operand[4].predicate (op2, modev4))
26514     op2 = copy_to_mode_reg (modev4, op2);
26515   if (!insn_data[d->icode].operand[5].predicate (op3, modei5))
26516     op3 = copy_to_mode_reg (modei5, op3);
26517
26518   if (!insn_data[d->icode].operand[6].predicate (op4, modeimm))
26519     {
26520       error ("the fifth argument must be a 8-bit immediate");
26521       return const0_rtx;
26522     }
26523
26524   if (d->code == IX86_BUILTIN_PCMPESTRI128)
26525     {
26526       if (optimize || !target
26527           || GET_MODE (target) != tmode0
26528           || !insn_data[d->icode].operand[0].predicate (target, tmode0))
26529         target = gen_reg_rtx (tmode0);
26530
26531       scratch1 = gen_reg_rtx (tmode1);
26532
26533       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
26534     }
26535   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
26536     {
26537       if (optimize || !target
26538           || GET_MODE (target) != tmode1
26539           || !insn_data[d->icode].operand[1].predicate (target, tmode1))
26540         target = gen_reg_rtx (tmode1);
26541
26542       scratch0 = gen_reg_rtx (tmode0);
26543
26544       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
26545     }
26546   else
26547     {
26548       gcc_assert (d->flag);
26549
26550       scratch0 = gen_reg_rtx (tmode0);
26551       scratch1 = gen_reg_rtx (tmode1);
26552
26553       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
26554     }
26555
26556   if (! pat)
26557     return 0;
26558
26559   emit_insn (pat);
26560
26561   if (d->flag)
26562     {
26563       target = gen_reg_rtx (SImode);
26564       emit_move_insn (target, const0_rtx);
26565       target = gen_rtx_SUBREG (QImode, target, 0);
26566
26567       emit_insn
26568         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26569                       gen_rtx_fmt_ee (EQ, QImode,
26570                                       gen_rtx_REG ((enum machine_mode) d->flag,
26571                                                    FLAGS_REG),
26572                                       const0_rtx)));
26573       return SUBREG_REG (target);
26574     }
26575   else
26576     return target;
26577 }
26578
26579
26580 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
26581
26582 static rtx
26583 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
26584                           tree exp, rtx target)
26585 {
26586   rtx pat;
26587   tree arg0 = CALL_EXPR_ARG (exp, 0);
26588   tree arg1 = CALL_EXPR_ARG (exp, 1);
26589   tree arg2 = CALL_EXPR_ARG (exp, 2);
26590   rtx scratch0, scratch1;
26591   rtx op0 = expand_normal (arg0);
26592   rtx op1 = expand_normal (arg1);
26593   rtx op2 = expand_normal (arg2);
26594   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
26595
26596   tmode0 = insn_data[d->icode].operand[0].mode;
26597   tmode1 = insn_data[d->icode].operand[1].mode;
26598   modev2 = insn_data[d->icode].operand[2].mode;
26599   modev3 = insn_data[d->icode].operand[3].mode;
26600   modeimm = insn_data[d->icode].operand[4].mode;
26601
26602   if (VECTOR_MODE_P (modev2))
26603     op0 = safe_vector_operand (op0, modev2);
26604   if (VECTOR_MODE_P (modev3))
26605     op1 = safe_vector_operand (op1, modev3);
26606
26607   if (!insn_data[d->icode].operand[2].predicate (op0, modev2))
26608     op0 = copy_to_mode_reg (modev2, op0);
26609   if ((optimize && !register_operand (op1, modev3))
26610       || !insn_data[d->icode].operand[3].predicate (op1, modev3))
26611     op1 = copy_to_mode_reg (modev3, op1);
26612
26613   if (!insn_data[d->icode].operand[4].predicate (op2, modeimm))
26614     {
26615       error ("the third argument must be a 8-bit immediate");
26616       return const0_rtx;
26617     }
26618
26619   if (d->code == IX86_BUILTIN_PCMPISTRI128)
26620     {
26621       if (optimize || !target
26622           || GET_MODE (target) != tmode0
26623           || !insn_data[d->icode].operand[0].predicate (target, tmode0))
26624         target = gen_reg_rtx (tmode0);
26625
26626       scratch1 = gen_reg_rtx (tmode1);
26627
26628       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
26629     }
26630   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
26631     {
26632       if (optimize || !target
26633           || GET_MODE (target) != tmode1
26634           || !insn_data[d->icode].operand[1].predicate (target, tmode1))
26635         target = gen_reg_rtx (tmode1);
26636
26637       scratch0 = gen_reg_rtx (tmode0);
26638
26639       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
26640     }
26641   else
26642     {
26643       gcc_assert (d->flag);
26644
26645       scratch0 = gen_reg_rtx (tmode0);
26646       scratch1 = gen_reg_rtx (tmode1);
26647
26648       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
26649     }
26650
26651   if (! pat)
26652     return 0;
26653
26654   emit_insn (pat);
26655
26656   if (d->flag)
26657     {
26658       target = gen_reg_rtx (SImode);
26659       emit_move_insn (target, const0_rtx);
26660       target = gen_rtx_SUBREG (QImode, target, 0);
26661
26662       emit_insn
26663         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26664                       gen_rtx_fmt_ee (EQ, QImode,
26665                                       gen_rtx_REG ((enum machine_mode) d->flag,
26666                                                    FLAGS_REG),
26667                                       const0_rtx)));
26668       return SUBREG_REG (target);
26669     }
26670   else
26671     return target;
26672 }
26673
26674 /* Subroutine of ix86_expand_builtin to take care of insns with
26675    variable number of operands.  */
26676
26677 static rtx
26678 ix86_expand_args_builtin (const struct builtin_description *d,
26679                           tree exp, rtx target)
26680 {
26681   rtx pat, real_target;
26682   unsigned int i, nargs;
26683   unsigned int nargs_constant = 0;
26684   int num_memory = 0;
26685   struct
26686     {
26687       rtx op;
26688       enum machine_mode mode;
26689     } args[4];
26690   bool last_arg_count = false;
26691   enum insn_code icode = d->icode;
26692   const struct insn_data_d *insn_p = &insn_data[icode];
26693   enum machine_mode tmode = insn_p->operand[0].mode;
26694   enum machine_mode rmode = VOIDmode;
26695   bool swap = false;
26696   enum rtx_code comparison = d->comparison;
26697
26698   switch ((enum ix86_builtin_func_type) d->flag)
26699     {
26700     case V2DF_FTYPE_V2DF_ROUND:
26701     case V4DF_FTYPE_V4DF_ROUND:
26702     case V4SF_FTYPE_V4SF_ROUND:
26703     case V8SF_FTYPE_V8SF_ROUND:
26704       return ix86_expand_sse_round (d, exp, target);
26705     case INT_FTYPE_V8SF_V8SF_PTEST:
26706     case INT_FTYPE_V4DI_V4DI_PTEST:
26707     case INT_FTYPE_V4DF_V4DF_PTEST:
26708     case INT_FTYPE_V4SF_V4SF_PTEST:
26709     case INT_FTYPE_V2DI_V2DI_PTEST:
26710     case INT_FTYPE_V2DF_V2DF_PTEST:
26711       return ix86_expand_sse_ptest (d, exp, target);
26712     case FLOAT128_FTYPE_FLOAT128:
26713     case FLOAT_FTYPE_FLOAT:
26714     case INT_FTYPE_INT:
26715     case UINT64_FTYPE_INT:
26716     case UINT16_FTYPE_UINT16:
26717     case INT64_FTYPE_INT64:
26718     case INT64_FTYPE_V4SF:
26719     case INT64_FTYPE_V2DF:
26720     case INT_FTYPE_V16QI:
26721     case INT_FTYPE_V8QI:
26722     case INT_FTYPE_V8SF:
26723     case INT_FTYPE_V4DF:
26724     case INT_FTYPE_V4SF:
26725     case INT_FTYPE_V2DF:
26726     case V16QI_FTYPE_V16QI:
26727     case V8SI_FTYPE_V8SF:
26728     case V8SI_FTYPE_V4SI:
26729     case V8HI_FTYPE_V8HI:
26730     case V8HI_FTYPE_V16QI:
26731     case V8QI_FTYPE_V8QI:
26732     case V8SF_FTYPE_V8SF:
26733     case V8SF_FTYPE_V8SI:
26734     case V8SF_FTYPE_V4SF:
26735     case V8SF_FTYPE_V8HI:
26736     case V4SI_FTYPE_V4SI:
26737     case V4SI_FTYPE_V16QI:
26738     case V4SI_FTYPE_V4SF:
26739     case V4SI_FTYPE_V8SI:
26740     case V4SI_FTYPE_V8HI:
26741     case V4SI_FTYPE_V4DF:
26742     case V4SI_FTYPE_V2DF:
26743     case V4HI_FTYPE_V4HI:
26744     case V4DF_FTYPE_V4DF:
26745     case V4DF_FTYPE_V4SI:
26746     case V4DF_FTYPE_V4SF:
26747     case V4DF_FTYPE_V2DF:
26748     case V4SF_FTYPE_V4SF:
26749     case V4SF_FTYPE_V4SI:
26750     case V4SF_FTYPE_V8SF:
26751     case V4SF_FTYPE_V4DF:
26752     case V4SF_FTYPE_V8HI:
26753     case V4SF_FTYPE_V2DF:
26754     case V2DI_FTYPE_V2DI:
26755     case V2DI_FTYPE_V16QI:
26756     case V2DI_FTYPE_V8HI:
26757     case V2DI_FTYPE_V4SI:
26758     case V2DF_FTYPE_V2DF:
26759     case V2DF_FTYPE_V4SI:
26760     case V2DF_FTYPE_V4DF:
26761     case V2DF_FTYPE_V4SF:
26762     case V2DF_FTYPE_V2SI:
26763     case V2SI_FTYPE_V2SI:
26764     case V2SI_FTYPE_V4SF:
26765     case V2SI_FTYPE_V2SF:
26766     case V2SI_FTYPE_V2DF:
26767     case V2SF_FTYPE_V2SF:
26768     case V2SF_FTYPE_V2SI:
26769       nargs = 1;
26770       break;
26771     case V4SF_FTYPE_V4SF_VEC_MERGE:
26772     case V2DF_FTYPE_V2DF_VEC_MERGE:
26773       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
26774     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
26775     case V16QI_FTYPE_V16QI_V16QI:
26776     case V16QI_FTYPE_V8HI_V8HI:
26777     case V8QI_FTYPE_V8QI_V8QI:
26778     case V8QI_FTYPE_V4HI_V4HI:
26779     case V8HI_FTYPE_V8HI_V8HI:
26780     case V8HI_FTYPE_V16QI_V16QI:
26781     case V8HI_FTYPE_V4SI_V4SI:
26782     case V8SF_FTYPE_V8SF_V8SF:
26783     case V8SF_FTYPE_V8SF_V8SI:
26784     case V4SI_FTYPE_V4SI_V4SI:
26785     case V4SI_FTYPE_V8HI_V8HI:
26786     case V4SI_FTYPE_V4SF_V4SF:
26787     case V4SI_FTYPE_V2DF_V2DF:
26788     case V4HI_FTYPE_V4HI_V4HI:
26789     case V4HI_FTYPE_V8QI_V8QI:
26790     case V4HI_FTYPE_V2SI_V2SI:
26791     case V4DF_FTYPE_V4DF_V4DF:
26792     case V4DF_FTYPE_V4DF_V4DI:
26793     case V4SF_FTYPE_V4SF_V4SF:
26794     case V4SF_FTYPE_V4SF_V4SI:
26795     case V4SF_FTYPE_V4SF_V2SI:
26796     case V4SF_FTYPE_V4SF_V2DF:
26797     case V4SF_FTYPE_V4SF_DI:
26798     case V4SF_FTYPE_V4SF_SI:
26799     case V2DI_FTYPE_V2DI_V2DI:
26800     case V2DI_FTYPE_V16QI_V16QI:
26801     case V2DI_FTYPE_V4SI_V4SI:
26802     case V2DI_FTYPE_V2DI_V16QI:
26803     case V2DI_FTYPE_V2DF_V2DF:
26804     case V2SI_FTYPE_V2SI_V2SI:
26805     case V2SI_FTYPE_V4HI_V4HI:
26806     case V2SI_FTYPE_V2SF_V2SF:
26807     case V2DF_FTYPE_V2DF_V2DF:
26808     case V2DF_FTYPE_V2DF_V4SF:
26809     case V2DF_FTYPE_V2DF_V2DI:
26810     case V2DF_FTYPE_V2DF_DI:
26811     case V2DF_FTYPE_V2DF_SI:
26812     case V2SF_FTYPE_V2SF_V2SF:
26813     case V1DI_FTYPE_V1DI_V1DI:
26814     case V1DI_FTYPE_V8QI_V8QI:
26815     case V1DI_FTYPE_V2SI_V2SI:
26816       if (comparison == UNKNOWN)
26817         return ix86_expand_binop_builtin (icode, exp, target);
26818       nargs = 2;
26819       break;
26820     case V4SF_FTYPE_V4SF_V4SF_SWAP:
26821     case V2DF_FTYPE_V2DF_V2DF_SWAP:
26822       gcc_assert (comparison != UNKNOWN);
26823       nargs = 2;
26824       swap = true;
26825       break;
26826     case V8HI_FTYPE_V8HI_V8HI_COUNT:
26827     case V8HI_FTYPE_V8HI_SI_COUNT:
26828     case V4SI_FTYPE_V4SI_V4SI_COUNT:
26829     case V4SI_FTYPE_V4SI_SI_COUNT:
26830     case V4HI_FTYPE_V4HI_V4HI_COUNT:
26831     case V4HI_FTYPE_V4HI_SI_COUNT:
26832     case V2DI_FTYPE_V2DI_V2DI_COUNT:
26833     case V2DI_FTYPE_V2DI_SI_COUNT:
26834     case V2SI_FTYPE_V2SI_V2SI_COUNT:
26835     case V2SI_FTYPE_V2SI_SI_COUNT:
26836     case V1DI_FTYPE_V1DI_V1DI_COUNT:
26837     case V1DI_FTYPE_V1DI_SI_COUNT:
26838       nargs = 2;
26839       last_arg_count = true;
26840       break;
26841     case UINT64_FTYPE_UINT64_UINT64:
26842     case UINT_FTYPE_UINT_UINT:
26843     case UINT_FTYPE_UINT_USHORT:
26844     case UINT_FTYPE_UINT_UCHAR:
26845     case UINT16_FTYPE_UINT16_INT:
26846     case UINT8_FTYPE_UINT8_INT:
26847       nargs = 2;
26848       break;
26849     case V2DI_FTYPE_V2DI_INT_CONVERT:
26850       nargs = 2;
26851       rmode = V1TImode;
26852       nargs_constant = 1;
26853       break;
26854     case V8HI_FTYPE_V8HI_INT:
26855     case V8HI_FTYPE_V8SF_INT:
26856     case V8HI_FTYPE_V4SF_INT:
26857     case V8SF_FTYPE_V8SF_INT:
26858     case V4SI_FTYPE_V4SI_INT:
26859     case V4SI_FTYPE_V8SI_INT:
26860     case V4HI_FTYPE_V4HI_INT:
26861     case V4DF_FTYPE_V4DF_INT:
26862     case V4SF_FTYPE_V4SF_INT:
26863     case V4SF_FTYPE_V8SF_INT:
26864     case V2DI_FTYPE_V2DI_INT:
26865     case V2DF_FTYPE_V2DF_INT:
26866     case V2DF_FTYPE_V4DF_INT:
26867       nargs = 2;
26868       nargs_constant = 1;
26869       break;
26870     case V16QI_FTYPE_V16QI_V16QI_V16QI:
26871     case V8SF_FTYPE_V8SF_V8SF_V8SF:
26872     case V4DF_FTYPE_V4DF_V4DF_V4DF:
26873     case V4SF_FTYPE_V4SF_V4SF_V4SF:
26874     case V2DF_FTYPE_V2DF_V2DF_V2DF:
26875       nargs = 3;
26876       break;
26877     case V16QI_FTYPE_V16QI_V16QI_INT:
26878     case V8HI_FTYPE_V8HI_V8HI_INT:
26879     case V8SI_FTYPE_V8SI_V8SI_INT:
26880     case V8SI_FTYPE_V8SI_V4SI_INT:
26881     case V8SF_FTYPE_V8SF_V8SF_INT:
26882     case V8SF_FTYPE_V8SF_V4SF_INT:
26883     case V4SI_FTYPE_V4SI_V4SI_INT:
26884     case V4DF_FTYPE_V4DF_V4DF_INT:
26885     case V4DF_FTYPE_V4DF_V2DF_INT:
26886     case V4SF_FTYPE_V4SF_V4SF_INT:
26887     case V2DI_FTYPE_V2DI_V2DI_INT:
26888     case V2DF_FTYPE_V2DF_V2DF_INT:
26889       nargs = 3;
26890       nargs_constant = 1;
26891       break;
26892     case V2DI_FTYPE_V2DI_V2DI_INT_CONVERT:
26893       nargs = 3;
26894       rmode = V2DImode;
26895       nargs_constant = 1;
26896       break;
26897     case V1DI_FTYPE_V1DI_V1DI_INT_CONVERT:
26898       nargs = 3;
26899       rmode = DImode;
26900       nargs_constant = 1;
26901       break;
26902     case V2DI_FTYPE_V2DI_UINT_UINT:
26903       nargs = 3;
26904       nargs_constant = 2;
26905       break;
26906     case V2DF_FTYPE_V2DF_V2DF_V2DI_INT:
26907     case V4DF_FTYPE_V4DF_V4DF_V4DI_INT:
26908     case V4SF_FTYPE_V4SF_V4SF_V4SI_INT:
26909     case V8SF_FTYPE_V8SF_V8SF_V8SI_INT:
26910       nargs = 4;
26911       nargs_constant = 1;
26912       break;
26913     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
26914       nargs = 4;
26915       nargs_constant = 2;
26916       break;
26917     default:
26918       gcc_unreachable ();
26919     }
26920
26921   gcc_assert (nargs <= ARRAY_SIZE (args));
26922
26923   if (comparison != UNKNOWN)
26924     {
26925       gcc_assert (nargs == 2);
26926       return ix86_expand_sse_compare (d, exp, target, swap);
26927     }
26928
26929   if (rmode == VOIDmode || rmode == tmode)
26930     {
26931       if (optimize
26932           || target == 0
26933           || GET_MODE (target) != tmode
26934           || !insn_p->operand[0].predicate (target, tmode))
26935         target = gen_reg_rtx (tmode);
26936       real_target = target;
26937     }
26938   else
26939     {
26940       target = gen_reg_rtx (rmode);
26941       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
26942     }
26943
26944   for (i = 0; i < nargs; i++)
26945     {
26946       tree arg = CALL_EXPR_ARG (exp, i);
26947       rtx op = expand_normal (arg);
26948       enum machine_mode mode = insn_p->operand[i + 1].mode;
26949       bool match = insn_p->operand[i + 1].predicate (op, mode);
26950
26951       if (last_arg_count && (i + 1) == nargs)
26952         {
26953           /* SIMD shift insns take either an 8-bit immediate or
26954              register as count.  But builtin functions take int as
26955              count.  If count doesn't match, we put it in register.  */
26956           if (!match)
26957             {
26958               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
26959               if (!insn_p->operand[i + 1].predicate (op, mode))
26960                 op = copy_to_reg (op);
26961             }
26962         }
26963       else if ((nargs - i) <= nargs_constant)
26964         {
26965           if (!match)
26966             switch (icode)
26967               {
26968               case CODE_FOR_sse4_1_roundpd:
26969               case CODE_FOR_sse4_1_roundps:
26970               case CODE_FOR_sse4_1_roundsd:
26971               case CODE_FOR_sse4_1_roundss:
26972               case CODE_FOR_sse4_1_blendps:
26973               case CODE_FOR_avx_blendpd256:
26974               case CODE_FOR_avx_vpermilv4df:
26975               case CODE_FOR_avx_roundpd256:
26976               case CODE_FOR_avx_roundps256:
26977                 error ("the last argument must be a 4-bit immediate");
26978                 return const0_rtx;
26979
26980               case CODE_FOR_sse4_1_blendpd:
26981               case CODE_FOR_avx_vpermilv2df:
26982               case CODE_FOR_xop_vpermil2v2df3:
26983               case CODE_FOR_xop_vpermil2v4sf3:
26984               case CODE_FOR_xop_vpermil2v4df3:
26985               case CODE_FOR_xop_vpermil2v8sf3:
26986                 error ("the last argument must be a 2-bit immediate");
26987                 return const0_rtx;
26988
26989               case CODE_FOR_avx_vextractf128v4df:
26990               case CODE_FOR_avx_vextractf128v8sf:
26991               case CODE_FOR_avx_vextractf128v8si:
26992               case CODE_FOR_avx_vinsertf128v4df:
26993               case CODE_FOR_avx_vinsertf128v8sf:
26994               case CODE_FOR_avx_vinsertf128v8si:
26995                 error ("the last argument must be a 1-bit immediate");
26996                 return const0_rtx;
26997
26998               case CODE_FOR_avx_vmcmpv2df3:
26999               case CODE_FOR_avx_vmcmpv4sf3:
27000               case CODE_FOR_avx_cmpv2df3:
27001               case CODE_FOR_avx_cmpv4sf3:
27002               case CODE_FOR_avx_cmpv4df3:
27003               case CODE_FOR_avx_cmpv8sf3:
27004                 error ("the last argument must be a 5-bit immediate");
27005                 return const0_rtx;
27006
27007              default:
27008                 switch (nargs_constant)
27009                   {
27010                   case 2:
27011                     if ((nargs - i) == nargs_constant)
27012                       {
27013                         error ("the next to last argument must be an 8-bit immediate");
27014                         break;
27015                       }
27016                   case 1:
27017                     error ("the last argument must be an 8-bit immediate");
27018                     break;
27019                   default:
27020                     gcc_unreachable ();
27021                   }
27022                 return const0_rtx;
27023               }
27024         }
27025       else
27026         {
27027           if (VECTOR_MODE_P (mode))
27028             op = safe_vector_operand (op, mode);
27029
27030           /* If we aren't optimizing, only allow one memory operand to
27031              be generated.  */
27032           if (memory_operand (op, mode))
27033             num_memory++;
27034
27035           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
27036             {
27037               if (optimize || !match || num_memory > 1)
27038                 op = copy_to_mode_reg (mode, op);
27039             }
27040           else
27041             {
27042               op = copy_to_reg (op);
27043               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
27044             }
27045         }
27046
27047       args[i].op = op;
27048       args[i].mode = mode;
27049     }
27050
27051   switch (nargs)
27052     {
27053     case 1:
27054       pat = GEN_FCN (icode) (real_target, args[0].op);
27055       break;
27056     case 2:
27057       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
27058       break;
27059     case 3:
27060       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
27061                              args[2].op);
27062       break;
27063     case 4:
27064       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
27065                              args[2].op, args[3].op);
27066       break;
27067     default:
27068       gcc_unreachable ();
27069     }
27070
27071   if (! pat)
27072     return 0;
27073
27074   emit_insn (pat);
27075   return target;
27076 }
27077
27078 /* Subroutine of ix86_expand_builtin to take care of special insns
27079    with variable number of operands.  */
27080
27081 static rtx
27082 ix86_expand_special_args_builtin (const struct builtin_description *d,
27083                                     tree exp, rtx target)
27084 {
27085   tree arg;
27086   rtx pat, op;
27087   unsigned int i, nargs, arg_adjust, memory;
27088   struct
27089     {
27090       rtx op;
27091       enum machine_mode mode;
27092     } args[3];
27093   enum insn_code icode = d->icode;
27094   bool last_arg_constant = false;
27095   const struct insn_data_d *insn_p = &insn_data[icode];
27096   enum machine_mode tmode = insn_p->operand[0].mode;
27097   enum { load, store } klass;
27098
27099   switch ((enum ix86_builtin_func_type) d->flag)
27100     {
27101     case VOID_FTYPE_VOID:
27102       if (icode == CODE_FOR_avx_vzeroupper)
27103         target = GEN_INT (vzeroupper_intrinsic);
27104       emit_insn (GEN_FCN (icode) (target));
27105       return 0;
27106     case VOID_FTYPE_UINT64:
27107     case VOID_FTYPE_UNSIGNED:
27108       nargs = 0;
27109       klass = store;
27110       memory = 0;
27111       break;
27112       break;
27113     case UINT64_FTYPE_VOID:
27114     case UNSIGNED_FTYPE_VOID:
27115       nargs = 0;
27116       klass = load;
27117       memory = 0;
27118       break;
27119     case UINT64_FTYPE_PUNSIGNED:
27120     case V2DI_FTYPE_PV2DI:
27121     case V32QI_FTYPE_PCCHAR:
27122     case V16QI_FTYPE_PCCHAR:
27123     case V8SF_FTYPE_PCV4SF:
27124     case V8SF_FTYPE_PCFLOAT:
27125     case V4SF_FTYPE_PCFLOAT:
27126     case V4DF_FTYPE_PCV2DF:
27127     case V4DF_FTYPE_PCDOUBLE:
27128     case V2DF_FTYPE_PCDOUBLE:
27129     case VOID_FTYPE_PVOID:
27130       nargs = 1;
27131       klass = load;
27132       memory = 0;
27133       break;
27134     case VOID_FTYPE_PV2SF_V4SF:
27135     case VOID_FTYPE_PV4DI_V4DI:
27136     case VOID_FTYPE_PV2DI_V2DI:
27137     case VOID_FTYPE_PCHAR_V32QI:
27138     case VOID_FTYPE_PCHAR_V16QI:
27139     case VOID_FTYPE_PFLOAT_V8SF:
27140     case VOID_FTYPE_PFLOAT_V4SF:
27141     case VOID_FTYPE_PDOUBLE_V4DF:
27142     case VOID_FTYPE_PDOUBLE_V2DF:
27143     case VOID_FTYPE_PULONGLONG_ULONGLONG:
27144     case VOID_FTYPE_PINT_INT:
27145       nargs = 1;
27146       klass = store;
27147       /* Reserve memory operand for target.  */
27148       memory = ARRAY_SIZE (args);
27149       break;
27150     case V4SF_FTYPE_V4SF_PCV2SF:
27151     case V2DF_FTYPE_V2DF_PCDOUBLE:
27152       nargs = 2;
27153       klass = load;
27154       memory = 1;
27155       break;
27156     case V8SF_FTYPE_PCV8SF_V8SI:
27157     case V4DF_FTYPE_PCV4DF_V4DI:
27158     case V4SF_FTYPE_PCV4SF_V4SI:
27159     case V2DF_FTYPE_PCV2DF_V2DI:
27160       nargs = 2;
27161       klass = load;
27162       memory = 0;
27163       break;
27164     case VOID_FTYPE_PV8SF_V8SI_V8SF:
27165     case VOID_FTYPE_PV4DF_V4DI_V4DF:
27166     case VOID_FTYPE_PV4SF_V4SI_V4SF:
27167     case VOID_FTYPE_PV2DF_V2DI_V2DF:
27168       nargs = 2;
27169       klass = store;
27170       /* Reserve memory operand for target.  */
27171       memory = ARRAY_SIZE (args);
27172       break;
27173     case VOID_FTYPE_UINT_UINT_UINT:
27174     case VOID_FTYPE_UINT64_UINT_UINT:
27175     case UCHAR_FTYPE_UINT_UINT_UINT:
27176     case UCHAR_FTYPE_UINT64_UINT_UINT:
27177       nargs = 3;
27178       klass = load;
27179       memory = ARRAY_SIZE (args);
27180       last_arg_constant = true;
27181       break;
27182     default:
27183       gcc_unreachable ();
27184     }
27185
27186   gcc_assert (nargs <= ARRAY_SIZE (args));
27187
27188   if (klass == store)
27189     {
27190       arg = CALL_EXPR_ARG (exp, 0);
27191       op = expand_normal (arg);
27192       gcc_assert (target == 0);
27193       if (memory)
27194         target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
27195       else
27196         target = force_reg (tmode, op);
27197       arg_adjust = 1;
27198     }
27199   else
27200     {
27201       arg_adjust = 0;
27202       if (optimize
27203           || target == 0
27204           || GET_MODE (target) != tmode
27205           || !insn_p->operand[0].predicate (target, tmode))
27206         target = gen_reg_rtx (tmode);
27207     }
27208
27209   for (i = 0; i < nargs; i++)
27210     {
27211       enum machine_mode mode = insn_p->operand[i + 1].mode;
27212       bool match;
27213
27214       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
27215       op = expand_normal (arg);
27216       match = insn_p->operand[i + 1].predicate (op, mode);
27217
27218       if (last_arg_constant && (i + 1) == nargs)
27219         {
27220           if (!match)
27221             {
27222               if (icode == CODE_FOR_lwp_lwpvalsi3
27223                   || icode == CODE_FOR_lwp_lwpinssi3
27224                   || icode == CODE_FOR_lwp_lwpvaldi3
27225                   || icode == CODE_FOR_lwp_lwpinsdi3)
27226                 error ("the last argument must be a 32-bit immediate");
27227               else
27228                 error ("the last argument must be an 8-bit immediate");
27229               return const0_rtx;
27230             }
27231         }
27232       else
27233         {
27234           if (i == memory)
27235             {
27236               /* This must be the memory operand.  */
27237               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
27238               gcc_assert (GET_MODE (op) == mode
27239                           || GET_MODE (op) == VOIDmode);
27240             }
27241           else
27242             {
27243               /* This must be register.  */
27244               if (VECTOR_MODE_P (mode))
27245                 op = safe_vector_operand (op, mode);
27246
27247               gcc_assert (GET_MODE (op) == mode
27248                           || GET_MODE (op) == VOIDmode);
27249               op = copy_to_mode_reg (mode, op);
27250             }
27251         }
27252
27253       args[i].op = op;
27254       args[i].mode = mode;
27255     }
27256
27257   switch (nargs)
27258     {
27259     case 0:
27260       pat = GEN_FCN (icode) (target);
27261       break;
27262     case 1:
27263       pat = GEN_FCN (icode) (target, args[0].op);
27264       break;
27265     case 2:
27266       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
27267       break;
27268     case 3:
27269       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
27270       break;
27271     default:
27272       gcc_unreachable ();
27273     }
27274
27275   if (! pat)
27276     return 0;
27277   emit_insn (pat);
27278   return klass == store ? 0 : target;
27279 }
27280
27281 /* Return the integer constant in ARG.  Constrain it to be in the range
27282    of the subparts of VEC_TYPE; issue an error if not.  */
27283
27284 static int
27285 get_element_number (tree vec_type, tree arg)
27286 {
27287   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
27288
27289   if (!host_integerp (arg, 1)
27290       || (elt = tree_low_cst (arg, 1), elt > max))
27291     {
27292       error ("selector must be an integer constant in the range 0..%wi", max);
27293       return 0;
27294     }
27295
27296   return elt;
27297 }
27298
27299 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27300    ix86_expand_vector_init.  We DO have language-level syntax for this, in
27301    the form of  (type){ init-list }.  Except that since we can't place emms
27302    instructions from inside the compiler, we can't allow the use of MMX
27303    registers unless the user explicitly asks for it.  So we do *not* define
27304    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
27305    we have builtins invoked by mmintrin.h that gives us license to emit
27306    these sorts of instructions.  */
27307
27308 static rtx
27309 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
27310 {
27311   enum machine_mode tmode = TYPE_MODE (type);
27312   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
27313   int i, n_elt = GET_MODE_NUNITS (tmode);
27314   rtvec v = rtvec_alloc (n_elt);
27315
27316   gcc_assert (VECTOR_MODE_P (tmode));
27317   gcc_assert (call_expr_nargs (exp) == n_elt);
27318
27319   for (i = 0; i < n_elt; ++i)
27320     {
27321       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
27322       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
27323     }
27324
27325   if (!target || !register_operand (target, tmode))
27326     target = gen_reg_rtx (tmode);
27327
27328   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
27329   return target;
27330 }
27331
27332 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27333    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
27334    had a language-level syntax for referencing vector elements.  */
27335
27336 static rtx
27337 ix86_expand_vec_ext_builtin (tree exp, rtx target)
27338 {
27339   enum machine_mode tmode, mode0;
27340   tree arg0, arg1;
27341   int elt;
27342   rtx op0;
27343
27344   arg0 = CALL_EXPR_ARG (exp, 0);
27345   arg1 = CALL_EXPR_ARG (exp, 1);
27346
27347   op0 = expand_normal (arg0);
27348   elt = get_element_number (TREE_TYPE (arg0), arg1);
27349
27350   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
27351   mode0 = TYPE_MODE (TREE_TYPE (arg0));
27352   gcc_assert (VECTOR_MODE_P (mode0));
27353
27354   op0 = force_reg (mode0, op0);
27355
27356   if (optimize || !target || !register_operand (target, tmode))
27357     target = gen_reg_rtx (tmode);
27358
27359   ix86_expand_vector_extract (true, target, op0, elt);
27360
27361   return target;
27362 }
27363
27364 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27365    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
27366    a language-level syntax for referencing vector elements.  */
27367
27368 static rtx
27369 ix86_expand_vec_set_builtin (tree exp)
27370 {
27371   enum machine_mode tmode, mode1;
27372   tree arg0, arg1, arg2;
27373   int elt;
27374   rtx op0, op1, target;
27375
27376   arg0 = CALL_EXPR_ARG (exp, 0);
27377   arg1 = CALL_EXPR_ARG (exp, 1);
27378   arg2 = CALL_EXPR_ARG (exp, 2);
27379
27380   tmode = TYPE_MODE (TREE_TYPE (arg0));
27381   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
27382   gcc_assert (VECTOR_MODE_P (tmode));
27383
27384   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
27385   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
27386   elt = get_element_number (TREE_TYPE (arg0), arg2);
27387
27388   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
27389     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
27390
27391   op0 = force_reg (tmode, op0);
27392   op1 = force_reg (mode1, op1);
27393
27394   /* OP0 is the source of these builtin functions and shouldn't be
27395      modified.  Create a copy, use it and return it as target.  */
27396   target = gen_reg_rtx (tmode);
27397   emit_move_insn (target, op0);
27398   ix86_expand_vector_set (true, target, op1, elt);
27399
27400   return target;
27401 }
27402
27403 /* Expand an expression EXP that calls a built-in function,
27404    with result going to TARGET if that's convenient
27405    (and in mode MODE if that's convenient).
27406    SUBTARGET may be used as the target for computing one of EXP's operands.
27407    IGNORE is nonzero if the value is to be ignored.  */
27408
27409 static rtx
27410 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
27411                      enum machine_mode mode ATTRIBUTE_UNUSED,
27412                      int ignore ATTRIBUTE_UNUSED)
27413 {
27414   const struct builtin_description *d;
27415   size_t i;
27416   enum insn_code icode;
27417   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
27418   tree arg0, arg1, arg2;
27419   rtx op0, op1, op2, pat;
27420   enum machine_mode mode0, mode1, mode2;
27421   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
27422
27423   /* Determine whether the builtin function is available under the current ISA.
27424      Originally the builtin was not created if it wasn't applicable to the
27425      current ISA based on the command line switches.  With function specific
27426      options, we need to check in the context of the function making the call
27427      whether it is supported.  */
27428   if (ix86_builtins_isa[fcode].isa
27429       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
27430     {
27431       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
27432                                        NULL, NULL, false);
27433
27434       if (!opts)
27435         error ("%qE needs unknown isa option", fndecl);
27436       else
27437         {
27438           gcc_assert (opts != NULL);
27439           error ("%qE needs isa option %s", fndecl, opts);
27440           free (opts);
27441         }
27442       return const0_rtx;
27443     }
27444
27445   switch (fcode)
27446     {
27447     case IX86_BUILTIN_MASKMOVQ:
27448     case IX86_BUILTIN_MASKMOVDQU:
27449       icode = (fcode == IX86_BUILTIN_MASKMOVQ
27450                ? CODE_FOR_mmx_maskmovq
27451                : CODE_FOR_sse2_maskmovdqu);
27452       /* Note the arg order is different from the operand order.  */
27453       arg1 = CALL_EXPR_ARG (exp, 0);
27454       arg2 = CALL_EXPR_ARG (exp, 1);
27455       arg0 = CALL_EXPR_ARG (exp, 2);
27456       op0 = expand_normal (arg0);
27457       op1 = expand_normal (arg1);
27458       op2 = expand_normal (arg2);
27459       mode0 = insn_data[icode].operand[0].mode;
27460       mode1 = insn_data[icode].operand[1].mode;
27461       mode2 = insn_data[icode].operand[2].mode;
27462
27463       op0 = force_reg (Pmode, op0);
27464       op0 = gen_rtx_MEM (mode1, op0);
27465
27466       if (!insn_data[icode].operand[0].predicate (op0, mode0))
27467         op0 = copy_to_mode_reg (mode0, op0);
27468       if (!insn_data[icode].operand[1].predicate (op1, mode1))
27469         op1 = copy_to_mode_reg (mode1, op1);
27470       if (!insn_data[icode].operand[2].predicate (op2, mode2))
27471         op2 = copy_to_mode_reg (mode2, op2);
27472       pat = GEN_FCN (icode) (op0, op1, op2);
27473       if (! pat)
27474         return 0;
27475       emit_insn (pat);
27476       return 0;
27477
27478     case IX86_BUILTIN_LDMXCSR:
27479       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
27480       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
27481       emit_move_insn (target, op0);
27482       emit_insn (gen_sse_ldmxcsr (target));
27483       return 0;
27484
27485     case IX86_BUILTIN_STMXCSR:
27486       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
27487       emit_insn (gen_sse_stmxcsr (target));
27488       return copy_to_mode_reg (SImode, target);
27489
27490     case IX86_BUILTIN_CLFLUSH:
27491         arg0 = CALL_EXPR_ARG (exp, 0);
27492         op0 = expand_normal (arg0);
27493         icode = CODE_FOR_sse2_clflush;
27494         if (!insn_data[icode].operand[0].predicate (op0, Pmode))
27495             op0 = copy_to_mode_reg (Pmode, op0);
27496
27497         emit_insn (gen_sse2_clflush (op0));
27498         return 0;
27499
27500     case IX86_BUILTIN_MONITOR:
27501       arg0 = CALL_EXPR_ARG (exp, 0);
27502       arg1 = CALL_EXPR_ARG (exp, 1);
27503       arg2 = CALL_EXPR_ARG (exp, 2);
27504       op0 = expand_normal (arg0);
27505       op1 = expand_normal (arg1);
27506       op2 = expand_normal (arg2);
27507       if (!REG_P (op0))
27508         op0 = copy_to_mode_reg (Pmode, op0);
27509       if (!REG_P (op1))
27510         op1 = copy_to_mode_reg (SImode, op1);
27511       if (!REG_P (op2))
27512         op2 = copy_to_mode_reg (SImode, op2);
27513       emit_insn (ix86_gen_monitor (op0, op1, op2));
27514       return 0;
27515
27516     case IX86_BUILTIN_MWAIT:
27517       arg0 = CALL_EXPR_ARG (exp, 0);
27518       arg1 = CALL_EXPR_ARG (exp, 1);
27519       op0 = expand_normal (arg0);
27520       op1 = expand_normal (arg1);
27521       if (!REG_P (op0))
27522         op0 = copy_to_mode_reg (SImode, op0);
27523       if (!REG_P (op1))
27524         op1 = copy_to_mode_reg (SImode, op1);
27525       emit_insn (gen_sse3_mwait (op0, op1));
27526       return 0;
27527
27528     case IX86_BUILTIN_VEC_INIT_V2SI:
27529     case IX86_BUILTIN_VEC_INIT_V4HI:
27530     case IX86_BUILTIN_VEC_INIT_V8QI:
27531       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
27532
27533     case IX86_BUILTIN_VEC_EXT_V2DF:
27534     case IX86_BUILTIN_VEC_EXT_V2DI:
27535     case IX86_BUILTIN_VEC_EXT_V4SF:
27536     case IX86_BUILTIN_VEC_EXT_V4SI:
27537     case IX86_BUILTIN_VEC_EXT_V8HI:
27538     case IX86_BUILTIN_VEC_EXT_V2SI:
27539     case IX86_BUILTIN_VEC_EXT_V4HI:
27540     case IX86_BUILTIN_VEC_EXT_V16QI:
27541       return ix86_expand_vec_ext_builtin (exp, target);
27542
27543     case IX86_BUILTIN_VEC_SET_V2DI:
27544     case IX86_BUILTIN_VEC_SET_V4SF:
27545     case IX86_BUILTIN_VEC_SET_V4SI:
27546     case IX86_BUILTIN_VEC_SET_V8HI:
27547     case IX86_BUILTIN_VEC_SET_V4HI:
27548     case IX86_BUILTIN_VEC_SET_V16QI:
27549       return ix86_expand_vec_set_builtin (exp);
27550
27551     case IX86_BUILTIN_VEC_PERM_V2DF:
27552     case IX86_BUILTIN_VEC_PERM_V4SF:
27553     case IX86_BUILTIN_VEC_PERM_V2DI:
27554     case IX86_BUILTIN_VEC_PERM_V4SI:
27555     case IX86_BUILTIN_VEC_PERM_V8HI:
27556     case IX86_BUILTIN_VEC_PERM_V16QI:
27557     case IX86_BUILTIN_VEC_PERM_V2DI_U:
27558     case IX86_BUILTIN_VEC_PERM_V4SI_U:
27559     case IX86_BUILTIN_VEC_PERM_V8HI_U:
27560     case IX86_BUILTIN_VEC_PERM_V16QI_U:
27561     case IX86_BUILTIN_VEC_PERM_V4DF:
27562     case IX86_BUILTIN_VEC_PERM_V8SF:
27563       return ix86_expand_vec_perm_builtin (exp);
27564
27565     case IX86_BUILTIN_INFQ:
27566     case IX86_BUILTIN_HUGE_VALQ:
27567       {
27568         REAL_VALUE_TYPE inf;
27569         rtx tmp;
27570
27571         real_inf (&inf);
27572         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
27573
27574         tmp = validize_mem (force_const_mem (mode, tmp));
27575
27576         if (target == 0)
27577           target = gen_reg_rtx (mode);
27578
27579         emit_move_insn (target, tmp);
27580         return target;
27581       }
27582
27583     case IX86_BUILTIN_LLWPCB:
27584       arg0 = CALL_EXPR_ARG (exp, 0);
27585       op0 = expand_normal (arg0);
27586       icode = CODE_FOR_lwp_llwpcb;
27587       if (!insn_data[icode].operand[0].predicate (op0, Pmode))
27588         op0 = copy_to_mode_reg (Pmode, op0);
27589       emit_insn (gen_lwp_llwpcb (op0));
27590       return 0;
27591
27592     case IX86_BUILTIN_SLWPCB:
27593       icode = CODE_FOR_lwp_slwpcb;
27594       if (!target
27595           || !insn_data[icode].operand[0].predicate (target, Pmode))
27596         target = gen_reg_rtx (Pmode);
27597       emit_insn (gen_lwp_slwpcb (target));
27598       return target;
27599
27600     case IX86_BUILTIN_BEXTRI32:
27601     case IX86_BUILTIN_BEXTRI64:
27602       arg0 = CALL_EXPR_ARG (exp, 0);
27603       arg1 = CALL_EXPR_ARG (exp, 1);
27604       op0 = expand_normal (arg0);
27605       op1 = expand_normal (arg1);
27606       icode = (fcode == IX86_BUILTIN_BEXTRI32
27607           ? CODE_FOR_tbm_bextri_si
27608           : CODE_FOR_tbm_bextri_di);
27609       if (!CONST_INT_P (op1))
27610         {
27611           error ("last argument must be an immediate");
27612           return const0_rtx;
27613         }
27614       else
27615         {
27616           unsigned char length = (INTVAL (op1) >> 8) & 0xFF;
27617           unsigned char lsb_index = INTVAL (op1) & 0xFF;
27618           op1 = GEN_INT (length);
27619           op2 = GEN_INT (lsb_index);
27620           pat = GEN_FCN (icode) (target, op0, op1, op2);
27621           if (pat)
27622             emit_insn (pat);
27623           return target;
27624         }
27625
27626     case IX86_BUILTIN_RDRAND16_STEP:
27627       icode = CODE_FOR_rdrandhi_1;
27628       mode0 = HImode;
27629       goto rdrand_step;
27630
27631     case IX86_BUILTIN_RDRAND32_STEP:
27632       icode = CODE_FOR_rdrandsi_1;
27633       mode0 = SImode;
27634       goto rdrand_step;
27635
27636     case IX86_BUILTIN_RDRAND64_STEP:
27637       icode = CODE_FOR_rdranddi_1;
27638       mode0 = DImode;
27639
27640 rdrand_step:
27641       op0 = gen_reg_rtx (mode0);
27642       emit_insn (GEN_FCN (icode) (op0));
27643
27644       op1 = gen_reg_rtx (SImode);
27645       emit_move_insn (op1, CONST1_RTX (SImode));
27646
27647       /* Emit SImode conditional move.  */
27648       if (mode0 == HImode)
27649         {
27650           op2 = gen_reg_rtx (SImode);
27651           emit_insn (gen_zero_extendhisi2 (op2, op0));
27652         }
27653       else if (mode0 == SImode)
27654         op2 = op0;
27655       else
27656         op2 = gen_rtx_SUBREG (SImode, op0, 0);
27657
27658       pat = gen_rtx_GEU (VOIDmode, gen_rtx_REG (CCCmode, FLAGS_REG),
27659                          const0_rtx);
27660       emit_insn (gen_rtx_SET (VOIDmode, op1,
27661                               gen_rtx_IF_THEN_ELSE (SImode, pat, op2, op1)));
27662       emit_move_insn (target, op1);
27663
27664       arg0 = CALL_EXPR_ARG (exp, 0);
27665       op1 = expand_normal (arg0);
27666       if (!address_operand (op1, VOIDmode))
27667         op1 = copy_addr_to_reg (op1);
27668       emit_move_insn (gen_rtx_MEM (mode0, op1), op0);
27669       return target;
27670
27671     default:
27672       break;
27673     }
27674
27675   for (i = 0, d = bdesc_special_args;
27676        i < ARRAY_SIZE (bdesc_special_args);
27677        i++, d++)
27678     if (d->code == fcode)
27679       return ix86_expand_special_args_builtin (d, exp, target);
27680
27681   for (i = 0, d = bdesc_args;
27682        i < ARRAY_SIZE (bdesc_args);
27683        i++, d++)
27684     if (d->code == fcode)
27685       switch (fcode)
27686         {
27687         case IX86_BUILTIN_FABSQ:
27688         case IX86_BUILTIN_COPYSIGNQ:
27689           if (!TARGET_SSE2)
27690             /* Emit a normal call if SSE2 isn't available.  */
27691             return expand_call (exp, target, ignore);
27692         default:
27693           return ix86_expand_args_builtin (d, exp, target);
27694         }
27695
27696   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
27697     if (d->code == fcode)
27698       return ix86_expand_sse_comi (d, exp, target);
27699
27700   for (i = 0, d = bdesc_pcmpestr;
27701        i < ARRAY_SIZE (bdesc_pcmpestr);
27702        i++, d++)
27703     if (d->code == fcode)
27704       return ix86_expand_sse_pcmpestr (d, exp, target);
27705
27706   for (i = 0, d = bdesc_pcmpistr;
27707        i < ARRAY_SIZE (bdesc_pcmpistr);
27708        i++, d++)
27709     if (d->code == fcode)
27710       return ix86_expand_sse_pcmpistr (d, exp, target);
27711
27712   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
27713     if (d->code == fcode)
27714       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
27715                                             (enum ix86_builtin_func_type)
27716                                             d->flag, d->comparison);
27717
27718   gcc_unreachable ();
27719 }
27720
27721 /* Returns a function decl for a vectorized version of the builtin function
27722    with builtin function code FN and the result vector type TYPE, or NULL_TREE
27723    if it is not available.  */
27724
27725 static tree
27726 ix86_builtin_vectorized_function (tree fndecl, tree type_out,
27727                                   tree type_in)
27728 {
27729   enum machine_mode in_mode, out_mode;
27730   int in_n, out_n;
27731   enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
27732
27733   if (TREE_CODE (type_out) != VECTOR_TYPE
27734       || TREE_CODE (type_in) != VECTOR_TYPE
27735       || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
27736     return NULL_TREE;
27737
27738   out_mode = TYPE_MODE (TREE_TYPE (type_out));
27739   out_n = TYPE_VECTOR_SUBPARTS (type_out);
27740   in_mode = TYPE_MODE (TREE_TYPE (type_in));
27741   in_n = TYPE_VECTOR_SUBPARTS (type_in);
27742
27743   switch (fn)
27744     {
27745     case BUILT_IN_SQRT:
27746       if (out_mode == DFmode && in_mode == DFmode)
27747         {
27748           if (out_n == 2 && in_n == 2)
27749             return ix86_builtins[IX86_BUILTIN_SQRTPD];
27750           else if (out_n == 4 && in_n == 4)
27751             return ix86_builtins[IX86_BUILTIN_SQRTPD256];
27752         }
27753       break;
27754
27755     case BUILT_IN_SQRTF:
27756       if (out_mode == SFmode && in_mode == SFmode)
27757         {
27758           if (out_n == 4 && in_n == 4)
27759             return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
27760           else if (out_n == 8 && in_n == 8)
27761             return ix86_builtins[IX86_BUILTIN_SQRTPS_NR256];
27762         }
27763       break;
27764
27765     case BUILT_IN_LRINT:
27766       if (out_mode == SImode && out_n == 4
27767           && in_mode == DFmode && in_n == 2)
27768         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
27769       break;
27770
27771     case BUILT_IN_LRINTF:
27772       if (out_mode == SImode && in_mode == SFmode)
27773         {
27774           if (out_n == 4 && in_n == 4)
27775             return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
27776           else if (out_n == 8 && in_n == 8)
27777             return ix86_builtins[IX86_BUILTIN_CVTPS2DQ256];
27778         }
27779       break;
27780
27781     case BUILT_IN_COPYSIGN:
27782       if (out_mode == DFmode && in_mode == DFmode)
27783         {
27784           if (out_n == 2 && in_n == 2)
27785             return ix86_builtins[IX86_BUILTIN_CPYSGNPD];
27786           else if (out_n == 4 && in_n == 4)
27787             return ix86_builtins[IX86_BUILTIN_CPYSGNPD256];
27788         }
27789       break;
27790
27791     case BUILT_IN_COPYSIGNF:
27792       if (out_mode == SFmode && in_mode == SFmode)
27793         {
27794           if (out_n == 4 && in_n == 4)
27795             return ix86_builtins[IX86_BUILTIN_CPYSGNPS];
27796           else if (out_n == 8 && in_n == 8)
27797             return ix86_builtins[IX86_BUILTIN_CPYSGNPS256];
27798         }
27799       break;
27800
27801     case BUILT_IN_FLOOR:
27802       /* The round insn does not trap on denormals.  */
27803       if (flag_trapping_math || !TARGET_ROUND)
27804         break;
27805
27806       if (out_mode == DFmode && in_mode == DFmode)
27807         {
27808           if (out_n == 2 && in_n == 2)
27809             return ix86_builtins[IX86_BUILTIN_FLOORPD];
27810           else if (out_n == 4 && in_n == 4)
27811             return ix86_builtins[IX86_BUILTIN_FLOORPD256];
27812         }
27813       break;
27814
27815     case BUILT_IN_FLOORF:
27816       /* The round insn does not trap on denormals.  */
27817       if (flag_trapping_math || !TARGET_ROUND)
27818         break;
27819
27820       if (out_mode == SFmode && in_mode == SFmode)
27821         {
27822           if (out_n == 4 && in_n == 4)
27823             return ix86_builtins[IX86_BUILTIN_FLOORPS];
27824           else if (out_n == 8 && in_n == 8)
27825             return ix86_builtins[IX86_BUILTIN_FLOORPS256];
27826         }
27827       break;
27828
27829     case BUILT_IN_CEIL:
27830       /* The round insn does not trap on denormals.  */
27831       if (flag_trapping_math || !TARGET_ROUND)
27832         break;
27833
27834       if (out_mode == DFmode && in_mode == DFmode)
27835         {
27836           if (out_n == 2 && in_n == 2)
27837             return ix86_builtins[IX86_BUILTIN_CEILPD];
27838           else if (out_n == 4 && in_n == 4)
27839             return ix86_builtins[IX86_BUILTIN_CEILPD256];
27840         }
27841       break;
27842
27843     case BUILT_IN_CEILF:
27844       /* The round insn does not trap on denormals.  */
27845       if (flag_trapping_math || !TARGET_ROUND)
27846         break;
27847
27848       if (out_mode == SFmode && in_mode == SFmode)
27849         {
27850           if (out_n == 4 && in_n == 4)
27851             return ix86_builtins[IX86_BUILTIN_CEILPS];
27852           else if (out_n == 8 && in_n == 8)
27853             return ix86_builtins[IX86_BUILTIN_CEILPS256];
27854         }
27855       break;
27856
27857     case BUILT_IN_TRUNC:
27858       /* The round insn does not trap on denormals.  */
27859       if (flag_trapping_math || !TARGET_ROUND)
27860         break;
27861
27862       if (out_mode == DFmode && in_mode == DFmode)
27863         {
27864           if (out_n == 2 && in_n == 2)
27865             return ix86_builtins[IX86_BUILTIN_TRUNCPD];
27866           else if (out_n == 4 && in_n == 4)
27867             return ix86_builtins[IX86_BUILTIN_TRUNCPD256];
27868         }
27869       break;
27870
27871     case BUILT_IN_TRUNCF:
27872       /* The round insn does not trap on denormals.  */
27873       if (flag_trapping_math || !TARGET_ROUND)
27874         break;
27875
27876       if (out_mode == SFmode && in_mode == SFmode)
27877         {
27878           if (out_n == 4 && in_n == 4)
27879             return ix86_builtins[IX86_BUILTIN_TRUNCPS];
27880           else if (out_n == 8 && in_n == 8)
27881             return ix86_builtins[IX86_BUILTIN_TRUNCPS256];
27882         }
27883       break;
27884
27885     case BUILT_IN_RINT:
27886       /* The round insn does not trap on denormals.  */
27887       if (flag_trapping_math || !TARGET_ROUND)
27888         break;
27889
27890       if (out_mode == DFmode && in_mode == DFmode)
27891         {
27892           if (out_n == 2 && in_n == 2)
27893             return ix86_builtins[IX86_BUILTIN_RINTPD];
27894           else if (out_n == 4 && in_n == 4)
27895             return ix86_builtins[IX86_BUILTIN_RINTPD256];
27896         }
27897       break;
27898
27899     case BUILT_IN_RINTF:
27900       /* The round insn does not trap on denormals.  */
27901       if (flag_trapping_math || !TARGET_ROUND)
27902         break;
27903
27904       if (out_mode == SFmode && in_mode == SFmode)
27905         {
27906           if (out_n == 4 && in_n == 4)
27907             return ix86_builtins[IX86_BUILTIN_RINTPS];
27908           else if (out_n == 8 && in_n == 8)
27909             return ix86_builtins[IX86_BUILTIN_RINTPS256];
27910         }
27911       break;
27912
27913     case BUILT_IN_FMA:
27914       if (out_mode == DFmode && in_mode == DFmode)
27915         {
27916           if (out_n == 2 && in_n == 2)
27917             return ix86_builtins[IX86_BUILTIN_VFMADDPD];
27918           if (out_n == 4 && in_n == 4)
27919             return ix86_builtins[IX86_BUILTIN_VFMADDPD256];
27920         }
27921       break;
27922
27923     case BUILT_IN_FMAF:
27924       if (out_mode == SFmode && in_mode == SFmode)
27925         {
27926           if (out_n == 4 && in_n == 4)
27927             return ix86_builtins[IX86_BUILTIN_VFMADDPS];
27928           if (out_n == 8 && in_n == 8)
27929             return ix86_builtins[IX86_BUILTIN_VFMADDPS256];
27930         }
27931       break;
27932
27933     default:
27934       break;
27935     }
27936
27937   /* Dispatch to a handler for a vectorization library.  */
27938   if (ix86_veclib_handler)
27939     return ix86_veclib_handler ((enum built_in_function) fn, type_out,
27940                                 type_in);
27941
27942   return NULL_TREE;
27943 }
27944
27945 /* Handler for an SVML-style interface to
27946    a library with vectorized intrinsics.  */
27947
27948 static tree
27949 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
27950 {
27951   char name[20];
27952   tree fntype, new_fndecl, args;
27953   unsigned arity;
27954   const char *bname;
27955   enum machine_mode el_mode, in_mode;
27956   int n, in_n;
27957
27958   /* The SVML is suitable for unsafe math only.  */
27959   if (!flag_unsafe_math_optimizations)
27960     return NULL_TREE;
27961
27962   el_mode = TYPE_MODE (TREE_TYPE (type_out));
27963   n = TYPE_VECTOR_SUBPARTS (type_out);
27964   in_mode = TYPE_MODE (TREE_TYPE (type_in));
27965   in_n = TYPE_VECTOR_SUBPARTS (type_in);
27966   if (el_mode != in_mode
27967       || n != in_n)
27968     return NULL_TREE;
27969
27970   switch (fn)
27971     {
27972     case BUILT_IN_EXP:
27973     case BUILT_IN_LOG:
27974     case BUILT_IN_LOG10:
27975     case BUILT_IN_POW:
27976     case BUILT_IN_TANH:
27977     case BUILT_IN_TAN:
27978     case BUILT_IN_ATAN:
27979     case BUILT_IN_ATAN2:
27980     case BUILT_IN_ATANH:
27981     case BUILT_IN_CBRT:
27982     case BUILT_IN_SINH:
27983     case BUILT_IN_SIN:
27984     case BUILT_IN_ASINH:
27985     case BUILT_IN_ASIN:
27986     case BUILT_IN_COSH:
27987     case BUILT_IN_COS:
27988     case BUILT_IN_ACOSH:
27989     case BUILT_IN_ACOS:
27990       if (el_mode != DFmode || n != 2)
27991         return NULL_TREE;
27992       break;
27993
27994     case BUILT_IN_EXPF:
27995     case BUILT_IN_LOGF:
27996     case BUILT_IN_LOG10F:
27997     case BUILT_IN_POWF:
27998     case BUILT_IN_TANHF:
27999     case BUILT_IN_TANF:
28000     case BUILT_IN_ATANF:
28001     case BUILT_IN_ATAN2F:
28002     case BUILT_IN_ATANHF:
28003     case BUILT_IN_CBRTF:
28004     case BUILT_IN_SINHF:
28005     case BUILT_IN_SINF:
28006     case BUILT_IN_ASINHF:
28007     case BUILT_IN_ASINF:
28008     case BUILT_IN_COSHF:
28009     case BUILT_IN_COSF:
28010     case BUILT_IN_ACOSHF:
28011     case BUILT_IN_ACOSF:
28012       if (el_mode != SFmode || n != 4)
28013         return NULL_TREE;
28014       break;
28015
28016     default:
28017       return NULL_TREE;
28018     }
28019
28020   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
28021
28022   if (fn == BUILT_IN_LOGF)
28023     strcpy (name, "vmlsLn4");
28024   else if (fn == BUILT_IN_LOG)
28025     strcpy (name, "vmldLn2");
28026   else if (n == 4)
28027     {
28028       sprintf (name, "vmls%s", bname+10);
28029       name[strlen (name)-1] = '4';
28030     }
28031   else
28032     sprintf (name, "vmld%s2", bname+10);
28033
28034   /* Convert to uppercase. */
28035   name[4] &= ~0x20;
28036
28037   arity = 0;
28038   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
28039        args = TREE_CHAIN (args))
28040     arity++;
28041
28042   if (arity == 1)
28043     fntype = build_function_type_list (type_out, type_in, NULL);
28044   else
28045     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
28046
28047   /* Build a function declaration for the vectorized function.  */
28048   new_fndecl = build_decl (BUILTINS_LOCATION,
28049                            FUNCTION_DECL, get_identifier (name), fntype);
28050   TREE_PUBLIC (new_fndecl) = 1;
28051   DECL_EXTERNAL (new_fndecl) = 1;
28052   DECL_IS_NOVOPS (new_fndecl) = 1;
28053   TREE_READONLY (new_fndecl) = 1;
28054
28055   return new_fndecl;
28056 }
28057
28058 /* Handler for an ACML-style interface to
28059    a library with vectorized intrinsics.  */
28060
28061 static tree
28062 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
28063 {
28064   char name[20] = "__vr.._";
28065   tree fntype, new_fndecl, args;
28066   unsigned arity;
28067   const char *bname;
28068   enum machine_mode el_mode, in_mode;
28069   int n, in_n;
28070
28071   /* The ACML is 64bits only and suitable for unsafe math only as
28072      it does not correctly support parts of IEEE with the required
28073      precision such as denormals.  */
28074   if (!TARGET_64BIT
28075       || !flag_unsafe_math_optimizations)
28076     return NULL_TREE;
28077
28078   el_mode = TYPE_MODE (TREE_TYPE (type_out));
28079   n = TYPE_VECTOR_SUBPARTS (type_out);
28080   in_mode = TYPE_MODE (TREE_TYPE (type_in));
28081   in_n = TYPE_VECTOR_SUBPARTS (type_in);
28082   if (el_mode != in_mode
28083       || n != in_n)
28084     return NULL_TREE;
28085
28086   switch (fn)
28087     {
28088     case BUILT_IN_SIN:
28089     case BUILT_IN_COS:
28090     case BUILT_IN_EXP:
28091     case BUILT_IN_LOG:
28092     case BUILT_IN_LOG2:
28093     case BUILT_IN_LOG10:
28094       name[4] = 'd';
28095       name[5] = '2';
28096       if (el_mode != DFmode
28097           || n != 2)
28098         return NULL_TREE;
28099       break;
28100
28101     case BUILT_IN_SINF:
28102     case BUILT_IN_COSF:
28103     case BUILT_IN_EXPF:
28104     case BUILT_IN_POWF:
28105     case BUILT_IN_LOGF:
28106     case BUILT_IN_LOG2F:
28107     case BUILT_IN_LOG10F:
28108       name[4] = 's';
28109       name[5] = '4';
28110       if (el_mode != SFmode
28111           || n != 4)
28112         return NULL_TREE;
28113       break;
28114
28115     default:
28116       return NULL_TREE;
28117     }
28118
28119   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
28120   sprintf (name + 7, "%s", bname+10);
28121
28122   arity = 0;
28123   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
28124        args = TREE_CHAIN (args))
28125     arity++;
28126
28127   if (arity == 1)
28128     fntype = build_function_type_list (type_out, type_in, NULL);
28129   else
28130     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
28131
28132   /* Build a function declaration for the vectorized function.  */
28133   new_fndecl = build_decl (BUILTINS_LOCATION,
28134                            FUNCTION_DECL, get_identifier (name), fntype);
28135   TREE_PUBLIC (new_fndecl) = 1;
28136   DECL_EXTERNAL (new_fndecl) = 1;
28137   DECL_IS_NOVOPS (new_fndecl) = 1;
28138   TREE_READONLY (new_fndecl) = 1;
28139
28140   return new_fndecl;
28141 }
28142
28143
28144 /* Returns a decl of a function that implements conversion of an integer vector
28145    into a floating-point vector, or vice-versa.  DEST_TYPE and SRC_TYPE
28146    are the types involved when converting according to CODE.
28147    Return NULL_TREE if it is not available.  */
28148
28149 static tree
28150 ix86_vectorize_builtin_conversion (unsigned int code,
28151                                    tree dest_type, tree src_type)
28152 {
28153   if (! TARGET_SSE2)
28154     return NULL_TREE;
28155
28156   switch (code)
28157     {
28158     case FLOAT_EXPR:
28159       switch (TYPE_MODE (src_type))
28160         {
28161         case V4SImode:
28162           switch (TYPE_MODE (dest_type))
28163             {
28164             case V4SFmode:
28165               return (TYPE_UNSIGNED (src_type)
28166                       ? ix86_builtins[IX86_BUILTIN_CVTUDQ2PS]
28167                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PS]);
28168             case V4DFmode:
28169               return (TYPE_UNSIGNED (src_type)
28170                       ? NULL_TREE
28171                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PD256]);
28172             default:
28173               return NULL_TREE;
28174             }
28175           break;
28176         case V8SImode:
28177           switch (TYPE_MODE (dest_type))
28178             {
28179             case V8SFmode:
28180               return (TYPE_UNSIGNED (src_type)
28181                       ? NULL_TREE
28182                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PS256]);
28183             default:
28184               return NULL_TREE;
28185             }
28186           break;
28187         default:
28188           return NULL_TREE;
28189         }
28190
28191     case FIX_TRUNC_EXPR:
28192       switch (TYPE_MODE (dest_type))
28193         {
28194         case V4SImode:
28195           switch (TYPE_MODE (src_type))
28196             {
28197             case V4SFmode:
28198               return (TYPE_UNSIGNED (dest_type)
28199                       ? NULL_TREE
28200                       : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ]);
28201             case V4DFmode:
28202               return (TYPE_UNSIGNED (dest_type)
28203                       ? NULL_TREE
28204                       : ix86_builtins[IX86_BUILTIN_CVTTPD2DQ256]);
28205             default:
28206               return NULL_TREE;
28207             }
28208           break;
28209
28210         case V8SImode:
28211           switch (TYPE_MODE (src_type))
28212             {
28213             case V8SFmode:
28214               return (TYPE_UNSIGNED (dest_type)
28215                       ? NULL_TREE
28216                       : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ256]);
28217             default:
28218               return NULL_TREE;
28219             }
28220           break;
28221
28222         default:
28223           return NULL_TREE;
28224         }
28225
28226     default:
28227       return NULL_TREE;
28228     }
28229
28230   return NULL_TREE;
28231 }
28232
28233 /* Returns a code for a target-specific builtin that implements
28234    reciprocal of the function, or NULL_TREE if not available.  */
28235
28236 static tree
28237 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
28238                          bool sqrt ATTRIBUTE_UNUSED)
28239 {
28240   if (! (TARGET_SSE_MATH && !optimize_insn_for_size_p ()
28241          && flag_finite_math_only && !flag_trapping_math
28242          && flag_unsafe_math_optimizations))
28243     return NULL_TREE;
28244
28245   if (md_fn)
28246     /* Machine dependent builtins.  */
28247     switch (fn)
28248       {
28249         /* Vectorized version of sqrt to rsqrt conversion.  */
28250       case IX86_BUILTIN_SQRTPS_NR:
28251         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
28252
28253       case IX86_BUILTIN_SQRTPS_NR256:
28254         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR256];
28255
28256       default:
28257         return NULL_TREE;
28258       }
28259   else
28260     /* Normal builtins.  */
28261     switch (fn)
28262       {
28263         /* Sqrt to rsqrt conversion.  */
28264       case BUILT_IN_SQRTF:
28265         return ix86_builtins[IX86_BUILTIN_RSQRTF];
28266
28267       default:
28268         return NULL_TREE;
28269       }
28270 }
28271 \f
28272 /* Helper for avx_vpermilps256_operand et al.  This is also used by
28273    the expansion functions to turn the parallel back into a mask.
28274    The return value is 0 for no match and the imm8+1 for a match.  */
28275
28276 int
28277 avx_vpermilp_parallel (rtx par, enum machine_mode mode)
28278 {
28279   unsigned i, nelt = GET_MODE_NUNITS (mode);
28280   unsigned mask = 0;
28281   unsigned char ipar[8];
28282
28283   if (XVECLEN (par, 0) != (int) nelt)
28284     return 0;
28285
28286   /* Validate that all of the elements are constants, and not totally
28287      out of range.  Copy the data into an integral array to make the
28288      subsequent checks easier.  */
28289   for (i = 0; i < nelt; ++i)
28290     {
28291       rtx er = XVECEXP (par, 0, i);
28292       unsigned HOST_WIDE_INT ei;
28293
28294       if (!CONST_INT_P (er))
28295         return 0;
28296       ei = INTVAL (er);
28297       if (ei >= nelt)
28298         return 0;
28299       ipar[i] = ei;
28300     }
28301
28302   switch (mode)
28303     {
28304     case V4DFmode:
28305       /* In the 256-bit DFmode case, we can only move elements within
28306          a 128-bit lane.  */
28307       for (i = 0; i < 2; ++i)
28308         {
28309           if (ipar[i] >= 2)
28310             return 0;
28311           mask |= ipar[i] << i;
28312         }
28313       for (i = 2; i < 4; ++i)
28314         {
28315           if (ipar[i] < 2)
28316             return 0;
28317           mask |= (ipar[i] - 2) << i;
28318         }
28319       break;
28320
28321     case V8SFmode:
28322       /* In the 256-bit SFmode case, we have full freedom of movement
28323          within the low 128-bit lane, but the high 128-bit lane must
28324          mirror the exact same pattern.  */
28325       for (i = 0; i < 4; ++i)
28326         if (ipar[i] + 4 != ipar[i + 4])
28327           return 0;
28328       nelt = 4;
28329       /* FALLTHRU */
28330
28331     case V2DFmode:
28332     case V4SFmode:
28333       /* In the 128-bit case, we've full freedom in the placement of
28334          the elements from the source operand.  */
28335       for (i = 0; i < nelt; ++i)
28336         mask |= ipar[i] << (i * (nelt / 2));
28337       break;
28338
28339     default:
28340       gcc_unreachable ();
28341     }
28342
28343   /* Make sure success has a non-zero value by adding one.  */
28344   return mask + 1;
28345 }
28346
28347 /* Helper for avx_vperm2f128_v4df_operand et al.  This is also used by
28348    the expansion functions to turn the parallel back into a mask.
28349    The return value is 0 for no match and the imm8+1 for a match.  */
28350
28351 int
28352 avx_vperm2f128_parallel (rtx par, enum machine_mode mode)
28353 {
28354   unsigned i, nelt = GET_MODE_NUNITS (mode), nelt2 = nelt / 2;
28355   unsigned mask = 0;
28356   unsigned char ipar[8];
28357
28358   if (XVECLEN (par, 0) != (int) nelt)
28359     return 0;
28360
28361   /* Validate that all of the elements are constants, and not totally
28362      out of range.  Copy the data into an integral array to make the
28363      subsequent checks easier.  */
28364   for (i = 0; i < nelt; ++i)
28365     {
28366       rtx er = XVECEXP (par, 0, i);
28367       unsigned HOST_WIDE_INT ei;
28368
28369       if (!CONST_INT_P (er))
28370         return 0;
28371       ei = INTVAL (er);
28372       if (ei >= 2 * nelt)
28373         return 0;
28374       ipar[i] = ei;
28375     }
28376
28377   /* Validate that the halves of the permute are halves.  */
28378   for (i = 0; i < nelt2 - 1; ++i)
28379     if (ipar[i] + 1 != ipar[i + 1])
28380       return 0;
28381   for (i = nelt2; i < nelt - 1; ++i)
28382     if (ipar[i] + 1 != ipar[i + 1])
28383       return 0;
28384
28385   /* Reconstruct the mask.  */
28386   for (i = 0; i < 2; ++i)
28387     {
28388       unsigned e = ipar[i * nelt2];
28389       if (e % nelt2)
28390         return 0;
28391       e /= nelt2;
28392       mask |= e << (i * 4);
28393     }
28394
28395   /* Make sure success has a non-zero value by adding one.  */
28396   return mask + 1;
28397 }
28398 \f
28399
28400 /* Store OPERAND to the memory after reload is completed.  This means
28401    that we can't easily use assign_stack_local.  */
28402 rtx
28403 ix86_force_to_memory (enum machine_mode mode, rtx operand)
28404 {
28405   rtx result;
28406
28407   gcc_assert (reload_completed);
28408   if (ix86_using_red_zone ())
28409     {
28410       result = gen_rtx_MEM (mode,
28411                             gen_rtx_PLUS (Pmode,
28412                                           stack_pointer_rtx,
28413                                           GEN_INT (-RED_ZONE_SIZE)));
28414       emit_move_insn (result, operand);
28415     }
28416   else if (TARGET_64BIT)
28417     {
28418       switch (mode)
28419         {
28420         case HImode:
28421         case SImode:
28422           operand = gen_lowpart (DImode, operand);
28423           /* FALLTHRU */
28424         case DImode:
28425           emit_insn (
28426                       gen_rtx_SET (VOIDmode,
28427                                    gen_rtx_MEM (DImode,
28428                                                 gen_rtx_PRE_DEC (DImode,
28429                                                         stack_pointer_rtx)),
28430                                    operand));
28431           break;
28432         default:
28433           gcc_unreachable ();
28434         }
28435       result = gen_rtx_MEM (mode, stack_pointer_rtx);
28436     }
28437   else
28438     {
28439       switch (mode)
28440         {
28441         case DImode:
28442           {
28443             rtx operands[2];
28444             split_double_mode (mode, &operand, 1, operands, operands + 1);
28445             emit_insn (
28446                         gen_rtx_SET (VOIDmode,
28447                                      gen_rtx_MEM (SImode,
28448                                                   gen_rtx_PRE_DEC (Pmode,
28449                                                         stack_pointer_rtx)),
28450                                      operands[1]));
28451             emit_insn (
28452                         gen_rtx_SET (VOIDmode,
28453                                      gen_rtx_MEM (SImode,
28454                                                   gen_rtx_PRE_DEC (Pmode,
28455                                                         stack_pointer_rtx)),
28456                                      operands[0]));
28457           }
28458           break;
28459         case HImode:
28460           /* Store HImodes as SImodes.  */
28461           operand = gen_lowpart (SImode, operand);
28462           /* FALLTHRU */
28463         case SImode:
28464           emit_insn (
28465                       gen_rtx_SET (VOIDmode,
28466                                    gen_rtx_MEM (GET_MODE (operand),
28467                                                 gen_rtx_PRE_DEC (SImode,
28468                                                         stack_pointer_rtx)),
28469                                    operand));
28470           break;
28471         default:
28472           gcc_unreachable ();
28473         }
28474       result = gen_rtx_MEM (mode, stack_pointer_rtx);
28475     }
28476   return result;
28477 }
28478
28479 /* Free operand from the memory.  */
28480 void
28481 ix86_free_from_memory (enum machine_mode mode)
28482 {
28483   if (!ix86_using_red_zone ())
28484     {
28485       int size;
28486
28487       if (mode == DImode || TARGET_64BIT)
28488         size = 8;
28489       else
28490         size = 4;
28491       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
28492          to pop or add instruction if registers are available.  */
28493       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
28494                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
28495                                             GEN_INT (size))));
28496     }
28497 }
28498
28499 /* Implement TARGET_PREFERRED_RELOAD_CLASS.
28500
28501    Put float CONST_DOUBLE in the constant pool instead of fp regs.
28502    QImode must go into class Q_REGS.
28503    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
28504    movdf to do mem-to-mem moves through integer regs.  */
28505
28506 static reg_class_t
28507 ix86_preferred_reload_class (rtx x, reg_class_t regclass)
28508 {
28509   enum machine_mode mode = GET_MODE (x);
28510
28511   /* We're only allowed to return a subclass of CLASS.  Many of the
28512      following checks fail for NO_REGS, so eliminate that early.  */
28513   if (regclass == NO_REGS)
28514     return NO_REGS;
28515
28516   /* All classes can load zeros.  */
28517   if (x == CONST0_RTX (mode))
28518     return regclass;
28519
28520   /* Force constants into memory if we are loading a (nonzero) constant into
28521      an MMX or SSE register.  This is because there are no MMX/SSE instructions
28522      to load from a constant.  */
28523   if (CONSTANT_P (x)
28524       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
28525     return NO_REGS;
28526
28527   /* Prefer SSE regs only, if we can use them for math.  */
28528   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
28529     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
28530
28531   /* Floating-point constants need more complex checks.  */
28532   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
28533     {
28534       /* General regs can load everything.  */
28535       if (reg_class_subset_p (regclass, GENERAL_REGS))
28536         return regclass;
28537
28538       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
28539          zero above.  We only want to wind up preferring 80387 registers if
28540          we plan on doing computation with them.  */
28541       if (TARGET_80387
28542           && standard_80387_constant_p (x))
28543         {
28544           /* Limit class to non-sse.  */
28545           if (regclass == FLOAT_SSE_REGS)
28546             return FLOAT_REGS;
28547           if (regclass == FP_TOP_SSE_REGS)
28548             return FP_TOP_REG;
28549           if (regclass == FP_SECOND_SSE_REGS)
28550             return FP_SECOND_REG;
28551           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
28552             return regclass;
28553         }
28554
28555       return NO_REGS;
28556     }
28557
28558   /* Generally when we see PLUS here, it's the function invariant
28559      (plus soft-fp const_int).  Which can only be computed into general
28560      regs.  */
28561   if (GET_CODE (x) == PLUS)
28562     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
28563
28564   /* QImode constants are easy to load, but non-constant QImode data
28565      must go into Q_REGS.  */
28566   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
28567     {
28568       if (reg_class_subset_p (regclass, Q_REGS))
28569         return regclass;
28570       if (reg_class_subset_p (Q_REGS, regclass))
28571         return Q_REGS;
28572       return NO_REGS;
28573     }
28574
28575   return regclass;
28576 }
28577
28578 /* Discourage putting floating-point values in SSE registers unless
28579    SSE math is being used, and likewise for the 387 registers.  */
28580 static reg_class_t
28581 ix86_preferred_output_reload_class (rtx x, reg_class_t regclass)
28582 {
28583   enum machine_mode mode = GET_MODE (x);
28584
28585   /* Restrict the output reload class to the register bank that we are doing
28586      math on.  If we would like not to return a subset of CLASS, reject this
28587      alternative: if reload cannot do this, it will still use its choice.  */
28588   mode = GET_MODE (x);
28589   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
28590     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
28591
28592   if (X87_FLOAT_MODE_P (mode))
28593     {
28594       if (regclass == FP_TOP_SSE_REGS)
28595         return FP_TOP_REG;
28596       else if (regclass == FP_SECOND_SSE_REGS)
28597         return FP_SECOND_REG;
28598       else
28599         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
28600     }
28601
28602   return regclass;
28603 }
28604
28605 static reg_class_t
28606 ix86_secondary_reload (bool in_p, rtx x, reg_class_t rclass,
28607                        enum machine_mode mode,
28608                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
28609 {
28610   /* QImode spills from non-QI registers require
28611      intermediate register on 32bit targets.  */
28612   if (!TARGET_64BIT
28613       && !in_p && mode == QImode
28614       && (rclass == GENERAL_REGS
28615           || rclass == LEGACY_REGS
28616           || rclass == INDEX_REGS))
28617     {
28618       int regno;
28619
28620       if (REG_P (x))
28621         regno = REGNO (x);
28622       else
28623         regno = -1;
28624
28625       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
28626         regno = true_regnum (x);
28627
28628       /* Return Q_REGS if the operand is in memory.  */
28629       if (regno == -1)
28630         return Q_REGS;
28631     }
28632
28633   /* This condition handles corner case where an expression involving
28634      pointers gets vectorized.  We're trying to use the address of a
28635      stack slot as a vector initializer.  
28636
28637      (set (reg:V2DI 74 [ vect_cst_.2 ])
28638           (vec_duplicate:V2DI (reg/f:DI 20 frame)))
28639
28640      Eventually frame gets turned into sp+offset like this:
28641
28642      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28643           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
28644                                        (const_int 392 [0x188]))))
28645
28646      That later gets turned into:
28647
28648      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28649           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
28650             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))))
28651
28652      We'll have the following reload recorded:
28653
28654      Reload 0: reload_in (DI) =
28655            (plus:DI (reg/f:DI 7 sp)
28656             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))
28657      reload_out (V2DI) = (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28658      SSE_REGS, RELOAD_OTHER (opnum = 0), can't combine
28659      reload_in_reg: (plus:DI (reg/f:DI 7 sp) (const_int 392 [0x188]))
28660      reload_out_reg: (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28661      reload_reg_rtx: (reg:V2DI 22 xmm1)
28662
28663      Which isn't going to work since SSE instructions can't handle scalar
28664      additions.  Returning GENERAL_REGS forces the addition into integer
28665      register and reload can handle subsequent reloads without problems.  */
28666
28667   if (in_p && GET_CODE (x) == PLUS
28668       && SSE_CLASS_P (rclass)
28669       && SCALAR_INT_MODE_P (mode))
28670     return GENERAL_REGS;
28671
28672   return NO_REGS;
28673 }
28674
28675 /* Implement TARGET_CLASS_LIKELY_SPILLED_P.  */
28676
28677 static bool
28678 ix86_class_likely_spilled_p (reg_class_t rclass)
28679 {
28680   switch (rclass)
28681     {
28682       case AREG:
28683       case DREG:
28684       case CREG:
28685       case BREG:
28686       case AD_REGS:
28687       case SIREG:
28688       case DIREG:
28689       case SSE_FIRST_REG:
28690       case FP_TOP_REG:
28691       case FP_SECOND_REG:
28692         return true;
28693
28694       default:
28695         break;
28696     }
28697
28698   return false;
28699 }
28700
28701 /* If we are copying between general and FP registers, we need a memory
28702    location. The same is true for SSE and MMX registers.
28703
28704    To optimize register_move_cost performance, allow inline variant.
28705
28706    The macro can't work reliably when one of the CLASSES is class containing
28707    registers from multiple units (SSE, MMX, integer).  We avoid this by never
28708    combining those units in single alternative in the machine description.
28709    Ensure that this constraint holds to avoid unexpected surprises.
28710
28711    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
28712    enforce these sanity checks.  */
28713
28714 static inline bool
28715 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
28716                                 enum machine_mode mode, int strict)
28717 {
28718   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
28719       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
28720       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
28721       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
28722       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
28723       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
28724     {
28725       gcc_assert (!strict);
28726       return true;
28727     }
28728
28729   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
28730     return true;
28731
28732   /* ??? This is a lie.  We do have moves between mmx/general, and for
28733      mmx/sse2.  But by saying we need secondary memory we discourage the
28734      register allocator from using the mmx registers unless needed.  */
28735   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
28736     return true;
28737
28738   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
28739     {
28740       /* SSE1 doesn't have any direct moves from other classes.  */
28741       if (!TARGET_SSE2)
28742         return true;
28743
28744       /* If the target says that inter-unit moves are more expensive
28745          than moving through memory, then don't generate them.  */
28746       if (!TARGET_INTER_UNIT_MOVES)
28747         return true;
28748
28749       /* Between SSE and general, we have moves no larger than word size.  */
28750       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
28751         return true;
28752     }
28753
28754   return false;
28755 }
28756
28757 bool
28758 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
28759                               enum machine_mode mode, int strict)
28760 {
28761   return inline_secondary_memory_needed (class1, class2, mode, strict);
28762 }
28763
28764 /* Return true if the registers in CLASS cannot represent the change from
28765    modes FROM to TO.  */
28766
28767 bool
28768 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
28769                                enum reg_class regclass)
28770 {
28771   if (from == to)
28772     return false;
28773
28774   /* x87 registers can't do subreg at all, as all values are reformatted
28775      to extended precision.  */
28776   if (MAYBE_FLOAT_CLASS_P (regclass))
28777     return true;
28778
28779   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
28780     {
28781       /* Vector registers do not support QI or HImode loads.  If we don't
28782          disallow a change to these modes, reload will assume it's ok to
28783          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
28784          the vec_dupv4hi pattern.  */
28785       if (GET_MODE_SIZE (from) < 4)
28786         return true;
28787
28788       /* Vector registers do not support subreg with nonzero offsets, which
28789          are otherwise valid for integer registers.  Since we can't see
28790          whether we have a nonzero offset from here, prohibit all
28791          nonparadoxical subregs changing size.  */
28792       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
28793         return true;
28794     }
28795
28796   return false;
28797 }
28798
28799 /* Return the cost of moving data of mode M between a
28800    register and memory.  A value of 2 is the default; this cost is
28801    relative to those in `REGISTER_MOVE_COST'.
28802
28803    This function is used extensively by register_move_cost that is used to
28804    build tables at startup.  Make it inline in this case.
28805    When IN is 2, return maximum of in and out move cost.
28806
28807    If moving between registers and memory is more expensive than
28808    between two registers, you should define this macro to express the
28809    relative cost.
28810
28811    Model also increased moving costs of QImode registers in non
28812    Q_REGS classes.
28813  */
28814 static inline int
28815 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
28816                          int in)
28817 {
28818   int cost;
28819   if (FLOAT_CLASS_P (regclass))
28820     {
28821       int index;
28822       switch (mode)
28823         {
28824           case SFmode:
28825             index = 0;
28826             break;
28827           case DFmode:
28828             index = 1;
28829             break;
28830           case XFmode:
28831             index = 2;
28832             break;
28833           default:
28834             return 100;
28835         }
28836       if (in == 2)
28837         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
28838       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
28839     }
28840   if (SSE_CLASS_P (regclass))
28841     {
28842       int index;
28843       switch (GET_MODE_SIZE (mode))
28844         {
28845           case 4:
28846             index = 0;
28847             break;
28848           case 8:
28849             index = 1;
28850             break;
28851           case 16:
28852             index = 2;
28853             break;
28854           default:
28855             return 100;
28856         }
28857       if (in == 2)
28858         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
28859       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
28860     }
28861   if (MMX_CLASS_P (regclass))
28862     {
28863       int index;
28864       switch (GET_MODE_SIZE (mode))
28865         {
28866           case 4:
28867             index = 0;
28868             break;
28869           case 8:
28870             index = 1;
28871             break;
28872           default:
28873             return 100;
28874         }
28875       if (in)
28876         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
28877       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
28878     }
28879   switch (GET_MODE_SIZE (mode))
28880     {
28881       case 1:
28882         if (Q_CLASS_P (regclass) || TARGET_64BIT)
28883           {
28884             if (!in)
28885               return ix86_cost->int_store[0];
28886             if (TARGET_PARTIAL_REG_DEPENDENCY
28887                 && optimize_function_for_speed_p (cfun))
28888               cost = ix86_cost->movzbl_load;
28889             else
28890               cost = ix86_cost->int_load[0];
28891             if (in == 2)
28892               return MAX (cost, ix86_cost->int_store[0]);
28893             return cost;
28894           }
28895         else
28896           {
28897            if (in == 2)
28898              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
28899            if (in)
28900              return ix86_cost->movzbl_load;
28901            else
28902              return ix86_cost->int_store[0] + 4;
28903           }
28904         break;
28905       case 2:
28906         if (in == 2)
28907           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
28908         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
28909       default:
28910         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
28911         if (mode == TFmode)
28912           mode = XFmode;
28913         if (in == 2)
28914           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
28915         else if (in)
28916           cost = ix86_cost->int_load[2];
28917         else
28918           cost = ix86_cost->int_store[2];
28919         return (cost * (((int) GET_MODE_SIZE (mode)
28920                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
28921     }
28922 }
28923
28924 static int
28925 ix86_memory_move_cost (enum machine_mode mode, reg_class_t regclass,
28926                        bool in)
28927 {
28928   return inline_memory_move_cost (mode, (enum reg_class) regclass, in ? 1 : 0);
28929 }
28930
28931
28932 /* Return the cost of moving data from a register in class CLASS1 to
28933    one in class CLASS2.
28934
28935    It is not required that the cost always equal 2 when FROM is the same as TO;
28936    on some machines it is expensive to move between registers if they are not
28937    general registers.  */
28938
28939 static int
28940 ix86_register_move_cost (enum machine_mode mode, reg_class_t class1_i,
28941                          reg_class_t class2_i)
28942 {
28943   enum reg_class class1 = (enum reg_class) class1_i;
28944   enum reg_class class2 = (enum reg_class) class2_i;
28945
28946   /* In case we require secondary memory, compute cost of the store followed
28947      by load.  In order to avoid bad register allocation choices, we need
28948      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
28949
28950   if (inline_secondary_memory_needed (class1, class2, mode, 0))
28951     {
28952       int cost = 1;
28953
28954       cost += inline_memory_move_cost (mode, class1, 2);
28955       cost += inline_memory_move_cost (mode, class2, 2);
28956
28957       /* In case of copying from general_purpose_register we may emit multiple
28958          stores followed by single load causing memory size mismatch stall.
28959          Count this as arbitrarily high cost of 20.  */
28960       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
28961         cost += 20;
28962
28963       /* In the case of FP/MMX moves, the registers actually overlap, and we
28964          have to switch modes in order to treat them differently.  */
28965       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
28966           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
28967         cost += 20;
28968
28969       return cost;
28970     }
28971
28972   /* Moves between SSE/MMX and integer unit are expensive.  */
28973   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
28974       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
28975
28976     /* ??? By keeping returned value relatively high, we limit the number
28977        of moves between integer and MMX/SSE registers for all targets.
28978        Additionally, high value prevents problem with x86_modes_tieable_p(),
28979        where integer modes in MMX/SSE registers are not tieable
28980        because of missing QImode and HImode moves to, from or between
28981        MMX/SSE registers.  */
28982     return MAX (8, ix86_cost->mmxsse_to_integer);
28983
28984   if (MAYBE_FLOAT_CLASS_P (class1))
28985     return ix86_cost->fp_move;
28986   if (MAYBE_SSE_CLASS_P (class1))
28987     return ix86_cost->sse_move;
28988   if (MAYBE_MMX_CLASS_P (class1))
28989     return ix86_cost->mmx_move;
28990   return 2;
28991 }
28992
28993 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
28994
28995 bool
28996 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
28997 {
28998   /* Flags and only flags can only hold CCmode values.  */
28999   if (CC_REGNO_P (regno))
29000     return GET_MODE_CLASS (mode) == MODE_CC;
29001   if (GET_MODE_CLASS (mode) == MODE_CC
29002       || GET_MODE_CLASS (mode) == MODE_RANDOM
29003       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
29004     return 0;
29005   if (FP_REGNO_P (regno))
29006     return VALID_FP_MODE_P (mode);
29007   if (SSE_REGNO_P (regno))
29008     {
29009       /* We implement the move patterns for all vector modes into and
29010          out of SSE registers, even when no operation instructions
29011          are available.  OImode move is available only when AVX is
29012          enabled.  */
29013       return ((TARGET_AVX && mode == OImode)
29014               || VALID_AVX256_REG_MODE (mode)
29015               || VALID_SSE_REG_MODE (mode)
29016               || VALID_SSE2_REG_MODE (mode)
29017               || VALID_MMX_REG_MODE (mode)
29018               || VALID_MMX_REG_MODE_3DNOW (mode));
29019     }
29020   if (MMX_REGNO_P (regno))
29021     {
29022       /* We implement the move patterns for 3DNOW modes even in MMX mode,
29023          so if the register is available at all, then we can move data of
29024          the given mode into or out of it.  */
29025       return (VALID_MMX_REG_MODE (mode)
29026               || VALID_MMX_REG_MODE_3DNOW (mode));
29027     }
29028
29029   if (mode == QImode)
29030     {
29031       /* Take care for QImode values - they can be in non-QI regs,
29032          but then they do cause partial register stalls.  */
29033       if (regno <= BX_REG || TARGET_64BIT)
29034         return 1;
29035       if (!TARGET_PARTIAL_REG_STALL)
29036         return 1;
29037       return reload_in_progress || reload_completed;
29038     }
29039   /* We handle both integer and floats in the general purpose registers.  */
29040   else if (VALID_INT_MODE_P (mode))
29041     return 1;
29042   else if (VALID_FP_MODE_P (mode))
29043     return 1;
29044   else if (VALID_DFP_MODE_P (mode))
29045     return 1;
29046   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
29047      on to use that value in smaller contexts, this can easily force a
29048      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
29049      supporting DImode, allow it.  */
29050   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
29051     return 1;
29052
29053   return 0;
29054 }
29055
29056 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
29057    tieable integer mode.  */
29058
29059 static bool
29060 ix86_tieable_integer_mode_p (enum machine_mode mode)
29061 {
29062   switch (mode)
29063     {
29064     case HImode:
29065     case SImode:
29066       return true;
29067
29068     case QImode:
29069       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
29070
29071     case DImode:
29072       return TARGET_64BIT;
29073
29074     default:
29075       return false;
29076     }
29077 }
29078
29079 /* Return true if MODE1 is accessible in a register that can hold MODE2
29080    without copying.  That is, all register classes that can hold MODE2
29081    can also hold MODE1.  */
29082
29083 bool
29084 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
29085 {
29086   if (mode1 == mode2)
29087     return true;
29088
29089   if (ix86_tieable_integer_mode_p (mode1)
29090       && ix86_tieable_integer_mode_p (mode2))
29091     return true;
29092
29093   /* MODE2 being XFmode implies fp stack or general regs, which means we
29094      can tie any smaller floating point modes to it.  Note that we do not
29095      tie this with TFmode.  */
29096   if (mode2 == XFmode)
29097     return mode1 == SFmode || mode1 == DFmode;
29098
29099   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
29100      that we can tie it with SFmode.  */
29101   if (mode2 == DFmode)
29102     return mode1 == SFmode;
29103
29104   /* If MODE2 is only appropriate for an SSE register, then tie with
29105      any other mode acceptable to SSE registers.  */
29106   if (GET_MODE_SIZE (mode2) == 16
29107       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
29108     return (GET_MODE_SIZE (mode1) == 16
29109             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
29110
29111   /* If MODE2 is appropriate for an MMX register, then tie
29112      with any other mode acceptable to MMX registers.  */
29113   if (GET_MODE_SIZE (mode2) == 8
29114       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
29115     return (GET_MODE_SIZE (mode1) == 8
29116             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
29117
29118   return false;
29119 }
29120
29121 /* Compute a (partial) cost for rtx X.  Return true if the complete
29122    cost has been computed, and false if subexpressions should be
29123    scanned.  In either case, *TOTAL contains the cost result.  */
29124
29125 static bool
29126 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
29127 {
29128   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
29129   enum machine_mode mode = GET_MODE (x);
29130   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
29131
29132   switch (code)
29133     {
29134     case CONST_INT:
29135     case CONST:
29136     case LABEL_REF:
29137     case SYMBOL_REF:
29138       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
29139         *total = 3;
29140       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
29141         *total = 2;
29142       else if (flag_pic && SYMBOLIC_CONST (x)
29143                && (!TARGET_64BIT
29144                    || (!GET_CODE (x) != LABEL_REF
29145                        && (GET_CODE (x) != SYMBOL_REF
29146                            || !SYMBOL_REF_LOCAL_P (x)))))
29147         *total = 1;
29148       else
29149         *total = 0;
29150       return true;
29151
29152     case CONST_DOUBLE:
29153       if (mode == VOIDmode)
29154         *total = 0;
29155       else
29156         switch (standard_80387_constant_p (x))
29157           {
29158           case 1: /* 0.0 */
29159             *total = 1;
29160             break;
29161           default: /* Other constants */
29162             *total = 2;
29163             break;
29164           case 0:
29165           case -1:
29166             /* Start with (MEM (SYMBOL_REF)), since that's where
29167                it'll probably end up.  Add a penalty for size.  */
29168             *total = (COSTS_N_INSNS (1)
29169                       + (flag_pic != 0 && !TARGET_64BIT)
29170                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
29171             break;
29172           }
29173       return true;
29174
29175     case ZERO_EXTEND:
29176       /* The zero extensions is often completely free on x86_64, so make
29177          it as cheap as possible.  */
29178       if (TARGET_64BIT && mode == DImode
29179           && GET_MODE (XEXP (x, 0)) == SImode)
29180         *total = 1;
29181       else if (TARGET_ZERO_EXTEND_WITH_AND)
29182         *total = cost->add;
29183       else
29184         *total = cost->movzx;
29185       return false;
29186
29187     case SIGN_EXTEND:
29188       *total = cost->movsx;
29189       return false;
29190
29191     case ASHIFT:
29192       if (CONST_INT_P (XEXP (x, 1))
29193           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
29194         {
29195           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
29196           if (value == 1)
29197             {
29198               *total = cost->add;
29199               return false;
29200             }
29201           if ((value == 2 || value == 3)
29202               && cost->lea <= cost->shift_const)
29203             {
29204               *total = cost->lea;
29205               return false;
29206             }
29207         }
29208       /* FALLTHRU */
29209
29210     case ROTATE:
29211     case ASHIFTRT:
29212     case LSHIFTRT:
29213     case ROTATERT:
29214       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
29215         {
29216           if (CONST_INT_P (XEXP (x, 1)))
29217             {
29218               if (INTVAL (XEXP (x, 1)) > 32)
29219                 *total = cost->shift_const + COSTS_N_INSNS (2);
29220               else
29221                 *total = cost->shift_const * 2;
29222             }
29223           else
29224             {
29225               if (GET_CODE (XEXP (x, 1)) == AND)
29226                 *total = cost->shift_var * 2;
29227               else
29228                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
29229             }
29230         }
29231       else
29232         {
29233           if (CONST_INT_P (XEXP (x, 1)))
29234             *total = cost->shift_const;
29235           else
29236             *total = cost->shift_var;
29237         }
29238       return false;
29239
29240     case FMA:
29241       {
29242         rtx sub;
29243
29244         gcc_assert (FLOAT_MODE_P (mode));
29245         gcc_assert (TARGET_FMA || TARGET_FMA4);
29246
29247         /* ??? SSE scalar/vector cost should be used here.  */
29248         /* ??? Bald assumption that fma has the same cost as fmul.  */
29249         *total = cost->fmul;
29250         *total += rtx_cost (XEXP (x, 1), FMA, speed);
29251
29252         /* Negate in op0 or op2 is free: FMS, FNMA, FNMS.  */
29253         sub = XEXP (x, 0);
29254         if (GET_CODE (sub) == NEG)
29255           sub = XEXP (x, 0);
29256         *total += rtx_cost (sub, FMA, speed);
29257
29258         sub = XEXP (x, 2);
29259         if (GET_CODE (sub) == NEG)
29260           sub = XEXP (x, 0);
29261         *total += rtx_cost (sub, FMA, speed);
29262         return true;
29263       }
29264
29265     case MULT:
29266       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29267         {
29268           /* ??? SSE scalar cost should be used here.  */
29269           *total = cost->fmul;
29270           return false;
29271         }
29272       else if (X87_FLOAT_MODE_P (mode))
29273         {
29274           *total = cost->fmul;
29275           return false;
29276         }
29277       else if (FLOAT_MODE_P (mode))
29278         {
29279           /* ??? SSE vector cost should be used here.  */
29280           *total = cost->fmul;
29281           return false;
29282         }
29283       else
29284         {
29285           rtx op0 = XEXP (x, 0);
29286           rtx op1 = XEXP (x, 1);
29287           int nbits;
29288           if (CONST_INT_P (XEXP (x, 1)))
29289             {
29290               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
29291               for (nbits = 0; value != 0; value &= value - 1)
29292                 nbits++;
29293             }
29294           else
29295             /* This is arbitrary.  */
29296             nbits = 7;
29297
29298           /* Compute costs correctly for widening multiplication.  */
29299           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
29300               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
29301                  == GET_MODE_SIZE (mode))
29302             {
29303               int is_mulwiden = 0;
29304               enum machine_mode inner_mode = GET_MODE (op0);
29305
29306               if (GET_CODE (op0) == GET_CODE (op1))
29307                 is_mulwiden = 1, op1 = XEXP (op1, 0);
29308               else if (CONST_INT_P (op1))
29309                 {
29310                   if (GET_CODE (op0) == SIGN_EXTEND)
29311                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
29312                                   == INTVAL (op1);
29313                   else
29314                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
29315                 }
29316
29317               if (is_mulwiden)
29318                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
29319             }
29320
29321           *total = (cost->mult_init[MODE_INDEX (mode)]
29322                     + nbits * cost->mult_bit
29323                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
29324
29325           return true;
29326         }
29327
29328     case DIV:
29329     case UDIV:
29330     case MOD:
29331     case UMOD:
29332       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29333         /* ??? SSE cost should be used here.  */
29334         *total = cost->fdiv;
29335       else if (X87_FLOAT_MODE_P (mode))
29336         *total = cost->fdiv;
29337       else if (FLOAT_MODE_P (mode))
29338         /* ??? SSE vector cost should be used here.  */
29339         *total = cost->fdiv;
29340       else
29341         *total = cost->divide[MODE_INDEX (mode)];
29342       return false;
29343
29344     case PLUS:
29345       if (GET_MODE_CLASS (mode) == MODE_INT
29346                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
29347         {
29348           if (GET_CODE (XEXP (x, 0)) == PLUS
29349               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
29350               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
29351               && CONSTANT_P (XEXP (x, 1)))
29352             {
29353               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
29354               if (val == 2 || val == 4 || val == 8)
29355                 {
29356                   *total = cost->lea;
29357                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
29358                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
29359                                       outer_code, speed);
29360                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29361                   return true;
29362                 }
29363             }
29364           else if (GET_CODE (XEXP (x, 0)) == MULT
29365                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
29366             {
29367               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
29368               if (val == 2 || val == 4 || val == 8)
29369                 {
29370                   *total = cost->lea;
29371                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
29372                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29373                   return true;
29374                 }
29375             }
29376           else if (GET_CODE (XEXP (x, 0)) == PLUS)
29377             {
29378               *total = cost->lea;
29379               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
29380               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
29381               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29382               return true;
29383             }
29384         }
29385       /* FALLTHRU */
29386
29387     case MINUS:
29388       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29389         {
29390           /* ??? SSE cost should be used here.  */
29391           *total = cost->fadd;
29392           return false;
29393         }
29394       else if (X87_FLOAT_MODE_P (mode))
29395         {
29396           *total = cost->fadd;
29397           return false;
29398         }
29399       else if (FLOAT_MODE_P (mode))
29400         {
29401           /* ??? SSE vector cost should be used here.  */
29402           *total = cost->fadd;
29403           return false;
29404         }
29405       /* FALLTHRU */
29406
29407     case AND:
29408     case IOR:
29409     case XOR:
29410       if (!TARGET_64BIT && mode == DImode)
29411         {
29412           *total = (cost->add * 2
29413                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
29414                        << (GET_MODE (XEXP (x, 0)) != DImode))
29415                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
29416                        << (GET_MODE (XEXP (x, 1)) != DImode)));
29417           return true;
29418         }
29419       /* FALLTHRU */
29420
29421     case NEG:
29422       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29423         {
29424           /* ??? SSE cost should be used here.  */
29425           *total = cost->fchs;
29426           return false;
29427         }
29428       else if (X87_FLOAT_MODE_P (mode))
29429         {
29430           *total = cost->fchs;
29431           return false;
29432         }
29433       else if (FLOAT_MODE_P (mode))
29434         {
29435           /* ??? SSE vector cost should be used here.  */
29436           *total = cost->fchs;
29437           return false;
29438         }
29439       /* FALLTHRU */
29440
29441     case NOT:
29442       if (!TARGET_64BIT && mode == DImode)
29443         *total = cost->add * 2;
29444       else
29445         *total = cost->add;
29446       return false;
29447
29448     case COMPARE:
29449       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
29450           && XEXP (XEXP (x, 0), 1) == const1_rtx
29451           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
29452           && XEXP (x, 1) == const0_rtx)
29453         {
29454           /* This kind of construct is implemented using test[bwl].
29455              Treat it as if we had an AND.  */
29456           *total = (cost->add
29457                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
29458                     + rtx_cost (const1_rtx, outer_code, speed));
29459           return true;
29460         }
29461       return false;
29462
29463     case FLOAT_EXTEND:
29464       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
29465         *total = 0;
29466       return false;
29467
29468     case ABS:
29469       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29470         /* ??? SSE cost should be used here.  */
29471         *total = cost->fabs;
29472       else if (X87_FLOAT_MODE_P (mode))
29473         *total = cost->fabs;
29474       else if (FLOAT_MODE_P (mode))
29475         /* ??? SSE vector cost should be used here.  */
29476         *total = cost->fabs;
29477       return false;
29478
29479     case SQRT:
29480       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29481         /* ??? SSE cost should be used here.  */
29482         *total = cost->fsqrt;
29483       else if (X87_FLOAT_MODE_P (mode))
29484         *total = cost->fsqrt;
29485       else if (FLOAT_MODE_P (mode))
29486         /* ??? SSE vector cost should be used here.  */
29487         *total = cost->fsqrt;
29488       return false;
29489
29490     case UNSPEC:
29491       if (XINT (x, 1) == UNSPEC_TP)
29492         *total = 0;
29493       return false;
29494
29495     case VEC_SELECT:
29496     case VEC_CONCAT:
29497     case VEC_MERGE:
29498     case VEC_DUPLICATE:
29499       /* ??? Assume all of these vector manipulation patterns are
29500          recognizable.  In which case they all pretty much have the
29501          same cost.  */
29502      *total = COSTS_N_INSNS (1);
29503      return true;
29504
29505     default:
29506       return false;
29507     }
29508 }
29509
29510 #if TARGET_MACHO
29511
29512 static int current_machopic_label_num;
29513
29514 /* Given a symbol name and its associated stub, write out the
29515    definition of the stub.  */
29516
29517 void
29518 machopic_output_stub (FILE *file, const char *symb, const char *stub)
29519 {
29520   unsigned int length;
29521   char *binder_name, *symbol_name, lazy_ptr_name[32];
29522   int label = ++current_machopic_label_num;
29523
29524   /* For 64-bit we shouldn't get here.  */
29525   gcc_assert (!TARGET_64BIT);
29526
29527   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
29528   symb = targetm.strip_name_encoding (symb);
29529
29530   length = strlen (stub);
29531   binder_name = XALLOCAVEC (char, length + 32);
29532   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
29533
29534   length = strlen (symb);
29535   symbol_name = XALLOCAVEC (char, length + 32);
29536   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
29537
29538   sprintf (lazy_ptr_name, "L%d$lz", label);
29539
29540   if (MACHOPIC_ATT_STUB)
29541     switch_to_section (darwin_sections[machopic_picsymbol_stub3_section]);
29542   else if (MACHOPIC_PURE)
29543     {
29544       if (TARGET_DEEP_BRANCH_PREDICTION)
29545         switch_to_section (darwin_sections[machopic_picsymbol_stub2_section]);
29546       else
29547     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
29548     }
29549   else
29550     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
29551
29552   fprintf (file, "%s:\n", stub);
29553   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
29554
29555   if (MACHOPIC_ATT_STUB)
29556     {
29557       fprintf (file, "\thlt ; hlt ; hlt ; hlt ; hlt\n");
29558     }
29559   else if (MACHOPIC_PURE)
29560     {
29561       /* PIC stub.  */
29562       if (TARGET_DEEP_BRANCH_PREDICTION)
29563         {
29564           /* 25-byte PIC stub using "CALL get_pc_thunk".  */
29565           rtx tmp = gen_rtx_REG (SImode, 2 /* ECX */);
29566           output_set_got (tmp, NULL_RTX);       /* "CALL ___<cpu>.get_pc_thunk.cx".  */
29567           fprintf (file, "LPC$%d:\tmovl\t%s-LPC$%d(%%ecx),%%ecx\n", label, lazy_ptr_name, label);
29568         }
29569       else
29570         {
29571           /* 26-byte PIC stub using inline picbase: "CALL L42 ! L42: pop %eax".  */
29572           fprintf (file, "\tcall LPC$%d\nLPC$%d:\tpopl %%ecx\n", label, label);
29573           fprintf (file, "\tmovl %s-LPC$%d(%%ecx),%%ecx\n", lazy_ptr_name, label);
29574         }
29575       fprintf (file, "\tjmp\t*%%ecx\n");
29576     }
29577   else
29578     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
29579
29580   /* The AT&T-style ("self-modifying") stub is not lazily bound, thus
29581      it needs no stub-binding-helper.  */
29582   if (MACHOPIC_ATT_STUB)
29583     return;
29584
29585   fprintf (file, "%s:\n", binder_name);
29586
29587   if (MACHOPIC_PURE)
29588     {
29589       fprintf (file, "\tlea\t%s-%s(%%ecx),%%ecx\n", lazy_ptr_name, binder_name);
29590       fprintf (file, "\tpushl\t%%ecx\n");
29591     }
29592   else
29593     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
29594
29595   fputs ("\tjmp\tdyld_stub_binding_helper\n", file);
29596
29597   /* N.B. Keep the correspondence of these
29598      'symbol_ptr/symbol_ptr2/symbol_ptr3' sections consistent with the
29599      old-pic/new-pic/non-pic stubs; altering this will break
29600      compatibility with existing dylibs.  */
29601   if (MACHOPIC_PURE)
29602     {
29603       /* PIC stubs.  */
29604       if (TARGET_DEEP_BRANCH_PREDICTION)
29605         /* 25-byte PIC stub using "CALL get_pc_thunk".  */
29606         switch_to_section (darwin_sections[machopic_lazy_symbol_ptr2_section]);
29607       else
29608         /* 26-byte PIC stub using inline picbase: "CALL L42 ! L42: pop %ebx".  */
29609   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
29610     }
29611   else
29612     /* 16-byte -mdynamic-no-pic stub.  */
29613     switch_to_section(darwin_sections[machopic_lazy_symbol_ptr3_section]);
29614
29615   fprintf (file, "%s:\n", lazy_ptr_name);
29616   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
29617   fprintf (file, ASM_LONG "%s\n", binder_name);
29618 }
29619 #endif /* TARGET_MACHO */
29620
29621 /* Order the registers for register allocator.  */
29622
29623 void
29624 x86_order_regs_for_local_alloc (void)
29625 {
29626    int pos = 0;
29627    int i;
29628
29629    /* First allocate the local general purpose registers.  */
29630    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
29631      if (GENERAL_REGNO_P (i) && call_used_regs[i])
29632         reg_alloc_order [pos++] = i;
29633
29634    /* Global general purpose registers.  */
29635    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
29636      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
29637         reg_alloc_order [pos++] = i;
29638
29639    /* x87 registers come first in case we are doing FP math
29640       using them.  */
29641    if (!TARGET_SSE_MATH)
29642      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
29643        reg_alloc_order [pos++] = i;
29644
29645    /* SSE registers.  */
29646    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
29647      reg_alloc_order [pos++] = i;
29648    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
29649      reg_alloc_order [pos++] = i;
29650
29651    /* x87 registers.  */
29652    if (TARGET_SSE_MATH)
29653      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
29654        reg_alloc_order [pos++] = i;
29655
29656    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
29657      reg_alloc_order [pos++] = i;
29658
29659    /* Initialize the rest of array as we do not allocate some registers
29660       at all.  */
29661    while (pos < FIRST_PSEUDO_REGISTER)
29662      reg_alloc_order [pos++] = 0;
29663 }
29664
29665 /* Handle a "callee_pop_aggregate_return" attribute; arguments as
29666    in struct attribute_spec handler.  */
29667 static tree
29668 ix86_handle_callee_pop_aggregate_return (tree *node, tree name,
29669                                               tree args,
29670                                               int flags ATTRIBUTE_UNUSED,
29671                                               bool *no_add_attrs)
29672 {
29673   if (TREE_CODE (*node) != FUNCTION_TYPE
29674       && TREE_CODE (*node) != METHOD_TYPE
29675       && TREE_CODE (*node) != FIELD_DECL
29676       && TREE_CODE (*node) != TYPE_DECL)
29677     {
29678       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29679                name);
29680       *no_add_attrs = true;
29681       return NULL_TREE;
29682     }
29683   if (TARGET_64BIT)
29684     {
29685       warning (OPT_Wattributes, "%qE attribute only available for 32-bit",
29686                name);
29687       *no_add_attrs = true;
29688       return NULL_TREE;
29689     }
29690   if (is_attribute_p ("callee_pop_aggregate_return", name))
29691     {
29692       tree cst;
29693
29694       cst = TREE_VALUE (args);
29695       if (TREE_CODE (cst) != INTEGER_CST)
29696         {
29697           warning (OPT_Wattributes,
29698                    "%qE attribute requires an integer constant argument",
29699                    name);
29700           *no_add_attrs = true;
29701         }
29702       else if (compare_tree_int (cst, 0) != 0
29703                && compare_tree_int (cst, 1) != 0)
29704         {
29705           warning (OPT_Wattributes,
29706                    "argument to %qE attribute is neither zero, nor one",
29707                    name);
29708           *no_add_attrs = true;
29709         }
29710
29711       return NULL_TREE;
29712     }
29713
29714   return NULL_TREE;
29715 }
29716
29717 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
29718    struct attribute_spec.handler.  */
29719 static tree
29720 ix86_handle_abi_attribute (tree *node, tree name,
29721                               tree args ATTRIBUTE_UNUSED,
29722                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29723 {
29724   if (TREE_CODE (*node) != FUNCTION_TYPE
29725       && TREE_CODE (*node) != METHOD_TYPE
29726       && TREE_CODE (*node) != FIELD_DECL
29727       && TREE_CODE (*node) != TYPE_DECL)
29728     {
29729       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29730                name);
29731       *no_add_attrs = true;
29732       return NULL_TREE;
29733     }
29734   if (!TARGET_64BIT)
29735     {
29736       warning (OPT_Wattributes, "%qE attribute only available for 64-bit",
29737                name);
29738       *no_add_attrs = true;
29739       return NULL_TREE;
29740     }
29741
29742   /* Can combine regparm with all attributes but fastcall.  */
29743   if (is_attribute_p ("ms_abi", name))
29744     {
29745       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
29746         {
29747           error ("ms_abi and sysv_abi attributes are not compatible");
29748         }
29749
29750       return NULL_TREE;
29751     }
29752   else if (is_attribute_p ("sysv_abi", name))
29753     {
29754       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
29755         {
29756           error ("ms_abi and sysv_abi attributes are not compatible");
29757         }
29758
29759       return NULL_TREE;
29760     }
29761
29762   return NULL_TREE;
29763 }
29764
29765 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
29766    struct attribute_spec.handler.  */
29767 static tree
29768 ix86_handle_struct_attribute (tree *node, tree name,
29769                               tree args ATTRIBUTE_UNUSED,
29770                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29771 {
29772   tree *type = NULL;
29773   if (DECL_P (*node))
29774     {
29775       if (TREE_CODE (*node) == TYPE_DECL)
29776         type = &TREE_TYPE (*node);
29777     }
29778   else
29779     type = node;
29780
29781   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
29782                  || TREE_CODE (*type) == UNION_TYPE)))
29783     {
29784       warning (OPT_Wattributes, "%qE attribute ignored",
29785                name);
29786       *no_add_attrs = true;
29787     }
29788
29789   else if ((is_attribute_p ("ms_struct", name)
29790             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
29791            || ((is_attribute_p ("gcc_struct", name)
29792                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
29793     {
29794       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
29795                name);
29796       *no_add_attrs = true;
29797     }
29798
29799   return NULL_TREE;
29800 }
29801
29802 static tree
29803 ix86_handle_fndecl_attribute (tree *node, tree name,
29804                               tree args ATTRIBUTE_UNUSED,
29805                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29806 {
29807   if (TREE_CODE (*node) != FUNCTION_DECL)
29808     {
29809       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29810                name);
29811       *no_add_attrs = true;
29812     }
29813   return NULL_TREE;
29814 }
29815
29816 static bool
29817 ix86_ms_bitfield_layout_p (const_tree record_type)
29818 {
29819   return ((TARGET_MS_BITFIELD_LAYOUT
29820            && !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
29821           || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type)));
29822 }
29823
29824 /* Returns an expression indicating where the this parameter is
29825    located on entry to the FUNCTION.  */
29826
29827 static rtx
29828 x86_this_parameter (tree function)
29829 {
29830   tree type = TREE_TYPE (function);
29831   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
29832   int nregs;
29833
29834   if (TARGET_64BIT)
29835     {
29836       const int *parm_regs;
29837
29838       if (ix86_function_type_abi (type) == MS_ABI)
29839         parm_regs = x86_64_ms_abi_int_parameter_registers;
29840       else
29841         parm_regs = x86_64_int_parameter_registers;
29842       return gen_rtx_REG (DImode, parm_regs[aggr]);
29843     }
29844
29845   nregs = ix86_function_regparm (type, function);
29846
29847   if (nregs > 0 && !stdarg_p (type))
29848     {
29849       int regno;
29850
29851       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
29852         regno = aggr ? DX_REG : CX_REG;
29853       else if (ix86_is_type_thiscall (type))
29854         {
29855           regno = CX_REG;
29856           if (aggr)
29857             return gen_rtx_MEM (SImode,
29858                                 plus_constant (stack_pointer_rtx, 4));
29859         }
29860       else
29861         {
29862           regno = AX_REG;
29863           if (aggr)
29864             {
29865               regno = DX_REG;
29866               if (nregs == 1)
29867                 return gen_rtx_MEM (SImode,
29868                                     plus_constant (stack_pointer_rtx, 4));
29869             }
29870         }
29871       return gen_rtx_REG (SImode, regno);
29872     }
29873
29874   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
29875 }
29876
29877 /* Determine whether x86_output_mi_thunk can succeed.  */
29878
29879 static bool
29880 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
29881                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
29882                          HOST_WIDE_INT vcall_offset, const_tree function)
29883 {
29884   /* 64-bit can handle anything.  */
29885   if (TARGET_64BIT)
29886     return true;
29887
29888   /* For 32-bit, everything's fine if we have one free register.  */
29889   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
29890     return true;
29891
29892   /* Need a free register for vcall_offset.  */
29893   if (vcall_offset)
29894     return false;
29895
29896   /* Need a free register for GOT references.  */
29897   if (flag_pic && !targetm.binds_local_p (function))
29898     return false;
29899
29900   /* Otherwise ok.  */
29901   return true;
29902 }
29903
29904 /* Output the assembler code for a thunk function.  THUNK_DECL is the
29905    declaration for the thunk function itself, FUNCTION is the decl for
29906    the target function.  DELTA is an immediate constant offset to be
29907    added to THIS.  If VCALL_OFFSET is nonzero, the word at
29908    *(*this + vcall_offset) should be added to THIS.  */
29909
29910 static void
29911 x86_output_mi_thunk (FILE *file,
29912                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
29913                      HOST_WIDE_INT vcall_offset, tree function)
29914 {
29915   rtx xops[3];
29916   rtx this_param = x86_this_parameter (function);
29917   rtx this_reg, tmp;
29918
29919   /* Make sure unwind info is emitted for the thunk if needed.  */
29920   final_start_function (emit_barrier (), file, 1);
29921
29922   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
29923      pull it in now and let DELTA benefit.  */
29924   if (REG_P (this_param))
29925     this_reg = this_param;
29926   else if (vcall_offset)
29927     {
29928       /* Put the this parameter into %eax.  */
29929       xops[0] = this_param;
29930       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
29931       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29932     }
29933   else
29934     this_reg = NULL_RTX;
29935
29936   /* Adjust the this parameter by a fixed constant.  */
29937   if (delta)
29938     {
29939       xops[0] = GEN_INT (delta);
29940       xops[1] = this_reg ? this_reg : this_param;
29941       if (TARGET_64BIT)
29942         {
29943           if (!x86_64_general_operand (xops[0], DImode))
29944             {
29945               tmp = gen_rtx_REG (DImode, R10_REG);
29946               xops[1] = tmp;
29947               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
29948               xops[0] = tmp;
29949               xops[1] = this_param;
29950             }
29951           if (x86_maybe_negate_const_int (&xops[0], DImode))
29952             output_asm_insn ("sub{q}\t{%0, %1|%1, %0}", xops);
29953           else
29954             output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
29955         }
29956       else if (x86_maybe_negate_const_int (&xops[0], SImode))
29957         output_asm_insn ("sub{l}\t{%0, %1|%1, %0}", xops);
29958       else
29959         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
29960     }
29961
29962   /* Adjust the this parameter by a value stored in the vtable.  */
29963   if (vcall_offset)
29964     {
29965       if (TARGET_64BIT)
29966         tmp = gen_rtx_REG (DImode, R10_REG);
29967       else
29968         {
29969           int tmp_regno = CX_REG;
29970           if (lookup_attribute ("fastcall",
29971                                 TYPE_ATTRIBUTES (TREE_TYPE (function)))
29972               || ix86_is_type_thiscall (TREE_TYPE (function)))
29973             tmp_regno = AX_REG;
29974           tmp = gen_rtx_REG (SImode, tmp_regno);
29975         }
29976
29977       xops[0] = gen_rtx_MEM (Pmode, this_reg);
29978       xops[1] = tmp;
29979       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29980
29981       /* Adjust the this parameter.  */
29982       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
29983       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
29984         {
29985           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
29986           xops[0] = GEN_INT (vcall_offset);
29987           xops[1] = tmp2;
29988           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
29989           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
29990         }
29991       xops[1] = this_reg;
29992       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
29993     }
29994
29995   /* If necessary, drop THIS back to its stack slot.  */
29996   if (this_reg && this_reg != this_param)
29997     {
29998       xops[0] = this_reg;
29999       xops[1] = this_param;
30000       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
30001     }
30002
30003   xops[0] = XEXP (DECL_RTL (function), 0);
30004   if (TARGET_64BIT)
30005     {
30006       if (!flag_pic || targetm.binds_local_p (function)
30007           || DEFAULT_ABI == MS_ABI)
30008         output_asm_insn ("jmp\t%P0", xops);
30009       /* All thunks should be in the same object as their target,
30010          and thus binds_local_p should be true.  */
30011       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
30012         gcc_unreachable ();
30013       else
30014         {
30015           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
30016           tmp = gen_rtx_CONST (Pmode, tmp);
30017           tmp = gen_rtx_MEM (QImode, tmp);
30018           xops[0] = tmp;
30019           output_asm_insn ("jmp\t%A0", xops);
30020         }
30021     }
30022   else
30023     {
30024       if (!flag_pic || targetm.binds_local_p (function))
30025         output_asm_insn ("jmp\t%P0", xops);
30026       else
30027 #if TARGET_MACHO
30028         if (TARGET_MACHO)
30029           {
30030             rtx sym_ref = XEXP (DECL_RTL (function), 0);
30031             if (TARGET_MACHO_BRANCH_ISLANDS)
30032               sym_ref = (gen_rtx_SYMBOL_REF
30033                    (Pmode,
30034                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
30035             tmp = gen_rtx_MEM (QImode, sym_ref);
30036             xops[0] = tmp;
30037             output_asm_insn ("jmp\t%0", xops);
30038           }
30039         else
30040 #endif /* TARGET_MACHO */
30041         {
30042           tmp = gen_rtx_REG (SImode, CX_REG);
30043           output_set_got (tmp, NULL_RTX);
30044
30045           xops[1] = tmp;
30046           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
30047           output_asm_insn ("jmp\t{*}%1", xops);
30048         }
30049     }
30050   final_end_function ();
30051 }
30052
30053 static void
30054 x86_file_start (void)
30055 {
30056   default_file_start ();
30057 #if TARGET_MACHO
30058   darwin_file_start ();
30059 #endif
30060   if (X86_FILE_START_VERSION_DIRECTIVE)
30061     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
30062   if (X86_FILE_START_FLTUSED)
30063     fputs ("\t.global\t__fltused\n", asm_out_file);
30064   if (ix86_asm_dialect == ASM_INTEL)
30065     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
30066 }
30067
30068 int
30069 x86_field_alignment (tree field, int computed)
30070 {
30071   enum machine_mode mode;
30072   tree type = TREE_TYPE (field);
30073
30074   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
30075     return computed;
30076   mode = TYPE_MODE (strip_array_types (type));
30077   if (mode == DFmode || mode == DCmode
30078       || GET_MODE_CLASS (mode) == MODE_INT
30079       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
30080     return MIN (32, computed);
30081   return computed;
30082 }
30083
30084 /* Output assembler code to FILE to increment profiler label # LABELNO
30085    for profiling a function entry.  */
30086 void
30087 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
30088 {
30089   const char *mcount_name = (flag_fentry ? MCOUNT_NAME_BEFORE_PROLOGUE
30090                                          : MCOUNT_NAME);
30091
30092   if (TARGET_64BIT)
30093     {
30094 #ifndef NO_PROFILE_COUNTERS
30095       fprintf (file, "\tleaq\t%sP%d(%%rip),%%r11\n", LPREFIX, labelno);
30096 #endif
30097
30098       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
30099         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", mcount_name);
30100       else
30101         fprintf (file, "\tcall\t%s\n", mcount_name);
30102     }
30103   else if (flag_pic)
30104     {
30105 #ifndef NO_PROFILE_COUNTERS
30106       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%" PROFILE_COUNT_REGISTER "\n",
30107                LPREFIX, labelno);
30108 #endif
30109       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", mcount_name);
30110     }
30111   else
30112     {
30113 #ifndef NO_PROFILE_COUNTERS
30114       fprintf (file, "\tmovl\t$%sP%d,%%" PROFILE_COUNT_REGISTER "\n",
30115                LPREFIX, labelno);
30116 #endif
30117       fprintf (file, "\tcall\t%s\n", mcount_name);
30118     }
30119 }
30120
30121 /* We don't have exact information about the insn sizes, but we may assume
30122    quite safely that we are informed about all 1 byte insns and memory
30123    address sizes.  This is enough to eliminate unnecessary padding in
30124    99% of cases.  */
30125
30126 static int
30127 min_insn_size (rtx insn)
30128 {
30129   int l = 0, len;
30130
30131   if (!INSN_P (insn) || !active_insn_p (insn))
30132     return 0;
30133
30134   /* Discard alignments we've emit and jump instructions.  */
30135   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
30136       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
30137     return 0;
30138   if (JUMP_TABLE_DATA_P (insn))
30139     return 0;
30140
30141   /* Important case - calls are always 5 bytes.
30142      It is common to have many calls in the row.  */
30143   if (CALL_P (insn)
30144       && symbolic_reference_mentioned_p (PATTERN (insn))
30145       && !SIBLING_CALL_P (insn))
30146     return 5;
30147   len = get_attr_length (insn);
30148   if (len <= 1)
30149     return 1;
30150
30151   /* For normal instructions we rely on get_attr_length being exact,
30152      with a few exceptions.  */
30153   if (!JUMP_P (insn))
30154     {
30155       enum attr_type type = get_attr_type (insn);
30156
30157       switch (type)
30158         {
30159         case TYPE_MULTI:
30160           if (GET_CODE (PATTERN (insn)) == ASM_INPUT
30161               || asm_noperands (PATTERN (insn)) >= 0)
30162             return 0;
30163           break;
30164         case TYPE_OTHER:
30165         case TYPE_FCMP:
30166           break;
30167         default:
30168           /* Otherwise trust get_attr_length.  */
30169           return len;
30170         }
30171
30172       l = get_attr_length_address (insn);
30173       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
30174         l = 4;
30175     }
30176   if (l)
30177     return 1+l;
30178   else
30179     return 2;
30180 }
30181
30182 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
30183
30184 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
30185    window.  */
30186
30187 static void
30188 ix86_avoid_jump_mispredicts (void)
30189 {
30190   rtx insn, start = get_insns ();
30191   int nbytes = 0, njumps = 0;
30192   int isjump = 0;
30193
30194   /* Look for all minimal intervals of instructions containing 4 jumps.
30195      The intervals are bounded by START and INSN.  NBYTES is the total
30196      size of instructions in the interval including INSN and not including
30197      START.  When the NBYTES is smaller than 16 bytes, it is possible
30198      that the end of START and INSN ends up in the same 16byte page.
30199
30200      The smallest offset in the page INSN can start is the case where START
30201      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
30202      We add p2align to 16byte window with maxskip 15 - NBYTES + sizeof (INSN).
30203      */
30204   for (insn = start; insn; insn = NEXT_INSN (insn))
30205     {
30206       int min_size;
30207
30208       if (LABEL_P (insn))
30209         {
30210           int align = label_to_alignment (insn);
30211           int max_skip = label_to_max_skip (insn);
30212
30213           if (max_skip > 15)
30214             max_skip = 15;
30215           /* If align > 3, only up to 16 - max_skip - 1 bytes can be
30216              already in the current 16 byte page, because otherwise
30217              ASM_OUTPUT_MAX_SKIP_ALIGN could skip max_skip or fewer
30218              bytes to reach 16 byte boundary.  */
30219           if (align <= 0
30220               || (align <= 3 && max_skip != (1 << align) - 1))
30221             max_skip = 0;
30222           if (dump_file)
30223             fprintf (dump_file, "Label %i with max_skip %i\n",
30224                      INSN_UID (insn), max_skip);
30225           if (max_skip)
30226             {
30227               while (nbytes + max_skip >= 16)
30228                 {
30229                   start = NEXT_INSN (start);
30230                   if ((JUMP_P (start)
30231                        && GET_CODE (PATTERN (start)) != ADDR_VEC
30232                        && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
30233                       || CALL_P (start))
30234                     njumps--, isjump = 1;
30235                   else
30236                     isjump = 0;
30237                   nbytes -= min_insn_size (start);
30238                 }
30239             }
30240           continue;
30241         }
30242
30243       min_size = min_insn_size (insn);
30244       nbytes += min_size;
30245       if (dump_file)
30246         fprintf (dump_file, "Insn %i estimated to %i bytes\n",
30247                  INSN_UID (insn), min_size);
30248       if ((JUMP_P (insn)
30249            && GET_CODE (PATTERN (insn)) != ADDR_VEC
30250            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
30251           || CALL_P (insn))
30252         njumps++;
30253       else
30254         continue;
30255
30256       while (njumps > 3)
30257         {
30258           start = NEXT_INSN (start);
30259           if ((JUMP_P (start)
30260                && GET_CODE (PATTERN (start)) != ADDR_VEC
30261                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
30262               || CALL_P (start))
30263             njumps--, isjump = 1;
30264           else
30265             isjump = 0;
30266           nbytes -= min_insn_size (start);
30267         }
30268       gcc_assert (njumps >= 0);
30269       if (dump_file)
30270         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
30271                  INSN_UID (start), INSN_UID (insn), nbytes);
30272
30273       if (njumps == 3 && isjump && nbytes < 16)
30274         {
30275           int padsize = 15 - nbytes + min_insn_size (insn);
30276
30277           if (dump_file)
30278             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
30279                      INSN_UID (insn), padsize);
30280           emit_insn_before (gen_pad (GEN_INT (padsize)), insn);
30281         }
30282     }
30283 }
30284 #endif
30285
30286 /* AMD Athlon works faster
30287    when RET is not destination of conditional jump or directly preceded
30288    by other jump instruction.  We avoid the penalty by inserting NOP just
30289    before the RET instructions in such cases.  */
30290 static void
30291 ix86_pad_returns (void)
30292 {
30293   edge e;
30294   edge_iterator ei;
30295
30296   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
30297     {
30298       basic_block bb = e->src;
30299       rtx ret = BB_END (bb);
30300       rtx prev;
30301       bool replace = false;
30302
30303       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
30304           || optimize_bb_for_size_p (bb))
30305         continue;
30306       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
30307         if (active_insn_p (prev) || LABEL_P (prev))
30308           break;
30309       if (prev && LABEL_P (prev))
30310         {
30311           edge e;
30312           edge_iterator ei;
30313
30314           FOR_EACH_EDGE (e, ei, bb->preds)
30315             if (EDGE_FREQUENCY (e) && e->src->index >= 0
30316                 && !(e->flags & EDGE_FALLTHRU))
30317               replace = true;
30318         }
30319       if (!replace)
30320         {
30321           prev = prev_active_insn (ret);
30322           if (prev
30323               && ((JUMP_P (prev) && any_condjump_p (prev))
30324                   || CALL_P (prev)))
30325             replace = true;
30326           /* Empty functions get branch mispredict even when
30327              the jump destination is not visible to us.  */
30328           if (!prev && !optimize_function_for_size_p (cfun))
30329             replace = true;
30330         }
30331       if (replace)
30332         {
30333           emit_jump_insn_before (gen_return_internal_long (), ret);
30334           delete_insn (ret);
30335         }
30336     }
30337 }
30338
30339 /* Count the minimum number of instructions in BB.  Return 4 if the
30340    number of instructions >= 4.  */
30341
30342 static int 
30343 ix86_count_insn_bb (basic_block bb)
30344 {
30345   rtx insn;
30346   int insn_count = 0;
30347
30348   /* Count number of instructions in this block.  Return 4 if the number
30349      of instructions >= 4.  */
30350   FOR_BB_INSNS (bb, insn)
30351     {
30352       /* Only happen in exit blocks.  */
30353       if (JUMP_P (insn)
30354           && GET_CODE (PATTERN (insn)) == RETURN)
30355         break;
30356
30357       if (NONDEBUG_INSN_P (insn)
30358           && GET_CODE (PATTERN (insn)) != USE
30359           && GET_CODE (PATTERN (insn)) != CLOBBER)
30360         {
30361           insn_count++;
30362           if (insn_count >= 4)
30363             return insn_count;
30364         }
30365     }
30366
30367   return insn_count;
30368 }
30369
30370
30371 /* Count the minimum number of instructions in code path in BB.  
30372    Return 4 if the number of instructions >= 4.  */
30373
30374 static int 
30375 ix86_count_insn (basic_block bb)
30376 {
30377   edge e;
30378   edge_iterator ei;
30379   int min_prev_count;
30380
30381   /* Only bother counting instructions along paths with no
30382      more than 2 basic blocks between entry and exit.  Given
30383      that BB has an edge to exit, determine if a predecessor
30384      of BB has an edge from entry.  If so, compute the number
30385      of instructions in the predecessor block.  If there
30386      happen to be multiple such blocks, compute the minimum.  */
30387   min_prev_count = 4;
30388   FOR_EACH_EDGE (e, ei, bb->preds)
30389     {
30390       edge prev_e;
30391       edge_iterator prev_ei;
30392
30393       if (e->src == ENTRY_BLOCK_PTR)
30394         {
30395           min_prev_count = 0;
30396           break;
30397         }
30398       FOR_EACH_EDGE (prev_e, prev_ei, e->src->preds)
30399         {
30400           if (prev_e->src == ENTRY_BLOCK_PTR)
30401             {
30402               int count = ix86_count_insn_bb (e->src);
30403               if (count < min_prev_count)
30404                 min_prev_count = count;
30405               break;
30406             }
30407         }
30408     }
30409
30410   if (min_prev_count < 4)
30411     min_prev_count += ix86_count_insn_bb (bb);
30412
30413   return min_prev_count;
30414 }
30415
30416 /* Pad short funtion to 4 instructions.   */
30417
30418 static void
30419 ix86_pad_short_function (void)
30420 {
30421   edge e;
30422   edge_iterator ei;
30423
30424   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
30425     {
30426       rtx ret = BB_END (e->src);
30427       if (JUMP_P (ret) && GET_CODE (PATTERN (ret)) == RETURN)
30428         {
30429           int insn_count = ix86_count_insn (e->src);
30430
30431           /* Pad short function.  */
30432           if (insn_count < 4)
30433             {
30434               rtx insn = ret;
30435
30436               /* Find epilogue.  */
30437               while (insn
30438                      && (!NOTE_P (insn)
30439                          || NOTE_KIND (insn) != NOTE_INSN_EPILOGUE_BEG))
30440                 insn = PREV_INSN (insn);
30441
30442               if (!insn)
30443                 insn = ret;
30444
30445               /* Two NOPs count as one instruction.  */
30446               insn_count = 2 * (4 - insn_count);
30447               emit_insn_before (gen_nops (GEN_INT (insn_count)), insn);
30448             }
30449         }
30450     }
30451 }
30452
30453 /* Implement machine specific optimizations.  We implement padding of returns
30454    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
30455 static void
30456 ix86_reorg (void)
30457 {
30458   /* We are freeing block_for_insn in the toplev to keep compatibility
30459      with old MDEP_REORGS that are not CFG based.  Recompute it now.  */
30460   compute_bb_for_insn ();
30461
30462   if (optimize && optimize_function_for_speed_p (cfun))
30463     {
30464       if (TARGET_PAD_SHORT_FUNCTION)
30465         ix86_pad_short_function ();
30466       else if (TARGET_PAD_RETURNS)
30467         ix86_pad_returns ();
30468 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
30469       if (TARGET_FOUR_JUMP_LIMIT)
30470         ix86_avoid_jump_mispredicts ();
30471 #endif
30472     }
30473
30474   /* Run the vzeroupper optimization if needed.  */
30475   if (TARGET_VZEROUPPER)
30476     move_or_delete_vzeroupper ();
30477 }
30478
30479 /* Return nonzero when QImode register that must be represented via REX prefix
30480    is used.  */
30481 bool
30482 x86_extended_QIreg_mentioned_p (rtx insn)
30483 {
30484   int i;
30485   extract_insn_cached (insn);
30486   for (i = 0; i < recog_data.n_operands; i++)
30487     if (REG_P (recog_data.operand[i])
30488         && REGNO (recog_data.operand[i]) > BX_REG)
30489        return true;
30490   return false;
30491 }
30492
30493 /* Return nonzero when P points to register encoded via REX prefix.
30494    Called via for_each_rtx.  */
30495 static int
30496 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
30497 {
30498    unsigned int regno;
30499    if (!REG_P (*p))
30500      return 0;
30501    regno = REGNO (*p);
30502    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
30503 }
30504
30505 /* Return true when INSN mentions register that must be encoded using REX
30506    prefix.  */
30507 bool
30508 x86_extended_reg_mentioned_p (rtx insn)
30509 {
30510   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
30511                        extended_reg_mentioned_1, NULL);
30512 }
30513
30514 /* If profitable, negate (without causing overflow) integer constant
30515    of mode MODE at location LOC.  Return true in this case.  */
30516 bool
30517 x86_maybe_negate_const_int (rtx *loc, enum machine_mode mode)
30518 {
30519   HOST_WIDE_INT val;
30520
30521   if (!CONST_INT_P (*loc))
30522     return false;
30523
30524   switch (mode)
30525     {
30526     case DImode:
30527       /* DImode x86_64 constants must fit in 32 bits.  */
30528       gcc_assert (x86_64_immediate_operand (*loc, mode));
30529
30530       mode = SImode;
30531       break;
30532
30533     case SImode:
30534     case HImode:
30535     case QImode:
30536       break;
30537
30538     default:
30539       gcc_unreachable ();
30540     }
30541
30542   /* Avoid overflows.  */
30543   if (mode_signbit_p (mode, *loc))
30544     return false;
30545
30546   val = INTVAL (*loc);
30547
30548   /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
30549      Exceptions: -128 encodes smaller than 128, so swap sign and op.  */
30550   if ((val < 0 && val != -128)
30551       || val == 128)
30552     {
30553       *loc = GEN_INT (-val);
30554       return true;
30555     }
30556
30557   return false;
30558 }
30559
30560 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
30561    optabs would emit if we didn't have TFmode patterns.  */
30562
30563 void
30564 x86_emit_floatuns (rtx operands[2])
30565 {
30566   rtx neglab, donelab, i0, i1, f0, in, out;
30567   enum machine_mode mode, inmode;
30568
30569   inmode = GET_MODE (operands[1]);
30570   gcc_assert (inmode == SImode || inmode == DImode);
30571
30572   out = operands[0];
30573   in = force_reg (inmode, operands[1]);
30574   mode = GET_MODE (out);
30575   neglab = gen_label_rtx ();
30576   donelab = gen_label_rtx ();
30577   f0 = gen_reg_rtx (mode);
30578
30579   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
30580
30581   expand_float (out, in, 0);
30582
30583   emit_jump_insn (gen_jump (donelab));
30584   emit_barrier ();
30585
30586   emit_label (neglab);
30587
30588   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
30589                             1, OPTAB_DIRECT);
30590   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
30591                             1, OPTAB_DIRECT);
30592   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
30593
30594   expand_float (f0, i0, 0);
30595
30596   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
30597
30598   emit_label (donelab);
30599 }
30600 \f
30601 /* AVX does not support 32-byte integer vector operations,
30602    thus the longest vector we are faced with is V16QImode.  */
30603 #define MAX_VECT_LEN    16
30604
30605 struct expand_vec_perm_d
30606 {
30607   rtx target, op0, op1;
30608   unsigned char perm[MAX_VECT_LEN];
30609   enum machine_mode vmode;
30610   unsigned char nelt;
30611   bool testing_p;
30612 };
30613
30614 static bool expand_vec_perm_1 (struct expand_vec_perm_d *d);
30615 static bool expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d);
30616
30617 /* Get a vector mode of the same size as the original but with elements
30618    twice as wide.  This is only guaranteed to apply to integral vectors.  */
30619
30620 static inline enum machine_mode
30621 get_mode_wider_vector (enum machine_mode o)
30622 {
30623   /* ??? Rely on the ordering that genmodes.c gives to vectors.  */
30624   enum machine_mode n = GET_MODE_WIDER_MODE (o);
30625   gcc_assert (GET_MODE_NUNITS (o) == GET_MODE_NUNITS (n) * 2);
30626   gcc_assert (GET_MODE_SIZE (o) == GET_MODE_SIZE (n));
30627   return n;
30628 }
30629
30630 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30631    with all elements equal to VAR.  Return true if successful.  */
30632
30633 static bool
30634 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
30635                                    rtx target, rtx val)
30636 {
30637   bool ok;
30638
30639   switch (mode)
30640     {
30641     case V2SImode:
30642     case V2SFmode:
30643       if (!mmx_ok)
30644         return false;
30645       /* FALLTHRU */
30646
30647     case V4DFmode:
30648     case V4DImode:
30649     case V8SFmode:
30650     case V8SImode:
30651     case V2DFmode:
30652     case V2DImode:
30653     case V4SFmode:
30654     case V4SImode:
30655       {
30656         rtx insn, dup;
30657
30658         /* First attempt to recognize VAL as-is.  */
30659         dup = gen_rtx_VEC_DUPLICATE (mode, val);
30660         insn = emit_insn (gen_rtx_SET (VOIDmode, target, dup));
30661         if (recog_memoized (insn) < 0)
30662           {
30663             rtx seq;
30664             /* If that fails, force VAL into a register.  */
30665
30666             start_sequence ();
30667             XEXP (dup, 0) = force_reg (GET_MODE_INNER (mode), val);
30668             seq = get_insns ();
30669             end_sequence ();
30670             if (seq)
30671               emit_insn_before (seq, insn);
30672
30673             ok = recog_memoized (insn) >= 0;
30674             gcc_assert (ok);
30675           }
30676       }
30677       return true;
30678
30679     case V4HImode:
30680       if (!mmx_ok)
30681         return false;
30682       if (TARGET_SSE || TARGET_3DNOW_A)
30683         {
30684           rtx x;
30685
30686           val = gen_lowpart (SImode, val);
30687           x = gen_rtx_TRUNCATE (HImode, val);
30688           x = gen_rtx_VEC_DUPLICATE (mode, x);
30689           emit_insn (gen_rtx_SET (VOIDmode, target, x));
30690           return true;
30691         }
30692       goto widen;
30693
30694     case V8QImode:
30695       if (!mmx_ok)
30696         return false;
30697       goto widen;
30698
30699     case V8HImode:
30700       if (TARGET_SSE2)
30701         {
30702           struct expand_vec_perm_d dperm;
30703           rtx tmp1, tmp2;
30704
30705         permute:
30706           memset (&dperm, 0, sizeof (dperm));
30707           dperm.target = target;
30708           dperm.vmode = mode;
30709           dperm.nelt = GET_MODE_NUNITS (mode);
30710           dperm.op0 = dperm.op1 = gen_reg_rtx (mode);
30711
30712           /* Extend to SImode using a paradoxical SUBREG.  */
30713           tmp1 = gen_reg_rtx (SImode);
30714           emit_move_insn (tmp1, gen_lowpart (SImode, val));
30715
30716           /* Insert the SImode value as low element of a V4SImode vector. */
30717           tmp2 = gen_lowpart (V4SImode, dperm.op0);
30718           emit_insn (gen_vec_setv4si_0 (tmp2, CONST0_RTX (V4SImode), tmp1));
30719
30720           ok = (expand_vec_perm_1 (&dperm)
30721                 || expand_vec_perm_broadcast_1 (&dperm));
30722           gcc_assert (ok);
30723           return ok;
30724         }
30725       goto widen;
30726
30727     case V16QImode:
30728       if (TARGET_SSE2)
30729         goto permute;
30730       goto widen;
30731
30732     widen:
30733       /* Replicate the value once into the next wider mode and recurse.  */
30734       {
30735         enum machine_mode smode, wsmode, wvmode;
30736         rtx x;
30737
30738         smode = GET_MODE_INNER (mode);
30739         wvmode = get_mode_wider_vector (mode);
30740         wsmode = GET_MODE_INNER (wvmode);
30741
30742         val = convert_modes (wsmode, smode, val, true);
30743         x = expand_simple_binop (wsmode, ASHIFT, val,
30744                                  GEN_INT (GET_MODE_BITSIZE (smode)),
30745                                  NULL_RTX, 1, OPTAB_LIB_WIDEN);
30746         val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
30747
30748         x = gen_lowpart (wvmode, target);
30749         ok = ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val);
30750         gcc_assert (ok);
30751         return ok;
30752       }
30753
30754     case V16HImode:
30755     case V32QImode:
30756       {
30757         enum machine_mode hvmode = (mode == V16HImode ? V8HImode : V16QImode);
30758         rtx x = gen_reg_rtx (hvmode);
30759
30760         ok = ix86_expand_vector_init_duplicate (false, hvmode, x, val);
30761         gcc_assert (ok);
30762
30763         x = gen_rtx_VEC_CONCAT (mode, x, x);
30764         emit_insn (gen_rtx_SET (VOIDmode, target, x));
30765       }
30766       return true;
30767
30768     default:
30769       return false;
30770     }
30771 }
30772
30773 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30774    whose ONE_VAR element is VAR, and other elements are zero.  Return true
30775    if successful.  */
30776
30777 static bool
30778 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
30779                                      rtx target, rtx var, int one_var)
30780 {
30781   enum machine_mode vsimode;
30782   rtx new_target;
30783   rtx x, tmp;
30784   bool use_vector_set = false;
30785
30786   switch (mode)
30787     {
30788     case V2DImode:
30789       /* For SSE4.1, we normally use vector set.  But if the second
30790          element is zero and inter-unit moves are OK, we use movq
30791          instead.  */
30792       use_vector_set = (TARGET_64BIT
30793                         && TARGET_SSE4_1
30794                         && !(TARGET_INTER_UNIT_MOVES
30795                              && one_var == 0));
30796       break;
30797     case V16QImode:
30798     case V4SImode:
30799     case V4SFmode:
30800       use_vector_set = TARGET_SSE4_1;
30801       break;
30802     case V8HImode:
30803       use_vector_set = TARGET_SSE2;
30804       break;
30805     case V4HImode:
30806       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
30807       break;
30808     case V32QImode:
30809     case V16HImode:
30810     case V8SImode:
30811     case V8SFmode:
30812     case V4DFmode:
30813       use_vector_set = TARGET_AVX;
30814       break;
30815     case V4DImode:
30816       /* Use ix86_expand_vector_set in 64bit mode only.  */
30817       use_vector_set = TARGET_AVX && TARGET_64BIT;
30818       break;
30819     default:
30820       break;
30821     }
30822
30823   if (use_vector_set)
30824     {
30825       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
30826       var = force_reg (GET_MODE_INNER (mode), var);
30827       ix86_expand_vector_set (mmx_ok, target, var, one_var);
30828       return true;
30829     }
30830
30831   switch (mode)
30832     {
30833     case V2SFmode:
30834     case V2SImode:
30835       if (!mmx_ok)
30836         return false;
30837       /* FALLTHRU */
30838
30839     case V2DFmode:
30840     case V2DImode:
30841       if (one_var != 0)
30842         return false;
30843       var = force_reg (GET_MODE_INNER (mode), var);
30844       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
30845       emit_insn (gen_rtx_SET (VOIDmode, target, x));
30846       return true;
30847
30848     case V4SFmode:
30849     case V4SImode:
30850       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
30851         new_target = gen_reg_rtx (mode);
30852       else
30853         new_target = target;
30854       var = force_reg (GET_MODE_INNER (mode), var);
30855       x = gen_rtx_VEC_DUPLICATE (mode, var);
30856       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
30857       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
30858       if (one_var != 0)
30859         {
30860           /* We need to shuffle the value to the correct position, so
30861              create a new pseudo to store the intermediate result.  */
30862
30863           /* With SSE2, we can use the integer shuffle insns.  */
30864           if (mode != V4SFmode && TARGET_SSE2)
30865             {
30866               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
30867                                             const1_rtx,
30868                                             GEN_INT (one_var == 1 ? 0 : 1),
30869                                             GEN_INT (one_var == 2 ? 0 : 1),
30870                                             GEN_INT (one_var == 3 ? 0 : 1)));
30871               if (target != new_target)
30872                 emit_move_insn (target, new_target);
30873               return true;
30874             }
30875
30876           /* Otherwise convert the intermediate result to V4SFmode and
30877              use the SSE1 shuffle instructions.  */
30878           if (mode != V4SFmode)
30879             {
30880               tmp = gen_reg_rtx (V4SFmode);
30881               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
30882             }
30883           else
30884             tmp = new_target;
30885
30886           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
30887                                        const1_rtx,
30888                                        GEN_INT (one_var == 1 ? 0 : 1),
30889                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
30890                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
30891
30892           if (mode != V4SFmode)
30893             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
30894           else if (tmp != target)
30895             emit_move_insn (target, tmp);
30896         }
30897       else if (target != new_target)
30898         emit_move_insn (target, new_target);
30899       return true;
30900
30901     case V8HImode:
30902     case V16QImode:
30903       vsimode = V4SImode;
30904       goto widen;
30905     case V4HImode:
30906     case V8QImode:
30907       if (!mmx_ok)
30908         return false;
30909       vsimode = V2SImode;
30910       goto widen;
30911     widen:
30912       if (one_var != 0)
30913         return false;
30914
30915       /* Zero extend the variable element to SImode and recurse.  */
30916       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
30917
30918       x = gen_reg_rtx (vsimode);
30919       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
30920                                                 var, one_var))
30921         gcc_unreachable ();
30922
30923       emit_move_insn (target, gen_lowpart (mode, x));
30924       return true;
30925
30926     default:
30927       return false;
30928     }
30929 }
30930
30931 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30932    consisting of the values in VALS.  It is known that all elements
30933    except ONE_VAR are constants.  Return true if successful.  */
30934
30935 static bool
30936 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
30937                                  rtx target, rtx vals, int one_var)
30938 {
30939   rtx var = XVECEXP (vals, 0, one_var);
30940   enum machine_mode wmode;
30941   rtx const_vec, x;
30942
30943   const_vec = copy_rtx (vals);
30944   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
30945   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
30946
30947   switch (mode)
30948     {
30949     case V2DFmode:
30950     case V2DImode:
30951     case V2SFmode:
30952     case V2SImode:
30953       /* For the two element vectors, it's just as easy to use
30954          the general case.  */
30955       return false;
30956
30957     case V4DImode:
30958       /* Use ix86_expand_vector_set in 64bit mode only.  */
30959       if (!TARGET_64BIT)
30960         return false;
30961     case V4DFmode:
30962     case V8SFmode:
30963     case V8SImode:
30964     case V16HImode:
30965     case V32QImode:
30966     case V4SFmode:
30967     case V4SImode:
30968     case V8HImode:
30969     case V4HImode:
30970       break;
30971
30972     case V16QImode:
30973       if (TARGET_SSE4_1)
30974         break;
30975       wmode = V8HImode;
30976       goto widen;
30977     case V8QImode:
30978       wmode = V4HImode;
30979       goto widen;
30980     widen:
30981       /* There's no way to set one QImode entry easily.  Combine
30982          the variable value with its adjacent constant value, and
30983          promote to an HImode set.  */
30984       x = XVECEXP (vals, 0, one_var ^ 1);
30985       if (one_var & 1)
30986         {
30987           var = convert_modes (HImode, QImode, var, true);
30988           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
30989                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
30990           x = GEN_INT (INTVAL (x) & 0xff);
30991         }
30992       else
30993         {
30994           var = convert_modes (HImode, QImode, var, true);
30995           x = gen_int_mode (INTVAL (x) << 8, HImode);
30996         }
30997       if (x != const0_rtx)
30998         var = expand_simple_binop (HImode, IOR, var, x, var,
30999                                    1, OPTAB_LIB_WIDEN);
31000
31001       x = gen_reg_rtx (wmode);
31002       emit_move_insn (x, gen_lowpart (wmode, const_vec));
31003       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
31004
31005       emit_move_insn (target, gen_lowpart (mode, x));
31006       return true;
31007
31008     default:
31009       return false;
31010     }
31011
31012   emit_move_insn (target, const_vec);
31013   ix86_expand_vector_set (mmx_ok, target, var, one_var);
31014   return true;
31015 }
31016
31017 /* A subroutine of ix86_expand_vector_init_general.  Use vector
31018    concatenate to handle the most general case: all values variable,
31019    and none identical.  */
31020
31021 static void
31022 ix86_expand_vector_init_concat (enum machine_mode mode,
31023                                 rtx target, rtx *ops, int n)
31024 {
31025   enum machine_mode cmode, hmode = VOIDmode;
31026   rtx first[8], second[4];
31027   rtvec v;
31028   int i, j;
31029
31030   switch (n)
31031     {
31032     case 2:
31033       switch (mode)
31034         {
31035         case V8SImode:
31036           cmode = V4SImode;
31037           break;
31038         case V8SFmode:
31039           cmode = V4SFmode;
31040           break;
31041         case V4DImode:
31042           cmode = V2DImode;
31043           break;
31044         case V4DFmode:
31045           cmode = V2DFmode;
31046           break;
31047         case V4SImode:
31048           cmode = V2SImode;
31049           break;
31050         case V4SFmode:
31051           cmode = V2SFmode;
31052           break;
31053         case V2DImode:
31054           cmode = DImode;
31055           break;
31056         case V2SImode:
31057           cmode = SImode;
31058           break;
31059         case V2DFmode:
31060           cmode = DFmode;
31061           break;
31062         case V2SFmode:
31063           cmode = SFmode;
31064           break;
31065         default:
31066           gcc_unreachable ();
31067         }
31068
31069       if (!register_operand (ops[1], cmode))
31070         ops[1] = force_reg (cmode, ops[1]);
31071       if (!register_operand (ops[0], cmode))
31072         ops[0] = force_reg (cmode, ops[0]);
31073       emit_insn (gen_rtx_SET (VOIDmode, target,
31074                               gen_rtx_VEC_CONCAT (mode, ops[0],
31075                                                   ops[1])));
31076       break;
31077
31078     case 4:
31079       switch (mode)
31080         {
31081         case V4DImode:
31082           cmode = V2DImode;
31083           break;
31084         case V4DFmode:
31085           cmode = V2DFmode;
31086           break;
31087         case V4SImode:
31088           cmode = V2SImode;
31089           break;
31090         case V4SFmode:
31091           cmode = V2SFmode;
31092           break;
31093         default:
31094           gcc_unreachable ();
31095         }
31096       goto half;
31097
31098     case 8:
31099       switch (mode)
31100         {
31101         case V8SImode:
31102           cmode = V2SImode;
31103           hmode = V4SImode;
31104           break;
31105         case V8SFmode:
31106           cmode = V2SFmode;
31107           hmode = V4SFmode;
31108           break;
31109         default:
31110           gcc_unreachable ();
31111         }
31112       goto half;
31113
31114 half:
31115       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
31116       i = n - 1;
31117       j = (n >> 1) - 1;
31118       for (; i > 0; i -= 2, j--)
31119         {
31120           first[j] = gen_reg_rtx (cmode);
31121           v = gen_rtvec (2, ops[i - 1], ops[i]);
31122           ix86_expand_vector_init (false, first[j],
31123                                    gen_rtx_PARALLEL (cmode, v));
31124         }
31125
31126       n >>= 1;
31127       if (n > 2)
31128         {
31129           gcc_assert (hmode != VOIDmode);
31130           for (i = j = 0; i < n; i += 2, j++)
31131             {
31132               second[j] = gen_reg_rtx (hmode);
31133               ix86_expand_vector_init_concat (hmode, second [j],
31134                                               &first [i], 2);
31135             }
31136           n >>= 1;
31137           ix86_expand_vector_init_concat (mode, target, second, n);
31138         }
31139       else
31140         ix86_expand_vector_init_concat (mode, target, first, n);
31141       break;
31142
31143     default:
31144       gcc_unreachable ();
31145     }
31146 }
31147
31148 /* A subroutine of ix86_expand_vector_init_general.  Use vector
31149    interleave to handle the most general case: all values variable,
31150    and none identical.  */
31151
31152 static void
31153 ix86_expand_vector_init_interleave (enum machine_mode mode,
31154                                     rtx target, rtx *ops, int n)
31155 {
31156   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
31157   int i, j;
31158   rtx op0, op1;
31159   rtx (*gen_load_even) (rtx, rtx, rtx);
31160   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
31161   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
31162
31163   switch (mode)
31164     {
31165     case V8HImode:
31166       gen_load_even = gen_vec_setv8hi;
31167       gen_interleave_first_low = gen_vec_interleave_lowv4si;
31168       gen_interleave_second_low = gen_vec_interleave_lowv2di;
31169       inner_mode = HImode;
31170       first_imode = V4SImode;
31171       second_imode = V2DImode;
31172       third_imode = VOIDmode;
31173       break;
31174     case V16QImode:
31175       gen_load_even = gen_vec_setv16qi;
31176       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
31177       gen_interleave_second_low = gen_vec_interleave_lowv4si;
31178       inner_mode = QImode;
31179       first_imode = V8HImode;
31180       second_imode = V4SImode;
31181       third_imode = V2DImode;
31182       break;
31183     default:
31184       gcc_unreachable ();
31185     }
31186
31187   for (i = 0; i < n; i++)
31188     {
31189       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
31190       op0 = gen_reg_rtx (SImode);
31191       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
31192
31193       /* Insert the SImode value as low element of V4SImode vector. */
31194       op1 = gen_reg_rtx (V4SImode);
31195       op0 = gen_rtx_VEC_MERGE (V4SImode,
31196                                gen_rtx_VEC_DUPLICATE (V4SImode,
31197                                                       op0),
31198                                CONST0_RTX (V4SImode),
31199                                const1_rtx);
31200       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
31201
31202       /* Cast the V4SImode vector back to a vector in orignal mode.  */
31203       op0 = gen_reg_rtx (mode);
31204       emit_move_insn (op0, gen_lowpart (mode, op1));
31205
31206       /* Load even elements into the second positon.  */
31207       emit_insn (gen_load_even (op0,
31208                                 force_reg (inner_mode,
31209                                            ops [i + i + 1]),
31210                                 const1_rtx));
31211
31212       /* Cast vector to FIRST_IMODE vector.  */
31213       ops[i] = gen_reg_rtx (first_imode);
31214       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
31215     }
31216
31217   /* Interleave low FIRST_IMODE vectors.  */
31218   for (i = j = 0; i < n; i += 2, j++)
31219     {
31220       op0 = gen_reg_rtx (first_imode);
31221       emit_insn (gen_interleave_first_low (op0, ops[i], ops[i + 1]));
31222
31223       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
31224       ops[j] = gen_reg_rtx (second_imode);
31225       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
31226     }
31227
31228   /* Interleave low SECOND_IMODE vectors.  */
31229   switch (second_imode)
31230     {
31231     case V4SImode:
31232       for (i = j = 0; i < n / 2; i += 2, j++)
31233         {
31234           op0 = gen_reg_rtx (second_imode);
31235           emit_insn (gen_interleave_second_low (op0, ops[i],
31236                                                 ops[i + 1]));
31237
31238           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
31239              vector.  */
31240           ops[j] = gen_reg_rtx (third_imode);
31241           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
31242         }
31243       second_imode = V2DImode;
31244       gen_interleave_second_low = gen_vec_interleave_lowv2di;
31245       /* FALLTHRU */
31246
31247     case V2DImode:
31248       op0 = gen_reg_rtx (second_imode);
31249       emit_insn (gen_interleave_second_low (op0, ops[0],
31250                                             ops[1]));
31251
31252       /* Cast the SECOND_IMODE vector back to a vector on original
31253          mode.  */
31254       emit_insn (gen_rtx_SET (VOIDmode, target,
31255                               gen_lowpart (mode, op0)));
31256       break;
31257
31258     default:
31259       gcc_unreachable ();
31260     }
31261 }
31262
31263 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
31264    all values variable, and none identical.  */
31265
31266 static void
31267 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
31268                                  rtx target, rtx vals)
31269 {
31270   rtx ops[32], op0, op1;
31271   enum machine_mode half_mode = VOIDmode;
31272   int n, i;
31273
31274   switch (mode)
31275     {
31276     case V2SFmode:
31277     case V2SImode:
31278       if (!mmx_ok && !TARGET_SSE)
31279         break;
31280       /* FALLTHRU */
31281
31282     case V8SFmode:
31283     case V8SImode:
31284     case V4DFmode:
31285     case V4DImode:
31286     case V4SFmode:
31287     case V4SImode:
31288     case V2DFmode:
31289     case V2DImode:
31290       n = GET_MODE_NUNITS (mode);
31291       for (i = 0; i < n; i++)
31292         ops[i] = XVECEXP (vals, 0, i);
31293       ix86_expand_vector_init_concat (mode, target, ops, n);
31294       return;
31295
31296     case V32QImode:
31297       half_mode = V16QImode;
31298       goto half;
31299
31300     case V16HImode:
31301       half_mode = V8HImode;
31302       goto half;
31303
31304 half:
31305       n = GET_MODE_NUNITS (mode);
31306       for (i = 0; i < n; i++)
31307         ops[i] = XVECEXP (vals, 0, i);
31308       op0 = gen_reg_rtx (half_mode);
31309       op1 = gen_reg_rtx (half_mode);
31310       ix86_expand_vector_init_interleave (half_mode, op0, ops,
31311                                           n >> 2);
31312       ix86_expand_vector_init_interleave (half_mode, op1,
31313                                           &ops [n >> 1], n >> 2);
31314       emit_insn (gen_rtx_SET (VOIDmode, target,
31315                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
31316       return;
31317
31318     case V16QImode:
31319       if (!TARGET_SSE4_1)
31320         break;
31321       /* FALLTHRU */
31322
31323     case V8HImode:
31324       if (!TARGET_SSE2)
31325         break;
31326
31327       /* Don't use ix86_expand_vector_init_interleave if we can't
31328          move from GPR to SSE register directly.  */
31329       if (!TARGET_INTER_UNIT_MOVES)
31330         break;
31331
31332       n = GET_MODE_NUNITS (mode);
31333       for (i = 0; i < n; i++)
31334         ops[i] = XVECEXP (vals, 0, i);
31335       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
31336       return;
31337
31338     case V4HImode:
31339     case V8QImode:
31340       break;
31341
31342     default:
31343       gcc_unreachable ();
31344     }
31345
31346     {
31347       int i, j, n_elts, n_words, n_elt_per_word;
31348       enum machine_mode inner_mode;
31349       rtx words[4], shift;
31350
31351       inner_mode = GET_MODE_INNER (mode);
31352       n_elts = GET_MODE_NUNITS (mode);
31353       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
31354       n_elt_per_word = n_elts / n_words;
31355       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
31356
31357       for (i = 0; i < n_words; ++i)
31358         {
31359           rtx word = NULL_RTX;
31360
31361           for (j = 0; j < n_elt_per_word; ++j)
31362             {
31363               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
31364               elt = convert_modes (word_mode, inner_mode, elt, true);
31365
31366               if (j == 0)
31367                 word = elt;
31368               else
31369                 {
31370                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
31371                                               word, 1, OPTAB_LIB_WIDEN);
31372                   word = expand_simple_binop (word_mode, IOR, word, elt,
31373                                               word, 1, OPTAB_LIB_WIDEN);
31374                 }
31375             }
31376
31377           words[i] = word;
31378         }
31379
31380       if (n_words == 1)
31381         emit_move_insn (target, gen_lowpart (mode, words[0]));
31382       else if (n_words == 2)
31383         {
31384           rtx tmp = gen_reg_rtx (mode);
31385           emit_clobber (tmp);
31386           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
31387           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
31388           emit_move_insn (target, tmp);
31389         }
31390       else if (n_words == 4)
31391         {
31392           rtx tmp = gen_reg_rtx (V4SImode);
31393           gcc_assert (word_mode == SImode);
31394           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
31395           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
31396           emit_move_insn (target, gen_lowpart (mode, tmp));
31397         }
31398       else
31399         gcc_unreachable ();
31400     }
31401 }
31402
31403 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
31404    instructions unless MMX_OK is true.  */
31405
31406 void
31407 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
31408 {
31409   enum machine_mode mode = GET_MODE (target);
31410   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31411   int n_elts = GET_MODE_NUNITS (mode);
31412   int n_var = 0, one_var = -1;
31413   bool all_same = true, all_const_zero = true;
31414   int i;
31415   rtx x;
31416
31417   for (i = 0; i < n_elts; ++i)
31418     {
31419       x = XVECEXP (vals, 0, i);
31420       if (!(CONST_INT_P (x)
31421             || GET_CODE (x) == CONST_DOUBLE
31422             || GET_CODE (x) == CONST_FIXED))
31423         n_var++, one_var = i;
31424       else if (x != CONST0_RTX (inner_mode))
31425         all_const_zero = false;
31426       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
31427         all_same = false;
31428     }
31429
31430   /* Constants are best loaded from the constant pool.  */
31431   if (n_var == 0)
31432     {
31433       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
31434       return;
31435     }
31436
31437   /* If all values are identical, broadcast the value.  */
31438   if (all_same
31439       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
31440                                             XVECEXP (vals, 0, 0)))
31441     return;
31442
31443   /* Values where only one field is non-constant are best loaded from
31444      the pool and overwritten via move later.  */
31445   if (n_var == 1)
31446     {
31447       if (all_const_zero
31448           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
31449                                                   XVECEXP (vals, 0, one_var),
31450                                                   one_var))
31451         return;
31452
31453       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
31454         return;
31455     }
31456
31457   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
31458 }
31459
31460 void
31461 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
31462 {
31463   enum machine_mode mode = GET_MODE (target);
31464   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31465   enum machine_mode half_mode;
31466   bool use_vec_merge = false;
31467   rtx tmp;
31468   static rtx (*gen_extract[6][2]) (rtx, rtx)
31469     = {
31470         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
31471         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
31472         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
31473         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
31474         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
31475         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
31476       };
31477   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
31478     = {
31479         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
31480         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
31481         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
31482         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
31483         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
31484         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
31485       };
31486   int i, j, n;
31487
31488   switch (mode)
31489     {
31490     case V2SFmode:
31491     case V2SImode:
31492       if (mmx_ok)
31493         {
31494           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
31495           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
31496           if (elt == 0)
31497             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
31498           else
31499             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
31500           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31501           return;
31502         }
31503       break;
31504
31505     case V2DImode:
31506       use_vec_merge = TARGET_SSE4_1;
31507       if (use_vec_merge)
31508         break;
31509
31510     case V2DFmode:
31511       {
31512         rtx op0, op1;
31513
31514         /* For the two element vectors, we implement a VEC_CONCAT with
31515            the extraction of the other element.  */
31516
31517         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
31518         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
31519
31520         if (elt == 0)
31521           op0 = val, op1 = tmp;
31522         else
31523           op0 = tmp, op1 = val;
31524
31525         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
31526         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31527       }
31528       return;
31529
31530     case V4SFmode:
31531       use_vec_merge = TARGET_SSE4_1;
31532       if (use_vec_merge)
31533         break;
31534
31535       switch (elt)
31536         {
31537         case 0:
31538           use_vec_merge = true;
31539           break;
31540
31541         case 1:
31542           /* tmp = target = A B C D */
31543           tmp = copy_to_reg (target);
31544           /* target = A A B B */
31545           emit_insn (gen_vec_interleave_lowv4sf (target, target, target));
31546           /* target = X A B B */
31547           ix86_expand_vector_set (false, target, val, 0);
31548           /* target = A X C D  */
31549           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31550                                           const1_rtx, const0_rtx,
31551                                           GEN_INT (2+4), GEN_INT (3+4)));
31552           return;
31553
31554         case 2:
31555           /* tmp = target = A B C D */
31556           tmp = copy_to_reg (target);
31557           /* tmp = X B C D */
31558           ix86_expand_vector_set (false, tmp, val, 0);
31559           /* target = A B X D */
31560           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31561                                           const0_rtx, const1_rtx,
31562                                           GEN_INT (0+4), GEN_INT (3+4)));
31563           return;
31564
31565         case 3:
31566           /* tmp = target = A B C D */
31567           tmp = copy_to_reg (target);
31568           /* tmp = X B C D */
31569           ix86_expand_vector_set (false, tmp, val, 0);
31570           /* target = A B X D */
31571           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31572                                           const0_rtx, const1_rtx,
31573                                           GEN_INT (2+4), GEN_INT (0+4)));
31574           return;
31575
31576         default:
31577           gcc_unreachable ();
31578         }
31579       break;
31580
31581     case V4SImode:
31582       use_vec_merge = TARGET_SSE4_1;
31583       if (use_vec_merge)
31584         break;
31585
31586       /* Element 0 handled by vec_merge below.  */
31587       if (elt == 0)
31588         {
31589           use_vec_merge = true;
31590           break;
31591         }
31592
31593       if (TARGET_SSE2)
31594         {
31595           /* With SSE2, use integer shuffles to swap element 0 and ELT,
31596              store into element 0, then shuffle them back.  */
31597
31598           rtx order[4];
31599
31600           order[0] = GEN_INT (elt);
31601           order[1] = const1_rtx;
31602           order[2] = const2_rtx;
31603           order[3] = GEN_INT (3);
31604           order[elt] = const0_rtx;
31605
31606           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
31607                                         order[1], order[2], order[3]));
31608
31609           ix86_expand_vector_set (false, target, val, 0);
31610
31611           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
31612                                         order[1], order[2], order[3]));
31613         }
31614       else
31615         {
31616           /* For SSE1, we have to reuse the V4SF code.  */
31617           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
31618                                   gen_lowpart (SFmode, val), elt);
31619         }
31620       return;
31621
31622     case V8HImode:
31623       use_vec_merge = TARGET_SSE2;
31624       break;
31625     case V4HImode:
31626       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
31627       break;
31628
31629     case V16QImode:
31630       use_vec_merge = TARGET_SSE4_1;
31631       break;
31632
31633     case V8QImode:
31634       break;
31635
31636     case V32QImode:
31637       half_mode = V16QImode;
31638       j = 0;
31639       n = 16;
31640       goto half;
31641
31642     case V16HImode:
31643       half_mode = V8HImode;
31644       j = 1;
31645       n = 8;
31646       goto half;
31647
31648     case V8SImode:
31649       half_mode = V4SImode;
31650       j = 2;
31651       n = 4;
31652       goto half;
31653
31654     case V4DImode:
31655       half_mode = V2DImode;
31656       j = 3;
31657       n = 2;
31658       goto half;
31659
31660     case V8SFmode:
31661       half_mode = V4SFmode;
31662       j = 4;
31663       n = 4;
31664       goto half;
31665
31666     case V4DFmode:
31667       half_mode = V2DFmode;
31668       j = 5;
31669       n = 2;
31670       goto half;
31671
31672 half:
31673       /* Compute offset.  */
31674       i = elt / n;
31675       elt %= n;
31676
31677       gcc_assert (i <= 1);
31678
31679       /* Extract the half.  */
31680       tmp = gen_reg_rtx (half_mode);
31681       emit_insn (gen_extract[j][i] (tmp, target));
31682
31683       /* Put val in tmp at elt.  */
31684       ix86_expand_vector_set (false, tmp, val, elt);
31685
31686       /* Put it back.  */
31687       emit_insn (gen_insert[j][i] (target, target, tmp));
31688       return;
31689
31690     default:
31691       break;
31692     }
31693
31694   if (use_vec_merge)
31695     {
31696       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
31697       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
31698       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31699     }
31700   else
31701     {
31702       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
31703
31704       emit_move_insn (mem, target);
31705
31706       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
31707       emit_move_insn (tmp, val);
31708
31709       emit_move_insn (target, mem);
31710     }
31711 }
31712
31713 void
31714 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
31715 {
31716   enum machine_mode mode = GET_MODE (vec);
31717   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31718   bool use_vec_extr = false;
31719   rtx tmp;
31720
31721   switch (mode)
31722     {
31723     case V2SImode:
31724     case V2SFmode:
31725       if (!mmx_ok)
31726         break;
31727       /* FALLTHRU */
31728
31729     case V2DFmode:
31730     case V2DImode:
31731       use_vec_extr = true;
31732       break;
31733
31734     case V4SFmode:
31735       use_vec_extr = TARGET_SSE4_1;
31736       if (use_vec_extr)
31737         break;
31738
31739       switch (elt)
31740         {
31741         case 0:
31742           tmp = vec;
31743           break;
31744
31745         case 1:
31746         case 3:
31747           tmp = gen_reg_rtx (mode);
31748           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
31749                                        GEN_INT (elt), GEN_INT (elt),
31750                                        GEN_INT (elt+4), GEN_INT (elt+4)));
31751           break;
31752
31753         case 2:
31754           tmp = gen_reg_rtx (mode);
31755           emit_insn (gen_vec_interleave_highv4sf (tmp, vec, vec));
31756           break;
31757
31758         default:
31759           gcc_unreachable ();
31760         }
31761       vec = tmp;
31762       use_vec_extr = true;
31763       elt = 0;
31764       break;
31765
31766     case V4SImode:
31767       use_vec_extr = TARGET_SSE4_1;
31768       if (use_vec_extr)
31769         break;
31770
31771       if (TARGET_SSE2)
31772         {
31773           switch (elt)
31774             {
31775             case 0:
31776               tmp = vec;
31777               break;
31778
31779             case 1:
31780             case 3:
31781               tmp = gen_reg_rtx (mode);
31782               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
31783                                             GEN_INT (elt), GEN_INT (elt),
31784                                             GEN_INT (elt), GEN_INT (elt)));
31785               break;
31786
31787             case 2:
31788               tmp = gen_reg_rtx (mode);
31789               emit_insn (gen_vec_interleave_highv4si (tmp, vec, vec));
31790               break;
31791
31792             default:
31793               gcc_unreachable ();
31794             }
31795           vec = tmp;
31796           use_vec_extr = true;
31797           elt = 0;
31798         }
31799       else
31800         {
31801           /* For SSE1, we have to reuse the V4SF code.  */
31802           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
31803                                       gen_lowpart (V4SFmode, vec), elt);
31804           return;
31805         }
31806       break;
31807
31808     case V8HImode:
31809       use_vec_extr = TARGET_SSE2;
31810       break;
31811     case V4HImode:
31812       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
31813       break;
31814
31815     case V16QImode:
31816       use_vec_extr = TARGET_SSE4_1;
31817       break;
31818
31819     case V8QImode:
31820       /* ??? Could extract the appropriate HImode element and shift.  */
31821     default:
31822       break;
31823     }
31824
31825   if (use_vec_extr)
31826     {
31827       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
31828       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
31829
31830       /* Let the rtl optimizers know about the zero extension performed.  */
31831       if (inner_mode == QImode || inner_mode == HImode)
31832         {
31833           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
31834           target = gen_lowpart (SImode, target);
31835         }
31836
31837       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31838     }
31839   else
31840     {
31841       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
31842
31843       emit_move_insn (mem, vec);
31844
31845       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
31846       emit_move_insn (target, tmp);
31847     }
31848 }
31849
31850 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
31851    pattern to reduce; DEST is the destination; IN is the input vector.  */
31852
31853 void
31854 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
31855 {
31856   rtx tmp1, tmp2, tmp3;
31857
31858   tmp1 = gen_reg_rtx (V4SFmode);
31859   tmp2 = gen_reg_rtx (V4SFmode);
31860   tmp3 = gen_reg_rtx (V4SFmode);
31861
31862   emit_insn (gen_sse_movhlps (tmp1, in, in));
31863   emit_insn (fn (tmp2, tmp1, in));
31864
31865   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
31866                                   const1_rtx, const1_rtx,
31867                                   GEN_INT (1+4), GEN_INT (1+4)));
31868   emit_insn (fn (dest, tmp2, tmp3));
31869 }
31870 \f
31871 /* Target hook for scalar_mode_supported_p.  */
31872 static bool
31873 ix86_scalar_mode_supported_p (enum machine_mode mode)
31874 {
31875   if (DECIMAL_FLOAT_MODE_P (mode))
31876     return default_decimal_float_supported_p ();
31877   else if (mode == TFmode)
31878     return true;
31879   else
31880     return default_scalar_mode_supported_p (mode);
31881 }
31882
31883 /* Implements target hook vector_mode_supported_p.  */
31884 static bool
31885 ix86_vector_mode_supported_p (enum machine_mode mode)
31886 {
31887   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
31888     return true;
31889   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
31890     return true;
31891   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
31892     return true;
31893   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
31894     return true;
31895   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
31896     return true;
31897   return false;
31898 }
31899
31900 /* Target hook for c_mode_for_suffix.  */
31901 static enum machine_mode
31902 ix86_c_mode_for_suffix (char suffix)
31903 {
31904   if (suffix == 'q')
31905     return TFmode;
31906   if (suffix == 'w')
31907     return XFmode;
31908
31909   return VOIDmode;
31910 }
31911
31912 /* Worker function for TARGET_MD_ASM_CLOBBERS.
31913
31914    We do this in the new i386 backend to maintain source compatibility
31915    with the old cc0-based compiler.  */
31916
31917 static tree
31918 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
31919                       tree inputs ATTRIBUTE_UNUSED,
31920                       tree clobbers)
31921 {
31922   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
31923                         clobbers);
31924   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
31925                         clobbers);
31926   return clobbers;
31927 }
31928
31929 /* Implements target vector targetm.asm.encode_section_info.  This
31930    is not used by netware.  */
31931
31932 static void ATTRIBUTE_UNUSED
31933 ix86_encode_section_info (tree decl, rtx rtl, int first)
31934 {
31935   default_encode_section_info (decl, rtl, first);
31936
31937   if (TREE_CODE (decl) == VAR_DECL
31938       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
31939       && ix86_in_large_data_p (decl))
31940     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
31941 }
31942
31943 /* Worker function for REVERSE_CONDITION.  */
31944
31945 enum rtx_code
31946 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
31947 {
31948   return (mode != CCFPmode && mode != CCFPUmode
31949           ? reverse_condition (code)
31950           : reverse_condition_maybe_unordered (code));
31951 }
31952
31953 /* Output code to perform an x87 FP register move, from OPERANDS[1]
31954    to OPERANDS[0].  */
31955
31956 const char *
31957 output_387_reg_move (rtx insn, rtx *operands)
31958 {
31959   if (REG_P (operands[0]))
31960     {
31961       if (REG_P (operands[1])
31962           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
31963         {
31964           if (REGNO (operands[0]) == FIRST_STACK_REG)
31965             return output_387_ffreep (operands, 0);
31966           return "fstp\t%y0";
31967         }
31968       if (STACK_TOP_P (operands[0]))
31969         return "fld%Z1\t%y1";
31970       return "fst\t%y0";
31971     }
31972   else if (MEM_P (operands[0]))
31973     {
31974       gcc_assert (REG_P (operands[1]));
31975       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
31976         return "fstp%Z0\t%y0";
31977       else
31978         {
31979           /* There is no non-popping store to memory for XFmode.
31980              So if we need one, follow the store with a load.  */
31981           if (GET_MODE (operands[0]) == XFmode)
31982             return "fstp%Z0\t%y0\n\tfld%Z0\t%y0";
31983           else
31984             return "fst%Z0\t%y0";
31985         }
31986     }
31987   else
31988     gcc_unreachable();
31989 }
31990
31991 /* Output code to perform a conditional jump to LABEL, if C2 flag in
31992    FP status register is set.  */
31993
31994 void
31995 ix86_emit_fp_unordered_jump (rtx label)
31996 {
31997   rtx reg = gen_reg_rtx (HImode);
31998   rtx temp;
31999
32000   emit_insn (gen_x86_fnstsw_1 (reg));
32001
32002   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
32003     {
32004       emit_insn (gen_x86_sahf_1 (reg));
32005
32006       temp = gen_rtx_REG (CCmode, FLAGS_REG);
32007       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
32008     }
32009   else
32010     {
32011       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
32012
32013       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
32014       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
32015     }
32016
32017   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
32018                               gen_rtx_LABEL_REF (VOIDmode, label),
32019                               pc_rtx);
32020   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
32021
32022   emit_jump_insn (temp);
32023   predict_jump (REG_BR_PROB_BASE * 10 / 100);
32024 }
32025
32026 /* Output code to perform a log1p XFmode calculation.  */
32027
32028 void ix86_emit_i387_log1p (rtx op0, rtx op1)
32029 {
32030   rtx label1 = gen_label_rtx ();
32031   rtx label2 = gen_label_rtx ();
32032
32033   rtx tmp = gen_reg_rtx (XFmode);
32034   rtx tmp2 = gen_reg_rtx (XFmode);
32035   rtx test;
32036
32037   emit_insn (gen_absxf2 (tmp, op1));
32038   test = gen_rtx_GE (VOIDmode, tmp,
32039     CONST_DOUBLE_FROM_REAL_VALUE (
32040        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
32041        XFmode));
32042   emit_jump_insn (gen_cbranchxf4 (test, XEXP (test, 0), XEXP (test, 1), label1));
32043
32044   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
32045   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
32046   emit_jump (label2);
32047
32048   emit_label (label1);
32049   emit_move_insn (tmp, CONST1_RTX (XFmode));
32050   emit_insn (gen_addxf3 (tmp, op1, tmp));
32051   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
32052   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
32053
32054   emit_label (label2);
32055 }
32056
32057 /* Output code to perform a Newton-Rhapson approximation of a single precision
32058    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
32059
32060 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
32061 {
32062   rtx x0, x1, e0, e1;
32063
32064   x0 = gen_reg_rtx (mode);
32065   e0 = gen_reg_rtx (mode);
32066   e1 = gen_reg_rtx (mode);
32067   x1 = gen_reg_rtx (mode);
32068
32069   /* a / b = a * ((rcp(b) + rcp(b)) - (b * rcp(b) * rcp (b))) */
32070
32071   /* x0 = rcp(b) estimate */
32072   emit_insn (gen_rtx_SET (VOIDmode, x0,
32073                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
32074                                           UNSPEC_RCP)));
32075   /* e0 = x0 * b */
32076   emit_insn (gen_rtx_SET (VOIDmode, e0,
32077                           gen_rtx_MULT (mode, x0, b)));
32078
32079   /* e0 = x0 * e0 */
32080   emit_insn (gen_rtx_SET (VOIDmode, e0,
32081                           gen_rtx_MULT (mode, x0, e0)));
32082
32083   /* e1 = x0 + x0 */
32084   emit_insn (gen_rtx_SET (VOIDmode, e1,
32085                           gen_rtx_PLUS (mode, x0, x0)));
32086
32087   /* x1 = e1 - e0 */
32088   emit_insn (gen_rtx_SET (VOIDmode, x1,
32089                           gen_rtx_MINUS (mode, e1, e0)));
32090
32091   /* res = a * x1 */
32092   emit_insn (gen_rtx_SET (VOIDmode, res,
32093                           gen_rtx_MULT (mode, a, x1)));
32094 }
32095
32096 /* Output code to perform a Newton-Rhapson approximation of a
32097    single precision floating point [reciprocal] square root.  */
32098
32099 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
32100                          bool recip)
32101 {
32102   rtx x0, e0, e1, e2, e3, mthree, mhalf;
32103   REAL_VALUE_TYPE r;
32104
32105   x0 = gen_reg_rtx (mode);
32106   e0 = gen_reg_rtx (mode);
32107   e1 = gen_reg_rtx (mode);
32108   e2 = gen_reg_rtx (mode);
32109   e3 = gen_reg_rtx (mode);
32110
32111   real_from_integer (&r, VOIDmode, -3, -1, 0);
32112   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
32113
32114   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
32115   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
32116
32117   if (VECTOR_MODE_P (mode))
32118     {
32119       mthree = ix86_build_const_vector (mode, true, mthree);
32120       mhalf = ix86_build_const_vector (mode, true, mhalf);
32121     }
32122
32123   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
32124      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
32125
32126   /* x0 = rsqrt(a) estimate */
32127   emit_insn (gen_rtx_SET (VOIDmode, x0,
32128                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
32129                                           UNSPEC_RSQRT)));
32130
32131   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
32132   if (!recip)
32133     {
32134       rtx zero, mask;
32135
32136       zero = gen_reg_rtx (mode);
32137       mask = gen_reg_rtx (mode);
32138
32139       zero = force_reg (mode, CONST0_RTX(mode));
32140       emit_insn (gen_rtx_SET (VOIDmode, mask,
32141                               gen_rtx_NE (mode, zero, a)));
32142
32143       emit_insn (gen_rtx_SET (VOIDmode, x0,
32144                               gen_rtx_AND (mode, x0, mask)));
32145     }
32146
32147   /* e0 = x0 * a */
32148   emit_insn (gen_rtx_SET (VOIDmode, e0,
32149                           gen_rtx_MULT (mode, x0, a)));
32150   /* e1 = e0 * x0 */
32151   emit_insn (gen_rtx_SET (VOIDmode, e1,
32152                           gen_rtx_MULT (mode, e0, x0)));
32153
32154   /* e2 = e1 - 3. */
32155   mthree = force_reg (mode, mthree);
32156   emit_insn (gen_rtx_SET (VOIDmode, e2,
32157                           gen_rtx_PLUS (mode, e1, mthree)));
32158
32159   mhalf = force_reg (mode, mhalf);
32160   if (recip)
32161     /* e3 = -.5 * x0 */
32162     emit_insn (gen_rtx_SET (VOIDmode, e3,
32163                             gen_rtx_MULT (mode, x0, mhalf)));
32164   else
32165     /* e3 = -.5 * e0 */
32166     emit_insn (gen_rtx_SET (VOIDmode, e3,
32167                             gen_rtx_MULT (mode, e0, mhalf)));
32168   /* ret = e2 * e3 */
32169   emit_insn (gen_rtx_SET (VOIDmode, res,
32170                           gen_rtx_MULT (mode, e2, e3)));
32171 }
32172
32173 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
32174
32175 static void ATTRIBUTE_UNUSED
32176 i386_solaris_elf_named_section (const char *name, unsigned int flags,
32177                                 tree decl)
32178 {
32179   /* With Binutils 2.15, the "@unwind" marker must be specified on
32180      every occurrence of the ".eh_frame" section, not just the first
32181      one.  */
32182   if (TARGET_64BIT
32183       && strcmp (name, ".eh_frame") == 0)
32184     {
32185       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
32186                flags & SECTION_WRITE ? "aw" : "a");
32187       return;
32188     }
32189   default_elf_asm_named_section (name, flags, decl);
32190 }
32191
32192 /* Return the mangling of TYPE if it is an extended fundamental type.  */
32193
32194 static const char *
32195 ix86_mangle_type (const_tree type)
32196 {
32197   type = TYPE_MAIN_VARIANT (type);
32198
32199   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
32200       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
32201     return NULL;
32202
32203   switch (TYPE_MODE (type))
32204     {
32205     case TFmode:
32206       /* __float128 is "g".  */
32207       return "g";
32208     case XFmode:
32209       /* "long double" or __float80 is "e".  */
32210       return "e";
32211     default:
32212       return NULL;
32213     }
32214 }
32215
32216 /* For 32-bit code we can save PIC register setup by using
32217    __stack_chk_fail_local hidden function instead of calling
32218    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
32219    register, so it is better to call __stack_chk_fail directly.  */
32220
32221 static tree
32222 ix86_stack_protect_fail (void)
32223 {
32224   return TARGET_64BIT
32225          ? default_external_stack_protect_fail ()
32226          : default_hidden_stack_protect_fail ();
32227 }
32228
32229 /* Select a format to encode pointers in exception handling data.  CODE
32230    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
32231    true if the symbol may be affected by dynamic relocations.
32232
32233    ??? All x86 object file formats are capable of representing this.
32234    After all, the relocation needed is the same as for the call insn.
32235    Whether or not a particular assembler allows us to enter such, I
32236    guess we'll have to see.  */
32237 int
32238 asm_preferred_eh_data_format (int code, int global)
32239 {
32240   if (flag_pic)
32241     {
32242       int type = DW_EH_PE_sdata8;
32243       if (!TARGET_64BIT
32244           || ix86_cmodel == CM_SMALL_PIC
32245           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
32246         type = DW_EH_PE_sdata4;
32247       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
32248     }
32249   if (ix86_cmodel == CM_SMALL
32250       || (ix86_cmodel == CM_MEDIUM && code))
32251     return DW_EH_PE_udata4;
32252   return DW_EH_PE_absptr;
32253 }
32254 \f
32255 /* Expand copysign from SIGN to the positive value ABS_VALUE
32256    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
32257    the sign-bit.  */
32258 static void
32259 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
32260 {
32261   enum machine_mode mode = GET_MODE (sign);
32262   rtx sgn = gen_reg_rtx (mode);
32263   if (mask == NULL_RTX)
32264     {
32265       enum machine_mode vmode;
32266
32267       if (mode == SFmode)
32268         vmode = V4SFmode;
32269       else if (mode == DFmode)
32270         vmode = V2DFmode;
32271       else
32272         vmode = mode;
32273
32274       mask = ix86_build_signbit_mask (vmode, VECTOR_MODE_P (mode), false);
32275       if (!VECTOR_MODE_P (mode))
32276         {
32277           /* We need to generate a scalar mode mask in this case.  */
32278           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
32279           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
32280           mask = gen_reg_rtx (mode);
32281           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
32282         }
32283     }
32284   else
32285     mask = gen_rtx_NOT (mode, mask);
32286   emit_insn (gen_rtx_SET (VOIDmode, sgn,
32287                           gen_rtx_AND (mode, mask, sign)));
32288   emit_insn (gen_rtx_SET (VOIDmode, result,
32289                           gen_rtx_IOR (mode, abs_value, sgn)));
32290 }
32291
32292 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
32293    mask for masking out the sign-bit is stored in *SMASK, if that is
32294    non-null.  */
32295 static rtx
32296 ix86_expand_sse_fabs (rtx op0, rtx *smask)
32297 {
32298   enum machine_mode vmode, mode = GET_MODE (op0);
32299   rtx xa, mask;
32300
32301   xa = gen_reg_rtx (mode);
32302   if (mode == SFmode)
32303     vmode = V4SFmode;
32304   else if (mode == DFmode)
32305     vmode = V2DFmode;
32306   else
32307     vmode = mode;
32308   mask = ix86_build_signbit_mask (vmode, VECTOR_MODE_P (mode), true);
32309   if (!VECTOR_MODE_P (mode))
32310     {
32311       /* We need to generate a scalar mode mask in this case.  */
32312       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
32313       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
32314       mask = gen_reg_rtx (mode);
32315       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
32316     }
32317   emit_insn (gen_rtx_SET (VOIDmode, xa,
32318                           gen_rtx_AND (mode, op0, mask)));
32319
32320   if (smask)
32321     *smask = mask;
32322
32323   return xa;
32324 }
32325
32326 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
32327    swapping the operands if SWAP_OPERANDS is true.  The expanded
32328    code is a forward jump to a newly created label in case the
32329    comparison is true.  The generated label rtx is returned.  */
32330 static rtx
32331 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
32332                                   bool swap_operands)
32333 {
32334   rtx label, tmp;
32335
32336   if (swap_operands)
32337     {
32338       tmp = op0;
32339       op0 = op1;
32340       op1 = tmp;
32341     }
32342
32343   label = gen_label_rtx ();
32344   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
32345   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32346                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
32347   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
32348   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
32349                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
32350   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
32351   JUMP_LABEL (tmp) = label;
32352
32353   return label;
32354 }
32355
32356 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
32357    using comparison code CODE.  Operands are swapped for the comparison if
32358    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
32359 static rtx
32360 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
32361                               bool swap_operands)
32362 {
32363   rtx (*insn)(rtx, rtx, rtx, rtx);
32364   enum machine_mode mode = GET_MODE (op0);
32365   rtx mask = gen_reg_rtx (mode);
32366
32367   if (swap_operands)
32368     {
32369       rtx tmp = op0;
32370       op0 = op1;
32371       op1 = tmp;
32372     }
32373
32374   insn = mode == DFmode ? gen_setcc_df_sse : gen_setcc_sf_sse;
32375
32376   emit_insn (insn (mask, op0, op1,
32377                    gen_rtx_fmt_ee (code, mode, op0, op1)));
32378   return mask;
32379 }
32380
32381 /* Generate and return a rtx of mode MODE for 2**n where n is the number
32382    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
32383 static rtx
32384 ix86_gen_TWO52 (enum machine_mode mode)
32385 {
32386   REAL_VALUE_TYPE TWO52r;
32387   rtx TWO52;
32388
32389   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
32390   TWO52 = const_double_from_real_value (TWO52r, mode);
32391   TWO52 = force_reg (mode, TWO52);
32392
32393   return TWO52;
32394 }
32395
32396 /* Expand SSE sequence for computing lround from OP1 storing
32397    into OP0.  */
32398 void
32399 ix86_expand_lround (rtx op0, rtx op1)
32400 {
32401   /* C code for the stuff we're doing below:
32402        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
32403        return (long)tmp;
32404    */
32405   enum machine_mode mode = GET_MODE (op1);
32406   const struct real_format *fmt;
32407   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
32408   rtx adj;
32409
32410   /* load nextafter (0.5, 0.0) */
32411   fmt = REAL_MODE_FORMAT (mode);
32412   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
32413   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
32414
32415   /* adj = copysign (0.5, op1) */
32416   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
32417   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
32418
32419   /* adj = op1 + adj */
32420   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
32421
32422   /* op0 = (imode)adj */
32423   expand_fix (op0, adj, 0);
32424 }
32425
32426 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
32427    into OPERAND0.  */
32428 void
32429 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
32430 {
32431   /* C code for the stuff we're doing below (for do_floor):
32432         xi = (long)op1;
32433         xi -= (double)xi > op1 ? 1 : 0;
32434         return xi;
32435    */
32436   enum machine_mode fmode = GET_MODE (op1);
32437   enum machine_mode imode = GET_MODE (op0);
32438   rtx ireg, freg, label, tmp;
32439
32440   /* reg = (long)op1 */
32441   ireg = gen_reg_rtx (imode);
32442   expand_fix (ireg, op1, 0);
32443
32444   /* freg = (double)reg */
32445   freg = gen_reg_rtx (fmode);
32446   expand_float (freg, ireg, 0);
32447
32448   /* ireg = (freg > op1) ? ireg - 1 : ireg */
32449   label = ix86_expand_sse_compare_and_jump (UNLE,
32450                                             freg, op1, !do_floor);
32451   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
32452                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
32453   emit_move_insn (ireg, tmp);
32454
32455   emit_label (label);
32456   LABEL_NUSES (label) = 1;
32457
32458   emit_move_insn (op0, ireg);
32459 }
32460
32461 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
32462    result in OPERAND0.  */
32463 void
32464 ix86_expand_rint (rtx operand0, rtx operand1)
32465 {
32466   /* C code for the stuff we're doing below:
32467         xa = fabs (operand1);
32468         if (!isless (xa, 2**52))
32469           return operand1;
32470         xa = xa + 2**52 - 2**52;
32471         return copysign (xa, operand1);
32472    */
32473   enum machine_mode mode = GET_MODE (operand0);
32474   rtx res, xa, label, TWO52, mask;
32475
32476   res = gen_reg_rtx (mode);
32477   emit_move_insn (res, operand1);
32478
32479   /* xa = abs (operand1) */
32480   xa = ix86_expand_sse_fabs (res, &mask);
32481
32482   /* if (!isless (xa, TWO52)) goto label; */
32483   TWO52 = ix86_gen_TWO52 (mode);
32484   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32485
32486   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32487   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
32488
32489   ix86_sse_copysign_to_positive (res, xa, res, mask);
32490
32491   emit_label (label);
32492   LABEL_NUSES (label) = 1;
32493
32494   emit_move_insn (operand0, res);
32495 }
32496
32497 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
32498    into OPERAND0.  */
32499 void
32500 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
32501 {
32502   /* C code for the stuff we expand below.
32503         double xa = fabs (x), x2;
32504         if (!isless (xa, TWO52))
32505           return x;
32506         xa = xa + TWO52 - TWO52;
32507         x2 = copysign (xa, x);
32508      Compensate.  Floor:
32509         if (x2 > x)
32510           x2 -= 1;
32511      Compensate.  Ceil:
32512         if (x2 < x)
32513           x2 -= -1;
32514         return x2;
32515    */
32516   enum machine_mode mode = GET_MODE (operand0);
32517   rtx xa, TWO52, tmp, label, one, res, mask;
32518
32519   TWO52 = ix86_gen_TWO52 (mode);
32520
32521   /* Temporary for holding the result, initialized to the input
32522      operand to ease control flow.  */
32523   res = gen_reg_rtx (mode);
32524   emit_move_insn (res, operand1);
32525
32526   /* xa = abs (operand1) */
32527   xa = ix86_expand_sse_fabs (res, &mask);
32528
32529   /* if (!isless (xa, TWO52)) goto label; */
32530   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32531
32532   /* xa = xa + TWO52 - TWO52; */
32533   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32534   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
32535
32536   /* xa = copysign (xa, operand1) */
32537   ix86_sse_copysign_to_positive (xa, xa, res, mask);
32538
32539   /* generate 1.0 or -1.0 */
32540   one = force_reg (mode,
32541                    const_double_from_real_value (do_floor
32542                                                  ? dconst1 : dconstm1, mode));
32543
32544   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
32545   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
32546   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32547                           gen_rtx_AND (mode, one, tmp)));
32548   /* We always need to subtract here to preserve signed zero.  */
32549   tmp = expand_simple_binop (mode, MINUS,
32550                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32551   emit_move_insn (res, tmp);
32552
32553   emit_label (label);
32554   LABEL_NUSES (label) = 1;
32555
32556   emit_move_insn (operand0, res);
32557 }
32558
32559 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
32560    into OPERAND0.  */
32561 void
32562 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
32563 {
32564   /* C code for the stuff we expand below.
32565         double xa = fabs (x), x2;
32566         if (!isless (xa, TWO52))
32567           return x;
32568         x2 = (double)(long)x;
32569      Compensate.  Floor:
32570         if (x2 > x)
32571           x2 -= 1;
32572      Compensate.  Ceil:
32573         if (x2 < x)
32574           x2 += 1;
32575         if (HONOR_SIGNED_ZEROS (mode))
32576           return copysign (x2, x);
32577         return x2;
32578    */
32579   enum machine_mode mode = GET_MODE (operand0);
32580   rtx xa, xi, TWO52, tmp, label, one, res, mask;
32581
32582   TWO52 = ix86_gen_TWO52 (mode);
32583
32584   /* Temporary for holding the result, initialized to the input
32585      operand to ease control flow.  */
32586   res = gen_reg_rtx (mode);
32587   emit_move_insn (res, operand1);
32588
32589   /* xa = abs (operand1) */
32590   xa = ix86_expand_sse_fabs (res, &mask);
32591
32592   /* if (!isless (xa, TWO52)) goto label; */
32593   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32594
32595   /* xa = (double)(long)x */
32596   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32597   expand_fix (xi, res, 0);
32598   expand_float (xa, xi, 0);
32599
32600   /* generate 1.0 */
32601   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
32602
32603   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
32604   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
32605   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32606                           gen_rtx_AND (mode, one, tmp)));
32607   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
32608                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32609   emit_move_insn (res, tmp);
32610
32611   if (HONOR_SIGNED_ZEROS (mode))
32612     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
32613
32614   emit_label (label);
32615   LABEL_NUSES (label) = 1;
32616
32617   emit_move_insn (operand0, res);
32618 }
32619
32620 /* Expand SSE sequence for computing round from OPERAND1 storing
32621    into OPERAND0.  Sequence that works without relying on DImode truncation
32622    via cvttsd2siq that is only available on 64bit targets.  */
32623 void
32624 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
32625 {
32626   /* C code for the stuff we expand below.
32627         double xa = fabs (x), xa2, x2;
32628         if (!isless (xa, TWO52))
32629           return x;
32630      Using the absolute value and copying back sign makes
32631      -0.0 -> -0.0 correct.
32632         xa2 = xa + TWO52 - TWO52;
32633      Compensate.
32634         dxa = xa2 - xa;
32635         if (dxa <= -0.5)
32636           xa2 += 1;
32637         else if (dxa > 0.5)
32638           xa2 -= 1;
32639         x2 = copysign (xa2, x);
32640         return x2;
32641    */
32642   enum machine_mode mode = GET_MODE (operand0);
32643   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
32644
32645   TWO52 = ix86_gen_TWO52 (mode);
32646
32647   /* Temporary for holding the result, initialized to the input
32648      operand to ease control flow.  */
32649   res = gen_reg_rtx (mode);
32650   emit_move_insn (res, operand1);
32651
32652   /* xa = abs (operand1) */
32653   xa = ix86_expand_sse_fabs (res, &mask);
32654
32655   /* if (!isless (xa, TWO52)) goto label; */
32656   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32657
32658   /* xa2 = xa + TWO52 - TWO52; */
32659   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32660   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
32661
32662   /* dxa = xa2 - xa; */
32663   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
32664
32665   /* generate 0.5, 1.0 and -0.5 */
32666   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
32667   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
32668   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
32669                                0, OPTAB_DIRECT);
32670
32671   /* Compensate.  */
32672   tmp = gen_reg_rtx (mode);
32673   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
32674   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
32675   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32676                           gen_rtx_AND (mode, one, tmp)));
32677   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32678   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
32679   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
32680   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32681                           gen_rtx_AND (mode, one, tmp)));
32682   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32683
32684   /* res = copysign (xa2, operand1) */
32685   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
32686
32687   emit_label (label);
32688   LABEL_NUSES (label) = 1;
32689
32690   emit_move_insn (operand0, res);
32691 }
32692
32693 /* Expand SSE sequence for computing trunc from OPERAND1 storing
32694    into OPERAND0.  */
32695 void
32696 ix86_expand_trunc (rtx operand0, rtx operand1)
32697 {
32698   /* C code for SSE variant we expand below.
32699         double xa = fabs (x), x2;
32700         if (!isless (xa, TWO52))
32701           return x;
32702         x2 = (double)(long)x;
32703         if (HONOR_SIGNED_ZEROS (mode))
32704           return copysign (x2, x);
32705         return x2;
32706    */
32707   enum machine_mode mode = GET_MODE (operand0);
32708   rtx xa, xi, TWO52, label, res, mask;
32709
32710   TWO52 = ix86_gen_TWO52 (mode);
32711
32712   /* Temporary for holding the result, initialized to the input
32713      operand to ease control flow.  */
32714   res = gen_reg_rtx (mode);
32715   emit_move_insn (res, operand1);
32716
32717   /* xa = abs (operand1) */
32718   xa = ix86_expand_sse_fabs (res, &mask);
32719
32720   /* if (!isless (xa, TWO52)) goto label; */
32721   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32722
32723   /* x = (double)(long)x */
32724   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32725   expand_fix (xi, res, 0);
32726   expand_float (res, xi, 0);
32727
32728   if (HONOR_SIGNED_ZEROS (mode))
32729     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
32730
32731   emit_label (label);
32732   LABEL_NUSES (label) = 1;
32733
32734   emit_move_insn (operand0, res);
32735 }
32736
32737 /* Expand SSE sequence for computing trunc from OPERAND1 storing
32738    into OPERAND0.  */
32739 void
32740 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
32741 {
32742   enum machine_mode mode = GET_MODE (operand0);
32743   rtx xa, mask, TWO52, label, one, res, smask, tmp;
32744
32745   /* C code for SSE variant we expand below.
32746         double xa = fabs (x), x2;
32747         if (!isless (xa, TWO52))
32748           return x;
32749         xa2 = xa + TWO52 - TWO52;
32750      Compensate:
32751         if (xa2 > xa)
32752           xa2 -= 1.0;
32753         x2 = copysign (xa2, x);
32754         return x2;
32755    */
32756
32757   TWO52 = ix86_gen_TWO52 (mode);
32758
32759   /* Temporary for holding the result, initialized to the input
32760      operand to ease control flow.  */
32761   res = gen_reg_rtx (mode);
32762   emit_move_insn (res, operand1);
32763
32764   /* xa = abs (operand1) */
32765   xa = ix86_expand_sse_fabs (res, &smask);
32766
32767   /* if (!isless (xa, TWO52)) goto label; */
32768   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32769
32770   /* res = xa + TWO52 - TWO52; */
32771   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32772   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
32773   emit_move_insn (res, tmp);
32774
32775   /* generate 1.0 */
32776   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
32777
32778   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
32779   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
32780   emit_insn (gen_rtx_SET (VOIDmode, mask,
32781                           gen_rtx_AND (mode, mask, one)));
32782   tmp = expand_simple_binop (mode, MINUS,
32783                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
32784   emit_move_insn (res, tmp);
32785
32786   /* res = copysign (res, operand1) */
32787   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
32788
32789   emit_label (label);
32790   LABEL_NUSES (label) = 1;
32791
32792   emit_move_insn (operand0, res);
32793 }
32794
32795 /* Expand SSE sequence for computing round from OPERAND1 storing
32796    into OPERAND0.  */
32797 void
32798 ix86_expand_round (rtx operand0, rtx operand1)
32799 {
32800   /* C code for the stuff we're doing below:
32801         double xa = fabs (x);
32802         if (!isless (xa, TWO52))
32803           return x;
32804         xa = (double)(long)(xa + nextafter (0.5, 0.0));
32805         return copysign (xa, x);
32806    */
32807   enum machine_mode mode = GET_MODE (operand0);
32808   rtx res, TWO52, xa, label, xi, half, mask;
32809   const struct real_format *fmt;
32810   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
32811
32812   /* Temporary for holding the result, initialized to the input
32813      operand to ease control flow.  */
32814   res = gen_reg_rtx (mode);
32815   emit_move_insn (res, operand1);
32816
32817   TWO52 = ix86_gen_TWO52 (mode);
32818   xa = ix86_expand_sse_fabs (res, &mask);
32819   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32820
32821   /* load nextafter (0.5, 0.0) */
32822   fmt = REAL_MODE_FORMAT (mode);
32823   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
32824   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
32825
32826   /* xa = xa + 0.5 */
32827   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
32828   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
32829
32830   /* xa = (double)(int64_t)xa */
32831   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32832   expand_fix (xi, xa, 0);
32833   expand_float (xa, xi, 0);
32834
32835   /* res = copysign (xa, operand1) */
32836   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
32837
32838   emit_label (label);
32839   LABEL_NUSES (label) = 1;
32840
32841   emit_move_insn (operand0, res);
32842 }
32843 \f
32844
32845 /* Table of valid machine attributes.  */
32846 static const struct attribute_spec ix86_attribute_table[] =
32847 {
32848   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
32849        affects_type_identity } */
32850   /* Stdcall attribute says callee is responsible for popping arguments
32851      if they are not variable.  */
32852   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32853     true },
32854   /* Fastcall attribute says callee is responsible for popping arguments
32855      if they are not variable.  */
32856   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32857     true },
32858   /* Thiscall attribute says callee is responsible for popping arguments
32859      if they are not variable.  */
32860   { "thiscall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32861     true },
32862   /* Cdecl attribute says the callee is a normal C declaration */
32863   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32864     true },
32865   /* Regparm attribute specifies how many integer arguments are to be
32866      passed in registers.  */
32867   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute,
32868     true },
32869   /* Sseregparm attribute says we are using x86_64 calling conventions
32870      for FP arguments.  */
32871   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute,
32872     true },
32873   /* force_align_arg_pointer says this function realigns the stack at entry.  */
32874   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
32875     false, true,  true, ix86_handle_cconv_attribute, false },
32876 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
32877   { "dllimport", 0, 0, false, false, false, handle_dll_attribute, false },
32878   { "dllexport", 0, 0, false, false, false, handle_dll_attribute, false },
32879   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute,
32880     false },
32881 #endif
32882   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
32883     false },
32884   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
32885     false },
32886 #ifdef SUBTARGET_ATTRIBUTE_TABLE
32887   SUBTARGET_ATTRIBUTE_TABLE,
32888 #endif
32889   /* ms_abi and sysv_abi calling convention function attributes.  */
32890   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true },
32891   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true },
32892   { "ms_hook_prologue", 0, 0, true, false, false, ix86_handle_fndecl_attribute,
32893     false },
32894   { "callee_pop_aggregate_return", 1, 1, false, true, true,
32895     ix86_handle_callee_pop_aggregate_return, true },
32896   /* End element.  */
32897   { NULL,        0, 0, false, false, false, NULL, false }
32898 };
32899
32900 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
32901 static int
32902 ix86_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
32903                                  tree vectype ATTRIBUTE_UNUSED,
32904                                  int misalign ATTRIBUTE_UNUSED)
32905 {
32906   switch (type_of_cost)
32907     {
32908       case scalar_stmt:
32909         return ix86_cost->scalar_stmt_cost;
32910
32911       case scalar_load:
32912         return ix86_cost->scalar_load_cost;
32913
32914       case scalar_store:
32915         return ix86_cost->scalar_store_cost;
32916
32917       case vector_stmt:
32918         return ix86_cost->vec_stmt_cost;
32919
32920       case vector_load:
32921         return ix86_cost->vec_align_load_cost;
32922
32923       case vector_store:
32924         return ix86_cost->vec_store_cost;
32925
32926       case vec_to_scalar:
32927         return ix86_cost->vec_to_scalar_cost;
32928
32929       case scalar_to_vec:
32930         return ix86_cost->scalar_to_vec_cost;
32931
32932       case unaligned_load:
32933       case unaligned_store:
32934         return ix86_cost->vec_unalign_load_cost;
32935
32936       case cond_branch_taken:
32937         return ix86_cost->cond_taken_branch_cost;
32938
32939       case cond_branch_not_taken:
32940         return ix86_cost->cond_not_taken_branch_cost;
32941
32942       case vec_perm:
32943         return 1;
32944
32945       default:
32946         gcc_unreachable ();
32947     }
32948 }
32949
32950
32951 /* Implement targetm.vectorize.builtin_vec_perm.  */
32952
32953 static tree
32954 ix86_vectorize_builtin_vec_perm (tree vec_type, tree *mask_type)
32955 {
32956   tree itype = TREE_TYPE (vec_type);
32957   bool u = TYPE_UNSIGNED (itype);
32958   enum machine_mode vmode = TYPE_MODE (vec_type);
32959   enum ix86_builtins fcode;
32960   bool ok = TARGET_SSE2;
32961
32962   switch (vmode)
32963     {
32964     case V4DFmode:
32965       ok = TARGET_AVX;
32966       fcode = IX86_BUILTIN_VEC_PERM_V4DF;
32967       goto get_di;
32968     case V2DFmode:
32969       fcode = IX86_BUILTIN_VEC_PERM_V2DF;
32970     get_di:
32971       itype = ix86_get_builtin_type (IX86_BT_DI);
32972       break;
32973
32974     case V8SFmode:
32975       ok = TARGET_AVX;
32976       fcode = IX86_BUILTIN_VEC_PERM_V8SF;
32977       goto get_si;
32978     case V4SFmode:
32979       ok = TARGET_SSE;
32980       fcode = IX86_BUILTIN_VEC_PERM_V4SF;
32981     get_si:
32982       itype = ix86_get_builtin_type (IX86_BT_SI);
32983       break;
32984
32985     case V2DImode:
32986       fcode = u ? IX86_BUILTIN_VEC_PERM_V2DI_U : IX86_BUILTIN_VEC_PERM_V2DI;
32987       break;
32988     case V4SImode:
32989       fcode = u ? IX86_BUILTIN_VEC_PERM_V4SI_U : IX86_BUILTIN_VEC_PERM_V4SI;
32990       break;
32991     case V8HImode:
32992       fcode = u ? IX86_BUILTIN_VEC_PERM_V8HI_U : IX86_BUILTIN_VEC_PERM_V8HI;
32993       break;
32994     case V16QImode:
32995       fcode = u ? IX86_BUILTIN_VEC_PERM_V16QI_U : IX86_BUILTIN_VEC_PERM_V16QI;
32996       break;
32997     default:
32998       ok = false;
32999       break;
33000     }
33001
33002   if (!ok)
33003     return NULL_TREE;
33004
33005   *mask_type = itype;
33006   return ix86_builtins[(int) fcode];
33007 }
33008
33009 /* Return a vector mode with twice as many elements as VMODE.  */
33010 /* ??? Consider moving this to a table generated by genmodes.c.  */
33011
33012 static enum machine_mode
33013 doublesize_vector_mode (enum machine_mode vmode)
33014 {
33015   switch (vmode)
33016     {
33017     case V2SFmode:      return V4SFmode;
33018     case V1DImode:      return V2DImode;
33019     case V2SImode:      return V4SImode;
33020     case V4HImode:      return V8HImode;
33021     case V8QImode:      return V16QImode;
33022
33023     case V2DFmode:      return V4DFmode;
33024     case V4SFmode:      return V8SFmode;
33025     case V2DImode:      return V4DImode;
33026     case V4SImode:      return V8SImode;
33027     case V8HImode:      return V16HImode;
33028     case V16QImode:     return V32QImode;
33029
33030     case V4DFmode:      return V8DFmode;
33031     case V8SFmode:      return V16SFmode;
33032     case V4DImode:      return V8DImode;
33033     case V8SImode:      return V16SImode;
33034     case V16HImode:     return V32HImode;
33035     case V32QImode:     return V64QImode;
33036
33037     default:
33038       gcc_unreachable ();
33039     }
33040 }
33041
33042 /* Construct (set target (vec_select op0 (parallel perm))) and
33043    return true if that's a valid instruction in the active ISA.  */
33044
33045 static bool
33046 expand_vselect (rtx target, rtx op0, const unsigned char *perm, unsigned nelt)
33047 {
33048   rtx rperm[MAX_VECT_LEN], x;
33049   unsigned i;
33050
33051   for (i = 0; i < nelt; ++i)
33052     rperm[i] = GEN_INT (perm[i]);
33053
33054   x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
33055   x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
33056   x = gen_rtx_SET (VOIDmode, target, x);
33057
33058   x = emit_insn (x);
33059   if (recog_memoized (x) < 0)
33060     {
33061       remove_insn (x);
33062       return false;
33063     }
33064   return true;
33065 }
33066
33067 /* Similar, but generate a vec_concat from op0 and op1 as well.  */
33068
33069 static bool
33070 expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
33071                         const unsigned char *perm, unsigned nelt)
33072 {
33073   enum machine_mode v2mode;
33074   rtx x;
33075
33076   v2mode = doublesize_vector_mode (GET_MODE (op0));
33077   x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
33078   return expand_vselect (target, x, perm, nelt);
33079 }
33080
33081 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33082    in terms of blendp[sd] / pblendw / pblendvb.  */
33083
33084 static bool
33085 expand_vec_perm_blend (struct expand_vec_perm_d *d)
33086 {
33087   enum machine_mode vmode = d->vmode;
33088   unsigned i, mask, nelt = d->nelt;
33089   rtx target, op0, op1, x;
33090
33091   if (!TARGET_SSE4_1 || d->op0 == d->op1)
33092     return false;
33093   if (!(GET_MODE_SIZE (vmode) == 16 || vmode == V4DFmode || vmode == V8SFmode))
33094     return false;
33095
33096   /* This is a blend, not a permute.  Elements must stay in their
33097      respective lanes.  */
33098   for (i = 0; i < nelt; ++i)
33099     {
33100       unsigned e = d->perm[i];
33101       if (!(e == i || e == i + nelt))
33102         return false;
33103     }
33104
33105   if (d->testing_p)
33106     return true;
33107
33108   /* ??? Without SSE4.1, we could implement this with and/andn/or.  This
33109      decision should be extracted elsewhere, so that we only try that
33110      sequence once all budget==3 options have been tried.  */
33111
33112   /* For bytes, see if bytes move in pairs so we can use pblendw with
33113      an immediate argument, rather than pblendvb with a vector argument.  */
33114   if (vmode == V16QImode)
33115     {
33116       bool pblendw_ok = true;
33117       for (i = 0; i < 16 && pblendw_ok; i += 2)
33118         pblendw_ok = (d->perm[i] + 1 == d->perm[i + 1]);
33119
33120       if (!pblendw_ok)
33121         {
33122           rtx rperm[16], vperm;
33123
33124           for (i = 0; i < nelt; ++i)
33125             rperm[i] = (d->perm[i] < nelt ? const0_rtx : constm1_rtx);
33126
33127           vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
33128           vperm = force_reg (V16QImode, vperm);
33129
33130           emit_insn (gen_sse4_1_pblendvb (d->target, d->op0, d->op1, vperm));
33131           return true;
33132         }
33133     }
33134
33135   target = d->target;
33136   op0 = d->op0;
33137   op1 = d->op1;
33138   mask = 0;
33139
33140   switch (vmode)
33141     {
33142     case V4DFmode:
33143     case V8SFmode:
33144     case V2DFmode:
33145     case V4SFmode:
33146     case V8HImode:
33147       for (i = 0; i < nelt; ++i)
33148         mask |= (d->perm[i] >= nelt) << i;
33149       break;
33150
33151     case V2DImode:
33152       for (i = 0; i < 2; ++i)
33153         mask |= (d->perm[i] >= 2 ? 15 : 0) << (i * 4);
33154       goto do_subreg;
33155
33156     case V4SImode:
33157       for (i = 0; i < 4; ++i)
33158         mask |= (d->perm[i] >= 4 ? 3 : 0) << (i * 2);
33159       goto do_subreg;
33160
33161     case V16QImode:
33162       for (i = 0; i < 8; ++i)
33163         mask |= (d->perm[i * 2] >= 16) << i;
33164
33165     do_subreg:
33166       vmode = V8HImode;
33167       target = gen_lowpart (vmode, target);
33168       op0 = gen_lowpart (vmode, op0);
33169       op1 = gen_lowpart (vmode, op1);
33170       break;
33171
33172     default:
33173       gcc_unreachable ();
33174     }
33175
33176   /* This matches five different patterns with the different modes.  */
33177   x = gen_rtx_VEC_MERGE (vmode, op1, op0, GEN_INT (mask));
33178   x = gen_rtx_SET (VOIDmode, target, x);
33179   emit_insn (x);
33180
33181   return true;
33182 }
33183
33184 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33185    in terms of the variable form of vpermilps.
33186
33187    Note that we will have already failed the immediate input vpermilps,
33188    which requires that the high and low part shuffle be identical; the
33189    variable form doesn't require that.  */
33190
33191 static bool
33192 expand_vec_perm_vpermil (struct expand_vec_perm_d *d)
33193 {
33194   rtx rperm[8], vperm;
33195   unsigned i;
33196
33197   if (!TARGET_AVX || d->vmode != V8SFmode || d->op0 != d->op1)
33198     return false;
33199
33200   /* We can only permute within the 128-bit lane.  */
33201   for (i = 0; i < 8; ++i)
33202     {
33203       unsigned e = d->perm[i];
33204       if (i < 4 ? e >= 4 : e < 4)
33205         return false;
33206     }
33207
33208   if (d->testing_p)
33209     return true;
33210
33211   for (i = 0; i < 8; ++i)
33212     {
33213       unsigned e = d->perm[i];
33214
33215       /* Within each 128-bit lane, the elements of op0 are numbered
33216          from 0 and the elements of op1 are numbered from 4.  */
33217       if (e >= 8 + 4)
33218         e -= 8;
33219       else if (e >= 4)
33220         e -= 4;
33221
33222       rperm[i] = GEN_INT (e);
33223     }
33224
33225   vperm = gen_rtx_CONST_VECTOR (V8SImode, gen_rtvec_v (8, rperm));
33226   vperm = force_reg (V8SImode, vperm);
33227   emit_insn (gen_avx_vpermilvarv8sf3 (d->target, d->op0, vperm));
33228
33229   return true;
33230 }
33231
33232 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33233    in terms of pshufb or vpperm.  */
33234
33235 static bool
33236 expand_vec_perm_pshufb (struct expand_vec_perm_d *d)
33237 {
33238   unsigned i, nelt, eltsz;
33239   rtx rperm[16], vperm, target, op0, op1;
33240
33241   if (!(d->op0 == d->op1 ? TARGET_SSSE3 : TARGET_XOP))
33242     return false;
33243   if (GET_MODE_SIZE (d->vmode) != 16)
33244     return false;
33245
33246   if (d->testing_p)
33247     return true;
33248
33249   nelt = d->nelt;
33250   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
33251
33252   for (i = 0; i < nelt; ++i)
33253     {
33254       unsigned j, e = d->perm[i];
33255       for (j = 0; j < eltsz; ++j)
33256         rperm[i * eltsz + j] = GEN_INT (e * eltsz + j);
33257     }
33258
33259   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
33260   vperm = force_reg (V16QImode, vperm);
33261
33262   target = gen_lowpart (V16QImode, d->target);
33263   op0 = gen_lowpart (V16QImode, d->op0);
33264   if (d->op0 == d->op1)
33265     emit_insn (gen_ssse3_pshufbv16qi3 (target, op0, vperm));
33266   else
33267     {
33268       op1 = gen_lowpart (V16QImode, d->op1);
33269       emit_insn (gen_xop_pperm (target, op0, op1, vperm));
33270     }
33271
33272   return true;
33273 }
33274
33275 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to instantiate D
33276    in a single instruction.  */
33277
33278 static bool
33279 expand_vec_perm_1 (struct expand_vec_perm_d *d)
33280 {
33281   unsigned i, nelt = d->nelt;
33282   unsigned char perm2[MAX_VECT_LEN];
33283
33284   /* Check plain VEC_SELECT first, because AVX has instructions that could
33285      match both SEL and SEL+CONCAT, but the plain SEL will allow a memory
33286      input where SEL+CONCAT may not.  */
33287   if (d->op0 == d->op1)
33288     {
33289       int mask = nelt - 1;
33290
33291       for (i = 0; i < nelt; i++)
33292         perm2[i] = d->perm[i] & mask;
33293
33294       if (expand_vselect (d->target, d->op0, perm2, nelt))
33295         return true;
33296
33297       /* There are plenty of patterns in sse.md that are written for
33298          SEL+CONCAT and are not replicated for a single op.  Perhaps
33299          that should be changed, to avoid the nastiness here.  */
33300
33301       /* Recognize interleave style patterns, which means incrementing
33302          every other permutation operand.  */
33303       for (i = 0; i < nelt; i += 2)
33304         {
33305           perm2[i] = d->perm[i] & mask;
33306           perm2[i + 1] = (d->perm[i + 1] & mask) + nelt;
33307         }
33308       if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
33309         return true;
33310
33311       /* Recognize shufps, which means adding {0, 0, nelt, nelt}.  */
33312       if (nelt >= 4)
33313         {
33314           for (i = 0; i < nelt; i += 4)
33315             {
33316               perm2[i + 0] = d->perm[i + 0] & mask;
33317               perm2[i + 1] = d->perm[i + 1] & mask;
33318               perm2[i + 2] = (d->perm[i + 2] & mask) + nelt;
33319               perm2[i + 3] = (d->perm[i + 3] & mask) + nelt;
33320             }
33321
33322           if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
33323             return true;
33324         }
33325     }
33326
33327   /* Finally, try the fully general two operand permute.  */
33328   if (expand_vselect_vconcat (d->target, d->op0, d->op1, d->perm, nelt))
33329     return true;
33330
33331   /* Recognize interleave style patterns with reversed operands.  */
33332   if (d->op0 != d->op1)
33333     {
33334       for (i = 0; i < nelt; ++i)
33335         {
33336           unsigned e = d->perm[i];
33337           if (e >= nelt)
33338             e -= nelt;
33339           else
33340             e += nelt;
33341           perm2[i] = e;
33342         }
33343
33344       if (expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
33345         return true;
33346     }
33347
33348   /* Try the SSE4.1 blend variable merge instructions.  */
33349   if (expand_vec_perm_blend (d))
33350     return true;
33351
33352   /* Try one of the AVX vpermil variable permutations.  */
33353   if (expand_vec_perm_vpermil (d))
33354     return true;
33355
33356   /* Try the SSSE3 pshufb or XOP vpperm variable permutation.  */
33357   if (expand_vec_perm_pshufb (d))
33358     return true;
33359
33360   return false;
33361 }
33362
33363 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33364    in terms of a pair of pshuflw + pshufhw instructions.  */
33365
33366 static bool
33367 expand_vec_perm_pshuflw_pshufhw (struct expand_vec_perm_d *d)
33368 {
33369   unsigned char perm2[MAX_VECT_LEN];
33370   unsigned i;
33371   bool ok;
33372
33373   if (d->vmode != V8HImode || d->op0 != d->op1)
33374     return false;
33375
33376   /* The two permutations only operate in 64-bit lanes.  */
33377   for (i = 0; i < 4; ++i)
33378     if (d->perm[i] >= 4)
33379       return false;
33380   for (i = 4; i < 8; ++i)
33381     if (d->perm[i] < 4)
33382       return false;
33383
33384   if (d->testing_p)
33385     return true;
33386
33387   /* Emit the pshuflw.  */
33388   memcpy (perm2, d->perm, 4);
33389   for (i = 4; i < 8; ++i)
33390     perm2[i] = i;
33391   ok = expand_vselect (d->target, d->op0, perm2, 8);
33392   gcc_assert (ok);
33393
33394   /* Emit the pshufhw.  */
33395   memcpy (perm2 + 4, d->perm + 4, 4);
33396   for (i = 0; i < 4; ++i)
33397     perm2[i] = i;
33398   ok = expand_vselect (d->target, d->target, perm2, 8);
33399   gcc_assert (ok);
33400
33401   return true;
33402 }
33403
33404 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
33405    the permutation using the SSSE3 palignr instruction.  This succeeds
33406    when all of the elements in PERM fit within one vector and we merely
33407    need to shift them down so that a single vector permutation has a
33408    chance to succeed.  */
33409
33410 static bool
33411 expand_vec_perm_palignr (struct expand_vec_perm_d *d)
33412 {
33413   unsigned i, nelt = d->nelt;
33414   unsigned min, max;
33415   bool in_order, ok;
33416   rtx shift;
33417
33418   /* Even with AVX, palignr only operates on 128-bit vectors.  */
33419   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
33420     return false;
33421
33422   min = nelt, max = 0;
33423   for (i = 0; i < nelt; ++i)
33424     {
33425       unsigned e = d->perm[i];
33426       if (e < min)
33427         min = e;
33428       if (e > max)
33429         max = e;
33430     }
33431   if (min == 0 || max - min >= nelt)
33432     return false;
33433
33434   /* Given that we have SSSE3, we know we'll be able to implement the
33435      single operand permutation after the palignr with pshufb.  */
33436   if (d->testing_p)
33437     return true;
33438
33439   shift = GEN_INT (min * GET_MODE_BITSIZE (GET_MODE_INNER (d->vmode)));
33440   emit_insn (gen_ssse3_palignrti (gen_lowpart (TImode, d->target),
33441                                   gen_lowpart (TImode, d->op1),
33442                                   gen_lowpart (TImode, d->op0), shift));
33443
33444   d->op0 = d->op1 = d->target;
33445
33446   in_order = true;
33447   for (i = 0; i < nelt; ++i)
33448     {
33449       unsigned e = d->perm[i] - min;
33450       if (e != i)
33451         in_order = false;
33452       d->perm[i] = e;
33453     }
33454
33455   /* Test for the degenerate case where the alignment by itself
33456      produces the desired permutation.  */
33457   if (in_order)
33458     return true;
33459
33460   ok = expand_vec_perm_1 (d);
33461   gcc_assert (ok);
33462
33463   return ok;
33464 }
33465
33466 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
33467    a two vector permutation into a single vector permutation by using
33468    an interleave operation to merge the vectors.  */
33469
33470 static bool
33471 expand_vec_perm_interleave2 (struct expand_vec_perm_d *d)
33472 {
33473   struct expand_vec_perm_d dremap, dfinal;
33474   unsigned i, nelt = d->nelt, nelt2 = nelt / 2;
33475   unsigned contents, h1, h2, h3, h4;
33476   unsigned char remap[2 * MAX_VECT_LEN];
33477   rtx seq;
33478   bool ok;
33479
33480   if (d->op0 == d->op1)
33481     return false;
33482
33483   /* The 256-bit unpck[lh]p[sd] instructions only operate within the 128-bit
33484      lanes.  We can use similar techniques with the vperm2f128 instruction,
33485      but it requires slightly different logic.  */
33486   if (GET_MODE_SIZE (d->vmode) != 16)
33487     return false;
33488
33489   /* Examine from whence the elements come.  */
33490   contents = 0;
33491   for (i = 0; i < nelt; ++i)
33492     contents |= 1u << d->perm[i];
33493
33494   /* Split the two input vectors into 4 halves.  */
33495   h1 = (1u << nelt2) - 1;
33496   h2 = h1 << nelt2;
33497   h3 = h2 << nelt2;
33498   h4 = h3 << nelt2;
33499
33500   memset (remap, 0xff, sizeof (remap));
33501   dremap = *d;
33502
33503   /* If the elements from the low halves use interleave low, and similarly
33504      for interleave high.  If the elements are from mis-matched halves, we
33505      can use shufps for V4SF/V4SI or do a DImode shuffle.  */
33506   if ((contents & (h1 | h3)) == contents)
33507     {
33508       for (i = 0; i < nelt2; ++i)
33509         {
33510           remap[i] = i * 2;
33511           remap[i + nelt] = i * 2 + 1;
33512           dremap.perm[i * 2] = i;
33513           dremap.perm[i * 2 + 1] = i + nelt;
33514         }
33515     }
33516   else if ((contents & (h2 | h4)) == contents)
33517     {
33518       for (i = 0; i < nelt2; ++i)
33519         {
33520           remap[i + nelt2] = i * 2;
33521           remap[i + nelt + nelt2] = i * 2 + 1;
33522           dremap.perm[i * 2] = i + nelt2;
33523           dremap.perm[i * 2 + 1] = i + nelt + nelt2;
33524         }
33525     }
33526   else if ((contents & (h1 | h4)) == contents)
33527     {
33528       for (i = 0; i < nelt2; ++i)
33529         {
33530           remap[i] = i;
33531           remap[i + nelt + nelt2] = i + nelt2;
33532           dremap.perm[i] = i;
33533           dremap.perm[i + nelt2] = i + nelt + nelt2;
33534         }
33535       if (nelt != 4)
33536         {
33537           dremap.vmode = V2DImode;
33538           dremap.nelt = 2;
33539           dremap.perm[0] = 0;
33540           dremap.perm[1] = 3;
33541         }
33542     }
33543   else if ((contents & (h2 | h3)) == contents)
33544     {
33545       for (i = 0; i < nelt2; ++i)
33546         {
33547           remap[i + nelt2] = i;
33548           remap[i + nelt] = i + nelt2;
33549           dremap.perm[i] = i + nelt2;
33550           dremap.perm[i + nelt2] = i + nelt;
33551         }
33552       if (nelt != 4)
33553         {
33554           dremap.vmode = V2DImode;
33555           dremap.nelt = 2;
33556           dremap.perm[0] = 1;
33557           dremap.perm[1] = 2;
33558         }
33559     }
33560   else
33561     return false;
33562
33563   /* Use the remapping array set up above to move the elements from their
33564      swizzled locations into their final destinations.  */
33565   dfinal = *d;
33566   for (i = 0; i < nelt; ++i)
33567     {
33568       unsigned e = remap[d->perm[i]];
33569       gcc_assert (e < nelt);
33570       dfinal.perm[i] = e;
33571     }
33572   dfinal.op0 = gen_reg_rtx (dfinal.vmode);
33573   dfinal.op1 = dfinal.op0;
33574   dremap.target = dfinal.op0;
33575
33576   /* Test if the final remap can be done with a single insn.  For V4SFmode or
33577      V4SImode this *will* succeed.  For V8HImode or V16QImode it may not.  */
33578   start_sequence ();
33579   ok = expand_vec_perm_1 (&dfinal);
33580   seq = get_insns ();
33581   end_sequence ();
33582
33583   if (!ok)
33584     return false;
33585
33586   if (dremap.vmode != dfinal.vmode)
33587     {
33588       dremap.target = gen_lowpart (dremap.vmode, dremap.target);
33589       dremap.op0 = gen_lowpart (dremap.vmode, dremap.op0);
33590       dremap.op1 = gen_lowpart (dremap.vmode, dremap.op1);
33591     }
33592
33593   ok = expand_vec_perm_1 (&dremap);
33594   gcc_assert (ok);
33595
33596   emit_insn (seq);
33597   return true;
33598 }
33599
33600 /* A subroutine of expand_vec_perm_even_odd_1.  Implement the double-word
33601    permutation with two pshufb insns and an ior.  We should have already
33602    failed all two instruction sequences.  */
33603
33604 static bool
33605 expand_vec_perm_pshufb2 (struct expand_vec_perm_d *d)
33606 {
33607   rtx rperm[2][16], vperm, l, h, op, m128;
33608   unsigned int i, nelt, eltsz;
33609
33610   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
33611     return false;
33612   gcc_assert (d->op0 != d->op1);
33613
33614   nelt = d->nelt;
33615   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
33616
33617   /* Generate two permutation masks.  If the required element is within
33618      the given vector it is shuffled into the proper lane.  If the required
33619      element is in the other vector, force a zero into the lane by setting
33620      bit 7 in the permutation mask.  */
33621   m128 = GEN_INT (-128);
33622   for (i = 0; i < nelt; ++i)
33623     {
33624       unsigned j, e = d->perm[i];
33625       unsigned which = (e >= nelt);
33626       if (e >= nelt)
33627         e -= nelt;
33628
33629       for (j = 0; j < eltsz; ++j)
33630         {
33631           rperm[which][i*eltsz + j] = GEN_INT (e*eltsz + j);
33632           rperm[1-which][i*eltsz + j] = m128;
33633         }
33634     }
33635
33636   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[0]));
33637   vperm = force_reg (V16QImode, vperm);
33638
33639   l = gen_reg_rtx (V16QImode);
33640   op = gen_lowpart (V16QImode, d->op0);
33641   emit_insn (gen_ssse3_pshufbv16qi3 (l, op, vperm));
33642
33643   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[1]));
33644   vperm = force_reg (V16QImode, vperm);
33645
33646   h = gen_reg_rtx (V16QImode);
33647   op = gen_lowpart (V16QImode, d->op1);
33648   emit_insn (gen_ssse3_pshufbv16qi3 (h, op, vperm));
33649
33650   op = gen_lowpart (V16QImode, d->target);
33651   emit_insn (gen_iorv16qi3 (op, l, h));
33652
33653   return true;
33654 }
33655
33656 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement extract-even
33657    and extract-odd permutations.  */
33658
33659 static bool
33660 expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
33661 {
33662   rtx t1, t2, t3;
33663
33664   switch (d->vmode)
33665     {
33666     case V4DFmode:
33667       t1 = gen_reg_rtx (V4DFmode);
33668       t2 = gen_reg_rtx (V4DFmode);
33669
33670       /* Shuffle the lanes around into { 0 1 4 5 } and { 2 3 6 7 }.  */
33671       emit_insn (gen_avx_vperm2f128v4df3 (t1, d->op0, d->op1, GEN_INT (0x20)));
33672       emit_insn (gen_avx_vperm2f128v4df3 (t2, d->op0, d->op1, GEN_INT (0x31)));
33673
33674       /* Now an unpck[lh]pd will produce the result required.  */
33675       if (odd)
33676         t3 = gen_avx_unpckhpd256 (d->target, t1, t2);
33677       else
33678         t3 = gen_avx_unpcklpd256 (d->target, t1, t2);
33679       emit_insn (t3);
33680       break;
33681
33682     case V8SFmode:
33683       {
33684         int mask = odd ? 0xdd : 0x88;
33685
33686         t1 = gen_reg_rtx (V8SFmode);
33687         t2 = gen_reg_rtx (V8SFmode);
33688         t3 = gen_reg_rtx (V8SFmode);
33689
33690         /* Shuffle within the 128-bit lanes to produce:
33691            { 0 2 8 a 4 6 c e } | { 1 3 9 b 5 7 d f }.  */
33692         emit_insn (gen_avx_shufps256 (t1, d->op0, d->op1,
33693                                       GEN_INT (mask)));
33694
33695         /* Shuffle the lanes around to produce:
33696            { 4 6 c e 0 2 8 a } and { 5 7 d f 1 3 9 b }.  */
33697         emit_insn (gen_avx_vperm2f128v8sf3 (t2, t1, t1,
33698                                             GEN_INT (0x3)));
33699
33700         /* Shuffle within the 128-bit lanes to produce:
33701            { 0 2 4 6 4 6 0 2 } | { 1 3 5 7 5 7 1 3 }.  */
33702         emit_insn (gen_avx_shufps256 (t3, t1, t2, GEN_INT (0x44)));
33703
33704         /* Shuffle within the 128-bit lanes to produce:
33705            { 8 a c e c e 8 a } | { 9 b d f d f 9 b }.  */
33706         emit_insn (gen_avx_shufps256 (t2, t1, t2, GEN_INT (0xee)));
33707
33708         /* Shuffle the lanes around to produce:
33709            { 0 2 4 6 8 a c e } | { 1 3 5 7 9 b d f }.  */
33710         emit_insn (gen_avx_vperm2f128v8sf3 (d->target, t3, t2,
33711                                             GEN_INT (0x20)));
33712       }
33713       break;
33714
33715     case V2DFmode:
33716     case V4SFmode:
33717     case V2DImode:
33718     case V4SImode:
33719       /* These are always directly implementable by expand_vec_perm_1.  */
33720       gcc_unreachable ();
33721
33722     case V8HImode:
33723       if (TARGET_SSSE3)
33724         return expand_vec_perm_pshufb2 (d);
33725       else
33726         {
33727           /* We need 2*log2(N)-1 operations to achieve odd/even
33728              with interleave. */
33729           t1 = gen_reg_rtx (V8HImode);
33730           t2 = gen_reg_rtx (V8HImode);
33731           emit_insn (gen_vec_interleave_highv8hi (t1, d->op0, d->op1));
33732           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->op0, d->op1));
33733           emit_insn (gen_vec_interleave_highv8hi (t2, d->target, t1));
33734           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->target, t1));
33735           if (odd)
33736             t3 = gen_vec_interleave_highv8hi (d->target, d->target, t2);
33737           else
33738             t3 = gen_vec_interleave_lowv8hi (d->target, d->target, t2);
33739           emit_insn (t3);
33740         }
33741       break;
33742
33743     case V16QImode:
33744       if (TARGET_SSSE3)
33745         return expand_vec_perm_pshufb2 (d);
33746       else
33747         {
33748           t1 = gen_reg_rtx (V16QImode);
33749           t2 = gen_reg_rtx (V16QImode);
33750           t3 = gen_reg_rtx (V16QImode);
33751           emit_insn (gen_vec_interleave_highv16qi (t1, d->op0, d->op1));
33752           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->op0, d->op1));
33753           emit_insn (gen_vec_interleave_highv16qi (t2, d->target, t1));
33754           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t1));
33755           emit_insn (gen_vec_interleave_highv16qi (t3, d->target, t2));
33756           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t2));
33757           if (odd)
33758             t3 = gen_vec_interleave_highv16qi (d->target, d->target, t3);
33759           else
33760             t3 = gen_vec_interleave_lowv16qi (d->target, d->target, t3);
33761           emit_insn (t3);
33762         }
33763       break;
33764
33765     default:
33766       gcc_unreachable ();
33767     }
33768
33769   return true;
33770 }
33771
33772 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
33773    extract-even and extract-odd permutations.  */
33774
33775 static bool
33776 expand_vec_perm_even_odd (struct expand_vec_perm_d *d)
33777 {
33778   unsigned i, odd, nelt = d->nelt;
33779
33780   odd = d->perm[0];
33781   if (odd != 0 && odd != 1)
33782     return false;
33783
33784   for (i = 1; i < nelt; ++i)
33785     if (d->perm[i] != 2 * i + odd)
33786       return false;
33787
33788   return expand_vec_perm_even_odd_1 (d, odd);
33789 }
33790
33791 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement broadcast
33792    permutations.  We assume that expand_vec_perm_1 has already failed.  */
33793
33794 static bool
33795 expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d)
33796 {
33797   unsigned elt = d->perm[0], nelt2 = d->nelt / 2;
33798   enum machine_mode vmode = d->vmode;
33799   unsigned char perm2[4];
33800   rtx op0 = d->op0;
33801   bool ok;
33802
33803   switch (vmode)
33804     {
33805     case V4DFmode:
33806     case V8SFmode:
33807       /* These are special-cased in sse.md so that we can optionally
33808          use the vbroadcast instruction.  They expand to two insns
33809          if the input happens to be in a register.  */
33810       gcc_unreachable ();
33811
33812     case V2DFmode:
33813     case V2DImode:
33814     case V4SFmode:
33815     case V4SImode:
33816       /* These are always implementable using standard shuffle patterns.  */
33817       gcc_unreachable ();
33818
33819     case V8HImode:
33820     case V16QImode:
33821       /* These can be implemented via interleave.  We save one insn by
33822          stopping once we have promoted to V4SImode and then use pshufd.  */
33823       do
33824         {
33825           optab otab = vec_interleave_low_optab;
33826
33827           if (elt >= nelt2)
33828             {
33829               otab = vec_interleave_high_optab;
33830               elt -= nelt2;
33831             }
33832           nelt2 /= 2;
33833
33834           op0 = expand_binop (vmode, otab, op0, op0, NULL, 0, OPTAB_DIRECT);
33835           vmode = get_mode_wider_vector (vmode);
33836           op0 = gen_lowpart (vmode, op0);
33837         }
33838       while (vmode != V4SImode);
33839
33840       memset (perm2, elt, 4);
33841       ok = expand_vselect (gen_lowpart (V4SImode, d->target), op0, perm2, 4);
33842       gcc_assert (ok);
33843       return true;
33844
33845     default:
33846       gcc_unreachable ();
33847     }
33848 }
33849
33850 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
33851    broadcast permutations.  */
33852
33853 static bool
33854 expand_vec_perm_broadcast (struct expand_vec_perm_d *d)
33855 {
33856   unsigned i, elt, nelt = d->nelt;
33857
33858   if (d->op0 != d->op1)
33859     return false;
33860
33861   elt = d->perm[0];
33862   for (i = 1; i < nelt; ++i)
33863     if (d->perm[i] != elt)
33864       return false;
33865
33866   return expand_vec_perm_broadcast_1 (d);
33867 }
33868
33869 /* The guts of ix86_expand_vec_perm_builtin, also used by the ok hook.
33870    With all of the interface bits taken care of, perform the expansion
33871    in D and return true on success.  */
33872
33873 static bool
33874 ix86_expand_vec_perm_builtin_1 (struct expand_vec_perm_d *d)
33875 {
33876   /* Try a single instruction expansion.  */
33877   if (expand_vec_perm_1 (d))
33878     return true;
33879
33880   /* Try sequences of two instructions.  */
33881
33882   if (expand_vec_perm_pshuflw_pshufhw (d))
33883     return true;
33884
33885   if (expand_vec_perm_palignr (d))
33886     return true;
33887
33888   if (expand_vec_perm_interleave2 (d))
33889     return true;
33890
33891   if (expand_vec_perm_broadcast (d))
33892     return true;
33893
33894   /* Try sequences of three instructions.  */
33895
33896   if (expand_vec_perm_pshufb2 (d))
33897     return true;
33898
33899   /* ??? Look for narrow permutations whose element orderings would
33900      allow the promotion to a wider mode.  */
33901
33902   /* ??? Look for sequences of interleave or a wider permute that place
33903      the data into the correct lanes for a half-vector shuffle like
33904      pshuf[lh]w or vpermilps.  */
33905
33906   /* ??? Look for sequences of interleave that produce the desired results.
33907      The combinatorics of punpck[lh] get pretty ugly... */
33908
33909   if (expand_vec_perm_even_odd (d))
33910     return true;
33911
33912   return false;
33913 }
33914
33915 /* Extract the values from the vector CST into the permutation array in D.
33916    Return 0 on error, 1 if all values from the permutation come from the
33917    first vector, 2 if all values from the second vector, and 3 otherwise.  */
33918
33919 static int
33920 extract_vec_perm_cst (struct expand_vec_perm_d *d, tree cst)
33921 {
33922   tree list = TREE_VECTOR_CST_ELTS (cst);
33923   unsigned i, nelt = d->nelt;
33924   int ret = 0;
33925
33926   for (i = 0; i < nelt; ++i, list = TREE_CHAIN (list))
33927     {
33928       unsigned HOST_WIDE_INT e;
33929
33930       if (!host_integerp (TREE_VALUE (list), 1))
33931         return 0;
33932       e = tree_low_cst (TREE_VALUE (list), 1);
33933       if (e >= 2 * nelt)
33934         return 0;
33935
33936       ret |= (e < nelt ? 1 : 2);
33937       d->perm[i] = e;
33938     }
33939   gcc_assert (list == NULL);
33940
33941   /* For all elements from second vector, fold the elements to first.  */
33942   if (ret == 2)
33943     for (i = 0; i < nelt; ++i)
33944       d->perm[i] -= nelt;
33945
33946   return ret;
33947 }
33948
33949 static rtx
33950 ix86_expand_vec_perm_builtin (tree exp)
33951 {
33952   struct expand_vec_perm_d d;
33953   tree arg0, arg1, arg2;
33954
33955   arg0 = CALL_EXPR_ARG (exp, 0);
33956   arg1 = CALL_EXPR_ARG (exp, 1);
33957   arg2 = CALL_EXPR_ARG (exp, 2);
33958
33959   d.vmode = TYPE_MODE (TREE_TYPE (arg0));
33960   d.nelt = GET_MODE_NUNITS (d.vmode);
33961   d.testing_p = false;
33962   gcc_assert (VECTOR_MODE_P (d.vmode));
33963
33964   if (TREE_CODE (arg2) != VECTOR_CST)
33965     {
33966       error_at (EXPR_LOCATION (exp),
33967                 "vector permutation requires vector constant");
33968       goto exit_error;
33969     }
33970
33971   switch (extract_vec_perm_cst (&d, arg2))
33972     {
33973     default:
33974       gcc_unreachable();
33975
33976     case 0:
33977       error_at (EXPR_LOCATION (exp), "invalid vector permutation constant");
33978       goto exit_error;
33979
33980     case 3:
33981       if (!operand_equal_p (arg0, arg1, 0))
33982         {
33983           d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
33984           d.op0 = force_reg (d.vmode, d.op0);
33985           d.op1 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
33986           d.op1 = force_reg (d.vmode, d.op1);
33987           break;
33988         }
33989
33990       /* The elements of PERM do not suggest that only the first operand
33991          is used, but both operands are identical.  Allow easier matching
33992          of the permutation by folding the permutation into the single
33993          input vector.  */
33994       {
33995         unsigned i, nelt = d.nelt;
33996         for (i = 0; i < nelt; ++i)
33997           if (d.perm[i] >= nelt)
33998             d.perm[i] -= nelt;
33999       }
34000       /* FALLTHRU */
34001
34002     case 1:
34003       d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
34004       d.op0 = force_reg (d.vmode, d.op0);
34005       d.op1 = d.op0;
34006       break;
34007
34008     case 2:
34009       d.op0 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
34010       d.op0 = force_reg (d.vmode, d.op0);
34011       d.op1 = d.op0;
34012       break;
34013     }
34014
34015   d.target = gen_reg_rtx (d.vmode);
34016   if (ix86_expand_vec_perm_builtin_1 (&d))
34017     return d.target;
34018
34019   /* For compiler generated permutations, we should never got here, because
34020      the compiler should also be checking the ok hook.  But since this is a
34021      builtin the user has access too, so don't abort.  */
34022   switch (d.nelt)
34023     {
34024     case 2:
34025       sorry ("vector permutation (%d %d)", d.perm[0], d.perm[1]);
34026       break;
34027     case 4:
34028       sorry ("vector permutation (%d %d %d %d)",
34029              d.perm[0], d.perm[1], d.perm[2], d.perm[3]);
34030       break;
34031     case 8:
34032       sorry ("vector permutation (%d %d %d %d %d %d %d %d)",
34033              d.perm[0], d.perm[1], d.perm[2], d.perm[3],
34034              d.perm[4], d.perm[5], d.perm[6], d.perm[7]);
34035       break;
34036     case 16:
34037       sorry ("vector permutation "
34038              "(%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d)",
34039              d.perm[0], d.perm[1], d.perm[2], d.perm[3],
34040              d.perm[4], d.perm[5], d.perm[6], d.perm[7],
34041              d.perm[8], d.perm[9], d.perm[10], d.perm[11],
34042              d.perm[12], d.perm[13], d.perm[14], d.perm[15]);
34043       break;
34044     default:
34045       gcc_unreachable ();
34046     }
34047  exit_error:
34048   return CONST0_RTX (d.vmode);
34049 }
34050
34051 /* Implement targetm.vectorize.builtin_vec_perm_ok.  */
34052
34053 static bool
34054 ix86_vectorize_builtin_vec_perm_ok (tree vec_type, tree mask)
34055 {
34056   struct expand_vec_perm_d d;
34057   int vec_mask;
34058   bool ret, one_vec;
34059
34060   d.vmode = TYPE_MODE (vec_type);
34061   d.nelt = GET_MODE_NUNITS (d.vmode);
34062   d.testing_p = true;
34063
34064   /* Given sufficient ISA support we can just return true here
34065      for selected vector modes.  */
34066   if (GET_MODE_SIZE (d.vmode) == 16)
34067     {
34068       /* All implementable with a single vpperm insn.  */
34069       if (TARGET_XOP)
34070         return true;
34071       /* All implementable with 2 pshufb + 1 ior.  */
34072       if (TARGET_SSSE3)
34073         return true;
34074       /* All implementable with shufpd or unpck[lh]pd.  */
34075       if (d.nelt == 2)
34076         return true;
34077     }
34078
34079   vec_mask = extract_vec_perm_cst (&d, mask);
34080
34081   /* This hook is cannot be called in response to something that the
34082      user does (unlike the builtin expander) so we shouldn't ever see
34083      an error generated from the extract.  */
34084   gcc_assert (vec_mask > 0 && vec_mask <= 3);
34085   one_vec = (vec_mask != 3);
34086
34087   /* Implementable with shufps or pshufd.  */
34088   if (one_vec && (d.vmode == V4SFmode || d.vmode == V4SImode))
34089     return true;
34090
34091   /* Otherwise we have to go through the motions and see if we can
34092      figure out how to generate the requested permutation.  */
34093   d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
34094   d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
34095   if (!one_vec)
34096     d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
34097
34098   start_sequence ();
34099   ret = ix86_expand_vec_perm_builtin_1 (&d);
34100   end_sequence ();
34101
34102   return ret;
34103 }
34104
34105 void
34106 ix86_expand_vec_extract_even_odd (rtx targ, rtx op0, rtx op1, unsigned odd)
34107 {
34108   struct expand_vec_perm_d d;
34109   unsigned i, nelt;
34110
34111   d.target = targ;
34112   d.op0 = op0;
34113   d.op1 = op1;
34114   d.vmode = GET_MODE (targ);
34115   d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
34116   d.testing_p = false;
34117
34118   for (i = 0; i < nelt; ++i)
34119     d.perm[i] = i * 2 + odd;
34120
34121   /* We'll either be able to implement the permutation directly...  */
34122   if (expand_vec_perm_1 (&d))
34123     return;
34124
34125   /* ... or we use the special-case patterns.  */
34126   expand_vec_perm_even_odd_1 (&d, odd);
34127 }
34128 \f
34129 /* This function returns the calling abi specific va_list type node.
34130    It returns  the FNDECL specific va_list type.  */
34131
34132 static tree
34133 ix86_fn_abi_va_list (tree fndecl)
34134 {
34135   if (!TARGET_64BIT)
34136     return va_list_type_node;
34137   gcc_assert (fndecl != NULL_TREE);
34138
34139   if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
34140     return ms_va_list_type_node;
34141   else
34142     return sysv_va_list_type_node;
34143 }
34144
34145 /* Returns the canonical va_list type specified by TYPE. If there
34146    is no valid TYPE provided, it return NULL_TREE.  */
34147
34148 static tree
34149 ix86_canonical_va_list_type (tree type)
34150 {
34151   tree wtype, htype;
34152
34153   /* Resolve references and pointers to va_list type.  */
34154   if (TREE_CODE (type) == MEM_REF)
34155     type = TREE_TYPE (type);
34156   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
34157     type = TREE_TYPE (type);
34158   else if (POINTER_TYPE_P (type) && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
34159     type = TREE_TYPE (type);
34160
34161   if (TARGET_64BIT && va_list_type_node != NULL_TREE)
34162     {
34163       wtype = va_list_type_node;
34164           gcc_assert (wtype != NULL_TREE);
34165       htype = type;
34166       if (TREE_CODE (wtype) == ARRAY_TYPE)
34167         {
34168           /* If va_list is an array type, the argument may have decayed
34169              to a pointer type, e.g. by being passed to another function.
34170              In that case, unwrap both types so that we can compare the
34171              underlying records.  */
34172           if (TREE_CODE (htype) == ARRAY_TYPE
34173               || POINTER_TYPE_P (htype))
34174             {
34175               wtype = TREE_TYPE (wtype);
34176               htype = TREE_TYPE (htype);
34177             }
34178         }
34179       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34180         return va_list_type_node;
34181       wtype = sysv_va_list_type_node;
34182           gcc_assert (wtype != NULL_TREE);
34183       htype = type;
34184       if (TREE_CODE (wtype) == ARRAY_TYPE)
34185         {
34186           /* If va_list is an array type, the argument may have decayed
34187              to a pointer type, e.g. by being passed to another function.
34188              In that case, unwrap both types so that we can compare the
34189              underlying records.  */
34190           if (TREE_CODE (htype) == ARRAY_TYPE
34191               || POINTER_TYPE_P (htype))
34192             {
34193               wtype = TREE_TYPE (wtype);
34194               htype = TREE_TYPE (htype);
34195             }
34196         }
34197       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34198         return sysv_va_list_type_node;
34199       wtype = ms_va_list_type_node;
34200           gcc_assert (wtype != NULL_TREE);
34201       htype = type;
34202       if (TREE_CODE (wtype) == ARRAY_TYPE)
34203         {
34204           /* If va_list is an array type, the argument may have decayed
34205              to a pointer type, e.g. by being passed to another function.
34206              In that case, unwrap both types so that we can compare the
34207              underlying records.  */
34208           if (TREE_CODE (htype) == ARRAY_TYPE
34209               || POINTER_TYPE_P (htype))
34210             {
34211               wtype = TREE_TYPE (wtype);
34212               htype = TREE_TYPE (htype);
34213             }
34214         }
34215       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34216         return ms_va_list_type_node;
34217       return NULL_TREE;
34218     }
34219   return std_canonical_va_list_type (type);
34220 }
34221
34222 /* Iterate through the target-specific builtin types for va_list.
34223    IDX denotes the iterator, *PTREE is set to the result type of
34224    the va_list builtin, and *PNAME to its internal type.
34225    Returns zero if there is no element for this index, otherwise
34226    IDX should be increased upon the next call.
34227    Note, do not iterate a base builtin's name like __builtin_va_list.
34228    Used from c_common_nodes_and_builtins.  */
34229
34230 static int
34231 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
34232 {
34233   if (TARGET_64BIT)
34234     {
34235       switch (idx)
34236         {
34237         default:
34238           break;
34239
34240         case 0:
34241           *ptree = ms_va_list_type_node;
34242           *pname = "__builtin_ms_va_list";
34243           return 1;
34244
34245         case 1:
34246           *ptree = sysv_va_list_type_node;
34247           *pname = "__builtin_sysv_va_list";
34248           return 1;
34249         }
34250     }
34251
34252   return 0;
34253 }
34254
34255 #undef TARGET_SCHED_DISPATCH
34256 #define TARGET_SCHED_DISPATCH has_dispatch
34257 #undef TARGET_SCHED_DISPATCH_DO
34258 #define TARGET_SCHED_DISPATCH_DO do_dispatch
34259
34260 /* The size of the dispatch window is the total number of bytes of
34261    object code allowed in a window.  */
34262 #define DISPATCH_WINDOW_SIZE 16
34263
34264 /* Number of dispatch windows considered for scheduling.  */
34265 #define MAX_DISPATCH_WINDOWS 3
34266
34267 /* Maximum number of instructions in a window.  */
34268 #define MAX_INSN 4
34269
34270 /* Maximum number of immediate operands in a window.  */
34271 #define MAX_IMM 4
34272
34273 /* Maximum number of immediate bits allowed in a window.  */
34274 #define MAX_IMM_SIZE 128
34275
34276 /* Maximum number of 32 bit immediates allowed in a window.  */
34277 #define MAX_IMM_32 4
34278
34279 /* Maximum number of 64 bit immediates allowed in a window.  */
34280 #define MAX_IMM_64 2
34281
34282 /* Maximum total of loads or prefetches allowed in a window.  */
34283 #define MAX_LOAD 2
34284
34285 /* Maximum total of stores allowed in a window.  */
34286 #define MAX_STORE 1
34287
34288 #undef BIG
34289 #define BIG 100
34290
34291
34292 /* Dispatch groups.  Istructions that affect the mix in a dispatch window.  */
34293 enum dispatch_group {
34294   disp_no_group = 0,
34295   disp_load,
34296   disp_store,
34297   disp_load_store,
34298   disp_prefetch,
34299   disp_imm,
34300   disp_imm_32,
34301   disp_imm_64,
34302   disp_branch,
34303   disp_cmp,
34304   disp_jcc,
34305   disp_last
34306 };
34307
34308 /* Number of allowable groups in a dispatch window.  It is an array
34309    indexed by dispatch_group enum.  100 is used as a big number,
34310    because the number of these kind of operations does not have any
34311    effect in dispatch window, but we need them for other reasons in
34312    the table.  */
34313 static unsigned int num_allowable_groups[disp_last] = {
34314   0, 2, 1, 1, 2, 4, 4, 2, 1, BIG, BIG
34315 };
34316
34317 char group_name[disp_last + 1][16] = {
34318   "disp_no_group", "disp_load", "disp_store", "disp_load_store",
34319   "disp_prefetch", "disp_imm", "disp_imm_32", "disp_imm_64",
34320   "disp_branch", "disp_cmp", "disp_jcc", "disp_last"
34321 };
34322
34323 /* Instruction path.  */
34324 enum insn_path {
34325   no_path = 0,
34326   path_single, /* Single micro op.  */
34327   path_double, /* Double micro op.  */
34328   path_multi,  /* Instructions with more than 2 micro op..  */
34329   last_path
34330 };
34331
34332 /* sched_insn_info defines a window to the instructions scheduled in
34333    the basic block.  It contains a pointer to the insn_info table and
34334    the instruction scheduled.
34335
34336    Windows are allocated for each basic block and are linked
34337    together.  */
34338 typedef struct sched_insn_info_s {
34339   rtx insn;
34340   enum dispatch_group group;
34341   enum insn_path path;
34342   int byte_len;
34343   int imm_bytes;
34344 } sched_insn_info;
34345
34346 /* Linked list of dispatch windows.  This is a two way list of
34347    dispatch windows of a basic block.  It contains information about
34348    the number of uops in the window and the total number of
34349    instructions and of bytes in the object code for this dispatch
34350    window.  */
34351 typedef struct dispatch_windows_s {
34352   int num_insn;            /* Number of insn in the window.  */
34353   int num_uops;            /* Number of uops in the window.  */
34354   int window_size;         /* Number of bytes in the window.  */
34355   int window_num;          /* Window number between 0 or 1.  */
34356   int num_imm;             /* Number of immediates in an insn.  */
34357   int num_imm_32;          /* Number of 32 bit immediates in an insn.  */
34358   int num_imm_64;          /* Number of 64 bit immediates in an insn.  */
34359   int imm_size;            /* Total immediates in the window.  */
34360   int num_loads;           /* Total memory loads in the window.  */
34361   int num_stores;          /* Total memory stores in the window.  */
34362   int violation;          /* Violation exists in window.  */
34363   sched_insn_info *window; /* Pointer to the window.  */
34364   struct dispatch_windows_s *next;
34365   struct dispatch_windows_s *prev;
34366 } dispatch_windows;
34367
34368 /* Immediate valuse used in an insn.  */
34369 typedef struct imm_info_s
34370   {
34371     int imm;
34372     int imm32;
34373     int imm64;
34374   } imm_info;
34375
34376 static dispatch_windows *dispatch_window_list;
34377 static dispatch_windows *dispatch_window_list1;
34378
34379 /* Get dispatch group of insn.  */
34380
34381 static enum dispatch_group
34382 get_mem_group (rtx insn)
34383 {
34384   enum attr_memory memory;
34385
34386   if (INSN_CODE (insn) < 0)
34387     return disp_no_group;
34388   memory = get_attr_memory (insn);
34389   if (memory == MEMORY_STORE)
34390     return disp_store;
34391
34392   if (memory == MEMORY_LOAD)
34393     return disp_load;
34394
34395   if (memory == MEMORY_BOTH)
34396     return disp_load_store;
34397
34398   return disp_no_group;
34399 }
34400
34401 /* Return true if insn is a compare instruction.  */
34402
34403 static bool
34404 is_cmp (rtx insn)
34405 {
34406   enum attr_type type;
34407
34408   type = get_attr_type (insn);
34409   return (type == TYPE_TEST
34410           || type == TYPE_ICMP
34411           || type == TYPE_FCMP
34412           || GET_CODE (PATTERN (insn)) == COMPARE);
34413 }
34414
34415 /* Return true if a dispatch violation encountered.  */
34416
34417 static bool
34418 dispatch_violation (void)
34419 {
34420   if (dispatch_window_list->next)
34421     return dispatch_window_list->next->violation;
34422   return dispatch_window_list->violation;
34423 }
34424
34425 /* Return true if insn is a branch instruction.  */
34426
34427 static bool
34428 is_branch (rtx insn)
34429 {
34430   return (CALL_P (insn) || JUMP_P (insn));
34431 }
34432
34433 /* Return true if insn is a prefetch instruction.  */
34434
34435 static bool
34436 is_prefetch (rtx insn)
34437 {
34438   return NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == PREFETCH;
34439 }
34440
34441 /* This function initializes a dispatch window and the list container holding a
34442    pointer to the window.  */
34443
34444 static void
34445 init_window (int window_num)
34446 {
34447   int i;
34448   dispatch_windows *new_list;
34449
34450   if (window_num == 0)
34451     new_list = dispatch_window_list;
34452   else
34453     new_list = dispatch_window_list1;
34454
34455   new_list->num_insn = 0;
34456   new_list->num_uops = 0;
34457   new_list->window_size = 0;
34458   new_list->next = NULL;
34459   new_list->prev = NULL;
34460   new_list->window_num = window_num;
34461   new_list->num_imm = 0;
34462   new_list->num_imm_32 = 0;
34463   new_list->num_imm_64 = 0;
34464   new_list->imm_size = 0;
34465   new_list->num_loads = 0;
34466   new_list->num_stores = 0;
34467   new_list->violation = false;
34468
34469   for (i = 0; i < MAX_INSN; i++)
34470     {
34471       new_list->window[i].insn = NULL;
34472       new_list->window[i].group = disp_no_group;
34473       new_list->window[i].path = no_path;
34474       new_list->window[i].byte_len = 0;
34475       new_list->window[i].imm_bytes = 0;
34476     }
34477   return;
34478 }
34479
34480 /* This function allocates and initializes a dispatch window and the
34481    list container holding a pointer to the window.  */
34482
34483 static dispatch_windows *
34484 allocate_window (void)
34485 {
34486   dispatch_windows *new_list = XNEW (struct dispatch_windows_s);
34487   new_list->window = XNEWVEC (struct sched_insn_info_s, MAX_INSN + 1);
34488
34489   return new_list;
34490 }
34491
34492 /* This routine initializes the dispatch scheduling information.  It
34493    initiates building dispatch scheduler tables and constructs the
34494    first dispatch window.  */
34495
34496 static void
34497 init_dispatch_sched (void)
34498 {
34499   /* Allocate a dispatch list and a window.  */
34500   dispatch_window_list = allocate_window ();
34501   dispatch_window_list1 = allocate_window ();
34502   init_window (0);
34503   init_window (1);
34504 }
34505
34506 /* This function returns true if a branch is detected.  End of a basic block
34507    does not have to be a branch, but here we assume only branches end a
34508    window.  */
34509
34510 static bool
34511 is_end_basic_block (enum dispatch_group group)
34512 {
34513   return group == disp_branch;
34514 }
34515
34516 /* This function is called when the end of a window processing is reached.  */
34517
34518 static void
34519 process_end_window (void)
34520 {
34521   gcc_assert (dispatch_window_list->num_insn <= MAX_INSN);
34522   if (dispatch_window_list->next)
34523     {
34524       gcc_assert (dispatch_window_list1->num_insn <= MAX_INSN);
34525       gcc_assert (dispatch_window_list->window_size
34526                   + dispatch_window_list1->window_size <= 48);
34527       init_window (1);
34528     }
34529   init_window (0);
34530 }
34531
34532 /* Allocates a new dispatch window and adds it to WINDOW_LIST.
34533    WINDOW_NUM is either 0 or 1.  A maximum of two windows are generated
34534    for 48 bytes of instructions.  Note that these windows are not dispatch
34535    windows that their sizes are DISPATCH_WINDOW_SIZE.  */
34536
34537 static dispatch_windows *
34538 allocate_next_window (int window_num)
34539 {
34540   if (window_num == 0)
34541     {
34542       if (dispatch_window_list->next)
34543           init_window (1);
34544       init_window (0);
34545       return dispatch_window_list;
34546     }
34547
34548   dispatch_window_list->next = dispatch_window_list1;
34549   dispatch_window_list1->prev = dispatch_window_list;
34550
34551   return dispatch_window_list1;
34552 }
34553
34554 /* Increment the number of immediate operands of an instruction.  */
34555
34556 static int
34557 find_constant_1 (rtx *in_rtx, imm_info *imm_values)
34558 {
34559   if (*in_rtx == 0)
34560     return 0;
34561
34562     switch ( GET_CODE (*in_rtx))
34563     {
34564     case CONST:
34565     case SYMBOL_REF:
34566     case CONST_INT:
34567       (imm_values->imm)++;
34568       if (x86_64_immediate_operand (*in_rtx, SImode))
34569         (imm_values->imm32)++;
34570       else
34571         (imm_values->imm64)++;
34572       break;
34573
34574     case CONST_DOUBLE:
34575       (imm_values->imm)++;
34576       (imm_values->imm64)++;
34577       break;
34578
34579     case CODE_LABEL:
34580       if (LABEL_KIND (*in_rtx) == LABEL_NORMAL)
34581         {
34582           (imm_values->imm)++;
34583           (imm_values->imm32)++;
34584         }
34585       break;
34586
34587     default:
34588       break;
34589     }
34590
34591   return 0;
34592 }
34593
34594 /* Compute number of immediate operands of an instruction.  */
34595
34596 static void
34597 find_constant (rtx in_rtx, imm_info *imm_values)
34598 {
34599   for_each_rtx (INSN_P (in_rtx) ? &PATTERN (in_rtx) : &in_rtx,
34600                 (rtx_function) find_constant_1, (void *) imm_values);
34601 }
34602
34603 /* Return total size of immediate operands of an instruction along with number
34604    of corresponding immediate-operands.  It initializes its parameters to zero
34605    befor calling FIND_CONSTANT.
34606    INSN is the input instruction.  IMM is the total of immediates.
34607    IMM32 is the number of 32 bit immediates.  IMM64 is the number of 64
34608    bit immediates.  */
34609
34610 static int
34611 get_num_immediates (rtx insn, int *imm, int *imm32, int *imm64)
34612 {
34613   imm_info imm_values = {0, 0, 0};
34614
34615   find_constant (insn, &imm_values);
34616   *imm = imm_values.imm;
34617   *imm32 = imm_values.imm32;
34618   *imm64 = imm_values.imm64;
34619   return imm_values.imm32 * 4 + imm_values.imm64 * 8;
34620 }
34621
34622 /* This function indicates if an operand of an instruction is an
34623    immediate.  */
34624
34625 static bool
34626 has_immediate (rtx insn)
34627 {
34628   int num_imm_operand;
34629   int num_imm32_operand;
34630   int num_imm64_operand;
34631
34632   if (insn)
34633     return get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34634                                &num_imm64_operand);
34635   return false;
34636 }
34637
34638 /* Return single or double path for instructions.  */
34639
34640 static enum insn_path
34641 get_insn_path (rtx insn)
34642 {
34643   enum attr_amdfam10_decode path = get_attr_amdfam10_decode (insn);
34644
34645   if ((int)path == 0)
34646     return path_single;
34647
34648   if ((int)path == 1)
34649     return path_double;
34650
34651   return path_multi;
34652 }
34653
34654 /* Return insn dispatch group.  */
34655
34656 static enum dispatch_group
34657 get_insn_group (rtx insn)
34658 {
34659   enum dispatch_group group = get_mem_group (insn);
34660   if (group)
34661     return group;
34662
34663   if (is_branch (insn))
34664     return disp_branch;
34665
34666   if (is_cmp (insn))
34667     return disp_cmp;
34668
34669   if (has_immediate (insn))
34670     return disp_imm;
34671
34672   if (is_prefetch (insn))
34673     return disp_prefetch;
34674
34675   return disp_no_group;
34676 }
34677
34678 /* Count number of GROUP restricted instructions in a dispatch
34679    window WINDOW_LIST.  */
34680
34681 static int
34682 count_num_restricted (rtx insn, dispatch_windows *window_list)
34683 {
34684   enum dispatch_group group = get_insn_group (insn);
34685   int imm_size;
34686   int num_imm_operand;
34687   int num_imm32_operand;
34688   int num_imm64_operand;
34689
34690   if (group == disp_no_group)
34691     return 0;
34692
34693   if (group == disp_imm)
34694     {
34695       imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34696                               &num_imm64_operand);
34697       if (window_list->imm_size + imm_size > MAX_IMM_SIZE
34698           || num_imm_operand + window_list->num_imm > MAX_IMM
34699           || (num_imm32_operand > 0
34700               && (window_list->num_imm_32 + num_imm32_operand > MAX_IMM_32
34701                   || window_list->num_imm_64 * 2 + num_imm32_operand > MAX_IMM_32))
34702           || (num_imm64_operand > 0
34703               && (window_list->num_imm_64 + num_imm64_operand > MAX_IMM_64
34704                   || window_list->num_imm_32 + num_imm64_operand * 2 > MAX_IMM_32))
34705           || (window_list->imm_size + imm_size == MAX_IMM_SIZE
34706               && num_imm64_operand > 0
34707               && ((window_list->num_imm_64 > 0
34708                    && window_list->num_insn >= 2)
34709                   || window_list->num_insn >= 3)))
34710         return BIG;
34711
34712       return 1;
34713     }
34714
34715   if ((group == disp_load_store
34716        && (window_list->num_loads >= MAX_LOAD
34717            || window_list->num_stores >= MAX_STORE))
34718       || ((group == disp_load
34719            || group == disp_prefetch)
34720           && window_list->num_loads >= MAX_LOAD)
34721       || (group == disp_store
34722           && window_list->num_stores >= MAX_STORE))
34723     return BIG;
34724
34725   return 1;
34726 }
34727
34728 /* This function returns true if insn satisfies dispatch rules on the
34729    last window scheduled.  */
34730
34731 static bool
34732 fits_dispatch_window (rtx insn)
34733 {
34734   dispatch_windows *window_list = dispatch_window_list;
34735   dispatch_windows *window_list_next = dispatch_window_list->next;
34736   unsigned int num_restrict;
34737   enum dispatch_group group = get_insn_group (insn);
34738   enum insn_path path = get_insn_path (insn);
34739   int sum;
34740
34741   /* Make disp_cmp and disp_jcc get scheduled at the latest.  These
34742      instructions should be given the lowest priority in the
34743      scheduling process in Haifa scheduler to make sure they will be
34744      scheduled in the same dispatch window as the refrence to them.  */
34745   if (group == disp_jcc || group == disp_cmp)
34746     return false;
34747
34748   /* Check nonrestricted.  */
34749   if (group == disp_no_group || group == disp_branch)
34750     return true;
34751
34752   /* Get last dispatch window.  */
34753   if (window_list_next)
34754     window_list = window_list_next;
34755
34756   if (window_list->window_num == 1)
34757     {
34758       sum = window_list->prev->window_size + window_list->window_size;
34759
34760       if (sum == 32
34761           || (min_insn_size (insn) + sum) >= 48)
34762         /* Window 1 is full.  Go for next window.  */
34763         return true;
34764     }
34765
34766   num_restrict = count_num_restricted (insn, window_list);
34767
34768   if (num_restrict > num_allowable_groups[group])
34769     return false;
34770
34771   /* See if it fits in the first window.  */
34772   if (window_list->window_num == 0)
34773     {
34774       /* The first widow should have only single and double path
34775          uops.  */
34776       if (path == path_double
34777           && (window_list->num_uops + 2) > MAX_INSN)
34778         return false;
34779       else if (path != path_single)
34780         return false;
34781     }
34782   return true;
34783 }
34784
34785 /* Add an instruction INSN with NUM_UOPS micro-operations to the
34786    dispatch window WINDOW_LIST.  */
34787
34788 static void
34789 add_insn_window (rtx insn, dispatch_windows *window_list, int num_uops)
34790 {
34791   int byte_len = min_insn_size (insn);
34792   int num_insn = window_list->num_insn;
34793   int imm_size;
34794   sched_insn_info *window = window_list->window;
34795   enum dispatch_group group = get_insn_group (insn);
34796   enum insn_path path = get_insn_path (insn);
34797   int num_imm_operand;
34798   int num_imm32_operand;
34799   int num_imm64_operand;
34800
34801   if (!window_list->violation && group != disp_cmp
34802       && !fits_dispatch_window (insn))
34803     window_list->violation = true;
34804
34805   imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34806                                  &num_imm64_operand);
34807
34808   /* Initialize window with new instruction.  */
34809   window[num_insn].insn = insn;
34810   window[num_insn].byte_len = byte_len;
34811   window[num_insn].group = group;
34812   window[num_insn].path = path;
34813   window[num_insn].imm_bytes = imm_size;
34814
34815   window_list->window_size += byte_len;
34816   window_list->num_insn = num_insn + 1;
34817   window_list->num_uops = window_list->num_uops + num_uops;
34818   window_list->imm_size += imm_size;
34819   window_list->num_imm += num_imm_operand;
34820   window_list->num_imm_32 += num_imm32_operand;
34821   window_list->num_imm_64 += num_imm64_operand;
34822
34823   if (group == disp_store)
34824     window_list->num_stores += 1;
34825   else if (group == disp_load
34826            || group == disp_prefetch)
34827     window_list->num_loads += 1;
34828   else if (group == disp_load_store)
34829     {
34830       window_list->num_stores += 1;
34831       window_list->num_loads += 1;
34832     }
34833 }
34834
34835 /* Adds a scheduled instruction, INSN, to the current dispatch window.
34836    If the total bytes of instructions or the number of instructions in
34837    the window exceed allowable, it allocates a new window.  */
34838
34839 static void
34840 add_to_dispatch_window (rtx insn)
34841 {
34842   int byte_len;
34843   dispatch_windows *window_list;
34844   dispatch_windows *next_list;
34845   dispatch_windows *window0_list;
34846   enum insn_path path;
34847   enum dispatch_group insn_group;
34848   bool insn_fits;
34849   int num_insn;
34850   int num_uops;
34851   int window_num;
34852   int insn_num_uops;
34853   int sum;
34854
34855   if (INSN_CODE (insn) < 0)
34856     return;
34857
34858   byte_len = min_insn_size (insn);
34859   window_list = dispatch_window_list;
34860   next_list = window_list->next;
34861   path = get_insn_path (insn);
34862   insn_group = get_insn_group (insn);
34863
34864   /* Get the last dispatch window.  */
34865   if (next_list)
34866       window_list = dispatch_window_list->next;
34867
34868   if (path == path_single)
34869     insn_num_uops = 1;
34870   else if (path == path_double)
34871     insn_num_uops = 2;
34872   else
34873     insn_num_uops = (int) path;
34874
34875   /* If current window is full, get a new window.
34876      Window number zero is full, if MAX_INSN uops are scheduled in it.
34877      Window number one is full, if window zero's bytes plus window
34878      one's bytes is 32, or if the bytes of the new instruction added
34879      to the total makes it greater than 48, or it has already MAX_INSN
34880      instructions in it.  */
34881   num_insn = window_list->num_insn;
34882   num_uops = window_list->num_uops;
34883   window_num = window_list->window_num;
34884   insn_fits = fits_dispatch_window (insn);
34885
34886   if (num_insn >= MAX_INSN
34887       || num_uops + insn_num_uops > MAX_INSN
34888       || !(insn_fits))
34889     {
34890       window_num = ~window_num & 1;
34891       window_list = allocate_next_window (window_num);
34892     }
34893
34894   if (window_num == 0)
34895     {
34896       add_insn_window (insn, window_list, insn_num_uops);
34897       if (window_list->num_insn >= MAX_INSN
34898           && insn_group == disp_branch)
34899         {
34900           process_end_window ();
34901           return;
34902         }
34903     }
34904   else if (window_num == 1)
34905     {
34906       window0_list = window_list->prev;
34907       sum = window0_list->window_size + window_list->window_size;
34908       if (sum == 32
34909           || (byte_len + sum) >= 48)
34910         {
34911           process_end_window ();
34912           window_list = dispatch_window_list;
34913         }
34914
34915       add_insn_window (insn, window_list, insn_num_uops);
34916     }
34917   else
34918     gcc_unreachable ();
34919
34920   if (is_end_basic_block (insn_group))
34921     {
34922       /* End of basic block is reached do end-basic-block process.  */
34923       process_end_window ();
34924       return;
34925     }
34926 }
34927
34928 /* Print the dispatch window, WINDOW_NUM, to FILE.  */
34929
34930 DEBUG_FUNCTION static void
34931 debug_dispatch_window_file (FILE *file, int window_num)
34932 {
34933   dispatch_windows *list;
34934   int i;
34935
34936   if (window_num == 0)
34937     list = dispatch_window_list;
34938   else
34939     list = dispatch_window_list1;
34940
34941   fprintf (file, "Window #%d:\n", list->window_num);
34942   fprintf (file, "  num_insn = %d, num_uops = %d, window_size = %d\n",
34943           list->num_insn, list->num_uops, list->window_size);
34944   fprintf (file, "  num_imm = %d, num_imm_32 = %d, num_imm_64 = %d, imm_size = %d\n",
34945            list->num_imm, list->num_imm_32, list->num_imm_64, list->imm_size);
34946
34947   fprintf (file, "  num_loads = %d, num_stores = %d\n", list->num_loads,
34948           list->num_stores);
34949   fprintf (file, " insn info:\n");
34950
34951   for (i = 0; i < MAX_INSN; i++)
34952     {
34953       if (!list->window[i].insn)
34954         break;
34955       fprintf (file, "    group[%d] = %s, insn[%d] = %p, path[%d] = %d byte_len[%d] = %d, imm_bytes[%d] = %d\n",
34956               i, group_name[list->window[i].group],
34957               i, (void *)list->window[i].insn,
34958               i, list->window[i].path,
34959               i, list->window[i].byte_len,
34960               i, list->window[i].imm_bytes);
34961     }
34962 }
34963
34964 /* Print to stdout a dispatch window.  */
34965
34966 DEBUG_FUNCTION void
34967 debug_dispatch_window (int window_num)
34968 {
34969   debug_dispatch_window_file (stdout, window_num);
34970 }
34971
34972 /* Print INSN dispatch information to FILE.  */
34973
34974 DEBUG_FUNCTION static void
34975 debug_insn_dispatch_info_file (FILE *file, rtx insn)
34976 {
34977   int byte_len;
34978   enum insn_path path;
34979   enum dispatch_group group;
34980   int imm_size;
34981   int num_imm_operand;
34982   int num_imm32_operand;
34983   int num_imm64_operand;
34984
34985   if (INSN_CODE (insn) < 0)
34986     return;
34987
34988   byte_len = min_insn_size (insn);
34989   path = get_insn_path (insn);
34990   group = get_insn_group (insn);
34991   imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34992                                  &num_imm64_operand);
34993
34994   fprintf (file, " insn info:\n");
34995   fprintf (file, "  group = %s, path = %d, byte_len = %d\n",
34996            group_name[group], path, byte_len);
34997   fprintf (file, "  num_imm = %d, num_imm_32 = %d, num_imm_64 = %d, imm_size = %d\n",
34998            num_imm_operand, num_imm32_operand, num_imm64_operand, imm_size);
34999 }
35000
35001 /* Print to STDERR the status of the ready list with respect to
35002    dispatch windows.  */
35003
35004 DEBUG_FUNCTION void
35005 debug_ready_dispatch (void)
35006 {
35007   int i;
35008   int no_ready = number_in_ready ();
35009
35010   fprintf (stdout, "Number of ready: %d\n", no_ready);
35011
35012   for (i = 0; i < no_ready; i++)
35013     debug_insn_dispatch_info_file (stdout, get_ready_element (i));
35014 }
35015
35016 /* This routine is the driver of the dispatch scheduler.  */
35017
35018 static void
35019 do_dispatch (rtx insn, int mode)
35020 {
35021   if (mode == DISPATCH_INIT)
35022     init_dispatch_sched ();
35023   else if (mode == ADD_TO_DISPATCH_WINDOW)
35024     add_to_dispatch_window (insn);
35025 }
35026
35027 /* Return TRUE if Dispatch Scheduling is supported.  */
35028
35029 static bool
35030 has_dispatch (rtx insn, int action)
35031 {
35032   if (ix86_tune == PROCESSOR_BDVER1 && flag_dispatch_scheduler)
35033     switch (action)
35034       {
35035       default:
35036         return false;
35037
35038       case IS_DISPATCH_ON:
35039         return true;
35040         break;
35041
35042       case IS_CMP:
35043         return is_cmp (insn);
35044
35045       case DISPATCH_VIOLATION:
35046         return dispatch_violation ();
35047
35048       case FITS_DISPATCH_WINDOW:
35049         return fits_dispatch_window (insn);
35050       }
35051
35052   return false;
35053 }
35054
35055 /* ??? No autovectorization into MMX or 3DNOW until we can reliably
35056    place emms and femms instructions.  */
35057
35058 static enum machine_mode
35059 ix86_preferred_simd_mode (enum machine_mode mode)
35060 {
35061   /* Disable double precision vectorizer if needed.  */
35062   if (mode == DFmode && !TARGET_VECTORIZE_DOUBLE)
35063     return word_mode;
35064
35065   if (!TARGET_AVX && !TARGET_SSE)
35066     return word_mode;
35067
35068   switch (mode)
35069     {
35070     case SFmode:
35071       return (TARGET_AVX && !flag_prefer_avx128) ? V8SFmode : V4SFmode;
35072     case DFmode:
35073       return (TARGET_AVX && !flag_prefer_avx128) ? V4DFmode : V2DFmode;
35074     case DImode:
35075       return V2DImode;
35076     case SImode:
35077       return V4SImode;
35078     case HImode:
35079       return V8HImode;
35080     case QImode:
35081       return V16QImode;
35082
35083     default:;
35084     }
35085
35086   return word_mode;
35087 }
35088
35089 /* If AVX is enabled then try vectorizing with both 256bit and 128bit
35090    vectors.  */
35091
35092 static unsigned int
35093 ix86_autovectorize_vector_sizes (void)
35094 {
35095   return TARGET_AVX ? 32 | 16 : 0;
35096 }
35097
35098 /* Initialize the GCC target structure.  */
35099 #undef TARGET_RETURN_IN_MEMORY
35100 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
35101
35102 #undef TARGET_LEGITIMIZE_ADDRESS
35103 #define TARGET_LEGITIMIZE_ADDRESS ix86_legitimize_address
35104
35105 #undef TARGET_ATTRIBUTE_TABLE
35106 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
35107 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
35108 #  undef TARGET_MERGE_DECL_ATTRIBUTES
35109 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
35110 #endif
35111
35112 #undef TARGET_COMP_TYPE_ATTRIBUTES
35113 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
35114
35115 #undef TARGET_INIT_BUILTINS
35116 #define TARGET_INIT_BUILTINS ix86_init_builtins
35117 #undef TARGET_BUILTIN_DECL
35118 #define TARGET_BUILTIN_DECL ix86_builtin_decl
35119 #undef TARGET_EXPAND_BUILTIN
35120 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
35121
35122 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
35123 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
35124   ix86_builtin_vectorized_function
35125
35126 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
35127 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
35128
35129 #undef TARGET_BUILTIN_RECIPROCAL
35130 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
35131
35132 #undef TARGET_ASM_FUNCTION_EPILOGUE
35133 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
35134
35135 #undef TARGET_ENCODE_SECTION_INFO
35136 #ifndef SUBTARGET_ENCODE_SECTION_INFO
35137 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
35138 #else
35139 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
35140 #endif
35141
35142 #undef TARGET_ASM_OPEN_PAREN
35143 #define TARGET_ASM_OPEN_PAREN ""
35144 #undef TARGET_ASM_CLOSE_PAREN
35145 #define TARGET_ASM_CLOSE_PAREN ""
35146
35147 #undef TARGET_ASM_BYTE_OP
35148 #define TARGET_ASM_BYTE_OP ASM_BYTE
35149
35150 #undef TARGET_ASM_ALIGNED_HI_OP
35151 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
35152 #undef TARGET_ASM_ALIGNED_SI_OP
35153 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
35154 #ifdef ASM_QUAD
35155 #undef TARGET_ASM_ALIGNED_DI_OP
35156 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
35157 #endif
35158
35159 #undef TARGET_PROFILE_BEFORE_PROLOGUE
35160 #define TARGET_PROFILE_BEFORE_PROLOGUE ix86_profile_before_prologue
35161
35162 #undef TARGET_ASM_UNALIGNED_HI_OP
35163 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
35164 #undef TARGET_ASM_UNALIGNED_SI_OP
35165 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
35166 #undef TARGET_ASM_UNALIGNED_DI_OP
35167 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
35168
35169 #undef TARGET_PRINT_OPERAND
35170 #define TARGET_PRINT_OPERAND ix86_print_operand
35171 #undef TARGET_PRINT_OPERAND_ADDRESS
35172 #define TARGET_PRINT_OPERAND_ADDRESS ix86_print_operand_address
35173 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
35174 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P ix86_print_operand_punct_valid_p
35175 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
35176 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA i386_asm_output_addr_const_extra 
35177
35178 #undef TARGET_SCHED_INIT_GLOBAL
35179 #define TARGET_SCHED_INIT_GLOBAL ix86_sched_init_global
35180 #undef TARGET_SCHED_ADJUST_COST
35181 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
35182 #undef TARGET_SCHED_ISSUE_RATE
35183 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
35184 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
35185 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
35186   ia32_multipass_dfa_lookahead
35187
35188 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
35189 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
35190
35191 #ifdef HAVE_AS_TLS
35192 #undef TARGET_HAVE_TLS
35193 #define TARGET_HAVE_TLS true
35194 #endif
35195 #undef TARGET_CANNOT_FORCE_CONST_MEM
35196 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
35197 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
35198 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
35199
35200 #undef TARGET_DELEGITIMIZE_ADDRESS
35201 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
35202
35203 #undef TARGET_MS_BITFIELD_LAYOUT_P
35204 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
35205
35206 #if TARGET_MACHO
35207 #undef TARGET_BINDS_LOCAL_P
35208 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
35209 #endif
35210 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
35211 #undef TARGET_BINDS_LOCAL_P
35212 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
35213 #endif
35214
35215 #undef TARGET_ASM_OUTPUT_MI_THUNK
35216 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
35217 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
35218 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
35219
35220 #undef TARGET_ASM_FILE_START
35221 #define TARGET_ASM_FILE_START x86_file_start
35222
35223 #undef TARGET_DEFAULT_TARGET_FLAGS
35224 #define TARGET_DEFAULT_TARGET_FLAGS     \
35225   (TARGET_DEFAULT                       \
35226    | TARGET_SUBTARGET_DEFAULT           \
35227    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
35228
35229 #undef TARGET_HANDLE_OPTION
35230 #define TARGET_HANDLE_OPTION ix86_handle_option
35231
35232 #undef TARGET_OPTION_OVERRIDE
35233 #define TARGET_OPTION_OVERRIDE ix86_option_override
35234 #undef TARGET_OPTION_OPTIMIZATION_TABLE
35235 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
35236 #undef TARGET_OPTION_INIT_STRUCT
35237 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
35238
35239 #undef TARGET_REGISTER_MOVE_COST
35240 #define TARGET_REGISTER_MOVE_COST ix86_register_move_cost
35241 #undef TARGET_MEMORY_MOVE_COST
35242 #define TARGET_MEMORY_MOVE_COST ix86_memory_move_cost
35243 #undef TARGET_RTX_COSTS
35244 #define TARGET_RTX_COSTS ix86_rtx_costs
35245 #undef TARGET_ADDRESS_COST
35246 #define TARGET_ADDRESS_COST ix86_address_cost
35247
35248 #undef TARGET_FIXED_CONDITION_CODE_REGS
35249 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
35250 #undef TARGET_CC_MODES_COMPATIBLE
35251 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
35252
35253 #undef TARGET_MACHINE_DEPENDENT_REORG
35254 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
35255
35256 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
35257 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
35258
35259 #undef TARGET_BUILD_BUILTIN_VA_LIST
35260 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
35261
35262 #undef TARGET_ENUM_VA_LIST_P
35263 #define TARGET_ENUM_VA_LIST_P ix86_enum_va_list
35264
35265 #undef TARGET_FN_ABI_VA_LIST
35266 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
35267
35268 #undef TARGET_CANONICAL_VA_LIST_TYPE
35269 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
35270
35271 #undef TARGET_EXPAND_BUILTIN_VA_START
35272 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
35273
35274 #undef TARGET_MD_ASM_CLOBBERS
35275 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
35276
35277 #undef TARGET_PROMOTE_PROTOTYPES
35278 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
35279 #undef TARGET_STRUCT_VALUE_RTX
35280 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
35281 #undef TARGET_SETUP_INCOMING_VARARGS
35282 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
35283 #undef TARGET_MUST_PASS_IN_STACK
35284 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
35285 #undef TARGET_FUNCTION_ARG_ADVANCE
35286 #define TARGET_FUNCTION_ARG_ADVANCE ix86_function_arg_advance
35287 #undef TARGET_FUNCTION_ARG
35288 #define TARGET_FUNCTION_ARG ix86_function_arg
35289 #undef TARGET_FUNCTION_ARG_BOUNDARY
35290 #define TARGET_FUNCTION_ARG_BOUNDARY ix86_function_arg_boundary
35291 #undef TARGET_PASS_BY_REFERENCE
35292 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
35293 #undef TARGET_INTERNAL_ARG_POINTER
35294 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
35295 #undef TARGET_UPDATE_STACK_BOUNDARY
35296 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
35297 #undef TARGET_GET_DRAP_RTX
35298 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
35299 #undef TARGET_STRICT_ARGUMENT_NAMING
35300 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
35301 #undef TARGET_STATIC_CHAIN
35302 #define TARGET_STATIC_CHAIN ix86_static_chain
35303 #undef TARGET_TRAMPOLINE_INIT
35304 #define TARGET_TRAMPOLINE_INIT ix86_trampoline_init
35305 #undef TARGET_RETURN_POPS_ARGS
35306 #define TARGET_RETURN_POPS_ARGS ix86_return_pops_args
35307
35308 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
35309 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
35310
35311 #undef TARGET_SCALAR_MODE_SUPPORTED_P
35312 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
35313
35314 #undef TARGET_VECTOR_MODE_SUPPORTED_P
35315 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
35316
35317 #undef TARGET_C_MODE_FOR_SUFFIX
35318 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
35319
35320 #ifdef HAVE_AS_TLS
35321 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
35322 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
35323 #endif
35324
35325 #ifdef SUBTARGET_INSERT_ATTRIBUTES
35326 #undef TARGET_INSERT_ATTRIBUTES
35327 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
35328 #endif
35329
35330 #undef TARGET_MANGLE_TYPE
35331 #define TARGET_MANGLE_TYPE ix86_mangle_type
35332
35333 #undef TARGET_STACK_PROTECT_FAIL
35334 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
35335
35336 #undef TARGET_SUPPORTS_SPLIT_STACK
35337 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
35338
35339 #undef TARGET_FUNCTION_VALUE
35340 #define TARGET_FUNCTION_VALUE ix86_function_value
35341
35342 #undef TARGET_FUNCTION_VALUE_REGNO_P
35343 #define TARGET_FUNCTION_VALUE_REGNO_P ix86_function_value_regno_p
35344
35345 #undef TARGET_SECONDARY_RELOAD
35346 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
35347
35348 #undef TARGET_PREFERRED_RELOAD_CLASS
35349 #define TARGET_PREFERRED_RELOAD_CLASS ix86_preferred_reload_class
35350 #undef TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
35351 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS ix86_preferred_output_reload_class
35352 #undef TARGET_CLASS_LIKELY_SPILLED_P
35353 #define TARGET_CLASS_LIKELY_SPILLED_P ix86_class_likely_spilled_p
35354
35355 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
35356 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
35357   ix86_builtin_vectorization_cost
35358 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
35359 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM \
35360   ix86_vectorize_builtin_vec_perm
35361 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK
35362 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK \
35363   ix86_vectorize_builtin_vec_perm_ok
35364 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
35365 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
35366   ix86_preferred_simd_mode
35367 #undef TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES
35368 #define TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES \
35369   ix86_autovectorize_vector_sizes
35370
35371 #undef TARGET_SET_CURRENT_FUNCTION
35372 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
35373
35374 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
35375 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
35376
35377 #undef TARGET_OPTION_SAVE
35378 #define TARGET_OPTION_SAVE ix86_function_specific_save
35379
35380 #undef TARGET_OPTION_RESTORE
35381 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
35382
35383 #undef TARGET_OPTION_PRINT
35384 #define TARGET_OPTION_PRINT ix86_function_specific_print
35385
35386 #undef TARGET_CAN_INLINE_P
35387 #define TARGET_CAN_INLINE_P ix86_can_inline_p
35388
35389 #undef TARGET_EXPAND_TO_RTL_HOOK
35390 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
35391
35392 #undef TARGET_LEGITIMATE_ADDRESS_P
35393 #define TARGET_LEGITIMATE_ADDRESS_P ix86_legitimate_address_p
35394
35395 #undef TARGET_FRAME_POINTER_REQUIRED
35396 #define TARGET_FRAME_POINTER_REQUIRED ix86_frame_pointer_required
35397
35398 #undef TARGET_CAN_ELIMINATE
35399 #define TARGET_CAN_ELIMINATE ix86_can_eliminate
35400
35401 #undef TARGET_EXTRA_LIVE_ON_ENTRY
35402 #define TARGET_EXTRA_LIVE_ON_ENTRY ix86_live_on_entry
35403
35404 #undef TARGET_ASM_CODE_END
35405 #define TARGET_ASM_CODE_END ix86_code_end
35406
35407 #undef TARGET_CONDITIONAL_REGISTER_USAGE
35408 #define TARGET_CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage
35409
35410 #if TARGET_MACHO
35411 #undef TARGET_INIT_LIBFUNCS
35412 #define TARGET_INIT_LIBFUNCS darwin_rename_builtins
35413 #endif
35414
35415 struct gcc_target targetm = TARGET_INITIALIZER;
35416 \f
35417 #include "gt-i386.h"